博客列表 >元素集合转换数组对象,定时器,事件模拟器,轮播图实战-2019年7月12日

元素集合转换数组对象,定时器,事件模拟器,轮播图实战-2019年7月12日

blog
blog原创
2019年07月18日 07:56:16638浏览

一.将html元素集合转换为数组对象

将html元素集合转换为数组对象有两种方式

1)array.slice

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
    <li>item4</li>
    <li>item5</li>
</ul>
<script>
    //array.slice方法转换
    var lis=document.getElementsByTagName("li");
    var lisArr=Array.prototype.slice.call(lis,0);
    console.log(lisArr);
</script>
</body>
</html>

运行实例 »

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

1.png

2)ES6的方式

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
    <li>item4</li>
    <li>item5</li>
</ul>
<script>
    //ES6方法转换
    var lis=document.getElementsByTagName("li");
    var lisArr=Array.from(lis);
    console.log(lisArr);
</script>
</body>
</html>

运行实例 »

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

1.png

二.定时器的种类与使用场景

javascript中定时器有4种,分别为一下四种,其中主要介绍常见的两种

1)setInterval:以固定的时间间隔,重复执行一个函数或者代码段

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>开始</button>
<button>停止</button>
<ul class="ul1">

</ul>
<script>
    var ul1=document.getElementsByClassName("ul1").item(0);
    var but1=document.getElementsByTagName("button").item(0);
    var but2=document.getElementsByTagName("button").item(1);
    but1.addEventListener('click',stt,false);
    but2.addEventListener('click',stp,false);
    var timer=null;
    function stt(event){
        timer=setInterval(function(){
            var li=document.createElement("li");
            li.innerHTML="<h4>hi!!!</h4>";
            ul1.appendChild(li);
        },2000);
    }
    function stp(event){
        clearInterval(timer);
    }
</script>
</body>
</html>

运行实例 »

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

1.png

可以看到setInterval定时器会一直执行函数或者代码块

2)setTimeout :只执行一次函数或者代码段

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>开始</button>
<button>停止</button>
<ul class="ul1">

</ul>
<script>
    var ul1=document.getElementsByClassName("ul1").item(0);
    var but1=document.getElementsByTagName("button").item(0);
    var but2=document.getElementsByTagName("button").item(1);
    but1.addEventListener('click',stt,false);
    but2.addEventListener('click',stp,false);
    var timer=null;
    function stt(event){
        timer=setTimeout(function(){
            var li=document.createElement("li");
            li.innerHTML="<h4>hi!!!</h4>";
            ul1.appendChild(li);
        },2000);
    }
    function stp(event){
        clearTimeout(timer);
    }
</script>
</body>
</html>

运行实例 »

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

1.png

可以看到setTimeout定时器只执行一次函数或者代码块

3)setImmediate,

4)requestAnimationFrame

三.事件模拟器的应用场景和案例

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        div{
            width:200px;
            height:200px;
            background-color:lightsalmon;
        }
    </style>
</head>
<body>
<div>点我!!</div>
<p id="money"></p>
<script>
    var div=document.getElementsByTagName("div").item(0);
    var p=document.getElementById("money");
    var num=0;
    var price=1;
    var click=new Event('click');
    setInterval(function(){
        div.dispatchEvent(click);
        num+=1;
        console.log(num);
        p.innerHTML=`广告收入: <span style="color:red"> ${num}</span>元`;
    },2000);
</script>
</body>
</html>

运行实例 »

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

1.png

四.轮播图的基本实现原理与步骤

1.设置小圆点数量与图片数量对应,增加或减少图片数量同时小圆点数量跟随增加或减少

2.为小圆点绑定图片,实现点击小圆点,轮播到对应图片

通过循环获取到对象,根据小圆点自定义属性data-index与当前显示图片进行对比,如果相同,则循环去除所有有小圆点的active并且给当前小圆点添加active

3.设置左右翻页按钮的特效

为左右翻页按钮添加点击事件,通过判断className中左右翻页按钮的区别进行分辨左右翻页按钮

4.设置定时器实现自动翻页

以鼠标移入或移出轮播图范围为事件触发点,创建定时器setInterval,自定义点击事件对象,并将其分配给右翻页按钮,与定时器setinterval配合实现自动点击,从而造成自动轮播效果

五.轮播图案例

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="2.css">
    <style type="text/css">
        *{
            margin:0px;
            padding:0px;
        }
        .box{
            position: relative;
            width:700px;
            height:250px;
            margin:0px auto;
        }

        .box .slider{
            width:700px;
            height:250px;
            display:none;
        }
        .box .slider.active{
            display:block;
        }
        .box .point-list{
            position:absolute;
            left:50%;
            margin-left:-38px;
            top:225px;
        }
        .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:80px;
            display:inline-block;
            width:40px;
            height:80px;
            text-align:center;
            line-height:80px;
            background-color:lightseagreen;;
            color:white;
            opacity: 0.2;
            font-size:36px;
        }
        .box .prev{
            left:0;
        }
        .box .next{
            right:0;
        }
        .box .skip:hover{
            cursor:pointer;
            opacity: 0.5;
            color:black;
        }
    </style>
