zoukankan      html  css  js  c++  java
  • js 轮播原理 实现过程

    1.基础知识(应用到的基础知识)

    (1)基础

    ①js 函数嵌套,模块化,全局变量,局部变量(查看其它随笔)className属性,onmouseover当鼠标移入元素,onmouseout当鼠标在元素以外,setinterval()定时器,clearInterval清除定时器,

    ②css 定位下的left,top,right,bottom遵循原则(其它随笔),background注意事项,

    2.使用数组的添加和删除,实现方框位置的替换

    (1)数组的添加,修改元素

    ①js 代码实现 (实现原理:通过获取页面的元素,将其添加到数组中,点击按钮 数组的进行顺时针旋转)

            <script>
                window.onload = function(){
                    var oDiv = document.getElementById('div1');
                    var oInput = document.getElementById('input1');
                    
                    oInput.onclick = function(){
                        var arr=oDiv.innerHTML.split(','); //将页面的元素用逗号隔开的数组(这里需要注意div中用什么隔开,split中就必须用什么符号组成数组)
                        arr.push(arr[0]); //将第一个元素添加到数组最后面
                        arr.shift(arr);  //将第一个元素删除
                        oDiv.innerHTML=arr;
                        
    
                    }
                }
            </script>

    ②html 页面

    <body>
            <div id="div1">1,2,3,4</div>
            <input type="button"id="input1" value="切换" />
        </body>

    ③ui 效果图 

    (2)通过上面的例子实现下面的简易轮播

    ①js 代码(实现原理:由上可知,添加上了一个时间定时器,点击按钮将图片顺时针,逆时针转动)

    <script type="text/javascript">
                window.onload=function(){
                var oInput = document.getElementsByTagName('input');
                var oDiv   = document.getElementsByTagName('div');
                
                var arr=[];
                for(var i=0;i<oDiv.length;i++){
                    //使用getStyle函数获取内联样式中的left,top,保存为二维函数
                    arr.push( [getStyle(oDiv[i],'left'),getStyle(oDiv[i],'top')]);
                    
                }
                //点击右按钮图片向右面转换
                oInput[1].onclick = function(){
                    //将arr[0]添加到函数的最后面,将函数的第一个元素删除
                    arr.push(arr[0]);
                    arr.shift();
                    
                    for (var i=0;i<oDiv.length;i++) { //遍历去arr这个二维数组的值,对应left,top
                        oDiv[i].style.left = arr[i][0]; 
                        oDiv[i].style.top = arr[i][1];
                    }
                }
                //点击左按钮图片向左面转换 
                oInput[0].onclick = function(){
                    //在数组头部添加一个元素,删除数组最后一个元素
                    arr.unshift(arr[arr.length-1]);
                    arr.pop();
                    
                    for (var i=0;i<oDiv.length;i++) {//遍历去arr这个二维数组的值,对应left,top
                        oDiv[i].style.left = arr[i][0];
                        oDiv[i].style.top = arr[i][1];
                    }
                    console.log(arr);
                }
                //每隔五秒图片移动一下
                function changeStyle(){
                    
                    arr.push(arr[0]);
                    arr.shift();
                    for(var i=0;i<oDiv.length;i++){
                        oDiv[i].style.left = arr[i][0];
                        oDiv[i].style.top = arr[i][1];
                    }
                        
                }
                setInterval(changeStyle,1000);
                //getStyle函数是js的style属性可以获得html标签的样式,但是不能获取非行间样式。obj表示那个元素,attr表示那个样式
                function getStyle(obj,attr){ //定义getStyle方法,否者未定义
                    if(obj.currentStyle){//ie下
                        return obj.currentStyle[attr];
                    }else{//ff下
                        return getComputedStyle(obj,false)[attr];
                    }
                }
                }
            </script>

    ② html 页面 

    <body>
       <input type="button" value="←" />
       <input type="button" value="→" />
       <div class="box1"></div>
       <div class="box2"></div>
       <div class="box3"></div>
    </body>

    ③ css 样式

    <style>
        body{
                position: relative;
           }
          .box1{
                height: 100px;width: 100px;background-image: url(../../img/1.jpeg);position:absolute;top: 100px;left: 100px;
           }
          .box2{
                height: 100px;width: 100px;background-image: url(../../css3/images/1.jpg);position:absolute;top: 80px;left: 220px;
           }
           .box3{
                 height: 100px;width: 100px;background-image: url(../../css3/images/2.jpg);position:absolute;top: 100px;left:340px;
          }
    </style>

    ④ ui  显示效果

    3.实现完美轮播

    ①实现原理:

    a、实现鼠标进入后离开图片开始轮播,触发事件main.onmouseover,main.onmouseout

    b、给每个span赋予一个id使,通过id对应图片,实现点击span图片转换

    c、点击左右按钮实现图片左移动,右移动

    实现步骤:a.创建函数slideImg函数(判断鼠标移入,移除)  b.创建changImg(点击圆点切换图片,以及方向键切换图片) c.点击右,左切换图片 d.index(全局变量) 和 i(局部变量) 变量,正好数值错开,才能使用以下代码切换样式,以至于图片的改变

    for(var i=0;i<oDivLength;i++){
    oDiv[i].style.display="none";
    oSpan[i].className ="";
    }
    oDiv[index].style.display="block";
    oSpan[index].className ="active";

    ② js 代码

    //封装一个getElementById的方法
    function byId(id){
        return typeof(id) === "string"?document.getElementById(id):id;
    }
    
    //图片轮播
    var index = 0,  //看图片轮播到哪里
     timer = null, //添加定时器
     oDiv = byId('banner').getElementsByTagName('div'),  //获取图片div
     oDivLength = oDiv.length,//获取图片个数
     oSpan = byId('dots').getElementsByTagName('span'),
     next = byId('next'),
     prev =byId('prev');
    console.log(prev);
    
    function slideImg(){
        var main = byId('main');  //获取外框
        //滑过清除定时器,离开定时器继续
        main.onmouseover = function(){
            //滑过清除定时器
            if(timer) clearInterval(timer) //清除轮播
        }
        main.onmouseout = function(){ //事件
            //离开定时器开始
            timer = setInterval(function(){
                index++;//获取当前图片的下标
                if(index >= oDivLength){
                    index=0;
                }
                changeImg(); //图片属性改变显示其他图片
            },2000)
        }
        //自动main上触发鼠标离开事件
        main.onmouseout();    //方法
        
        //遍历所有点击,需要绑定点击事件,点击圆点切换图片
        for( var d=0;d<oDivLength;d++){
            //给所有span添加一个id的属性,值为d,作为当前span的索引
            oSpan[d].id = d;
            oSpan[d].onclick = function(){
                //改变index为当前span的索引
                //alert(this.id);
                index = this.id;
                //实现按钮active 改变this.className = "active"; 但是不写在这
                
                //调用changeImg,实现图片切换
                changeImg()
            }
        }
        
    }
    
      // 下一张
        next.onclick = function(){
           index++;
           if(index>=oDivLength) index=0;
           changeImg();
        }
    
        // 上一张
        prev.onclick = function(){
           index--;
           if(index<0) index=oDivLength-1;
           changeImg();
        }
    
    
    function changeImg(){
        //遍历banner下所有div,以及dots下所有的span,将div其隐藏,将span清除类active(解决图片轮播一遍后,不会轮播第二遍)
        for(var i=0;i<oDivLength;i++){
            oDiv[i].style.display="none";
            oSpan[i].className = "";
        }
        //通过display:block切换图片,和当前span,activ将其显示出来
        oDiv[index].style.display="block";
        oSpan[index].className ="active";
    }
    slideImg();

    ③html 代码

    <div class="main" id="main">
                <div class="banner" id="banner">
                    <a href="#">
                        <div class="banner-slide slide1 slide-active"></div>
                    </a>
                    <a href="#">
                        <div class="banner-slide slide2"></div>
                    </a>
                    <a href="#">
                        <div class="banner-slide slide3"></div>
                    </a>
                </div>
                <!--上一张图 下一张图-->
                <a href="javascript:void(0)" class="button prev" id="prev"></a>
                <a href="javascript:void(0)" class="button next" id="next"></a>
                <!--圆点导航-->
                <div class="dots" id="dots">
                    <span class="active"></span>
                    <span></span>
                    <span></span>
                </div>
            </div>

    ④ css  代码(实现原理:通过定位将图片全部覆盖,并设置单独属性display:none实现图片隐藏,后序通过改变display的值,实现图片切换)

            <style>
                *{
                    margin: 0;
                    padding: 0;
                    
                }
                ul{
                    list-style: none;
                }
                body{
                    font-family: "微软雅黑";
                    color: #CCCCCC;
                }
                .main{
                    height: 460px;
                    width: 1200px;
                    margin: 30px auto;
                    overflow: hidden;
                    position:relative;/*左右按钮相对定位*/
                }
                .banner{
                    height: 460px;
                    width: 1200px;
                    overflow: hidden;
                    position: relative; /*图片相对定位*/
                }
                .banner-slide{
                    height: 460px;
                    width: 1200px;
                    position: absolute;
                    background-repeat: no-repeat;
                    display: none;
                }
                .slide1{
                    background-image: url(img/21557.png);
                    background-size: 100% 100%;
                    
                }
                .slide2{
                    background-image: url(img/31145.png);
                    background-size: 100% 100%;
                }
                .slide3{
                    background-image: url(img/卷毛.jpg);
                    background-size: 100% 100%;
                }
                .slide-active{
                    display: block;
                }
                /*按钮区域*/
                .button{
                    position: absolute;
                    left: 0px;
                    top: 50%;
                    margin-top: -40px;
                    background: url(img/arrow.png) no-repeat center center;
                    width: 40px;
                    height: 80px;
                }
                .button:hover{
                    /*background: #CCCCCC;*/
                    background-color: #333333;/*使用时需要注意background以及bakcgorund-color*/
                    opacity: 0.8;
                    filter: alpha(opacity-80);/*为了浏览器兼容*/
                }
                .prev{
                    transform: rotate(180deg);
                }
                .next{
                    left:auto;
                    right: 0;
                }
                /*圆点属性*/
                .dots{
                    position: absolute;
                    right: 0;
                    bottom: 24px;
                    text-align: right;
                }
                .dots span{
                    display: inline-block;
                    height: 12px;
                    width: 12px;
                    line-height: 12px;/*居中对齐*/
                    border-radius: 50%;
                    background:rgba(7,17,27,0.4);
                    box-shadow: 0 0 0 2px rgba(255,255,255,0.8);
                    margin-left: 8px;
                    cursor: pointer;
                }
                .dots span.active{
                    box-shadow: 0 0 0 2px rgba(7,17,27,0.4) inset;
                    background: #fff;
                }
            </style>

    ⑤ 效果图实现

    ①②③④⑤⑥⑦⑧

  • 相关阅读:
    vue开发环境搭建
    超出宽度省略号,css解决办法
    css平板手机pc媒体查询
    pc和移动端调用qq聊天
    fiddeler 抓包工具的配置使用
    给证件照换背景颜色
    markman高效的设计稿标注、测量工具
    画三角形和直角三角形
    vue中使用Ueditor编辑器 -- 1
    js获取浏览器缩放比例
  • 原文地址:https://www.cnblogs.com/520Girl/p/10061660.html
Copyright © 2011-2022 走看看