2021-05-10

JavaScript实现轮播图

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <!--引入图标字体-->
        <link rel="stylesheet" type="text/css" href="fa/css/all.css"/>
        <script src="js/tool.js" type="text/javascript" charset="utf-8"></script>
        <style type="text/css">
            /*
             * 清除默认外边距、内边距
             */
            * {
                margin: 0;
                padding: 0;
            }
            /*
             * 设置div的样式
             */
            .contain {
                width: 730px;
                height: 454px;
                background-color: #999;
                margin: 50px auto;
                position: relative;
                /*
                 * 裁剪多余的内容
                 */
                overflow: hidden;
            }
            ul li {
                list-style: none;
            }
            
            .arrow_Left {
                width: 30px;
                height: 50px;
                background-color: rgba(0,0,0,0.2);
                position: absolute;
                top: 0;
                bottom: 0;
                margin: auto 0;
                text-align: center;
                z-index: 2;
                /*
                 * 让箭头默认隐藏
                 */
                display: none;
            }
            .arrow_Left i{
                font-size: 24px;
                /*
                 * 方法一:
                 * 设置行高
                 * line-height: 50px
                 */
                line-height: 50px;
                /*display: block;
                margin-top: 5px;*/
                /*
                 * 方法二:
                 * 通过设置外边距
                 * margin-top: 13px;
                 */
                
            }
            .arrow_Right {
                width: 30px;
                height: 50px;
                background-color:rgba(0,0,0,0.2);
                margin: auto 0;
                right: 0;
                bottom: 0;
                top: 0;
                position: absolute;
                text-align: center;
                /*
                 * 设置箭头样式
                 */
                font-size: 24px;
                line-height: 50px;
                z-index: 2;
                /*
                 * 让箭头默认隐藏
                 */
                display: none;
            }
            /*
             * 设置小圆圈
             */
            
            .circle {
                height: 20px;
                width: 730px;
                position: absolute;
                bottom: 30px;
                z-index: 2;
            }
            
            
            ol {
                list-style: none;
                margin: 0 auto;
                width: 400px;
                height: 20px;
                
                
            }
            /*
             * 设置小圆圈样式
             */
            ol li {
                float: left;
                height: 20px;
                width: 20px;
                border-radius: 50%;
                background-color: #999;
                border: 1px solid rgba(0,0,0,.05);
                margin-right: 20px;
            }
            
            /*
             * 设置ul宽度,使其可以容纳图片,左右滑入滑出
             */
            
            ul {
                width: 4380px;
                position: absolute;
            }
            /*
             * 设置li左浮动,排列在一行
             */
            ul li {
                float: left;
            }
            /*
             * 设置图片宽高
             */
            ul li img {
                width: 730px;
                height: 454px;
            }
            
        </style>
        <script type="text/javascript">
            
        </script>
    </head>
    <body>
        <!--搭建页面结构-->
        <!--用于显示轮播图的div-->
        <div class="contain"> 
            <!--左箭头-->
            <div class="arrow_Left">
                <i class="fa fa-arrow-left"></i>
            </div>
            <!--右箭头-->
            <div class="arrow_Right fa fa-arrow-right">
                
            </div>
            <!--用于容纳动态小圆圈的ol-->
            <div class="circle">
                <ol>
                    
                </ol>
            </div>
            <!--创建ul用于进行图片的 滑动效果-->
            <ul id="clone">
                <li>
                    <img src="images/adver01.jpg"/>
                </li>
                <li>
                    <img src="images/adver02.jpg"/>
                </li>
                <li>
                    <img src="images/adver03.jpg"/>
                </li>
                <li>
                    <img src="images/adver04.jpg"/>
                </li>
                <li>
                    <img src="images/adver05.jpg"/>
                </li>
                <li>
                    <img src="images/adver06.jpg"/>
                </li>
            </ul>
        </div>
        
        <script type="text/javascript">
            //获取外曾容器对象
            var wrapper = document.getElementsByClassName('contain');
            //定义一个开关用于控制点击左侧,右侧按钮时候动画执行完成之后在触发下一次点击事件
            var flage = true;
            //定义circle_num变量记录每个小圆圈的索引值
            var circle_num =0; 
            //定义变量arrow_num与图片数组索引建立联系
            var arrow_num = 0;
            //获取父元素ol
            var ol = document.querySelector('ol');
            //获取图片数量
            var imgs =document.getElementsByTagName('img');
            //创建li元素 循环创建并添加
            for (var i=0;i<imgs.length;i++) {     //动态添加小圆圈
                var li = document.createElement('li');
                //把创建好的子元素添加到父元素中,动态添加
                ol.appendChild(li);
            }
            
              // 获取所有的小圆圈对象
              var circle_alls = ol.children;
              //设置默认显示第一个小圆圈背景颜色
              circle_alls[circle_num].style.backgroundColor = 'rgba(255,255,255,.4)'; 
               //获取左箭头对象
              var arrow_Left = document.getElementsByClassName('arrow_Left');
              //获取右箭头对象
              var arrow_Right = document.getElementsByClassName('arrow_Right');
              //获取ul对象
              var ul = document.querySelector('ul');
              
              //克隆第一个到最后一个
              //注意要用firstElementChild,用firstChild获取到是文本节点哈哈。
              var lilast = document.getElementById("clone").firstElementChild.cloneNode(true);
              //把lilast添加到ul的最后
              ul.appendChild(lilast);
              //获取所有的 li数组,获得其长度length
              var li_lenth = ul.children;
              //动态设置ul的width
              ul.style.width = imgs[0].width * li_lenth.length +'px';
              
            //添加自动轮播特效
            //开启定时器
            var timer = setInterval(function(){
                arrow_Right[0].click()
            },1000)
                  
                 /*
                  * 给右边箭头注册点击事件
                  */  
                   arrow_Right[0].addEventListener('click',function(){
                        if (flage) {
                            flage = false;
                            circle_num++;
                            if(circle_num==6){
                                circle_num=0;
                            }
                            for(var i=0;i<circle_alls.length;i++){
                                circle_alls[i].style.backgroundColor = '#999';
                            }
                            circle_alls[circle_num].style.backgroundColor = 'rgba(255,255,255,.4)';
                            
                  /*
                   * 务必注意不同执行顺序的不同结果
                   * 先加1后在执行
                   * 还是执行了在加一要注意区分
                   */
                  if(arrow_num==6) {
                      ul.style.left = 0 ;
                      arrow_num = 0;
                  }
                  arrow_num++;
                  var target = -arrow_num * imgs[0].width;
                  animation(ul,target,function(){
                      flage = true;
                      });
                  }
              })
               /*
               * 给左边边箭头注册点击事件
               */
              arrow_Left[0].addEventListener('click',function(){
                   if (flage) {
                           //禁用连续点击事件
                           flage = false;
                           arrow_num--;
                          if(arrow_num<0) {
                              ul.style.left = 0 ;
                              arrow_num = 5;
                          }
                          var target = -arrow_num * imgs[0].width;
                          animation(ul,target,function(){
                              //打开开关
                              flage = true;
                          });
                          circle_num--;
                          if (circle_num <0){
                              circle_num = 5
                          }
                          for(var i=0;i<circle_alls.length;i++){
                                circle_alls[i].style.backgroundColor = '#999';
                            }
                            circle_alls[circle_num].style.backgroundColor = 'rgba(255,255,255,.4)';
                          
                      }
              
                       }
                   ) 
                  
                 
                      for (var i= 0 ;i<circle_alls.length;i++){
                    circle_alls[i].num = i;
                    //为每一个小圆圈注册点击事件
                    circle_alls[i].addEventListener('click',function(){
                    flage = true ;
                    arrow_num = this.num ;
                    circle_num = arrow_num
                    var target = -arrow_num * imgs[0].width;
                      animation(ul,target);
                      for(var i=0;i<circle_alls.length;i++){
                                circle_alls[i].style.backgroundColor = '#999';
                            }
                            circle_alls[arrow_num].style.backgroundColor = 'rgba(255,255,255,.4)';
                })
            } 
            
            //鼠标移入时候添加定时器,使得轮播停止
            wrapper[0].addEventListener('mouseenter',function(){
                //注意直接使用arrow_Right会报错,因为,它是返回的数组。直接拿不到值。
                arrow_Right[0].style.display = 'block';
                arrow_Left[0].style.display = 'block';
                clearInterval(timer)
                timer = null;
                
            })
            
            //鼠标移出时候添加定时器,使得轮播继续
            wrapper[0].addEventListener('mouseleave',function(){
                arrow_Right[0].style.display = 'none';
                arrow_Left[0].style.display = 'none';
                timer = setInterval(function(){
                        arrow_Right[0].click()
                    },1000)
            })











