博客列表 >轮播图渐显功能

轮播图渐显功能

LISTEN的博客
LISTEN的博客原创
2019年07月22日 16:31:13573浏览

轮播图实现五秒钟自动切换,图片渐渐显示的功能:

实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图渐显功能</title>

    <style>
        .box{
            position:relative;
            width: 1200px;
            height: 400px;
            margin: 0 auto;
        }
        img{
            opacity: 0;
        }

        .box .slider{
            width: 1200px;
            height: 400px;
            display: none; /*元素不会被显示。*/
        }

        .box .slider.active{
            display: block; /*元素将显示为块级元素,此元素前后会带有换行符 */
        }

        .box .point-list{
            position: absolute;
            left: 50%;
            margin-left: -48px;
            top:360px;
        }

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

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

        .box .point-list .point:hover{
            /*cursor 一些不同的光标*/
            /*pointer	光标呈现为指示链接的指针(一只手)*/
            cursor:pointer;
        }

        .skip{
            position: absolute;
            display: inline-block;
            width: 60px;
            height: 60px;
            text-align: center;
            line-height: 60px;
            background-color: lightgray;
            color: black;
            opacity:0.3;
            font-size: 36px;
            top:170px;
            border-radius:50% ;
        }

        .box .prev{
            left:0;
        }

        .box .next{
            right: 0;
        }

        .box .skip:hover{
            cursor:pointer;
            opacity: 0.6;
            color: red;
        }

    </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>-->
    </div>

    <!--轮播左右切换按钮-->
    <span class="skip prev"> < </span>
    <span class="skip next"> > </span>

</div>

