原生JS实现无缝轮播图片


Posted in Javascript onJune 24, 2020

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

运动插件

function animove(obj,distance,speed,callback) { //调用的变量 目标距离 速度 回调函数
 clearInterval(obj.timer);
 obj.timer = setInterval(function () {
  let step = (distance - obj.offsetLeft) / 10;
  step = step > 0 ? Math.ceil(step) : Math.floor(step);
  if (obj.offsetLeft == distance) {
  clearInterval(obj.timer);
  if (callback) {
   callback();
  }
  }
  obj.style.left = obj.offsetLeft + step + 'px';
 },speed)
}

CSS代码

* {
  margin: 0;
  padding: 0;
 }
 ul,li {
  list-style: none;
 }
 .box {
  width: 1226px;
  height: 460px;
  margin: 100px auto;
  position: relative;
  overflow: hidden;
 }
 .pic-box {
  width: 4904px;
  position: absolute;
 }
 .pic-box > li {
  float: left;
 }
 .point {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
 }
 .point > li {
  float: left;
  width: 8px;
  height: 8px;
  border: 1px solid blueviolet;
  margin: 0 4px;
  border-radius: 50%;
 }
 .point > .active {
  background-color: orange;
 }
 .left-btn,
 .right-btn {
  width: 50px;
  height: 40px;
  background-color: rgba(0,0,0,.5);
  text-align: center;
  line-height: 40px;
  font-size: 20px;
  color: white;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
 }
 .left-btn {
  left: 0;
 }
 .right-btn {
  right: 0;
 }

HTML代码

<div class="box">
 <ul class="pic-box">
  <li>
  <img src="lb.webp" alt="">
  </li>
  <li>
  <img src="lb2.webp" alt="">
  </li>
  <li>
  <img src="pic3.jpg" alt="">
  </li>
 </ul>
 <ul class="point">
 </ul>
 <div class="left-btn"><</div>
 <div class="right-btn">></div>
 </div>
<script src="运动插件.js"></script>

js代码

let picbox = document.querySelector('.pic-box');
 let pic = document.querySelectorAll('.pic-box > li'); //由于获取的不是动态的 所以之后的克隆 并不会使这个变量发生改变
 let point = document.querySelector('.point');
 let leftbtn = document.querySelector('.left-btn');
 let rightbtn = document.querySelector('.right-btn');
 let carouselindex = 0;
 //通过for循环 生成小圆点 并将圆点添加到ul里
 for (let i = 0; i < pic.length; i ++) {
  let pointli = document.createElement('li');
  pointli.classList.add(i);
  point.appendChild(pointli);
 }
 //给第一个小圆点默认添加active
 point.children[0].classList.add('active');

 //克隆第一个图片 深度
 let kelon = picbox.children[0].cloneNode(true);
 picbox.appendChild(kelon); //将图片添加到最后位置

 //获取所以圆点
 let pointli = document.getElementsByClassName('point')[0].getElementsByTagName('li');

 //轮播方法
 function carousel(index) {
  let distance = (-index * pic[0].offsetWidth); //计算行走的距离 图片的index值乘以图片的大小
  animove(picbox,distance,10); //调用运动函数
  for (let i = 0; i < pointli.length; i ++) { //for循环移除每个小点的选中状态
  pointli[i].classList.remove('active');
  }
  if (index != pic.length) { //如果不等于pic的长度 就执行
  pointli[index].classList.add('active');
  } else { //如果索引值为3 说明此时图片为克隆的图 而圆点的最大索引值为2 将第一个圆点设置为active即可正常显示圆点状态
  point.children[0].classList.add('active');
  }
 }
 Array.prototype.forEach.call(pointli,function (item,index) { //给每个圆点添加点击事件
  item.addEventListener('click',function () {
   carouselindex = index;  //将点击的索引值赋值给轮播索引全局变量
   carousel(carouselindex);
  })
 });
 rightbtn.addEventListener('click',function () { //右边点击事件
  carouselindex ++; //每次点击全局轮播索引增加
  if (carouselindex > pic.length) { //如果索引大于图片数量 由于数量大小获取的是静态的 所以长度不会因为克隆变化而变化
   picbox.style.left = "0px"; //如果大于索引说明此时要离开克隆的那张图 此时迅速将left值设置为0
   carouselindex = 1; //然后将索引设置为1
  }
  carousel(carouselindex); //这时候就在left为0的位置 过渡到索引1的位置 实现无缝轮播的效果
 });
 leftbtn.addEventListener('click',function () { //左边点击事件
  carouselindex --; //减减
  if (carouselindex < 0) { //如果索引值小于0
  carouselindex = 2; //将索引值设置为2
  picbox.style.left = "-3678px"; //将位置迅速变换为第四张图的位置(克隆的图)
  }
  carousel(carouselindex); //由克隆的图过渡到索引为2的图(第三张图)
})

精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播

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

Javascript 相关文章推荐
js每次Title显示不同的名言
Sep 25 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
js中class的点击事件没有效果的解决方法
Oct 13 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
Angularjs使用过滤器完成排序功能
Sep 20 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 24 Javascript
详解Vue调用手机相机和相册以及上传
May 05 Javascript
vue router动态路由设置参数可选问题
Aug 21 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
Jun 16 #Javascript
js+css实现全屏侧边栏
Jun 16 #Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 #Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 #Javascript
vue proxy 的优势与使用场景实现
Jun 15 #Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 #Javascript
koa中间件核心(koa-compose)源码解读分析
Jun 15 #Javascript
You might like
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PDO::query讲解
2019/01/29 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
2016/07/12 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
浅析Python四种数据类型
2018/09/26 Python
pytorch permute维度转换方法
2018/12/14 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
详解python 中in 的 用法
2019/12/12 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
戒毒悔改检讨书
2014/09/21 职场文书
面试感谢信范文
2015/01/22 职场文书
社会实践活动总结
2015/02/05 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python