Blogger Information
Blog 49
fans 2
comment 1
visits 22218
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
07-14:轮播图幻灯片
子傅
Original
652 people have browsed it

轮播图前期准备工作:

1、HTML元素集合转数组的方法,Array.prototype.slice.call("元素集合")

2、js中自定义属性和原生属性的获取方法,自定义属性以data-为前缀 ,可以obj.dataset 方法获取自定义属性值,

如obj.dataset.id  即可以说的 元素属性名为  data-id 元素的属性值 。

3、js中原生属性的获取方法,对象名后跟对象原生属性即可,如 obj.id  obj.value   

4、obj,getAttribute("属性名") 方式是获取HTML元素属性的通用方法,即可在原生属性上使用,也可在自定义属性上使用。

5、obj.setAttribute(“属性名”,“属性值”)可以用于给HTML元素属性设置新增属性名以及对应的属性值

6、HTML元素的Class样式,既可以通过第 5步讲解的obj.getAttribute( )方法获得,也有更简便快捷的方法获取,推荐更为

简便的获取方法是 obj.classList( )方法,classList 方法可以快速【获取】或者【新增】【更新】【删除】【包含】HTML元素的Class样式值,甚至可以完成两个样式之间的自动切换,具体的使用方法如下:

      <1>获取 obj.classList.value                                   <2>新增 obj,classList.add(“样式名 ")  

     <3>更新  obj.classList.replace("原样式","新样式")  <4>删除 obj.classList.remove("样式名1","样式名N")  

     <5>自动切换  obj.classList.toggle("样式名")           <6>obj.classLst.contadins("样式名")

7、定时器,定时器分为一次性定时器设置和多次定时器设置,一次性定时器为 setTimeout("参数或JS函数","等待时长,毫秒)

多次定时器 setInterval()

8、一次性定时器的应用,3秒后跳转 setTimeout(function(){ location.assign("http://www.baidu.com") },3000),说明:assign( )加载一个新的文档。

9、多次定时器,又称间歇性定时器,使用中可关闭打开,样例,

btn_play.addEventListener("click",play,false);
function play(){
   timer = setInterval(function(){
   var index =  Math.ceil(Math.random()*3);
   img.src="./images/banner"+index+".jpg";
   console.log(img.src);
   },1000);
}

10、定时器的终止和取消,一次性定时器取消 clearTimeoue("定时器名")  间歇定时器取消  clearInterval("定时器名")

11、事件模拟器,是指由机器或者系统模拟人操作行为,触发事件的执行。常见的使用步骤分两步,1.事件生成 2.分配事件

12、事件模拟的样例:广告点击,影响收入

var div = document.getElementsByTagName("div").item(0);
var span =document.getElementsByTagName("span").item(1);
var num = 0 ;
var price = 0.5;
//事件模拟
var click =new Event("click");
   setInterval(function(){
   div.dispatchEvent(click); //广告联盟div发生点击事件
   num +=1;
   console.log(num);
   span.innerHTML = "广告收入:"+"<span style='color:red;'>"+price*num+"元</span>"
},1000)

13、轮播图效果的规划<1>梳理逻辑流程,<2>确定实现方法 <3>拓展新方法使用可能

14、涉及新的方法。构建js新数组  Array.push( )  数组元素包含对比 Array.include( )

15、轮播图实现构思:获取待显示图片,根据自定义属性data-indw生成一个索引数组, 对比当前显示图片,获得当先显示图片的索引ID,同时去掉当前图片的显示样式属性 active ,根据之前获得索引ID判断,当前元素下一个元素的索引ID是否存在,如果存在,为下一个元素的样式设置active属性,如果下一个元素索引不存在,当即将下一个元素的索引初始化。相当于图片重新进入循环是喜欢,以上为下一页按钮涉及原理,上一页向原地基本于此相当,仅仅在最后对比之前将原有获得HTML数组表反序排列,即可以实现 前一页的功能

16、关于轮播图渐显示的实现,大致由两种方法,

      <1>在给要显示的页添加active类之前,多设置几个一次性定时器,每个定时器执行一个不同图片透明度,直至最终的添                   加的active样式。

       <2> 在CSS样式中,找渐变货动画过程,通过页面样式的更新来实现图片的渐进限制

17、轮播图实战图

1.png


18、实战效果:

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS轮播图实战</title>
</head>
<style>

    ul,li {
        margin: 0;
        padding: 0;
        list-style: none;
    }
    .box {
        /*定位父级*/
        position: relative;
        width: 1000px;
        height: 350px;
        margin: 0 auto;
    }

    .box .slider {
        width: 1000px;
        height: 350px;
        display: none;
    }

    .box .slider.active{
        display: block;
    }

    .box .point-list {
        position: absolute;
        /*绝对定位的环境下的水平居中方式*/
        left: 50%;
        margin-left: -38px;
        top: 310px;
    }



    .box .point-list .point {
        display: inline-block;
        width: 12px;
        height: 12px;
        margin: 0 5px;
        background-color: white;
        border-radius: 100%;
    }

    .box .point-list .point.active {
        background-color: black;
    }

    .box .point-list .point:hover {
        cursor: pointer;
    }


    .skip {
        position: absolute;
        top: 140px;
        display: inline-block;
        width: 40px;
        height: 80px;
        text-align: center;
        line-height: 80px;
        background-color: lightgray;
        color: white;
        opacity: 0.5;
        font-size: 36px;
    }
    .box .prev{
        left: 0;
    }

    .box .next{
        right: 0;
    }

    .box .skip:hover {
        cursor: pointer;
        opacity: 0.7;
        color: black;
    }
</style>
<body>
<div class="box">
    <img src="./images/banner1.jpg" data-index="1" class="slider active" alt="" >
    <img src="./images/banner2.jpg" data-index="2" class="slider" alt="" >
    <img src="./images/banner3.jpg" data-index="3" class="slider" alt="" >

    <div class="point-list">
        <!--<span class="point active" data-index="1"></span>-->
    </div>

    <span class="skip prev"><</span>
    <span class="skip next">></span>
</div>
<script>

    //小圆点显示
    //获取有多少图片 生成对应数量的小圆点
    var imgs = document.images;

    //图片列表中的HTML元素转换成数组
    var imgArr = Array.prototype.slice.call(imgs,0);

    //获取原点父节点
    var pointList = document.getElementsByClassName("point-list").item(0);
    imgArr.forEach(function(img,index){
        var span = document.createElement("span");
        if(index == 0){
            span.classList.add("point","active");
            span.setAttribute("data-index","index");
        }
        span.classList.add("point");
        span.dataset.index = img.dataset.index;
        pointList.appendChild(span);
    });
    //小圆点显示结束

    //添加小圆点点击事件开始
    //获取小圆点元素并转换成数组
    var points = document.getElementsByClassName("point");

    //数组转换
    var pointArr = Array.prototype.slice.call(points,0);

    pointArr.forEach(function (spot){
        spot.addEventListener("click",setImgActive,false);
    });

    function setImgActive(event){

        imgArr.forEach(function(img){
            //自定义属性对比 data-index 相等则显示
            if(event.target.dataset.index == img.dataset.index){

            //先去掉所有图片显示的样式 active
            imgArr.forEach(function(img){img.classList.remove("active");});

            //为当前索引相等的图片加上active样式
            img.classList.add("active");

            //同上原理
            pointArr.forEach(function(spot){spot.classList.remove("active");});
            event.target.classList.add("active");
            }
        })

    }
    // 添加圆点点击事件结束


    // 前后翻页功能
    // 获取按钮
    var skip =document.getElementsByClassName("skip");
    //按钮监听 item(0)向上一个  item(1)向下一个
    skip.item(0).addEventListener("click",upImg,false);
    skip.item(1).addEventListener("click",nextImg,false);

    //下一页功能
    function nextImg(){
        //捕获当前正在显示的图片
        var num = imgArr.length;
        var imgIndex = 0;
        var indexArr = [];

        //生成以data-index元素组成的 数组 用于判断下一幅图是否存在。
        for (j=0;j<num;j++){
            //索引数组 indexArr
            var a = imgArr[j].dataset.index;
            indexArr.push(a);
        }

        //生成用于匹配判断的自定义索引值Index
        for(i=0;i<num;i++) {
             if(imgArr[i].classList.contains("active")){
                // console.log("第"+i+"次"+imgArr[i].dataset.index);
                imgArr[i].classList.remove("active");
                if(i+1<num){
                    imgIndex = imgArr[i+1].dataset.index;
                    // console.log("第一个imgIndex:"+imgIndex+" i是"+i);
                }else{
                    imgIndex = "1";
                }
              }
        }

        //下一个索引值 假定存在
        if(indexArr.includes(imgIndex)){
                imgArr.forEach(function(img){
                    if( img.dataset.index === imgIndex){
                        // console.log("第二个imgIndex:"+imgIndex+" index是"+index);
                        img.classList.add("active");

                        pointArr.forEach(function(spot){
                            spot.classList.remove("active");
                            if(spot.dataset.index==imgIndex){
                                spot.classList.add("active");
                            }
                        });
                    }
                })
        }
    }

    //前一页功能
    function upImg(ev){
        //捕获当前正在显示的图片
        var num = imgArr.length;
        var imgIndex = 0;
        var indexArr = [];

        //生成以data-index元素组成的 数组 用于判断下一幅图是否存在。
        for (j=0;j<num;j++){
            //索引数组 indexArr
            var a = imgArr[j].dataset.index;
            indexArr.push(a);
        }

        //生成用于匹配判断的自定义索引值Index
        for(i=0;i<num;i++) {
            if(imgArr[i].classList.contains("active")){
                // console.log("第"+i+"次"+imgArr[i].dataset.index);
                imgArr[i].classList.remove("active");
                if(i+1<num){
                    imgIndex = imgArr[i+1].dataset.index;
                    // console.log("第一个imgIndex:"+imgIndex+" i是"+i);
                }else{
                    imgIndex = "1";
                }
            }
        }

        //下一个索引值 假定存在
        //反转数组排序,实现向前翻页
        indexArr =indexArr.reverse();
        if(indexArr.includes(imgIndex)){
            imgArr.forEach(function(img){
                if( img.dataset.index === imgIndex){
                    // console.log("第二个imgIndex:"+imgIndex+" index是"+index);
                    img.classList.add("active");

                    pointArr.forEach(function(spot){
                        spot.classList.remove("active");
                        if(spot.dataset.index==imgIndex){
                            spot.classList.add("active");
                        }
                    });
                }
            })
        }
    }

     //模拟轮播功能 鼠标划入取消轮播 鼠标划出开始播放
     var box =document.getElementsByClassName("box").item(0);

     box.addEventListener("mouseout",start, false);
     box.addEventListener("mouseover",stop, false);

     var times = null;
     function start(){
         var click =new Event("click");
         times=setInterval(function(){
             skip.item(1).dispatchEvent(click);
         },2000)
     }

     function stop(){
         clearInterval(times);
     }


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

运行实例 »

点击 "运行实例" 按钮查看在线实例




Correction status:qualified

Teacher's comments:代码写得还不错, 对于这些常用的技巧, 重点在于理解编程思想
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post