JS 实现轮播图

  实现

 实现如图所示的轮播图,要实现的功能主要有:

  • 鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。
  • 点击右侧按钮一次,图片下滑一张;点击左侧按钮,图片上滑一张。
  • 图片播放的同时,下面小圆圈模块跟随一起变化。
  • 点击小圆圈,可以播放相应图片。
  • 鼠标不经过轮播图,轮播图也会自动播放。
  • 鼠标经过,轮播图模块自动播放停止。

   

  

 

  分析

 首先我们应该建立一个底层盒子,里面放置图片、左右按钮和小圆圈,html 部分如下:

<body>
<!--底层的盒子-->
<div class="focus">
    <!--核心的图片区域-->
    <ul>
//默认第一张图片显示 <li class="active"> <img src="img/one.jpg" alt=""> <!--图片上的文字--> <div class="content"> <h2>西亭别序</h2> <p>行到水穷处,坐看云起时</p> </div> </li> <li> <img src="img/two.jpg" alt=""> <div class="content"> <h2>苏轼</h2> <p>竹杖芒鞋轻胜马,一蓑烟雨任平生</p> <p>他人笑我太疯癫,我笑他人看不穿</p> </div> </li> <li> <img src="img/three.png" alt=""> <div class="content"> <h2>白鹤西去</h2> <p>为伊消得人憔悴</p> </div> </li> <li> <img src="img/four.png" alt=""> <div class="content"> <h2>白鹤西去</h2> <p>为伊消得人憔悴</p> </div> </li> </ul> <!--左侧按钮--> <a href="#" class="arrow-l" id="left">&lt</a> <!--右侧按钮--> <a href="#" class="arrow-r" id="right">&gt</a> <!--小圆圈:根据图片数量动态添加--> <ol class="circle"> </ol> </div> </body>

 注意设置父盒子 focus 定位为 relative,存放图片的子盒子 li 定位为 absolute 使图片堆叠在一起。其它 css 的样式布局就不具体讲解了,后面会补充详细代码。

 

  js 思想实现

 此款轮播图的核心思想主要是使用 z-index 来设置图片的堆叠顺序来显示图片的,z-index 的值高则在最上层被显示,值底则被值高的遮挡起来不被显示。接下来我们来看一下 js 的具体功能实现。

 功能 1:鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。

window.addEventListener('load',function (){
    //1、获取元素
    var arrow_l = document.querySelector('.arrow-l');//左按钮
    var arrow_r = document.querySelector('.arrow-r');//右按钮
    var focus = document.querySelector('.focus');//放置轮播图的底层盒子

    //2、鼠标经过底层盒子时,就显示隐藏的左右按钮
    focus.addEventListener('mouseenter',function (){
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    })
    //鼠标离开底层盒子时,就隐藏左右按钮
    focus.addEventListener('mouseleave',function (){
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })

  //...后续的功能代码都是放在此监听事件里面,就单独说明了

})

 

 功能 2:点击右侧按钮一次,图片下滑一张;点击左侧按钮,图片上滑一张。

//1、获取元素
    var ul = focus.querySelector('ul');//图片的ul
    var ol = focus.querySelector('ol');//小圆圈的ol
    var goleft = document.getElementById('left'); //左按钮
    var goright = document.getElementById('right');//右按钮

    var index = 0;//index表示第几张图片在展示,给他添加样式.active
    //2、排他思想:去掉所有元素的样式,只留下第 index 图片的样式
    var goIndex = function (index){
        //左右按钮的
        for(var i = 0;i < ul.children.length;i++){
            ul.children[i].className = '';
        }
        ul.children[index].className = 'active';
        
        //下面小圆圈的
        for(var i = 0;i < ol.children.length;i++){
            ol.children[i].className = '';
        }
        ol.children[index].className = 'current';
    }
    //3、右按钮:下一张
    var goNext = function (){
        //注意此处 index 的初值是0,所以比较长度要减1,点到最后一张图片时,返回第一张
        if (index < ul.children.length-1){
            index ++;
        }else{
            index = 0;
        }
        //确认 index 后设置样式显示图片
        goIndex(index);
    }
    //4、左按钮:上一张
    var preNext = function (){
        //注意此处index=0点到第一张图片,再点击返回最后一张
        if (index === 0){
            index = ul.children.length-1
        }else{
            index --;
        }
        //确认 index 后设置样式显示图片
        goIndex(index);
    }
    //5、分别给左右按钮添加点击事件
    goleft.addEventListener('click',function (){
        preNext();
    })
    goright.addEventListener('click',function (){
        goNext();
    })
    

 

  功能 3动态生成小圆圈,点击圆圈出现对应图片,并且圆圈变成圆球

