利用jQuery实现图片轮播


需求

在设置好html结构和css样式之后,利用jQuery实现轮播图效果。
初始结构和样式代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
    <!--清除浏览器默认样式-->
    <link rel="stylesheet" type="text/css" href="../重置样式表/reset.css"/>
    <style type="text/css">
        /*设置外部容器*/
        #container {
            /*外部容器刚好放下一个图片*/
            width: 600px;
            height: 400px;
            overflow: hidden;
            position: relative;/*相对定位*/
            margin: 20px auto;
        }

        /*设置图片容器*/
        #imgList {
            width: 4200px; /*7张图片的宽: 7*600 */
            height: 400px;
            position: absolute; /*绝对定位*/
            z-index: 1;

        }
        /*设置所有的图片<img>*/
        #imgList img {
            float: left;/*浮在左侧*/
        }

        /*设置所有小圆点容器<div>*/
        #pointsDiv {
            position: absolute;
            height: 12px;
            /*width: 100px;!*可以在js中设置*!*/
            z-index: 2;
            bottom: 20px;
            /*left: 250px;!*在js中设置居中*!*/
        }
        /*设置所有小圆点的样式*/
        #pointsDiv span {
            cursor: pointer;/*设置鼠标移动到元素边界范围内时显示的光标样式,pointer表示指示链接的指针(一只小手)*/
            float: left;
            border: 1px solid #fff;
            width: 10px;
            height: 10px;
            border-radius: 50%;
            background: #333;
            opacity: 0.7;
            margin: 0 3px;
        }

        /*设置第一个小圆点的默认样式*/
        #pointsDiv .on {
            background: orangered;
        }
        /*设置切换按钮*/
        .arrow {
            cursor: pointer;/*设置鼠标移动到元素边界范围内时显示的光标样式,pointer表示指示链接的指针(一只小手)*/
            display: none;
            line-height: 39px;
            text-align: center;
            font-size: 36px;
            font-weight: bold;
            width: 40px;
            height: 40px;
            position: absolute;
            z-index: 2;
            top: 180px;
            background-color: RGBA(0, 0, 0, 0.3);
            color: #fff;
            /*去除超链接下划线*/
            text-decoration: none;
        }
        /*鼠标移到切换按钮上时*/
        .arrow:hover {
            background-color: RGBA(0, 0, 0, 0.7);
        }
        /*鼠标移到整个div区域时使切换按钮显示*/
        #container:hover .arrow {
            display: block;/*显示*/
        }
        /*上一个切换图标的左外边距*/
        #prev {
            left: 20px;
        }
        /*下一个切换图标的右外边距*/
        #next {
            right: 20px;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="imgList" style="left: -600px">
            <img src="img/1.jpg" alt="1" />
            <img src="img/2.jpg" alt="2" />
            <img src="img/3.jpg" alt="3" />
            <img src="img/4.jpg" alt="4" />
            <img src="img/5.jpg" alt="5" />
        </div>
        <div id="pointsDiv">
            <span index="1" class="on"></span>
            <span index="2"></span>
            <span index="3"></span>
            <span index="4"></span>
            <span index="5"></span>
        </div>
        <a href="javascript:;" id="prev" class="arrow">&lt;</a>
        <a href="javascript:;" id="next" class="arrow">&gt;</a>
    </div>

</body>
</html>

实现步骤

首先,需要引入jQuery文件,此次练习可以分为六个主要步骤:

一、获取相关对象

  1. 获取外部容器container
  2. 获取图片容器imgList
  3. 获取小圆点容器pointsDiv
  4. 获取所有小圆点集合points
  5. 获取前后切换按钮prev和next

二、设置切换按钮

  1. 首先我们需要定义每次翻页时图片容器需要移动的偏移量,常量PAGE_WIDTH,等于每个图片的宽度。
  2. 定义每次动画执行的总时间time和动画的每帧移动的单位时间itemTime,得到总帧数。
  3. 定义动画执行的标识变量isMoving,用于判断动画是否正在执行,初始值为false。
  4. 创建图片切换函数nextPage,形参为布尔值next。
  5. 在函数开始时,根据isMoving的值判断当前是否正在执行图片切换,如果正在执行,就直接return退出当次函数调用,如果没有执行,则修改isMoving为true。
  6. 定义图片容器需要移动的总偏移量offset,总偏移量根据函数的实参判断向前切换图片还是向后切换,向前为正的PAGE_WIDTH,向后为负的PAGE_WIDTH,总偏移量/总帧数=单位偏移量itemOffset
  7. 获取当前图片容器的left值,等到图片容器移动的目标位置,targetLeft=left+offset
  8. 创建定时器,在定时器中修改图片容器的left值,left+=itemOffset
  9. 判断是否到达目标位置,left==targetLeft,如果到达目标位置,关闭定时器,标志着动画执行完毕,此时再改回isMoving的值为false
  10. 如果没有到达目标位置,在单位时间内移动图片容器
  11. 在按钮的click时间回调函数中调用nextPage()函数

