手撕JS轮播图!

今天来总结一下纯JS轮播图的写法

轮播图在前端应用的可以说是相当频繁的一个功能,虽然很多组件库都已经封装好类相关的组件,我们只需要调用修改img图片就行了,但是身为前端人员,能手动写出来一个轮播图的能力还是要有的,不然出去别人都会笑话你。。。。

相关代码我会放到讲解的后面哦,有不懂或者有更好的方法欢迎评论区碰一碰。

  • 首先要对整个轮播图页面进行分析
  • 我们需要一个大容器box一堆img两个前后的按钮/图 以及一堆小点点 结构代码如下(之所以先在第一个img的a标签和第一个dot加类名active是为了让它先显示一个‘装装样子’)
    如果直接拿走代码,注意换一下img的路径哦~
<div class="box">
      <a href="javascript:;" class="active"><img src="./img/1.jpg" alt="第一张"/></a>
      <a href="javascript:;"><img src="./img/2.jpg" alt="第二张" /></a>
      <a href="javascript:;"><img src="./img/3.jpg" alt="第三张" /></a>
      <a href="javascript:;"><img src="./img/4.jpg" alt="第四张" /></a>
      <a href="javascript:;"><img src="./img/5.jpg" alt="第五张" /></a>
      <span class="prev" title="前一张"></span>
      <span class="next" title="后一张"></span>

      <div class="pages">
        <i class="active"></i>
        <i></i>
        <i></i>
        <i></i>
        <i></i>
      </div>
    </div>
  • 然后我们要对他的样式进行修改,给box进行相对定位让图片和小点点都要进行绝对定位 代码如下(后缀名active是为了实现js代码中激活用)
<style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      .box {
        user-select: none;
        width: 1000px;
        height: 375px;
        margin: 10px auto;
        position: relative;
        cursor: pointer;
      }
      .box a {
        position: absolute;
        left: 0;
        top: 0;
        opacity: 0;
        transition: opacity 1s linear;
      }
      .box a.active {
        opacity: 1;
      }
      .box a img {
        width: 100%;
      }
      .prev,
      .next {
        background-image: url(./img/icons.png);
        background-repeat: no-repeat;
        display: inline-block;
        width: 41px;
        height: 69px;
        position: absolute;
        top: 50%;
        transform: translateY(-50%);
      }
      .box .prev {
        left: 10px;
        background-position: -85px 0;
      }
      .box .prev:hover {
        background-position: 0 0;
        left: 10px;
      }
      .box .next {
        right: 10px;
        background-position: -126px 0;
      }
      .box .next:hover {
        background-position: -43px 0;
      }
      .box .pages {
        position: absolute;
        right: 20px;
        bottom: 10px;
      }
      .box .pages i {
        display: inline-block;
        width: 15px;
        height: 15px;
        border-radius: 50%;
        background-color: #fff;
        border: 1px solid pink;
      }
      .box .pages i:hover,
      .box .pages i.active {
        background-color: pink;
        border: 1px solid #fff;
      }
    </style>

重点来了!!!!JS部分

  • js主要实现点击prev和next按钮能够跳转到下一张,要注意判断是不是到最后一张/第一张。然后给dot绑定点击事件。这时候取个巧,图片的数量和点点的数量相同,所以我们可以直接根据图片的索引来绑定点点的索引哦~
    代码如下:
<script>
      var box = document.querySelector(".box");
      var imgs = document.querySelectorAll(".box a");
      var prev = document.querySelector(".prev");
      var next = document.querySelector(".next");
      var dots = document.querySelectorAll(".pages i");
      var index = 0;//先默认索引为第一张的位置
      next.onclick = function (e) {
        showImg(index, e);
      };
      prev.onclick = function (e) {
        showImg(index, e);
      };
      for (let i = 0; i < dots.length; i++) {
        dots[i].addEventListener("click", function (e) {
          showImg(i, e);
        });
      }
      //因为代码重复了很多,于是进行了封装,是代码更简洁。
      function showImg(idx, e) {
        //   注意判断条件。 前一张 后一张 小点点 
        if (e.target.classList.contains("prev")) {
          idx === 0 ? (index = imgs.length - 1) : index--;
        } else if (e.target.classList.contains("next")) {
          idx === imgs.length - 1 ? (index = 0) : index++;
        } else {
          index = idx;
        }
        //这个是一段三目运算符的写法。不用弄混了。
        imgs.forEach((v,i)=>{
            i === index ? (v.classList.add("active"),dots[i].classList.add("active"))
            : (v.classList.remove("active"),dots[i].classList.remove("active"))
        })
      }
	//定义一个延时,为了让轮播图自动变化。鼠标进入box清除定时器
	//!!!!注意不能用setTimeout()因为它只能间隔一段时间执行一次。
	//我们的目的是想让他无线轮播
      var timer = setInterval(function(){
          next.click();
      },2000)
      box.onmouseover = function(){
          clearInterval(timer)
      }
      //鼠标离开轮播继续
      box.onmouseout = function(){
        timer = setInterval(function(){
            next.click()
        },2000)
      }
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值