JavaScript实现PC端横向轮播图


Posted in Javascript onFebruary 07, 2020

本文实例为大家分享了JavaScript实现PC端横向轮播图的具体代码,供大家参考,具体内容如下

步骤:

第一步:先实现右侧按钮点击图片动起来;
1.每次点击图片走的距离;
2.起始位置已知,计算定时器每走一小步的距离;

第二步:判断点击按钮一次图片移动的距离,停止定时器;

第三步:左边按钮逻辑和右侧按钮几乎一致;
1.因此封装函数move(flag),函数传参是Boolean则是左右按钮方向

第四步:无缝轮播:html结构修改,在当前结构分别加第一张图和最后一张图;
1.判断图片位置,设置相应位置;

第五步:小圆点逻辑:排他思想;
1.关键在于小圆点变色,用最终位置计算小圆点下标,设置样式;

第六步:点击小圆点,图片切换和小圆点位置对应,move函数中传参数根据类型判断,boolean 是左右按钮,数值室小圆点下标相关;flag参数代表左右按钮和小圆点;

第七步:自动轮播:根据图片下标进行;

第八步:自动轮播和鼠标行为同步时:鼠标移入清楚自动轮播;鼠标移出自动轮播

第九步:鼠标移入后,点击按钮和小圆点有需要把自动轮播的小标值更新,否则没法同步;

html代码:

<div id="swiper">
 <ul class="list">
  <li><img src="img/9.jpg" alt=""></li>
  <!-- 最后一张 -->
  <li><img src="img/2.jpg" alt=""></li>
  <li><img src="img/3.jpg" alt=""></li>
  <li><img src="img/4.jpg" alt=""></li>
  <li><img src="img/6.jpg" alt=""></li>
  <li><img src="img/9.jpg" alt=""></li>
  <!-- 第一张 -->
  <li><img src="img/2.jpg" alt=""></li>
 </ul>
 <span class="btn-left"><</span>
 <span class="btn-right">></span>
 <ul class="points">
  <li class="current"></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

css代码:

<style type="text/css">
 * {
  margin: 0;
  padding: 0;
 }
 
 ul,
 li {
  list-style: none;
 }
 
 a {
  text-decoration: none;
 }
 
 img {
  display: block;
 }
 
 input {
  outline: none;
 }
 
 .clearFix:after {
  content: '';
  display: block;
  clear: both;
 }
 /*禁止系统滚动条*/
 
 html,
 body {
  height: 100%;
  overflow: hidden;
 }
 
 #swiper {
  position: relative;
  width: 1000px;
  height: 500px;
  background: green;
  margin: 50px auto 0;
  overflow: hidden;
 }
 
 #swiper .list {
  position: absolute;
  left: -1000px;
  top: 0;
  width: 7000px;
  overflow: hidden;
 }
 
 #swiper .list>li {
  float: left;
  width: 1000px;
  height: 500px;
 }
 
 #swiper .list>li img {
  width: 100%;
  height: 100%;
 }
 
 #swiper span {
  position: absolute;
  /* left: 0; */
  top: 40%;
  transform: translateY(-50%);
  width: 80px;
  height: 100px;
  background: rgba(0, 0, 0, 0.5);
  font-size: 50px;
  color: white;
  font-weight: bold;
  padding-top: 30px;
  text-align: center;
  opacity: 0;
  transition: opacity 1s;
  cursor: pointer;
 }
 
 #swiper:hover span {
  opacity: 1;
 }
 
 #swiper .btn-left {
  left: 0;
 }
 
 #swiper .btn-right {
  right: 0;
 }
 
 #swiper .points {
  position: absolute;
  left: 40%;
  transform: translateX(-50%);
  bottom: 20px;
  /* width: 300px; */
 }
 
 #swiper .points>li {
  width: 30px;
  height: 30px;
  background: rgba(0, 0, 0, 0.5);
  border-radius: 50%;
  float: left;
  margin: 0 5px;
 }
 
 #swiper .points .current {
  background: red;
 }
</style>

javascript代码:

<script>
 window.onload = function() {
  // 获取变量
  var swiper = document.querySelector('#swiper');
  var list = document.querySelector('#swiper .list');
  var liNodes = document.querySelectorAll('#swiper .list>li');
  var btnNodes = document.querySelectorAll('#swiper span');
  // 切换一张需要的总时长
  var timeAll = 1000;
  // 每走一步需要的时长
  var timeStep = 20;
  var timer = null;
  // 小圆点
  var icons = document.querySelectorAll('#swiper>.points li');
  var isMove = false;
  var autoTimer = null;

  // 鼠标进入banner
  swiper.onmouseenter = function() {
  // 清除定时器
  clearInterval(autoTimer);
  }

  // 鼠标离开banner
  swiper.onmouseleave = function() {
  // 打开自动轮播定时器
  autoRun();
  }

  // 点击按钮切换图片
  // 右按钮
  btnNodes[1].onclick = function() {
  // 图片且切换函数
  move(true);
  }

  // 左按钮
  btnNodes[0].onclick = function() {
  // 图片切换函数
  move(false);
  }

  // 图片切换函数
  function move(flag) {
  // 保证定时器只开一个,不会堆砌
  if (isMove) {
   return;
  }
  isMove = true;


  // 区分flag参数,boolean是左右图片切换
  if (typeof flag == 'boolean') {
   if (flag) {
   var elementDistance = -1000;
   } else {
   var elementDistance = 1000;
   }
  } else {
   var elementDistance = flag - list.offsetLeft;
  }

  // 每次点击后,ul所走的距离
  var elementLast = list.offsetLeft + elementDistance;
  // 每走一小步的距离
  var step = elementDistance / (timeAll / timeStep);

  timer = setInterval(function() {
   var left = list.offsetLeft + step;
   if (left == elementLast) {
   // 走的的距离等于最终的位置
   clearInterval(timer);
   if (left == -6000) {
    left = -1000;
   } else if (left == 0) {
    left = -5000;
   }
   isMove = false;
   }
   // 设置样式
   list.style.left = left + 'px';
  }, timeStep);

  // 小圆点切换逻辑
  for (var i = 0; i < icons.length; i++) {
   icons[i].className = '';
  }

  // 小圆点切换
  var index = elementLast / -1000 - 1;
  if (index > 4) {
   index = 0;
  } else if (index < 0) {
   index = 4;
  }
  icons[index].className = 'current';
  console.log(icons);
  //让自动轮播和点击后下标保持统一
  autoIndex = index + 1;
  }

  // 点击小圆点逻辑
  for (var i = 0; i < icons.length; i++) {
  icons[i].index = i;
  icons[i].onclick = function() {
   // 拿小圆点下标,求显示图片的下标,再求显示图片位置
   move((this.index + 1) * -1000);
  }
  }

  // 自动轮播逻辑
  var autoIndex = 1;
  autoRun();

  function autoRun() {
  autoTimer = setInterval(function() {
   autoIndex++;
   move(autoIndex * -1000);
   if (autoIndex == 6) {
   autoIndex = 1;
   }
  }, 2000);
  }
 }
</script>

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

Javascript 相关文章推荐
js 目录列举函数
Nov 06 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
js获取url参数值的两种方式
Sep 10 Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 Javascript
flexslider.js实现移动端轮播
Feb 05 Javascript
Jquery-data的三种用法
Apr 18 jQuery
Angular简单验证功能示例
Dec 22 Javascript
详解Webpack多环境代码打包的方法
Aug 03 Javascript
一小时迅速入门Mybatis之bind与多数据源支持 Java API
Sep 15 Javascript
vue更改数组中的值实例代码详解
Feb 07 #Javascript
Vue 一键清空表单的实现方法
Feb 07 #Javascript
Vue中qs插件的使用详解
Feb 07 #Javascript
npm qs模块使用详解
Feb 07 #Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 #Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 #Javascript
jQuery实现获取多选框的值示例
Feb 07 #jQuery
You might like
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
php微信开发之图片回复功能
2018/06/14 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
linux 下实现python多版本安装实践
2014/11/18 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python内建模块struct实例详解
2018/02/02 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
基于matplotlib xticks用法详解
2020/04/16 Python
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
保护环境倡议书范文
2014/05/13 职场文书
2014年民警工作总结
2014/11/25 职场文书
食堂卫生管理制度
2015/08/04 职场文书
导游词之长城八达岭
2019/09/24 职场文书