//tools.js 文件代码,封装的缓动动画函数

function animation(obj,target,callback) {  //callback接受的是一个函数
                //添加一个清除定时器语句
                clearInterval(obj.timer);
                obj.timer = setInterval(function(){
                    //步长值写到定时器里面,这样每隔一段时间执行定时器,就修改步长值。
                    //var step = (target - obj.offsetLeft) /10;
                    //给步长值向上取整
                    //var step = Math.ceil((target - obj.offsetLeft) /10);
                    //考虑到往后执行动画的情况。
                    /*var step = (target - obj.offsetLeft) /10;
                    step = step>0?Math.ceil(step) : Math.floor(step);*/
                    //var step = Math.ceil((target - obj.offsetLeft) /10) || Math.floor((target - obj.offsetLeft) /10);
                    var step = Math.floor((target - obj.offsetLeft) /10) || Math.ceil((target - obj.offsetLeft) /10);
                    if(obj.offsetLeft == target) {
                        //停止动画效果
                        clearInterval(obj.timer);
                        //回到函数写道定时器里面结束位置,否则就是一个普通函数了
                        //添加回调函数
                        if(callback){
                            callback();
                        }
                    }
                    
            //把每次加1 这个步长改为一个慢慢变小的值  步长公式      (目标值-当前值)/10;
            //把1改为变量step
            //缓动动画步长是变化的
                    obj.style.left = obj.offsetLeft + step + 'px';
                },10)
            }

        </script>
    </body>
</html>



                

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值