原生JS实现pc端轮播图效果


Posted in Javascript onDecember 21, 2020

本文实例为大家分享了JS实现pc端轮播图效果的具体代码,供大家参考,具体内容如下

案例:轮播图需求

布局:ul下有很多li标签;浮动在一行;

原理:切换图片的时候,把ul位置修改一下,给ul的父容器,设置一个 overflow:hidden;

功能需求:

  • 序号轮播
  • 左右按钮的轮播
  • 自动轮播
  • 鼠标在轮播图里面的时候,停止自动轮播,离开后继续自动轮播

实现效果:

原生JS实现pc端轮播图效果

html部分

<div class="box" id="box">
    <div class="inner" id="inner">
      <ul id="imglist">
        <li>
          <a href="#" ><img src="images/1.jpg" alt=""></a>
        </li>
        <li>
          <a href="#" ><img src="images/2.jpg" alt=""></a>
        </li>
        <li>
          <a href="#" ><img src="images/3.jpg" alt=""></a>
        </li>
        <li>
          <a href="#" ><img src="images/4.jpg" alt=""></a>
        </li>
        <li>
          <a href="#" ><img src="images/5.jpg" alt=""></a>
        </li>
        <li>
          <a href="#" ><img src="images/6.jpg" alt=""></a>
        </li>
      </ul>
      <div class="list">
        <i class="current">1</i>
        <i>2</i>
        <i>3</i>
        <i>4</i>
        <i>5</i>
        <i>6</i>
      </div>
      <div class="arrow">
        <span class="arrow-left"><</span>
        <span class="arrow-right">></span>
      </div>
    </div>
</div>

css部分

* {
      margin: 0;
      padding: 0;
    }
    
    ul {
      list-style: none;
    }
    
    .box {
      width: 730px;
      height: 454px;
      padding: 8px;
      border: 1px solid green;
      margin: 100px auto;
    }
    
    .inner {
      position: relative;
      overflow: hidden;
      height: 454px;
    }
    
    #imglist {
      width: 700%;
      position: absolute;
      left: 0;
      transition: left 300ms linear;
    }
    
    li {
      float: left;
    }
    
    .list {
      position: absolute;
      bottom: 20px;
      left: 50%;
      margin-left: -85px;
    }
    
    .list i {
      width: 20px;
      height: 20px;
      border-radius: 50%;
      background-color: #fff;
      color: #333;
      float: left;
      font-style: normal;
      line-height: 20px;
      font-size: 14px;
      text-align: center;
      margin-right: 10px;
      cursor: pointer;
    }
    
    .list i:last-child {
      margin-right: 0;
    }
    
    .list i.current {
      background-color: skyblue;
      color: #fff;
    }
    
    .arrow {
      position: absolute;
      width: 100%;
      top: 50%;
      margin-top: -30px;
    }
    
    .arrow-left,
    .arrow-right {
      width: 30px;
      height: 60px;
      position: absolute;
      font: 20px/60px "consolas";
      color: #fff;
      background-color: rgba(0, 0, 0, .3);
      text-align: center;
      cursor: pointer;
    }
    
    .arrow-right {
      right: 0;
    }

js部分:

