JavaScript实现连续滚动

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

在经典论坛搜索“连续滚动”,有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实现连续滚动
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript(简称JS)是一种广泛应用于Web开发的脚本语言,它可以为网页添加动态功能和交互性。它是一种解释型语言,可以直接嵌入到HTML中,并由浏览器解释执行。 requestAnimationFrame是JavaScript提供的一个用于优化动画效果的方法。它通过浏览器的刷新频率来调用指定的回调函数,从而实现平滑的动画效果。相比于使用setTimeout或setInterval方法来实现动画,requestAnimationFrame能够更好地利用浏览器的资源,提供更流畅的动画效果。 下面是一个使用requestAnimationFrame实现平滑滚动的示例代码: ```javascript function smoothScroll(targetPosition, duration) { const startPosition = window.pageYOffset; const distance = targetPosition - startPosition; let startTime = null; function animation(currentTime) { if (startTime === null) { startTime = currentTime; } const elapsedTime = currentTime - startTime; const scrollY = ease(elapsedTime, startPosition, distance, duration); window.scrollTo(0, scrollY); if (elapsedTime < duration) { requestAnimationFrame(animation); } } function ease(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animation); } // 使用示例 const button = document.querySelector('.scroll-button'); button.addEventListener('click', () => { smoothScroll(0, 1000); // 滚动到页面顶部,持续时间为1秒 }); ``` 上述代码中,smoothScroll函数接受两个参数:目标位置targetPosition和滚动持续时间duration。它通过计算起始位置startPosition、滚动距离distance和动画开始时间startTime来实现平滑滚动效果。在animation函数中,使用ease函数来计算当前滚动位置scrollY,并通过window.scrollTo方法实现滚动效果。如果动画未结束,则通过requestAnimationFrame方法递归调用animation函数,实现连续的帧动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值