原生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 相关文章推荐
Prototype使用指南之selector.js说明
Oct 26 Javascript
基于Jquery的简单图片切换效果
Jan 06 Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 Javascript
javascript中clone对象详解
Dec 03 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
SWFObject基本用法实例分析
Jul 20 Javascript
jQuery实现摸拟alert提示框
May 22 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
JS实现标签页切换效果
May 04 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
Jun 01 Javascript
JS实现闭包中的沙箱模式示例
Sep 07 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 include的妙用,实现路径加密
2008/07/29 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Python导出DBF文件到Excel的方法
2015/07/25 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python类中super()和__init__()的区别
2016/10/18 Python
Python BS4库的安装与使用详解
2018/08/08 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
详解Python 最短匹配模式
2020/07/29 Python
python Pexpect模块的使用
2020/12/25 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
个人教师自我评价范文
2013/12/02 职场文书
驾驶员培训方案
2014/05/01 职场文书
软件售后服务承诺书
2014/05/21 职场文书
学校安全责任书范本
2014/07/23 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
房贷工资证明范本
2015/06/12 职场文书
在校生证明
2015/06/17 职场文书