// 获取DOM
  var yuan = document.querySelectorAll("i");
  var li = document.querySelector("ul li");
  var ul = document.querySelector("ul");
  var imgs = document.querySelector("#imglist");
  var right = document.querySelector(".arrow-right");
  var left = document.querySelector(".arrow-left");
  var box = document.querySelector(".box");
  window.onload = function() {
    //------------------------------------这里是点击小圆圈,控制图片的切换
    //循环小圆点 注册小圆点
    for (var i = 0; i < yuan.length; i++) {
      //我们需要这里面的i 必须提前拿出来,要不最后i的值就是最后一个数值了
      yuan[i].num = i;
      //注册事件
      yuan[i].onmouseover = function() {
        // 现在要循环将样式移除
        for (var j = 0; j < yuan.length; j++) {
          yuan[j].classList.remove("current");
        }
        //这里是为了将点击的小圆点 增加上样式
        this.classList.add("current");
        var num = this.num;
        //到这里的思路就是点击小圆点 将图片进行移动,向左面移动,上面css做了相应的定位操作
        //移动的距离就是 n 乘以 一张图片的宽度,
        //n 就是选择的小圆点的 坐标-----i(num)
        //图片的宽度 box.offsetWidth
        var left = num * li.offsetWidth;
        // console.log(num, box.offsetWidth, left);
        imgs.style.left = `-${left}px`;

        //这里小原点联动左右按钮
        for (var p = 0; p < yuan.length; p++) {
          //清除全部样式(小圆点)
          yuan[p].classList.remove("current");
        }
        //给当前的小圆点增加样式
        yuan[num].classList.add("current");
        //这里这个位置比较关键,在上面设置完样式之后,记得将此num赋值给全局的index
        index = this.num;


      }
    }
    //------------------------------------以上是点击小圆圈,控制图片的切换
    //------------------------------------下面是开始右面轮播,控制图片的切换
    //首先定义一个全局的index,这个index的作用依旧是控制图片的切换
    var index = 0;
    right.onclick = function() {
      index++;
      //这里要对index做一下判断,如果不做判断,可以试想一下,
      //只要你一点击,index就会无限的增大,增大到你“无法自拔”
      if (index == ul.children.length) {
        //如果坐标为6的话,显示应该显示第1张图片,所以要复位 即index=0
        index = 0;
      }
      var left = index * li.offsetWidth;
      // console.log(index, box.offsetWidth, left);
      imgs.style.left = `-${left}px`;

      //点击右面增加联动小圆点的效果
      for (var n = 0; n < yuan.length; n++) {
        //清除全部样式(小圆点)
        yuan[n].classList.remove("current");
      }
      //给当前的小圆点增加样式
      yuan[index].classList.add("current");
    };
    //------------------------------------以上是结束右面轮播,控制图片的切换

    //------------------------------------下面是开始左面轮播,控制图片的切换
    left.onclick = function() {
      index--;
      //这里同右点击一样,需要做一下判断,
      console.log(index);
      if (index == -1) {
        index = ul.children.length - 1;
      }
      var left = index * li.offsetWidth;
      // console.log(index, box.offsetWidth, left);
      // console.log(left);
      imgs.style.left = `-${left}px`;

      //这个位置做的是 左面点击联动小圆点
      for (var m = 0; m < yuan.length; m++) {
        //清除全部样式(小圆点)
        yuan[m].classList.remove("current");
      }
      //给当前的小圆点增加样式
      yuan[index].classList.add("current");
    };
    //------------------------------------上面是结束左面轮播,控制图片的切换
    //------------------------------------开始设置自动轮播
    var timer = setInterval(function() {
      right.onclick();
    }, 1000);
    //------------------------------------以上是自动轮播结束
    //------------------------------------设置鼠标进来就停止开始
    box.onmouseover = function() {
      clearInterval(timer);
    };
    //------------------------------------设置鼠标进来就停止结束
    //------------------------------------设置鼠标出去就停止开始
    box.onmouseout = function() {
      timer = setInterval(function() {
        right.onclick();
      }, 1000);
    };
    //------------------------------------设置鼠标出去就停止结束
  }

未完待续,本篇文章做的PC端的处理,目前从6页-1页,1页到6页还有点小瑕疵,会及时更新上的,其他功能一切正常,欢迎大家评论

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
轻松实现javascript数据双向绑定
Nov 11 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
Nov 11 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
jquery 禁止鼠标右键并监听右键事件
Apr 27 jQuery
JavaScript中splice与slice的区别
May 09 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
Sep 03 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
js实现移动端轮播图滑动切换
Dec 21 #Javascript
vue监听滚动事件的方法
Dec 21 #Vue.js
vue el-upload上传文件的示例代码
Dec 21 #Vue.js
微信小程序自定义支持图片的弹窗
Dec 21 #Javascript
Jquery+javascript实现支付网页数字键盘
Dec 21 #jQuery
微信小程序实现modal弹出框遮罩层组件(可带文本框)
Dec 20 #Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 #Javascript
You might like
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
js简易namespace管理器 实例代码
2013/06/21 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python计算N天之后日期的方法
2015/03/31 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python numpy 按行归一化的实例
2019/01/21 Python
python中的列表与元组的使用
2019/08/08 Python
python根据多个文件名批量查找文件
2019/08/13 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Python实现随机爬山算法
2021/01/29 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
甲方资料员岗位职责
2013/12/13 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
女性健康讲座主持词
2015/07/04 职场文书
健康教育主题班会
2015/08/14 职场文书
爱国之歌(8首)
2019/09/29 职场文书