找回密码
 注-册

QQ登录

只需一步,快速开始

查看: 1709|回复: 3

[特效] javascript无缝滚动2

[复制链接]
Leya 发表于 2010-6-7 17:53:24 | 显示全部楼层 |阅读模式
以更少的代码实现相同的效果应该是我们写程序的究极目标,当然可读性不能丢。在第一部分最后一个运行框,我已经做了这样的探索。不过换汤不换药,还是来来回回在scrollTop/scrollLeft与offsetTop/offsetLeft上做文章。总的思路基本是这样,让某个元素整体向某个方向移动,这样它里面的内容(图片或文字)就跟着移动,当元素移动到某一个距离后就回到原点。为了防止内容移着移着就没有了,我们需要两套相同的内容。在第一部分,第二套内容是动态生成的,并复制到另一个兄弟元素中,这在水平滚动时,我们需要花一些周折来让所有内容水平排列在一起。我就想,如果把第二套内容直接加在相同的元素是否效果会更好呢?起码CSS也少写一点。用scrollTop/scrollLeft实现滚动,还有一个缺点,它对父容器的宽度与高度有严格的规定的。比如我们想上下滚动图片,ul作为容器,li的图片为滚动内容,那么ul的高至少为图片的高的两倍(我们假设每张图片的尺寸都是相等的),否则就动不了。鉴此,我开发了新一代的无缝滚动函数。
  1. <ul id="marquee">
  2. <li>
  3. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s017.jpg" alt="无缝滚动"/></a>
  4. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s018.jpg" alt="无缝滚动"/></a
  5. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s019.jpg" alt="无缝滚动"/></a>
  6. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s020.jpg" alt="无缝滚动"/></a>
  7. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s021.jpg" alt="无缝滚动"/></a>
  8. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s022.jpg" alt="无缝滚动"/></a>
  9. <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s023.jpg" alt="无缝滚动"/></a>
  10. </li>
  11. </ul>
复制代码
>
  1. #marquee ,#marquee li {
  2. padding:0;
  3. margin:0;
  4. }
  5. #marquee {
  6. position:relative;
  7. list-style:none;
  8. height:150px;
  9. width:200px;
  10. overflow:hidden;
  11. border:10px solid #369;
  12. }
  13. #marquee li {
  14. position:absolute;
  15. }
  16. #marquee img {
  17. display:block;
  18. border:0;
  19. }
复制代码
  1. var Marquee = function(id){
  2. try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  3. var container = document.getElementById(id),
  4. slide = container.getElementsByTagName("li")[0],
  5. speed = arguments[1] || 10,
  6. delta = 0,//当前滚动的位置
  7. critical = slide.offsetHeight;//临界值
  8. slide.innerHTML += slide.innerHTML;
  9. var rolling = function(){
  10. delta == -critical ? delta = 0 : delta--;
  11. slide.style.top = delta + "px";
  12. }
  13. var timer = setInterval(rolling,speed)//设置定时器
  14. container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  15. container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  16. }
  17. window.onload = function(){
  18. Marquee("marquee");
  19. }
复制代码

  1. <!doctype html>
  2. <title>javascript无缝滚动  by 司徒正美</title>
  3. <meta charset="utf-8"/>
  4. <meta name="keywords" content="javascript无缝滚动 by 司徒正美" />
  5. <meta name="description" content="javascript无缝滚动  by 司徒正美" />
  6. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  7. <style type="text/css">
  8.   h1 {
  9.     font:400 16px/1 "Microsoft YaHei",KaiTi_GB2312,SimSun
  10.   }
  11.   #marquee ,#marquee li {
  12.     padding:0;
  13.     margin:0;
  14.   }
  15.   #marquee {
  16.     position:relative;
  17.     list-style:none;
  18.     height:150px;
  19.     width:200px;
  20.     overflow:hidden;
  21.     border:10px solid #369;
  22.   }
  23.   #marquee li {
  24.     position:absolute;
  25.   }
  26.   #marquee img {
  27.     display:block;
  28.     border:0;
  29.   }
  30. </style>
  31. <script type="text/javascript">
  32.   var Marquee = function(id){
  33.     try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  34.     var container = document.getElementById(id),
  35.     slide = container.getElementsByTagName("li")[0],
  36.     speed = arguments[1] || 10,
  37.     delta = 0,//当前滚动的位置
  38.     critical = slide.offsetHeight;//临界点
  39.     slide.innerHTML += slide.innerHTML;
  40.     var rolling = function(){
  41.       delta == -critical ? delta = 0 : delta--;
  42.       slide.style.top = delta + "px";
  43.     }
  44.     var timer = setInterval(rolling,speed)//设置定时器
  45.     container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  46.     container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  47.   }
  48.   window.onload = function(){
  49.     Marquee("marquee");
  50.   }
  51. </script>
  52. <h1>javascript无缝滚动(向上滚动) by 司徒正美</h1>
  53. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  54. <ul id="marquee">
  55.   <li>
  56.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s017.jpg" alt="无缝滚动 by 司徒正美"/></a>
  57.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s018.jpg" alt="无缝滚动 by 司徒正美"/></a>
  58.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s019.jpg" alt="无缝滚动 by 司徒正美"/></a>
  59.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s020.jpg" alt="无缝滚动 by 司徒正美"/></a>
  60.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s021.jpg" alt="无缝滚动 by 司徒正美"/></a>
  61.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s022.jpg" alt="无缝滚动 by 司徒正美"/></a>
  62.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s023.jpg" alt="无缝滚动 by 司徒正美"/></a>
  63.   </li>
  64. </ul>
