京东轮播图/平滑翻页(jQuery版本)

先放效果图

一:设计思路

功能设计:

1.点击超链接点点,跳转到对应的图
2.每隔一秒,切换一次图片,同时改变点点背景色

html结构

使用一个div作为最大的容器(outer),图片使用ul列表,翻页的点点使用另一个div来放置。

 1 <body>
 2     <div id="outer">
 3         <ul id="imgList">
 4             <li>
 5                 <img src="../pic/3.jpg" >
 6             </li>
 7             <li>
 8                 <img src="../pic/4.jpg" >
 9             </li>
10             <li>
11                 <img src="../pic/5.jpg" >
12             </li>
13             <li>
14                 <img src="../pic/3.jpg" >
15             </li>
16         </ul>
17         <!-- 创建导航按钮 -->
18         <div id="navDiv">
19             <a href="javascript:;"></a>
20             <a href="javascript:;"></a>
21             <a href="javascript:;"></a>
22 
23         </div>
24     </div>
25 </body>
html结构

 

轮播效果实现:

ul列表里的li横向排列(float:left),每切换一张图,实际上是把ul整体往左边移动一个图片的宽度,同时对应点点的切换。

注意,最后一张图切换到第一张图的平滑翻页方法:在真正的最后一张图后面再加上第一张图,最后一张图切换到第一张图,其实是切换到第一张图的副本,在这个期间再悄悄把left改成0,显示的是真正的最后一张图。

二:样式设计

最外层outer放在页面中间,开启定位为相对定位,这样其中的ul子元素才能相对于outer容器来定位。

宽度为图片宽度(380px)+图片之间的间距(设为10px)=400px,高度为图片的高度300px。

ul(img_list)采用绝对定位,这里要注意一个问题就是,ul的width一定要显式指定,因为ul会继承outer内容区的宽度,这样当li开启浮动,ul会竖向摆放这些图片,导致我们不能通过改变left来实现平滑翻页。ul的width可以是在css中按照图片数量手动指定,但是缺乏灵活性。可以通过js按照图片的数量动态设置ul宽度。

li开启浮动,有一个小问题:img的display属性是inline,所以它会按照文本的默认对齐方式(基线对齐)来对齐,这样就会导致图片和父元素之间会出现2px的空隙,将img的父元素li的lineheight改成0就可以解决这个问题。

关于点点:

1.通过设置a标签的width height bgc这三个属性,可以设置一个点点的形状颜色等,a标签开启浮动,并且设置边距。装a标签的容器div设置绝对定位,设置bottom使点点在图片靠下的位置。

2.上文提到,动态改变ul宽度,那么也应该根据a标签的数量,动态设置a标签水平居中。

三:功能实现

3.1.自动翻页

总体思路:写一个按照指定速度移动至目标位置的moveBox函数,自动翻页函数(autoChange)设置一个循环定时器,3秒钟调用一次moveBox函数,就可以实现自动翻页。

 

 1             // 功能:将obj按照指定速度移动到目标位置
 2             // speed始终为正
 3             function moveBox(obj,attr,target,speed,callback){
 4                 // 对于同一个属性,开启定时器之前应该结束旧的定时器,否则就会越来越快
 5                 clearInterval(obj.timer);
 6                 
 7                 var old_value = parseInt(obj.css(attr));
 8                 if(old_value > target){
 9                     // 往反方向移动
10                     speed = -speed;
11                 }
12                 console.log(target);
13                 obj.timer = setInterval(function(){
14                     old_value = parseInt(obj.css(attr));
15                     var new_value = old_value + speed;
16                     if(speed > 0 && new_value > target || speed < 0 && new_value < target)
17                     {
18                         // 当超出目标位置,要回正
19                         new_value = target;
20                     }
21                     obj.css(attr,new_value);
22                     if(new_value == target){
23                         // 到达目标位置要做的事
24                         // 结束定时器,查看是否有回调函数,有就调用
25                         clearInterval(obj.timer);
26                         callback && callback();
27                     }
28                 },30)
29             }            
moveBox

设置一个全局变量index,记录翻页的索引值,用于计算目标位置,设置对应的点点背景色变化

3.2点点背景变化

思路:通过index找到对应的点点,设置背景色。先全部设为红色,再把index对应的点设为灰色。当index=3时,应该用css把left设置为0,同时把index设为0.

        function setColor(){
            //    当翻到了第四张图,用css改left为0,index为0
            console.log(index);
                if(index >= $img_List.length - 1){
                    $('.img_List').css('left',0);
                    index = 0;
                }
                // 设置点点背景变色
                for(var i=0;i<$img_List.length;i++){
                    $(a[i]).css('background','rgba(228, 18, 18, 0.918)');
                }
                $(a[index]).css('background','rgba(75, 70, 70, 0.623)');
           }
setColor

3.3手动点击点点进行翻页

思路:为每个点点(a标签)绑定一个点击事件,当点击事件发生,结束autoChange的定时器timer(所以这个定时器应该是一个全局变量),调用moveBox移动到对应的页面。

调用完毕后重新开启timer进行自动翻页。