//3、动态生成小圆圈,有几张图片,就生成几个小圆圈
    for(var i = 0;i < ul.children.length;i++){
        //创建一个小li
        var li = document.createElement('li');
        //为每个小圆圈添加索引值
        li.setAttribute('index',i);
        //把li插到ol里面
        ol.appendChild(li);
        //4、我们可以直接在生成的小圆圈的同时直接绑定点击事件
        li.addEventListener('click',function (){

            //5、点击圆圈出现对应图片
            //获取当前被点击小圆圈的索引值
            var point = this.getAttribute('index');
            //调用上面排他思想的函数
            goIndex(point);
        })
    }
    //默认把ol里面的第一个小li设置类名为 current
    ol.children[0].className = 'current';

 

 功能 4:鼠标不经过轮播图,轮播图也会自动播放。图片播放的同时,下面小圆圈模块跟随一起变化。

//自动轮播
    var self = setInterval(function (){
        goIndex(index);
        if (index < ul.children.length-1){
            index ++;
        }else{
            index = 0;
        }
    },1000)

 

 功能 5:鼠标经过,轮播图模块自动播放停止。离开时又自动播放。(只需要在上面的底层盒子的鼠标经过事件中添加清除定时器就可以)

//2、鼠标经过底层盒子时,就显示隐藏的左右按钮
    focus.addEventListener('mouseenter',function (){
        //...
        //7、鼠标经过,轮播图模块自动播放停止。  
        clearTimeout(selfTimer);
        selfTimer = null;//清除定时器变量,释放内存
    })
    //鼠标离开底层盒子时,就隐藏左右按钮
    focus.addEventListener('mouseleave',function (){
        //...
        //7、鼠标离开时又自动播放
        selfTimer = setInterval(function (){
            goIndex(index);
            if (index < ul.children.length-1){
                index ++;
            }else{
                index = 0;
            }
        },1000)
    })

 好了,到此轮播图的全部功能就已经实现了,当然这只是实现轮播图的其中一种方式,还有其它很多方法那就等着你们自己去探索了。接下来粘贴一些样式代码

 

  附录

<style>

* {
  margin:0;
  padding:0;
}
body{
  background-color: rgba(50, 128, 102, 0.9);
}

.focus {
  position: relative;
  margin: 20px auto;
  width: 800px;
  height: 400px;
}

.focus ul {
  position:relative;
  width: 800px;
  height: 400px;
}
.focus ul li {
  position: absolute;
  width: 100%;
  height: 100%;
  opacity: 1;
  transition: all .5s;
}
.focus ul li img {
  width: 100%;
  height: 100%;
}
.focus ul li .content {
  position: absolute;
  bottom: 40px;
  left: 300px;
  text-align: center;
  color: white;
}
.focus ul li .content h2 {
  margin-bottom: 5px;
}
.focus ul li .content p {
  font-size: 14px;
}

.arrow-l,.arrow-r {
  display: none;
  position: absolute;
  top: 170px;
  /*margin-top: -20%;*/
  width: 24px;
  height: 40px;
  background: rgba(0,0,0,.3);
  text-align: center;
  line-height: 40px;
  color: #fff;
  font-size: 18px;
  /*左右按钮一直显示*/
  z-index: 100;
}
.arrow-r {
  right: 0;
}

.circle {
  position: absolute;
  bottom: 5px;
  left: 350px;
  list-style:none;
  /*圆圈一直显示*/
  z-index: 100;
}
.circle li {
  float: left;
  width: 8px;
  height: 8px;
  border: 2px solid rgba(255,255,255,0.5);
  margin: 0 3px;
  border-radius: 50%;
  /*鼠标经过显示小手*/
  cursor: pointer;
}
.current {
  background-color: #fff;
}
/*给图片动态添加的堆叠顺序*/
.active {
  opacity: 1;
  z-index: 10;
}

</style>

 

posted @ 2021-11-07 16:13  打遍天下吴敌手  阅读(2771)  评论(0编辑  收藏  举报