<script>
    //获取所有图片,将图片列表由HTML集合转为真正的数组类型
    var imgs=document.images;
    var imgArr=Array.prototype.slice.call(imgs,0);
    // console.log(imgArr);

    // load: 当页面加载完成会自动调用,防止第一张图片因为透明度为0而不显示
    window.addEventListener('load',fadeIn(imgArr[0]),false);

    //获取小圆点父节点
    var pointList=document.getElementsByClassName('point-list')[0];

    // 设置小圆点的数量与样式, 与图片的数量关联,实现每添加一张图, 小圆点数量自动更新
    // img: 当前元素  index: 当前元素的索引值。
    imgArr.forEach(function (img,index) {
        var span=document.createElement('span');

        if(index===0){
            span.classList.add('point','active');
        }else{
            span.classList.add('point');
        }
        //让小圆点的data-index属性与图片的data-index属性一致,使小圆点与图片一一对应
        span.dataset.index=img.dataset.index;
        pointList.appendChild(span);
    });

    // 获取所有的小圆点,将小圆点的html集合, 转为真正的数组
    var points=document.getElementsByClassName('point');
    pointArr=Array.prototype.slice.call(points,0);

    // 为小圆点设置点击事件,切换图片
    pointArr.forEach(function (point) {
        point.addEventListener('click',setImgActive,false);
    });

    // 设置图片切换
    function setImgActive(event) {
        // event.target: 当前被点击的对象,就是小圆点
        imgArr.forEach(function (img) {
            // 根据小圆点的data-index值与图片data-index对应关系来确定需要切换的图片
            if(img.dataset.index===event.target.dataset.index){
                // 去掉原来所有图片上的激活样式
                imgArr.forEach(function (img1) {
                    img1.classList.remove('active');
                    img1.style.opacity='0';//切换图片后修改图片透明度为0
                });

                // 设置当前图片为显示激活状态
                img.classList.add('active');
                fadeIn(img);
                // 设置小圆点的当前激活与高亮状态
                setPointActive(img.dataset.index);
            }
        });
    }

    // 获取翻页跳转按钮
    var skip =document.getElementsByClassName('skip');
    var leftskip=document.getElementsByClassName('skip')[0];
    var rightskip=document.getElementsByClassName('skip')[1];
    // 为翻页按钮添加事件
    leftskip.addEventListener('click',skipImg,false);
    rightskip.addEventListener('click',skipImg,false);

    function skipImg(event) {
        // 获取当前正在显示的图片
        var currentImg=null;
        imgArr.forEach(function (img) {
            //contains(class)	返回布尔值,判断指定的类名是否存在。
            if(img.classList.contains('active')){
                currentImg=img;
            }
        });

        // 判断点击的是显示前一个图片
        if(event.target.classList.contains('prev')){
            // 显示前一个兄弟元素节点
            // 移除当前图片高亮, 不要再显示
            currentImg.classList.remove('active');
            currentImg.style.opacity='0';
            // 更新当前图片节点
            currentImg=currentImg.previousElementSibling;

            // 显示前一个兄弟元素节点
            if(currentImg!==null && currentImg.nodeName==='IMG'){
                // 高亮前一个兄弟节点图片
                currentImg.classList.add('active');
            }else{
                // 如果不存在前一个兄弟节点,则显示最后一个,以此来循环显示
                // 高亮最后一个兄弟节点图片
                currentImg=imgArr[imgArr.length-1];
                currentImg.classList.add('active');
            }
        }

        // 判断是否是点击了显示后一个图片
        if(event.target.classList.contains('next')){
            currentImg.classList.remove('active');
            currentImg.style.opacity='0';
            //console.log( currentImg.style.opacity);
            currentImg=currentImg.nextElementSibling;

            // 显示后一个兄弟元素节点
            if(currentImg!==null &¤tImg.nodeName==='IMG'){

                currentImg.classList.add('active');
            }else{
                // 如果不存在后一个兄弟节点,则显示第一个,以此来循环显示
                // 高亮第一个兄弟节点图片, 索引为0
                currentImg=imgArr[0];
                currentImg.classList.add('active');
            }
        }

        fadeIn(currentImg);
        // 获取当前显示的图片的data-index
        var imgIndex=currentImg.dataset.index;
        setPointActive(imgIndex);
    }

    //  设置小圆点高亮
    function setPointActive(imgIndex) {
        // 清除小圆点原有的高亮
        pointArr.forEach(function (point) {
            point.classList.remove('active');
        });
        pointArr.forEach(function (point) {
            if(point.dataset.index===imgIndex){
                point.classList.add('active');
            }
        });
    }

    // 定时器: 每隔5秒自动切换
    // 这类自动操作最适合事件模拟器完成
    // 这里选择点击下一页的按钮事件来做(上一页也可以,随意)

    // 利用鼠标移入与移出事件来启动/关闭定时器

    var box=document.getElementsByClassName('box')[0];

    // 创建定时器并初始化
    var timer=null;

    // 创建鼠标移动事件监听器
    // 1. 当鼠标移出轮播图区域时, 启动定时器控制轮播图的播放
    box.addEventListener('mouseout',startTimer,false);

    // 2. 当鼠标移入到轮播图区域时, 清除定时器,由用户点击来控制轮播图的播放
    box.addEventListener('mouseover',clearTimer,false);

    // startTimer: 启动定时器的方法
    function startTimer() {
        // 先生成了一个自定义的点击事件对象
        var clickEvent=new Event('click');
        timer=setInterval(function () {
            // 将自定义的点击事件分配给下一页按钮,实现自动点击
            rightskip.dispatchEvent(clickEvent);
        },5000);
    }

    // clearTimer: 清除定时器的方法
    function clearTimer() {
        clearInterval(timer);
    }

    //渐显函数
    function fadeIn(img) {
        opa=parseInt(window.getComputedStyle(img).opacity);//获取当前图片的透明度,图片透明度一开始设置为0
        var timer=setInterval(function () {
            // console.log(opa);
            opa = opa+0.15;
            img.style.opacity=opa;
            // 当透明度大于或等于1应该停止,关闭定时器
            if(opa>=1){
                clearInterval(timer);
                return false;
            }
        },200);
    }

</script>

</body>
</html>

运行实例 »

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

 

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