JavaScript实现连续滚动

本文介绍了一种使用JavaScript实现的无缝连续滚动效果。该方法通过在滚动到内容尾部时将内容头部追加到尾部来避免空白期,同时解决了多次追加导致内存膨胀的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

灵活的无缝滚动,帖子:连续滚动

在经典论坛搜索“连续滚动”,有203条之多。叙述的问题大都是一样的,无论marquee还是用JavaScript模仿的类似滚动效果,当滚动到尾部的时候会出现一段真空期,也就是可见范围内看到了内容的尾巴,后面是一篇空白。而连续滚动就是要求不出现这种现象,当滚动到内容尾部的时候,紧接着出现文档开头的内容,出现头追尾巴的效果。

简单的看了一下以前的解决方案,基本上都是图片的连续滚动效果,或者说,需要在脚本中对元素具体的宽度和高度做出一些计算和判断,主要目的是拿元素宽度和当前已经滚动的距离做对比,从而做出一些文档结构上的改变。我希望能够写出一个适用于文本的、与所滚动的具体元素无关的无缝滚动效果。

刚开始想的时候想了很多方法,要么太复杂了,要么实现不了(以下省略半个多小时的痛苦过程),一点头绪也没有,不过最后灵光一现想到了一个非常“不错”的办法:

通常,我们滚动元素的时候都是使用element.scrollTop++的方法(横向滚动是scrollLeft),当滚动到内容尾部的时候,我们会发现scrollTop由于“无内容可滚”而无法继续变大,从而可以判断出已经滚动到头。

我想到的方法就在这里,此时我们可以人为地让滚动容器的innerHTML+=innerHTML,这样内容的头部就接到了尾部,从而可以继续滚动,造成连续的视觉效果。测试了一下,基本完美。

但是这个看似“不错”的方法却有一个致命的缺陷,假设滚动时间较长或者是滚动速度较快,那么就会有多次“滚到头”的情况,每次滚到头都会让innerHTML*2,那么文档占用的内存会不断增大,尤其是滚动内容有大图片的时候。所以需要对脚本的性能做进一步的优化(其实是改正错误)。

思路如下:当我们复制了一次innerHTML之后,就已经有头尾相接的效果了,因此没有必要再修改文档结构了。此时只要重现“第一次滚到头”时候的效果就可以了。至于如何重现,只要在第一次到头的时候记录下来当前的scrollTop值,然后恢复这个值就可以了。效果如下:

连续滚动示例标题

实例新闻,可以添加任何想要滚动的内容。包括图片等等。

连续滚动示例图片

……

连续滚动示例标题

实例新闻,可以添加任何想要滚动的内容。包括图片等等。

连续滚动示例图片

……

在IE8,FireFox和Chrome下效果都不错,最终的JavaScript代码和注释如下:

<script type="text/javascript">
//添加事件响应函数的函数,与本效果无关
function addEventSimple(obj,evt,fn){
if(obj.addEventListener){
obj.addEventListener(evt,fn,false);
}else if(obj.attachEvent){
obj.attachEvent('on'+evt,fn);
}
}
addEventSimple(window,'load',initScrolling);
//保存想要滚动的容器
var scrollingBox;
var scrollingInterval;
//用于记录是否“滚到头”过一次
var reachedBottom=false;
//记录第一次滚到头时候的scrollTop
var bottom;
//初始化滚动效果
function initScrolling(){
scrollingBox = document.getElementById("scrollText");
//样式设置,与滚动基本无关,应该用CSS设置。
scrollingBox.style.height = "60px";
scrollingBox.style.overflow = "hidden";
//滚动
scrollingInterval = setInterval("scrolling()",50);
//鼠标划过停止滚动效果
scrollingBox.onmouseover = over;
//鼠标划出回复滚动效果
scrollingBox.onmouseout = out;
}
//滚动效果
function scrolling(){
//开始滚动,origin是原来scrollTop
var origin = scrollingBox.scrollTop++;
//如果到头了
if(origin == scrollingBox.scrollTop){
//如果是第一次到头
if(!reachedBottom){
scrollingBox.innerHTML+=scrollingBox.innerHTML;
reachedBottom=true;
bottom=origin;
}else{
//已经到头过,只需回复头接尾的效果
scrollingBox.scrollTop=bottom;
}
}
}
function over(){
clearInterval(scrollingInterval);
}
function out(){
scrollingInterval = setInterval("scrolling()",50);
}
</script>

经典论坛JavaScript学习总结

  1. JavaScript制作移动的文字
  2. JavaScript实现随机的背景颜色
  3. 鼠标不移动就跳转到指定页面
  4. 占满屏幕的弹出窗口
  5. JavaScript访问弹出窗口的弹出窗口
  6. JavaScript函数中再定义函数
  7. JavaScript检查文本框的值为空禁用按钮
  8. JavaScript实现在指定窗口打开网址
  9. JavaScript实现联动的下拉菜单
  10. JavaScript滚动到底部、禁止刷新
  11. 下拉菜单式的友情链接列表
  12. JavaScript检测页面是否刷新过
  13. 屏蔽JavaScript的“网页上有错误”
  14. JavaScript实现的文本框联动
  15. 单选框控制表单的隐藏和显示
  16. JavaScript显示日期和时间
  17. JavaScript confirm应用实例
  18. 文本框获得焦点并删除原内容
  19. JavaScript tooltip效果
  20. JavaScript获取来源域名
  21. JavaScript事件的键值keyCode
  22. 用JavaScript禁止在表单内输入指定字符
  23. JavaScript eval遍历元素的使用
  24. JavaScript统计字符串内字符出现次数
  25. JavaScript实现鼠标跟随元素
  26. JavaScript实现文本过长自动省略
  27. JavaScript实现后退一页
  28. JavaScript实现按钮禁用指定时间
  29. JavaScript的undefined与null
  30. JavaScript滚动新闻
  31. 不同分辨率,不同的CSS样式
  32. 只能看不能改的select元素
  33. JavaScript实现顶端的大广告
  34. JavaScript控制链接在新窗口打开
  35. 载入时的loading等待效果
  36. JavaScript滚动文本
  37. JavaScript统计执行时间
  38. JavaScript倒置字符串
  39. JavaScript的全选效果
  40. JavaScript随机图片
  41. JavaScript切换文档样式表
  42. JavaScript字符串与Unicode 码
  43. JS特殊字符输出工具
  44. 双击后自动滚屏
  45. eval函数的应用
  46. JavaScript错误
  47. 用JavaScript获得网页的大小
  48. JavaScript限制复选框的最大可选数
  49. 模仿桌面软件的弹出消息
  50. JavaScript实现连续滚动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值