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 相关文章推荐
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
Dec 25 Javascript
Jquery Ajax.ashx 高效分页实现代码
Oct 20 Javascript
js过滤HTML标签以及空格的思路及代码
May 24 Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
基于Three.js插件制作360度全景图
Nov 29 Javascript
微信小程序上传图片到服务器实例代码
Nov 07 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
Vue中computed与methods的区别详解
Mar 24 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
微信小程序实现购物车功能
Nov 18 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Django自定义manage命令实例代码
2018/02/11 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
python:接口间数据传递与调用方法
2018/12/17 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python3实现高效的端口扫描
2019/08/31 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
护理专业推荐信
2013/11/07 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
房屋产权证明书
2015/06/19 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
Python制作表白爱心合集
2022/01/22 Python
Docker下安装Oracle19c
2022/04/13 Servers