复制代码
向下滚动也很容易,只不过一开始把它定位到第一套内容与第二套内容之间,也就是slide.offsetHeight,不过我们需要把它改成负数让向整体向下移动,然后再慢慢向上移动。

  1. <!doctype html>
  2. <title>javascript无缝滚动  by 司徒正美</title>
  3. <meta charset="utf-8"/>
  4. <meta name="keywords" content="javascript无缝滚动 by 司徒正美" />
  5. <meta name="description" content="javascript无缝滚动  by 司徒正美" />
  6. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  7. <style type="text/css">
  8.   h1 {
  9.     font:400 16px/1 "Microsoft YaHei",KaiTi_GB2312,SimSun
  10.   }
  11.   #marquee ,#marquee li {
  12.     padding:0;
  13.     margin:0;
  14.   }
  15.   #marquee {
  16.     position:relative;
  17.     list-style:none;
  18.     height:150px;
  19.     width:200px;
  20.     overflow:hidden;
  21.     border:10px solid #B45B3E;
  22.   }
  23.   #marquee li {
  24.     position:absolute;
  25.   }
  26.   #marquee img {
  27.     display:block;
  28.     border:0;
  29.   }
  30. </style>
  31. <script type="text/javascript">
  32.   var Marquee = function(id){
  33.     try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  34.     var container = document.getElementById(id),
  35.     slide = container.getElementsByTagName("li")[0],
  36.     speed = arguments[1] || 10,
  37.     critical = slide.offsetHeight,//临界值
  38.     delta = -critical;
  39.     slide.innerHTML += slide.innerHTML;
  40.     var rolling = function(){
  41.       delta == 0 ? delta = -critical : delta++;
  42.       slide.style.top = delta + "px";
  43.     }
  44.     var timer = setInterval(rolling,speed)//设置定时器
  45.     container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  46.     container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  47.   }
  48.   window.onload = function(){
  49.     Marquee("marquee");
  50.   }
  51. </script>
  52. <h1>javascript无缝滚动(向下滚动) by 司徒正美</h1>
  53. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  54. <ul id="marquee">
  55.   <li>
  56.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s017.jpg" alt="无缝滚动"/></a>
  57.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s018.jpg" alt="无缝滚动"/></a>
  58.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s019.jpg" alt="无缝滚动"/></a>
  59.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s020.jpg" alt="无缝滚动"/></a>
  60.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s021.jpg" alt="无缝滚动"/></a>
  61.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s022.jpg" alt="无缝滚动"/></a>
  62.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s023.jpg" alt="无缝滚动"/></a>
  63.   </li>
  64. </ul>
复制代码
实现水平移动也比第一部分容易,结构层完全不用改动,表现层也改动很少。
  1. #marquee ,#marquee li {
  2. padding:0;
  3. margin:0;
  4. }
  5. #marquee {
  6. position:relative;
  7. list-style:none;
  8. height:150px;
  9. width:200px;
  10. overflow:hidden;
  11. border:10px solid #B45B3E;
  12. }
  13. #marquee li {
  14. position:absolute;
  15. width:1000%;/*★★新增加★★*/
  16. }
  17. #marquee a {
  18. float:left;/*★★新增加★★*/
  19. }
  20. #marquee img {
  21. display:block;
  22. border:0;
  23. }
