利用原生JS实现轮播图

6 篇文章 0 订阅

写在前面:

利用原生js实现轮播图,没有用任何框架

之前有人说,来前端面试前,先实现一个js写轮播图吧

最近刷了一套百度笔试题全球,其中就有这样一道编程题

说起来很简单,但自己动手实现一下还是很有必要的

原理:

一行多个内容,通过移动这一行,只显示某一个部分

效果:

在这里插入图片描述

代码:

html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>sliider</title>
    <link rel="stylesheet" href="static/slider.css" />
     
  </head>
  <body>
    <!-- 轮播图容器 -->
    <div id="container">
      <!-- 轮播内容容器,实际上是一行多个照片 -->
      <div id="wrap" style="left:-500px">
        <!-- 虽然有三个内容,但分别在这三个左右多放一个,用作进行循环的标志 -->
        <div class="item">
          <img src="./static/img/3.jpg" />
        </div>

        <div class="item">
          <img src="./static/img/1.jpg" />
        </div>
        <div class="item">
          <img src="./static/img/2.jpg" />
        </div>
        <div class="item">
          <img src="./static/img/3.jpg" />
        </div>

        <div class="item">
          <img src="./static/img/1.jpg" />
        </div>
      </div>
      <!--显示目前的展示项  -->
      <div class="btns">
        <span>1</span>
        <span>2</span>
        <span>3</span>
      </div>

      <!-- 左右切换按钮 -->
      <button id="left" onclick="slideLeft()"><</button>
      <button id="right" onclick="slideRight()">></button>
    </div>

    <script src="static/slider.js"></script>
  </body>
</html>

css

#container {
  position: relative;
  height: 200px;
  width: 500px;
  border: 1px solid black;
  overflow: hidden;
}
.item {
  height: 198px;
  width: 498px;
  border: 1px solid pink;
  position: relative;
  margin: 0px;

  z-index: -99;
}
#wrap {
  padding: 0px;

  display: -webkit-box;
  position: absolute;
  left: 0;
}

.btns {
  margin-top: 180px;
  margin-left: 50%;
  z-index: 999;
}
#left {
  position: absolute;
  margin-top: -100px;
}
#right {
  position: absolute;
  margin-top: -100px;
  margin-left: 450px;
}

javascript


// 拿到一行排列的所有内容项
var wrap = document.getElementById("wrap");
//当前项显示,是一个数组
var span = document.getElementsByTagName("span")
//向左
function slideLeft() {
    //如果到最左,触发循环
    if (wrap.style.left == '0px') {
        wrap.style.left = '-1000px'
        //每点击一次,向左移动一个item单项
    } else {
        var newLeft = parseInt(wrap.style.left) + 500;
        wrap.style.left = newLeft + 'px';


    }
    //通过位置,得到当前是哪一项
    var index = getCurrentIndex(wrap.style.left);
    //对当前项变色
    span[index - 1].style.color = 'pink';
    //非当前项褪色
    for (let i = 0; i < span.length; i++) {
        if (i != index - 1) {
            span[i].style.color = 'black';
        }
    }


}

//向右,与向左原理相似。不同在最右时触发循环
function slideRight() {
    if (wrap.style.left == '-2000px') {
        wrap.style.left = '-1000px';

    } else {
        var newRight = parseInt(wrap.style.left) - 500;
        wrap.style.left = newRight + 'px';


    }

    var index = getCurrentIndex(wrap.style.left);

    span[index - 1].style.color = 'pink';

    for (let i = 0; i < span.length; i++) {
        if (i != index - 1) {
            span[i].style.color = 'black';
        }
    }

}
//拿到当前项
function getCurrentIndex(left) {
    var nowIndex = parseInt(left.split('p')[0]) / 500;
    //循环原理
    if (nowIndex == -4) {
        nowIndex = 1
    }
    if (nowIndex == 0) {
        nowIndex = 3;
    }

    if (nowIndex < 0) {
        nowIndex = -nowIndex;
    }
    return nowIndex;

}
//定时器,4s定时切换
setInterval(() => {
    slideLeft()
}, 4000)





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值