三、设置图片首尾相接效果

  1. 为实现首尾相接的效果,在第一张图片前添加第五张图片,在第五张图片后添加第一张图片,且将图片容器的初始化left值设置为-600px,修改图片容器的宽度
  2. 修改页面切换函数nextPage(),在每一次图片切换动画完成后,判断是否已经到达第一张/最后一张图片。left0或left-600*(真正的图片个数+1),真正的图片个数=小圆点个数
  3. 在移动到(假的)第一张/最后一张图片的动画完成后,瞬间修改图片容器的left值,使其修正到真正的第一张/最后一张图片。left=-600或left=-600*真正的图片个数

四、随图片切换更新小圆点

  1. 定义前一个显示的小圆点的索引oldIndex,初始值默认为0
  2. 创建updatePoint()函数用于更新小圆点,参数为布尔值,并在页面切换的函数中调用。
  3. 计算当前应该显示的小圆点的索引值。
  4. 判断当前小圆点索引值是否越界(index>小圆点数量-1或index<0),相应修改index为正确的值。
  5. 移除前一个显示的小圆点的class属性值“on”
  6. 为当前应该显示的小圆点添加class属性值“on”
  7. 更新oldIndex的值

五、点击小圆点切换图片

  1. 修改nextPage()函数,根据形参类型判断总偏移量offset的值,如果参数是布尔值,原offset不变,如果参数是数值,offset=-PAGE_WIDTH*(当前索引值-前一个显示的小圆点的索引值)。
  2. 修改小圆点更新函数updatePoint(),根据形参判断当前应该显示的小圆点的索引值index,如果参数是布尔值,原index值不变,如果是数值,是index=当前点击的小圆点的索引值。
  3. 在小圆点的click事件的回调函数中调用nextPage()函数,传入当前小圆点的索引值。