复制代码
难点是如何获取那个临界值,也就是夹在第一套内容与第二个套内容之间的那个位置。由于第二套内容我们并没有外套一个元素,因此我们需要从滚动对象下手。滚动对象都是a元素,我们需要计算出第二套内容的第一个a元素到达父元素左边的距离。这个值就是我们要求的临界值。明白这点,就轻松了。
  1. //*************略*********   
  2.   slide.innerHTML += slide.innerHTML;  
  3.   var item  = slide.getElementsByTagName("a"),  
  4.   critical = item[item.length/2].offsetLeft,//临界值
  5. //*************略*********
复制代码

  1. <!doctype html>
  2. <title>javascript无缝滚动  by 司徒正美</title>
  3. <meta charset="utf-8"/>
  4. <meta name="keywords" content="javascript无缝滚动 by 司徒正美" />
  5. <meta name="description" content="javascript无缝滚动  by 司徒正美" />
  6. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  7. <style type="text/css">
  8.   h1 {
  9.     font:400 16px/1 "Microsoft YaHei",KaiTi_GB2312,SimSun
  10.   }
  11.   #marquee ,#marquee li {
  12.     padding:0;
  13.     margin:0;
  14.   }
  15.   #marquee {
  16.     position:relative;
  17.     list-style:none;
  18.     height:150px;
  19.     width:200px;
  20.     overflow:hidden;
  21.     border:10px solid #8080C0;
  22.   }
  23.   #marquee li {
  24.     position:absolute;
  25.     width:1000%;/*新增加*/
  26.   }
  27.   #marquee a {
  28.     float:left;/*新增加*/
  29.   }
  30.   #marquee img {
  31.     display:block;
  32.     border:0;
  33.   }
  34. </style>
  35. <script type="text/javascript">
  36.   var Marquee = function(id){
  37.     try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  38.     var container = document.getElementById(id),
  39.     slide = container.getElementsByTagName("li")[0],
  40.     speed = arguments[1] || 10;
  41.     slide.innerHTML += slide.innerHTML;
  42.     var item  = slide.getElementsByTagName("a"),
  43.     critical = item[item.length/2].offsetLeft,//临界值
  44.     delta = 0;
  45.     var rolling = function(){
  46.       delta == -critical ? delta = 0 : delta--;
  47.       slide.style.left = delta + "px";
  48.     }
  49.     var timer = setInterval(rolling,speed)//设置定时器
  50.     container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  51.     container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  52.   }
  53.   window.onload = function(){
  54.     Marquee("marquee");
  55.   }
  56. </script>
  57. <h1>javascript无缝滚动(向左滚动) by 司徒正美</h1>
  58. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  59. <ul id="marquee">
  60.   <li>
  61.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s017.jpg" alt="无缝滚动"/></a>
  62.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s018.jpg" alt="无缝滚动"/></a>
  63.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s019.jpg" alt="无缝滚动"/></a>
  64.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s020.jpg" alt="无缝滚动"/></a>
  65.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s021.jpg" alt="无缝滚动"/></a>
  66.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s022.jpg" alt="无缝滚动"/></a>
  67.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s023.jpg" alt="无缝滚动"/></a>
  68.   </li>
  69. </ul>
