原生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 相关文章推荐
用js实现键盘方向键翻页功能的代码
Jun 03 Javascript
javascript innerHTML使用分析
Dec 03 Javascript
JS实现图片预加载无需等待
Dec 21 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
Jan 11 Javascript
理解 JavaScript EventEmitter
Mar 29 Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
Emberjs 通过 axios 下载文件的方法
Sep 03 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
JS实现九宫格拼图游戏
Jun 28 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
Python爬取读者并制作成PDF
2015/03/10 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python正规则表达式学习指南
2016/08/02 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
副总经理工作职责
2013/11/28 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
企业2014年度工作总结
2014/12/10 职场文书
旷课检讨书
2015/01/26 职场文书
大学团日活动总结书
2015/05/11 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android