六、鼠标无操作时图片自动轮播

  1. 创建定时器,在定时器的回调函数中调用页面切换函数naxtPage(),传入参数true。
  2. 为外部容器绑定hover事件,鼠标移入时,关闭自动翻页定时器,鼠标移出时开启自动翻页定时器。

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
    <!--清除浏览器默认样式-->
    <link rel="stylesheet" type="text/css" href="../重置样式表/reset.css"/>
    <style type="text/css">
        /*设置外部容器*/
        #container {
            /*外部容器刚好放下一个图片*/
            width: 600px;
            height: 400px;
            overflow: hidden;
            position: relative;/*相对定位*/
            margin: 20px auto;
        }

        /*设置图片容器*/
        #imgList {
            width: 4200px; /*7张图片的宽: 7*600 */
            height: 400px;
            position: absolute; /*绝对定位*/
            z-index: 1;

        }
        /*设置所有的图片<img>*/
        #imgList img {
            float: left;/*浮在左侧*/
        }

        /*设置所有小圆点容器<div>*/
        #pointsDiv {
            position: absolute;
            height: 12px;
            /*width: 100px;!*在js中设置*!*/
            z-index: 2;
            bottom: 20px;
            /*left: 250px;!*在js中设置居中*!*/
        }
        /*设置所有小圆点的样式*/
        #pointsDiv span {
            cursor: pointer;/*设置鼠标移动到元素边界范围内时显示的光标样式,pointer表示指示链接的指针(一只小手)*/
            float: left;
            border: 1px solid #fff;
            width: 10px;
            height: 10px;
            border-radius: 50%;
            background: #333;
            opacity: 0.7;
            margin: 0 3px;
        }

        /*设置第一个小圆点的默认样式*/
        #pointsDiv .on {
            background: orangered;
        }
        /*设置切换按钮*/
        .arrow {
            cursor: pointer;/*设置鼠标移动到元素边界范围内时显示的光标样式,pointer表示指示链接的指针(一只小手)*/
            display: none;
            line-height: 39px;
            text-align: center;
            font-size: 36px;
            font-weight: bold;
            width: 40px;
            height: 40px;
            position: absolute;
            z-index: 2;
            top: 180px;
            background-color: RGBA(0, 0, 0, 0.3);
            color: #fff;
            /*去除超链接下划线*/
            text-decoration: none;
        }
        /*鼠标移到切换按钮上时*/
        .arrow:hover {
            background-color: RGBA(0, 0, 0, 0.7);
        }
        /*鼠标移到整个div区域时使切换按钮显示*/
        #container:hover .arrow {
            display: block;/*显示*/
        }
        /*上一个切换图标的左外边距*/
        #prev {
            left: 20px;
        }
        /*下一个切换图标的右外边距*/
        #next {
            right: 20px;
        }
    </style>
    <!--引入jQuery-->
    <script type="text/javascript" src="../jquery/jquery-1.10.1.js"></script>
    <script type="text/javascript">
        $(function (){
            /*
            * 1. 获取对象
            * */
            //获取外部容器
            var $container=$("#container");
            //获取图片容器
            var $imgList=$("#imgList");
            //获取所有小圆点
            var $points=$("#pointsDiv span");
            //获取切换按钮
            var $prev=$("#prev");
            var $next=$("#next");
            /*
            * 设置所有小圆点容器的宽度
            * */
            //获取小圆点容器
            var $pointsDiv=$("#pointsDiv");
            //设置小圆点容器的宽度,18=border*2+margine*2+width
            $pointsDiv.width(18*$points.length);
            //设置小圆点容器居中
            $pointsDiv.css("left",($container.width()-$pointsDiv.width())/2);
            /*
            * 设置前后切换按钮
            * */
            //定义每次翻页的偏移量,常量,值为图片宽度600
            var PAGE_WIDTH=600;
            //定义每次动画执行的总时间
            var time=400;
            //定义动画的每帧移动的单位时间
            var itemTime=10;
            //创建翻页切换函数nextPage()
            //在按钮的回调函数中调用nextPage()
            $prev.click(function (){
                nextPage(false);
            });
            $next.click(function (){
                nextPage(true);
            });
            /*
            * 小圆点切换图片
            * */
            $points.click(function(){
                nextPage($(this).index());
                //修改nextPage()函数
                //修改updatePoint()函数
            });
            /*
            * 图片自动轮播
            * */
            //创建自动轮播定时器
            var autoPlay=setInterval(function(){
                //调用页面切换函数
                nextPage(true);
            },3000);
            //为整个外部容器绑定鼠标移入/移出事件
            $container.hover(function(){
                //鼠标移入,关闭自动轮播定时器
                clearInterval(autoPlay);
            },function(){
                //鼠标移出,重新开启自动轮播定时器
                autoPlay=setInterval(function(){
                    nextPage(true);
                },3000);
            });


            /*
            * 创建翻页切换函数nextPage()
            * */
            //定义标识变量,用于记录动画是否还执行中
            var isMoving=false;
            function nextPage(next){
                //判断翻页动画是否正在执行
                if(isMoving){
                    //退出
                    return;
                }
                //翻页动画开始执行时,修改ismoving的值为true
                isMoving=true;
                //判断总偏移量offset
                //判断参数类型
                if(typeof next=="boolean"){
                    var offset=next?-PAGE_WIDTH:PAGE_WIDTH;
                }else{
                    var offset=-PAGE_WIDTH*(next-oldIdex);
                }
                //定义单位偏移量
                var itemOffset=offset/(time/itemTime);
                //获取当前图片容器的left值
                var left=$imgList.position().left;
                //目标位置left值targetLeft
                var targetLeft=left+offset;
                //创建定时器
                var timer=setInterval(function(){
                    //修改图片容器的left值
                    left+=itemOffset;
                    //判断是否到达目标位置
                    if(left==targetLeft){
                        clearInterval(timer);
                        //翻页动画执行完毕,修改isMoving的值为false
                        isMoving=false;
                        /*
                        * 图片首尾相接
                        * */
                        //判断是否已经移动到(假的)第一张/最后一张
                        //是否移动到假的最后一张?left==0
                        if (left==0){
                            //到达假的最后一张,修正left值,left=-PAGE_WIDTH*真正的图片个数(小圆点个数)
                            left=-PAGE_WIDTH*$points.length;
                        }else if(left==(-600*($points.length+1))){
                            //到达假的第一张,修正left值,left=-PAGE_WIDTH
                            left=-PAGE_WIDTH;
                        }
                    }
                    //移动图片容器
                    $imgList.css("left",left);
                },itemTime);
                /*
                * 更新小圆点
                * */
                //创建小圆点更新函数updatePoint()
                //每次翻页动画执行完毕后调用小圆点跟新函数updatePoint()
                updatePoint(next);
            }
            /*
            * 创建小圆点更新函数updatePoint()
            * */
            //定义前一个显示的小圆点的索引oldIndex,初始值默认为0
            var oldIdex=0;
            function updatePoint(next){
                //计算当前应该显示的小圆点的索引
                //判断参数类型
                if(typeof next=="boolean"){
                    index=next?oldIdex+1:oldIdex-1;
                }else{
                    index=next;
                }
                //判断当前小圆点是否是最后一个/第一个(小圆点索引值边界判断)
                if(index>$points.length-1){
                    //应该显示第一个
                    index=0;
                }else if(index<0){
                    //应该显示最后一个
                    index=$points.length-1;
                }
                //移除前一个显示的小圆点的class属性值“on”
                $points[oldIdex].className="";
                //为当前应该显示的小圆点添加class属性值“on”
                $points[index].className="on";
                //更新前一个显示的小圆点的索引
                oldIdex=index;
            }
        });
    </script>
</head>
<body>
    <div id="container">
        <div id="imgList" style="left: -600px">
            <img src="img/5.jpg" alt="5" />
            <img src="img/1.jpg" alt="1" />
            <img src="img/2.jpg" alt="2" />
            <img src="img/3.jpg" alt="3" />
            <img src="img/4.jpg" alt="4" />
            <img src="img/5.jpg" alt="5" />
            <img src="img/1.jpg" alt="1" />
        </div>
        <div id="pointsDiv">
            <span index="1" class="on"></span>
            <span index="2"></span>
            <span index="3"></span>
            <span index="4"></span>
            <span index="5"></span>
        </div>
        <a href="javascript:;" id="prev" class="arrow">&lt;</a>
        <a href="javascript:;" id="next" class="arrow">&gt;</a>
    </div>

</body>
</html>

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值