tip:可以在一开始为每个a标签设置num属性,记录a的index,这样在点击事件发生时,就可以通过this.num获得被点击的a标签的index。

        // 监听点点是否被点击
        a.click(function(){
            index = this.num;
            clearInterval(timer);
            setColor();
            moveBox($('.img_List'),'left',-$('.outer').innerWidth()*index,50,setColor);
            autoChange();
            
        })
View Code

 

四:总体流程

1.设置ul宽度随着图片数量动态增加

2.设置navDiv随着a标签(点点)个数动态水平居中

3.设置全局变量index、timer

4.为a标签添加num属性

5.为navDiv设置初始颜色:第一个灰色,后面的都是红色

6.开启autoChange

全部代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../reset.css">
    <script src="../jquery-3.0.0.js"></script>
    <style>
        .outer{
            width: 400px;
            height: 300px;
            margin: 100px auto;
            padding: 10px 0;
            background-color: turquoise;
            position: relative;
            overflow: hidden;
        } 
        .img_List{
            position: absolute;
            left: 0;
        }
        .img_List li{
            /* 改变对齐方式 */
            line-height: 0;
            float: left;
            margin: 0 10px;
        }
        .navDiv{
            position: absolute;
            bottom: 20px;
        }
        .navDiv a{
            width: 15px;
            height: 15px;
            float: left;
            background-color: rgba(228, 18, 18, 0.918);
            margin: 0 5px;
        }
    </style>
    <script>
        $(function(){
            // 1.依据图片数量动态设置ul的宽度
            var $img_List = $('.img_List li');
            var len = $img_List.length;
            var ul_width = len * 400;
            $('.img_List').css('width',ul_width);

            // 2.依据a标签个数动态设置div居中
            var a = $('.navDiv a');
            var div_width = a.length * 25;
            var div_left = (400 - div_width)/2
            $('.navDiv').css('left',div_left);
            
            // 给标签添加num属性
            for(var x = 0; x < a.length;x++){
                a[x].num = x;
            }

            var index = 0;
            var timer;//自动切换用的定时器,手动切换时,要先关闭这个定时器,手动切换完再开始
            // 2.1设置点点初始背景色
            $(a[index]).css('background', 'rgba(75, 70, 70, 0.623)');
            // 开启自动翻页
            autoChange();
            
            // 3.设置自动翻页
            // 3.1 设置翻页函数
            // 功能:将obj按照指定速度移动到目标位置
            // speed始终为正
            function moveBox(obj,attr,target,speed,callback){
                // 对于同一个属性,开启定时器之前应该结束旧的定时器,否则就会越来越快
                clearInterval(obj.timer);
                
                var old_value = parseInt(obj.css(attr));
                if(old_value > target){
                    // 往反方向移动
                    speed = -speed;
                }
                console.log(target);
                obj.timer = setInterval(function(){
                    old_value = parseInt(obj.css(attr));
                    var new_value = old_value + speed;
                    if(speed > 0 && new_value > target || speed < 0 && new_value < target)
                    {
                        // 当超出目标位置,要回正
                        new_value = target;
                    }
                    obj.css(attr,new_value);
                    if(new_value == target){
                        // 到达目标位置要做的事
                        // 结束定时器,查看是否有回调函数,有就调用
                        clearInterval(obj.timer);
                        callback && callback();
                    }
                },30)
            }
            // 3.2设置自动翻页函数
            function autoChange(){   
                timer = setInterval(function(){
                    index++;
                    index %= $img_List.length;//index:0,1,2,3
                    moveBox($('.img_List'),'left',-$('.outer').innerWidth()*index,50,setColor)
                },3000)
            }
            // 3.2要保证点点和翻页同步
            /* 
                设置一个全局变量index,用于控制翻的是哪一页,和点亮哪一个点点
                并且判断是否翻页到了第一张图的副本页,如果是,用css改成第一页
            */

           function setColor(){
            //    当翻到了第四张图,用css改left为0,index为0
            console.log(index);
                if(index >= $img_List.length - 1){
                    $('.img_List').css('left',0);
                    index = 0;
                }
                // 设置点点背景变色
                for(var i=0;i<$img_List.length;i++){
                    $(a[i]).css('background','rgba(228, 18, 18, 0.918)');
                }
                $(a[index]).css('background','rgba(75, 70, 70, 0.623)');
           }
        //    3.3.手动点击点点翻页
        // 监听点点是否被点击
        a.click(function(){
            index = this.num;
            clearInterval(timer);
            setColor();
            moveBox($('.img_List'),'left',-$('.outer').innerWidth()*index,50,setColor);
            autoChange();
            
        })

        })
    </script>
</head>
<body>
    <div class="outer">
        <ul class="img_List">
            <li>
                <img src="../pic/3.jpg" alt="">
            </li>
            <li>
                <img src="../pic/4.jpg" alt="">
            </li>
            <li>
                <img src="../pic/5.jpg" alt="">
            </li>
            <li>
                <img src="../pic/3.jpg" alt="">
            </li>
        </ul>
        <div class="navDiv">
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
        </div>
    </div>
</body>
</html>
allCode

 

posted @ 2021-04-07 17:08  Pig2pignb  阅读(406)  评论(0)    收藏  举报