</head>
<body>
<div class="box">
    <img src="images/banner1.jpg" alt="" data-index="1" class="slider active">
    <img src="images/banner2.jpg" alt="" data-index="2" class="slider">
    <img src="images/banner3.jpg" alt="" data-index="3" class="slider">
    <div class="point-list">
       <!--<span class="point active" data-index="1"></span>
        <span class="point" data-index="2"></span>
        <span class="point" data-index="3"></span>-->
    </div>
    <span class="skip prev"><</span>
    <span class="skip next">></span>
</div>
<div class="gg">

</div>

<script>
    //设置小圆点数量与图片数量对应
    //获取所有的图片
    var imgs=document.images;
    //将所有的图片转换为数组
    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");
        //如果图片数量为0,则给加上active
        if(index===0){
            span.classList.add("active");
        }
        span.classList.add("point");
        //设置自定义的index对应
        span.dataset.index=img.dataset.index;
        //添加span
        pointList.appendChild(span);
    })
    //给小圆点设置点击事件,切换图片
    //获取所有的小圆点
    var points=document.getElementsByClassName("point");
    //转换为数组
    var pointArr=Array.prototype.slice.call(points,0);
    ///给所有小圆点添加一点击事件
    pointArr.forEach(function (point) {
        point.addEventListener('click',setImgActive,false);
    });
    //设置事件:点击小圆点,图片进行切换
    function setImgActive(event){
        imgArr.forEach(function (img) {
            if(img.dataset.index===event.target.dataset.index){  //event.target是当前被点击的小圆点
                //去掉所有小圆点上面的active样式
                imgArr.forEach(function (img) {
                    img.classList.remove("active");
                });
                //给当前小圆点对应的图片自定义属性添加active
                img.classList.add("active");
                //设置小圆点变成active样式
                setPointActive(img.dataset.index);
            }
        });
    }
    //左右翻转图片按钮
    ///获取左右两个翻页按钮
    var skip=document.getElementsByClassName("skip");
    //为左面翻页按钮添加事件
    skip.item(0).addEventListener('click',skipImg,false);
    //为右面翻页按钮添加事件
    skip.item(1).addEventListener('click',skipImg,false);
    function skipImg(event){
        var currentImg=null;
        imgArr.forEach(function(img){
            //获取当前图片:判断图片的classname中是否存在avtive
            if(img.classList.contains("active")){
                currentImg=img;
            }
        });
        //左侧按钮
        //判断自定义属性中是否存在prev
        if(event.target.classList.contains("prev")){
            //移除当前图片active
            currentImg.classList.remove("active");
            //更新上一个节点
            currentImg=currentImg.previousElementSibling;
            if(currentImg!==null&¤tImg.nodeName==="IMG"){
                currentImg.classList.add("active");
            }else{
                //如果当前不存在上一个兄弟节点,则跳到最后一个
                currentImg=imgArr[imgArr.length-1];
                //为节点添加actiive
                currentImg.classList.add("active");
            }
        }
        //右侧按钮
        //判断自定义属性中是否存在next
        if(event.target.classList.contains("next")){
            //移除当前图片active
            currentImg.classList.remove("active");
            //更新成下一个节点
            currentImg=currentImg.nextElementSibling;
            if(currentImg!==null&¤tImg.nodeName==="IMG"){
                currentImg.classList.add("active");
            }else{
                //如果不存在下一个兄弟节点,则跳转到第一个
                currentImg=imgArr[0];
                //为节点添加active
                currentImg.classList.add("active");
            }
        }
        //获取当前图片的data-index值
        var imgIndex=currentImg.dataset.index;
        //按动左右两侧按钮时,下面按钮也跟着动
        setPointActive(imgIndex);
    }
    function setPointActive(imgIndex){
        //遍历所有小圆点,移除active样式
        pointArr.forEach(function(point){
            point.classList.remove("active")
        });
        pointArr.forEach(function(point){
            //如果小圆点data-index值与相应的对应上
            if(point.dataset.index===imgIndex){
                //设置active样式
                point.classList.add("active");
            }
        });
    }
    //定时器:自动轮播
    //获取当前div
    var box =document.getElementsByClassName("box").item(0);
    //创建并初始化定时器
    var timer=null;
    //添加事件,当鼠标移出轮播图范围时候,启动定时器开始轮播
    box.addEventListener("mouseout",startTimer,false);
    //添加事件,当鼠标移入轮播图范围时候,清除定时器
    box.addEventListener("mouseover",clearTimer,false);
    function startTimer(event){
        //自定义点击事件对象
        var clickEvent=new Event("click");
        //setInterval 定时器一直进行
        //dispatchEvent分配点击事件,实现自动点击
        timer=setInterval(function(){
            skip.item(1).dispatchEvent(clickEvent);
        },3000);
    }
    function clearTimer(event){
        //清除定时器
        clearInterval(timer);
    }
</script>
</body>
</html>

运行实例 »

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

1.png




声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议