原生JS实现小米轮播图和网易云轮播图

小米轮播图

实现功能:

  1. 定时切换(2s)
  2. 点击按钮停止切换
  3. 点击向左向右按钮进行相应切换
  4. 鼠标点击下方的小圆点,并进行相应的切换

效果:
在这里插入图片描述
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>小米轮播图</title>
    <style>
        *{margin:0;padding: 0;}
        .box{width: 1200px;height: 470px;margin: 100px auto;position: relative;}
        .box div{width: 100%;height: 100%;position: absolute;left: 0;top: 0;opacity: 0;transition: opacity 2s;}
        .box div img{width: 1200px;height: 470px;}
        .item{width: 250px;position: absolute;left: 50%;top:90%;transform:translateX(-50%);}
        .item li{list-style: none;width: 12px;height: 12px;border-radius: 50%;border: 1px solid #fff;float: left;margin-left: 30px;display: block;cursor: pointer;}
        .show{background: #ccc;}
        .box span{width: 40px;height: 80px;position: absolute;top:50%;font-size: 20px;text-align: center;line-height: 80px;color: #ccc;background: #333;opacity: .2;cursor: pointer;transform: translateY(-50%)}
        .left{left: 0;}
        .right{right:0;}
    </style>
</head>
<body>
    <div class="box">
        <div style="opacity: 1"><img src="./images/01.jpg" alt=""></div>
        <div><img src="./images/02.jpg" alt=""></div>
        <div><img src="./images/03.jpg" alt=""></div>
        <div><img src="./images/04.jpg" alt=""></div>
        <div><img src="./images/05.jpg" alt=""></div>
        <ul class="item">
            <li class="show"></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <span class="left">&lt;</span>
        <span class="right">&gt;</span>
    </div>
</body>
<script>
    
    class Banner{
        constructor(){
            this.box=document.querySelector(".box");
            this.divs=document.querySelectorAll(".box div");
            this.item=document.querySelector(".item");
            this.lis =document.querySelectorAll("li");
            this.left=document.querySelector(".left");
            this.right=document.querySelector(".right");
            this.time=null;
            this.index=0;

            // 自动切换
            this.automatic();
            // 添加事件
            this.addEvent();
        }
        automatic(){
            var that =this;
            this.time=setInterval(function(){
                that.index++;
                if(that.index>that.divs.length-1){
                    that.index=0
                }
                for(var i=0;i<that.divs.length;i++){
                    that.divs[i].style.opacity=0;
                    that.lis[i].className="";
                }
                that.divs[that.index].style.opacity=1;
                that.lis[that.index].className="show"
            },2000)
        }
        addEvent(){
            var that =this;
            // 添加左按钮事件
            this.left.onclick=function(){
                that.leftclick();
            }
            // 添加右按钮事件
            this.right.onclick=function(){
                that.rightclick()
            }
            // 添加小圆点事件
            this.item.onclick=function(){
                that.itemclick()
            }
        }
        leftclick(){
            // console.log(1)
            // 点击之后先清除计时器
            clearInterval(this.time);
            this.index--;
            if(this.index <0){
                this.index = this.divs.length-1;
            }
            this.clickmove();
        }
        rightclick(){
            clearInterval(this.time);
            this.index++;
            if(this.index>this.divs.length-1){
                this.index=0
            }
            this.clickmove();
        }
        clickmove(){
            console.log(this.index)
            for(var i=0;i<this.divs.length;i++){
                this.divs[i].style.opacity=0;
                this.lis[i].className="";
            }
            this.divs[this.index].style.opacity=1;
            this.lis[this.index].className="show";
            // 点击事件后再开启自动播放
            this.automatic();
        }
        itemclick(){
            // 给每个小圆点添加一个内置属性
            for(var i =0;i<this.lis.length;i++){
                this.lis[i].setAttribute("x",i);
            }
            var that =this;
            // 事件委托
            this.item.onclick=function(eve){
                var e = eve || window.event;
                var target = e.target || e.srcElement;
                if(target.nodeName == "LI"){
                    console.log(target)
                    clearInterval(that.time);
                    for(var i=0;i<that.lis.length;i++){
                        that.divs[i].style.opacity=0;
                        that.lis[i].className="";
                    }
                    that.divs[target.getAttribute("x")].style.opacity=1;
                    that.lis[target.getAttribute("x")].className="show";
                    that.index=target.getAttribute("x");
                    that.automatic();
                }
            }
        }
    }
    new Banner();
</script>
</html>

网易云轮播图

实现功能

  1. 定时切换(3s)
  2. 鼠标放上去停止切换
  3. 点击左右图片进行图片切换
  4. 鼠标放上去显示向左向右按钮,鼠标移下来再次隐藏
  5. 点击向左向右按钮进行相应切换
  6. 鼠标放到下方的线上,停止定时切换,并进行相应的切换
  7. 鼠标离开下方的线,重新开始定时切换
    效果图:
    在这里插入图片描述
    代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>网页云轮播图</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .carousel {
        width: 1200px;
        margin: 100px auto;
        }
        ul {
        list-style-type: none;
        position: relative;
        display: flex;
        min-height: 300px;
        margin-bottom: 40px;
        }
        .prev,
        .next {
        cursor: pointer;
        display: none;
        position: absolute;
        top: 44%;
        z-index: 1;
        }
        .prev {
        left: 0;
        }
        .next {
        right: 0
        }
        ul li {
        width: 700px;
        height: 300px;
        position: absolute;
        left: 250px;
        right: 250px;
        transition: all .3s ease-out;
        opacity: 0;
        }
        li img {
        width: 100%;
        height: 100%;
        }
        .now {
        z-index: 1;
        opacity: 1;
        transform: scale3d(1.0, 1.2, 1.2)
        }
        .before {
        transform: translateX(-250px);
        opacity: .8;
        }
        .after {
        transform: translateX(250px);
        opacity: .8;
        }
        .lines {
        display: flex;
        justify-content: center;
        }
        .line {
        width: 20px;
        height: 4px;
        background-color: black;
        margin: 10px 10px;
        }
        .active-line{
        background-color: red;
        }
    </style>
</head>
<body>
    <div class="carousel">
        <ul>
            <span class="iconfont prev">&lt;</span>
            <span class="iconfont next">&gt;</span>
            <li class="now"><img src="./images/1.jpg" alt=""></li>
            <li class="after"><img src="./images/2.jpg" alt=""></li>
            <li><img src="./images/3.jpg" alt=""></li>
            <li><img src="./images/4.jpg" alt=""></li>
            <li><img src="./images/5.jpg" alt=""></li>
            <li class="before"><img src="./images/6.jpg" alt=""></li>
        </ul>
        <div class="lines">
            <div class="active-line line"></div>
            <div class="line"></div>
            <div class="line"></div>
            <div class="line"></div>
            <div class="line"></div>
            <div class="line"></div>
        </div>
    </div>
</body>
<script>
function nextPic () {
  var picArr = document.querySelectorAll('ul li'),
      len = picArr.length,
      i = 0;
  for (;i < len;i++) {
    if (picArr[i].className == 'after') {
      picArr[(i + 1) % len].className = 'after';
      picArr[i].className = 'now';
      if (i - 1 < 0) {
        picArr[len - 1].className = 'before';
      }else {
        picArr[i - 1].className = 'before';
      }
      //把原来的before删除(原来的now、after都被覆盖掉了)
      if (i == 0) {
        picArr[len - 2].className = '';
      }else if (i == 1) {
        picArr[len - 1].className = '';
      }else {
        picArr[i - 2].className = '';
      }
      break;
    }
  }
}
function prevPic () {
  var picArr = document.querySelectorAll('ul li'),
      len = picArr.length,
      i = 0;
  for (;i < len;i++) {
    if (picArr[i].className == 'before') {
      if (i - 1 < 0) {
        picArr[len - 1].className = 'before';
      }else {
        picArr[i - 1].className = 'before';
      }
      picArr[i].className = 'now';
      picArr[(i + 1) % len].className = 'after';
      //删除之前的after
      picArr[(i + 2)% len].className = '';
      break;
    }
  }
}
function nextLine () {
  // 颜色变化
  var lineArr = document.getElementsByClassName('line'),
      len = lineArr.length;
  for (var i = 0;i < len;i++) {
    if (lineArr[i].className.indexOf('active-line') != '-1') {
      lineArr[i].className = 'line';
      lineArr[(i + 1) % len].className = 'active-line line';
      break;
    }
  }
}
function preLine () {
  // 颜色变化
  var lineArr = document.getElementsByClassName('line'),
      len = lineArr.length;
  for (var i = 0;i < len;i++) {
    if (lineArr[i].className.indexOf('active-line') != '-1') {
      lineArr[i].className = 'line';
      if (i - 1 < 0) {
        lineArr[len - 1].className = 'active-line line';
      }else {
        lineArr[i - 1].className = 'active-line line';
      }
      break;
    }
  }
}
//上一张
function prev () {
  prevPic();
  preLine();
}
//下一张
function next () {
  nextPic();
  nextLine();
}
//初始时定时切换
var timer = setInterval(next, 3000);
//鼠标放到轮播图上,暂停切换,显示prev、next按钮
document.getElementsByClassName('carousel')[0].addEventListener('mousemove', function () {
  clearInterval(timer);
  document.getElementsByClassName('prev')[0].style.display = 'block';
  document.getElementsByClassName('next')[0].style.display = 'block';
}, false)
//鼠标离开轮播图上,重新开始切换,隐藏prev、next按钮
document.getElementsByClassName('carousel')[0].addEventListener('mouseleave', function () {
  timer = setInterval(next, 3000);
  document.getElementsByClassName('prev')[0].style.display = 'none';
  document.getElementsByClassName('next')[0].style.display = 'none';
}, false)
//上一张
document.querySelector('.prev').addEventListener('click', function () {
  prev();
}, false)
//下一张
document.querySelector('.next').addEventListener('click', function () {
  next();
}, false)
//图片点击事件(只有点击before、after有切换)
document.querySelector('ul').addEventListener('click', function(e) {
  if (e.target.parentNode.className == 'before') {
    prev();
  }else if (e.target.parentNode.className == 'after') {
    next();
  }
}, false)
//移动到线上,切换图片
document.getElementsByClassName('lines')[0].addEventListener('mouseover', function (e) {
  //只有冒泡到div的类是line的时候才进行判断,其他情况不判断
  if (e.target.className == 'line' || e.target.className == 'active-line line') {
    //暂停切换
    clearInterval(timer);
    var lineArr = this.querySelectorAll('.line'),
        len = lineArr.length,
        target,
        temp,
        acitve;
    //找到active的位置和鼠标的位置
    active = index(lineArr,this.querySelector('.active-line'));
    target = index(lineArr,e.target);
    //进行移动
    temp = Math.abs(target - active);
    if (active > target) {
      while (temp) {
        prev();
        temp--;
      }
    }else {
      while (temp) {
        next();
        temp--;
      }
    }
  }

}, false)
//离开线,重新开始定时切换
document.getElementsByClassName('lines')[0].addEventListener('mouseout', function (e) {
  if (e.target.className == 'line' || e.target.className == 'active-line line') {
    timer = setInterval(next, 3000);
  }
}, false)
//借鉴jquery的index(),找到子元素在父元素中的索引位置(就是给每个子元素添加一个自定义值index)
function index(father,target) {
  var i,
      len = father.length;
  for (i = 0;i < len;i++) {
    father[i].index = i;
  }
  for (i = 0;i < len;i++) {
    if (father[i].index == target.index) {
      return father[i].index;
    }
  }
}
</script>
</html>
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值