原生JS运动实现轮播图


Posted in Javascript onJanuary 02, 2021

原生JS运动实现轮播图

**基本原理:**通过控制包含n张图片的ul的left值来实现图片自动运动的效果,其中列表中li元素的个数为n,第一个li和最后一个li里存放的图片应为同一张图片,当图片运动到最后一张时,将ul的left值设为0,即可达到图片无线轮播的效果。

运动函数的实现

函数需传入元素(即需要参与运动的元素)、目标值(以对象的形式呈现,如{left: 300})、callback(回调函数)。

//多物体多值运动+回调机制
function startMove(dom, attrObj, callback) {
 var key = true;
 var iSpeed = null,
  iCur = null;
 clearInterval(dom.timer);
 if (key) {
  dom.timer = setInterval(function() {
  //bStop用来判断是否开始执行回调函数
   var bStop = true;
   //判断传入目标值中的“键”类型是否为opacity
   for (var attr in attrObj) {
   //若要改变的样式为opacity,则将元素的opacity扩大100被进行操作
    if (attr === 'opacity') {
     iCur = parseFloat(getStyle(dom, attr)) * 100;
    } else {
     iCur = parseInt(getStyle(dom, attr));
    }
    //运动速度设为目标值减去当前值的一半,即当前状态离目标值越接近,运动速度越小
    iSpeed = (attrObj[attr] - iCur) / 2;
    //对速度进行取整
    iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
    if (attr === 'opacity') {
     dom.style.opacity = (iCur + iSpeed) / 100;
    } else {
     dom.style[attr] = iCur + iSpeed + 'px';
    }
    if (iCur !== attrObj[attr]) {
     bStop = false;
    }
   }
   //当bStop为true时,元素的所有样式均已达到目标值,清理定时器并执行回调函数
   if (bStop) {
    clearInterval(dom.timer);
    typeof callback == 'function' && callback();
   }
  }, 30)
 }
 if (!key) {

 }
}
//用来获取元素实时的样式值
function getStyle(elem, prop){
 if (window.getComputedStyle){
  return window.getComputedStyle(elem, null)[prop];
 }
}

HTML部分

HTML中包含一个div,用来显示当前要播放的图片,该div中又包含一个ul(用来存放所有包含图片的li)、三个div(其中两个充当图片左右切换的按钮,第三个存放图片索引点,通过点击索引也可切换到要查看的图片),代码如下:

<div class="wrapper">
 <ul class="sliderPage">
  <li>
   <img src="./image/dog/阿拉斯加.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/比熊.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/边牧.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/柯基.jpeg"/>
  </li>
  <li>
   <img src="./image/dog/阿拉斯加.jpeg"/>
  </li>
 </ul>
 <div class="btn leftBtn"><</div>
 <div class="btn rightBtn">></div>
 <div class="sliderIndex">
  <span class="active"></span>
  <span></span>
  <span></span>
  <span></span>
 </div>
</div>

CSS代码

此处采用的为内联样式表

<style>
 *{
  margin: 0;
  padding: 0;
  list-style: none;
 }
 .wrapper{
  position: relative;
  margin: 100px auto 0;
  width: 600px;
  height: 360px;
  overflow: hidden;
 }
 .wrapper .sliderPage{
  position: absolute;
  left: 0;
  width: 3000px;
  height: 360px;
 }
 .wrapper .sliderPage li{
  width: 600px;
  height: 360px;
  float: left;
 }
 .wrapper .sliderPage li img{
  width: 100%;
  height: 100%;
 }
 .btn{
  position: absolute;
  top: 50%;
  width: 20px;
  height: 20px;
  color: #fff;
  text-align: center;
  line-height: 20px;
  background-color: #000;
  opacity: 0.2;
  cursor: pointer;
 }
 .leftBtn{
  left: 5px;
 }
 .rightBtn{
  right: 5px;
 }
 .wrapper:hover .btn{
  opacity: 0.8;
 }
 .sliderIndex{
  position: absolute;
  width: 100%;
  bottom: 10px;
  cursor: pointer;
  text-align: center;
 }
 span{
  width: 8px;
  height: 8px;
  background-color: #cccccc;
  border-radius: 50%;
  display: inline-block;
  margin-right: 5px;
 }
 .active{
  background-color: orange;
 }
