Javascript:图片无限循环滚动

分类:Pure Javascript 发表时间:2011年02月24日 字体大小:12号14号

早前为一位博友写了一个走马灯效果(增强型走马灯公告栏,可以抛弃marquee标签了点击看效果),但时是基于jQuery库写的。效果实现的优点牵强。而且当时的效果是页面加载完后一片空白,只有开始播放后才从底部出来。

年前用wordpress给公司做内部信息分享平台时,有一块是用来横向无限循环播放展示team building的图片。之前的效果不适合,便又写了一段原生的js来实现。主要实现原理是间隔时间地设置一个overflow:hidden;的div的scrollLeft。

downloaddemo

一、HTML代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="photo-list">
    <ul id="scroll">
        <li><a href="http://www.ihiro.org/intellij-idea"><img src="http://www.ihiro.org/blog/wp-content/uploads/2011/01/logo.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/javascript-getweek-by-date"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/12/calendar.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/beginning-python"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/12/beginning-python.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/css-position-hack"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/11/position-logo.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/text-range"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/11/text-range.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/html5-pro-ebook-recommendations"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/11/Pro_Html5_logo.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/jquery-plugin-recommended-maphighlight"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/10/maohightlight-logo.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/jquery-format-extend"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/09/jQuery.format_logo.png" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/information-september-2010-programming-language-list"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/08/2010.08.language-logo.jpg" width="100px" height="100px" alt=""/></a></li>
        <li><a href="http://www.ihiro.org/example-selectbox-simulation"><img src="http://www.ihiro.org/blog/wp-content/uploads/2010/09/select_logo.png" width="100px" height="100px" alt=""/></a></li>
    </ul>
</div>

使用一个无需列表,通过左浮横向显示。设置容器div的尺寸,超出部分不显示。

二、CSS代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* { padding:0; margin:0;}
body { text-align:center;}
 
#photo-list {
     /* 3张图片的宽度(包含宽度、padding、border、图片间的留白)
         计算:3*(100+2*2+1*2+9) - 9
         之所以减去9是第三张图片的右边留白
     */
    width:336px;
    /* 图片的宽度(包含高度、padding、border)
        计算:100+2*2+1*2
    */
    height:106px;
    margin:50px auto; overflow:hidden;
    border:1px dashed #ccc;
}
#photo-list ul { list-style:none;}
#photo-list li { float:left; padding-right:9px;}
#photo-list img { border:1px solid #ddd; background:#fff; padding:2px;}

注释中写明了容器div的尺寸计算方法。页面加载完成后未播放时的效果:

Firebug查看尺寸图:

三、JS代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var id = function(el) {
        return document.getElementById(el);
    },
    c = id('photo-list');
if(c) {
    var	ul = id('scroll'),
        lis = ul.getElementsByTagName('li'),
        itemCount = lis.length,
        width = lis[0].offsetWidth, //获得每个img容器的宽度
        marquee = function() {
            c.scrollLeft += 2;
            if(c.scrollLeft % width < = 1){  //当 c.scrollLeft 和 width 相等时,把第一个img追加到最后面
                ul.appendChild(ul.getElementsByTagName('li')[0]);
                c.scrollLeft = 0;
            };
        },
        speed = 50; //数值越大越慢
 
    ul.style.width = width*itemCount + 'px'; //加载完后设置容器长度
 
    var timer = setInterval(marquee, speed);
    c.onmouseover = function() {
        clearInterval(timer);
    };
    c.onmouseout = function() {
        timer = setInterval(marquee, speed);
    };
};

没有进行封装,只是实现效果。

不错不错,已经有 个评论!
  1. 这个功能不错,做外贸站的时候产品的展示常常会用到这个。

    • 用来做产品展示确实适合。

  2. 木有DEMO神马滴么!

  3. 我去瞎眼了!没看见watching demo哈。

    • 正常都喜欢先看Demo,在看代码吧。所以Button是放在前面的。

  4. 嗯,不错,值得收藏,很有用。

  5. 都是代码,不是很了解啊

  6. 代码不错哦 收藏了

  7. 好像稍微有点一顿一顿的?

    • 错觉~~

  8. 还是学不会,很希望自己懂得代码。那我就可以搞定我的免费减肥私教中心了

  9. 哇,好羡慕哦,我也好想学习JS,好想好想。。。

  10. 什么情况!

    • 什么“什么情况”?

  11. 不错的功能,大多数网络公司给客户做网站都用到这个。

  12. 兔年吉祥~

  13. 不错,收藏了

  14. 功能看起来不错

  15. 阿伦

    已经有更好的封装,可以方便实现多种效果,奇赞无比!

  16. 换成文字是不是有异曲同工的效果。

    • 原理一样的!

  17. 博客给力啊 继续加油

  18. 这个文章很好 受益了

  19. 这主题很炫,收下先,最近在纠结着换主题的事呢,翻一翻博主的博客,到处逛逛,呵呵….

  20. 这个有意思!

  21. 博客不错 这东西挺好的 大部分网站都需要用这功能

  22. 没有用JS框架的,,,而且这么精简。。。我不得不佩服。。。