复制代码
下面是向右滚动,由于都是不足20行的脚本,应该一看源码就明白,不详述了。

  1. <!doctype html>
  2. <title>javascript无缝滚动  by 司徒正美</title>
  3. <meta charset="utf-8"/>
  4. <meta name="keywords" content="javascript无缝滚动 by 司徒正美" />
  5. <meta name="description" content="javascript无缝滚动  by 司徒正美" />
  6. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  7. <style type="text/css">
  8.   h1 {
  9.     font:400 16px/1 "Microsoft YaHei",KaiTi_GB2312,SimSun
  10.   }
  11.   #marquee ,#marquee li {
  12.     padding:0;
  13.     margin:0;
  14.   }
  15.   #marquee {
  16.     position:relative;
  17.     list-style:none;
  18.     height:150px;
  19.     width:200px;
  20.     overflow:hidden;
  21.     border:10px solid #6cc;
  22.   }
  23.   #marquee li {
  24.     position:absolute;
  25.     width:1000%;
  26.   }
  27.   #marquee a {
  28.     float:left;
  29.   }
  30.   #marquee img {
  31.     display:block;
  32.     border:0;
  33.   }
  34. </style>
  35. <script type="text/javascript">
  36.   var Marquee = function(id){
  37.     try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  38.     var container = document.getElementById(id),
  39.     slide = container.getElementsByTagName("li")[0],
  40.     speed = arguments[1] || 10;
  41.     slide.innerHTML += slide.innerHTML;
  42.     var item  = slide.getElementsByTagName("a"),//临界点
  43.     critical = item[item.length/2].offsetLeft,
  44.     delta = -critical;
  45.     var rolling = function(){
  46.       delta == 0 ? delta = -critical : delta++;
  47.       slide.style.left = delta + "px";
  48.     }
  49.     var timer = setInterval(rolling,speed)//设置定时器
  50.     container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  51.     container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  52.   }
  53.   window.onload = function(){
  54.     Marquee("marquee");
  55.   }
  56. </script>
  57. <h1>javascript无缝滚动(向右滚动) by 司徒正美</h1>
  58. <base href="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/">
  59. <ul id="marquee">
  60.   <li>
  61.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s017.jpg" alt="无缝滚动"/></a>
  62.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s018.jpg" alt="无缝滚动"/></a>
  63.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s019.jpg" alt="无缝滚动"/></a>
  64.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s020.jpg" alt="无缝滚动"/></a>
  65.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s021.jpg" alt="无缝滚动"/></a>
  66.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s022.jpg" alt="无缝滚动"/></a>
  67.     <a href="http://www.cnblogs.com/rubylouvre/"><img src="o_s023.jpg" alt="无缝滚动"/></a>
  68.   </li>
  69. </ul>
复制代码
我们可以把上面四个函数合并成一个函数,结构层与表现层参照向上滚动。
  1. var Marquee = function(id){
  2. try{document.execCommand("BackgroundImageCache", false, true);}catch(e){};
  3. var container = document.getElementById(id),
  4. slide = container.getElementsByTagName("li")[0],
  5. options = arguments[1] || {},
  6. speed = options.speed || 10,
  7. direction = options.direction || "left";
  8. slide.innerHTML += slide.innerHTML;
  9. var item  = slide.getElementsByTagName("a"),
  10. critical,delta,rolling,field;
  11. if(direction == "left" || direction == "right"){
  12. slide.style.cssText = "width:1000%";
  13. for(var i=0 ,l=item.length; i<l;i++){
  14. item[i].style.cssText = "float:left";
  15. }
  16. field = "left";
  17. critical = item[item.length/2].offsetLeft;
  18. }else if(direction == "up" || direction == "down"){
  19. field = "top";
  20. critical = item[item.length/2].offsetTop;
  21. }
  22. if(direction == "up" || direction == "left"){
  23. delta = 0;
  24. rolling = function(){
  25. delta == -critical ? delta = 0 : delta--;
  26. slide.style[field]  = delta + "px";
  27. }
  28. }else if(direction == "down" || direction == "right"){
  29. delta = -critical;
  30. rolling = function(){
  31. delta == 0 ? delta = -critical : delta++;
  32. slide.style[field] = delta + "px";
  33. }
  34. }
  35. var timer = setInterval(rolling,speed)//设置定时器
  36. container.onmouseover=function() {clearInterval(timer)}//鼠标移到marquee上时,清除定时器,停止滚动
  37. container.onmouseout=function() {timer=setInterval(rolling,speed)}//鼠标移开时重设定时器
  38. }
复制代码
使用:
  1. Marquee("marquee",{speed:35,direction:"up"});
复制代码
回复

使用道具 举报

@k-47 发表于 2010-6-8 00:28:56 | 显示全部楼层
写的这么累都有没一个跟贴的,你们太没有良心了,
回复

使用道具 举报

铁十字勋章 发表于 2010-6-8 07:41:45 | 显示全部楼层
不知道做啥的啊
回复

使用道具 举报

zzaa2018 发表于 2010-6-8 12:24:25 | 显示全部楼层
不知道干什么的啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注-册

本版积分规则

Archiver|手机版|小黑屋|DoDVip ( 桂ICP备14000730号 )

GMT+8, 2024-5-3 13:03 , Processed in 0.053578 second(s), 20 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表