原生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插件制作 提示框插件实现代码
Aug 17 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
javascript的动态加载、缓存、更新以及复用(一)
Jun 09 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
Apr 18 Javascript
Vue 实现树形视图数据功能
May 07 Javascript
详解vue中的computed的this指向问题
Dec 05 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
javascript代码实现简易计算器
Jan 25 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防注
2007/01/15 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
php批量修改表结构实例
2017/05/24 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
深入讲解Python编程中的字符串
2015/10/14 Python
python3.x实现发送邮件功能
2018/05/22 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
如何通过python计算圆周率PI
2020/11/11 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
课内比教学心得体会
2014/09/09 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
2015最新婚礼主持词
2015/06/30 职场文书