</style>

图片自动运动及点击运动事件绑定

要点:

1、当图片运动到最后一张时(显示图片为第一张图片),将ul的left值设为0即可实现无限轮播;
2、图片每次运动的值为li的宽度;
3、图片的运动需要一定的时间,因此在图片运动过程中应禁止产生其它定时器,否则会造成运动尺寸混乱而导致图片轮播出现问题,这里用lock来进行实现,在ul运动过程中将lock值设为false,运动结束后又将lock值设为true;
4、通过index值来实现索引显示图片功能,图片轮播过程中,index初始值为0,当图片向右轮播时index值加1,图片向左轮播时,index值减1,index值为0时,若让图片向左轮播,则将index值设为n(li个数)并进行轮播,而当index值为3且图片向右轮播时,在ul运动完成后将index值设为0;

var timer = null;
var sliderPage = document.getElementsByTagName('ul')[0];
var moveWidth = sliderPage.children[0].offsetWidth;
var num = sliderPage.children.length - 1;
var leftBtn = document.getElementsByClassName('leftBtn')[0];
var rightBtn = document.getElementsByClassName('rightBtn')[0];
var lock = true;
var index = 0;
var indexArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');
//索引切换
for (var i = 0; i < indexArray.length; i ++){
 (function(myindex){
  indexArray[myindex].onclick = function(){
   lock = false;
   clearTimeout(timer);
   index = myindex;
   changeIndex(index);
   startMove(sliderPage, {left: -index * moveWidth}, function(){
    lock = true;
    timer = setTimeout(autoMove, 3000);
   })
  }
 }(i))
}
//图片运动过程中改变index点的样式
function changeIndex(index){
 for (var i = 0; i < indexArray.length; i++){
  indexArray[i].className = '';
 }
 indexArray[index].className = 'active';
}
timer = setTimeout(autoMove, 3000);
//向左翻
leftBtn.onclick = function (){
 autoMove('right->left');
}
//向右翻
rightBtn.onclick = function (){
 autoMove('left->right');
}
//direction
//默认轮播方向 'left->right' / undefined
//点击left按钮 'right->left'
function autoMove(direction){
 clearTimeout(timer);
 if (lock){
  lock = false;

  if (!direction || direction === 'left->right'){
   index++;
   startMove(sliderPage, {left: sliderPage.offsetLeft - moveWidth}, function(){
    if (sliderPage.offsetLeft === - num * moveWidth){
     index = 0;
     sliderPage.style.left = '0px';
    }
    timer = setTimeout(autoMove, 3000);
    lock = true;
    changeIndex(index);
   });
  }else if(direction === 'right->left'){
   if (sliderPage.offsetLeft === 0){
    index = num;
    sliderPage.style.left = - num * moveWidth + 'px';
   }
   index--;
   startMove(sliderPage, {left: sliderPage.offsetLeft + moveWidth}, function () {
    timer = setTimeout(autoMove, 3000);
    lock = true;
    changeIndex(index);
   })
  }
 }
}

以上即为通过原生JS运动所实现的图片轮播。

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

Javascript 相关文章推荐
jquery鼠标停止移动事件
Dec 21 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
js预加载图片方法汇总
Jun 15 Javascript
javascript实现支持移动设备画廊
Aug 24 Javascript
浅谈JS中的bind方法与函数柯里化
Aug 10 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
Feb 26 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
详解vue项目接入微信JSSDK的坑
Dec 14 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
May 23 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 #Javascript
JS+CSS实现过渡特效
Jan 02 #Javascript
jQuery实现全选按钮
Jan 01 #jQuery
vue实现登录功能
Dec 31 #Vue.js
vue 实现图片懒加载功能
Dec 31 #Vue.js
vue 动态创建组件的两种方法
Dec 31 #Vue.js
Vue 修改网站图标的方法
Dec 31 #Vue.js
You might like
php 常用类汇总 推荐收藏
2010/05/13 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
JavaScript 模拟用户单击事件
2009/12/31 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
js实现音乐播放控制条
2017/09/09 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
python paramiko模块学习分享
2017/08/23 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
学校办公室主任职责
2013/12/27 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
文秘个人求职信范文
2014/04/22 职场文书
工地标语大全
2014/06/18 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
医德医风个人总结
2015/02/28 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers