iSlider手机端图片滑动切换插件使用详解


Posted in Javascript onDecember 24, 2019

自适应轮播图,支持手机触屏滑动,三种切换效果。

效果图:

iSlider手机端图片滑动切换插件使用详解

js:

var iSlider = function(opts) {
 if (!opts.dom) {
  throw new Error("dom element can not be empty!");
 }
 if (!opts.data || !opts.data.length) {
  throw new Error("data must be an array and must have more than one element!");
 }
 this._opts = opts;
 this._setting();
 this._renderHTML();
 this._bindHandler();
};
iSlider.prototype._setting = function() {
 var opts = this._opts;
 this.wrap = opts.dom;
 this.data = opts.data;
 this.type = opts.type || 'pic';
 this.isVertical = opts.isVertical || false;
 this.onslide = opts.onslide;
 this.onslidestart = opts.onslidestart;
 this.onslideend = opts.onslideend;
 this.onslidechange = opts.onslidechange;
 this.duration = opts.duration || 4000;
 this.log = opts.isDebug ?
 function(str) {
  console.log(str)
 }: function() {};
 this.axis = this.isVertical ? 'Y': 'X';
 this.width = this.wrap.clientWidth;
 this.height = this.wrap.clientHeight;
 this.ratio = this.height / this.width;
 this.scale = opts.isVertical ? this.height: this.width;
 this.sliderIndex = this.sliderIndex || 0;
 if (this.data.length < 2) {
  this.isLooping = false;
  this.isAutoPlay = false;
 } else {
  this.isLooping = opts.isLooping || false;
  this.isAutoplay = opts.isAutoplay || false;
 }
 if (this.isAutoplay) {
  this.play();
 }
 this._setUpDamping();
 this._animateFunc = (opts.animateType in this._animateFuncs) ? this._animateFuncs[opts.animateType] : this._animateFuncs['default'];
 this._setPlayWhenFocus();
};
iSlider.prototype._setPlayWhenFocus = function() {
 var self = this;
 window.addEventListener('focus',
 function() {
  self.isAutoplay && self.play();
 },
 false);
 window.addEventListener('blur',
 function() {
  self.pause();
 },
 false);
}
iSlider.prototype._animateFuncs = {
 'default': function(dom, axis, scale, i, offset) {
  dom.style.webkitTransform = 'translateZ(0) translate' + axis + '(' + (offset + scale * (i - 1)) + 'px)';
 },
 'rotate': function(dom, axis, scale, i, offset) {
  var rotateDirect = (axis == "X") ? "Y": "X";
  var absoluteOffset = Math.abs(offset);
  var bdColor = window.getComputedStyle(this.wrap.parentNode, null).backgroundColor;
  if (this.isVertical) {
   offset = -offset;
  }
  this.wrap.style.webkitPerspective = scale * 4;
  if (i == 1) {
   dom.style.zIndex = scale - absoluteOffset;
  } else {
   dom.style.zIndex = (offset > 0) ? (1 - i) * absoluteOffset: (i - 1) * absoluteOffset;
  }
  dom.style.backgroundColor = bdColor || '#333';
  dom.style.position = 'absolute';
  dom.style.webkitBackfaceVisibility = 'hidden';
  dom.style.webkitTransformStyle = 'preserve-3d';
  dom.style.webkitTransform = 'rotate' + rotateDirect + '(' + 90 * (offset / scale + i - 1) + 'deg) translateZ(' + (0.888 * scale / 2) + 'px) scale(0.888)';
 },
 'flip': function(dom, axis, scale, i, offset) {
  var rotateDirect = (axis == "X") ? "Y": "X";
  var bdColor = window.getComputedStyle(this.wrap.parentNode, null).backgroundColor;
  if (this.isVertical) {
   offset = -offset;
  }
  this.wrap.style.webkitPerspective = scale * 4;
  if (offset > 0) {
   dom.style.visibility = (i > 1) ? 'hidden': 'visible';
  } else {
   dom.style.visibility = (i < 1) ? 'hidden': 'visible';
  }
  dom.style.backgroundColor = bdColor || '#333';
  dom.style.position = 'absolute';
  dom.style.webkitBackfaceVisibility = 'hidden';
  dom.style.webkitTransform = 'translateZ(' + (scale / 2) + 'px) rotate' + rotateDirect + '(' + 180 * (offset / scale + i - 1) + 'deg) scale(0.875)';
 },
 'depth': function(dom, axis, scale, i, offset) {
  var rotateDirect = (axis == "X") ? "Y": "X";
  var zoomScale = (4 - Math.abs(i - 1)) * 0.15;
  this.wrap.style.webkitPerspective = scale * 4;
  if (i == 1) {
   dom.style.zIndex = 100;
  } else {
   dom.style.zIndex = (offset > 0) ? (1 - i) : (i - 1);
  }
  dom.style.webkitTransform = 'scale(' + zoomScale + ', ' + zoomScale + ') translateZ(0) translate' + axis + '(' + (offset + 1.3 * scale * (i - 1)) + 'px)';
 },
 'tear': function(dom, axis, scale, i, offset) {
  var rotateDirect = (axis == "X") ? "Y": "X";
  var zoomScale = 1 - (Math.abs(i - 1) * 0.2);
  this.wrap.style.webkitPerspective = scale * 4;
  if (i == 1) {
   dom.style.zIndex = 100;
  } else {
   dom.style.zIndex = (offset > 0) ? (1 - i) : (i - 1);
  }
  dom.style.webkitTransform = 'scale(' + zoomScale + ', ' + zoomScale + ') translateZ(0) translate' + axis + '(' + (offset + scale * (i - 1)) + 'px)';
 }
}
iSlider.prototype._setUpDamping = function() {
 var oneIn2 = this.scale >> 1;
 var oneIn4 = oneIn2 >> 1;
 var oneIn16 = oneIn4 >> 2;
 this._damping = function(distance) {
  var dis = Math.abs(distance);
  var result;
  if (dis < oneIn2) {
   result = dis >> 1;
  } else if (dis < oneIn2 + oneIn4) {
   result = oneIn4 + ((dis - oneIn2) >> 2);
  } else {
   result = oneIn4 + oneIn16 + ((dis - oneIn2 - oneIn4) >> 3);
  }
  return distance > 0 ? result: -result;
 };
};
iSlider.prototype._renderItem = function(i) {
 var item, html;
 var len = this.data.length;
 if (!this.isLooping) {
  item = this.data[i] || {
   empty: true
  };
 } else {
  if (i < 0) {
   item = this.data[len + i];
  } else if (i > len - 1) {
   item = this.data[i - len];
  } else {
   item = this.data[i];
  }
 }
 if (item.empty) {
  return '';
 }
 if (this.type === 'pic') {
  html = item.height / item.width > this.ratio ? '<img height="' + this.height + '" src="' + item.content + '">': '<img width="' + this.width + '" src="' + item.content + '">';
 } else if (this.type === 'dom') {
  html = '<div style="height:' + item.height + ';width:' + item.width + ';">' + item.content + '</div>';
 } else if (this.type === 'overspread') {
  html = this.ratio < 1 ? '<div style="height: 100%; width:100%; background:url(' + item.content + ') center no-repeat; background-size:' + this.width + 'px auto;"></div>': '<div style="height: 100%; width:100%; background:url(' + item.content + ') center no-repeat; background-size: auto ' + this.height + 'px;"></div>';
 }
 return html;
};
iSlider.prototype._renderHTML = function() {
 var outer;
 if (this.outer) {
  this.outer.innerHTML = '';
  outer = this.outer;
 } else {
  outer = document.createElement('ul');
 }
 outer.style.width = this.width + 'px';
 outer.style.height = this.height + 'px';
 this.els = [];
 for (var i = 0; i < 3; i++) {
  var li = document.createElement('li');
  li.style.width = this.width + 'px';
  li.style.height = this.height + 'px';
  this._animateFunc(li, this.axis, this.scale, i, 0);
  this.els.push(li);
  outer.appendChild(li);
  if (this.isVertical && (this._opts.animateType == 'rotate' || this._opts.animateType == 'flip')) {
   li.innerHTML = this._renderItem(1 - i + this.sliderIndex);
  } else {
   li.innerHTML = this._renderItem(i - 1 + this.sliderIndex);
  }
 }
 if (!this.outer) {
  this.outer = outer;
  this.wrap.appendChild(outer);
 }
};
iSlider.prototype._slide = function(n) {
 var data = this.data;
 var els = this.els;
 var idx = this.sliderIndex + n;
 if (data[idx]) {
  this.sliderIndex = idx;
 } else {
  if (this.isLooping) {
   this.sliderIndex = n > 0 ? 0 : data.length - 1;
  } else {
   n = 0;
  }
 }
 this.log('pic idx:' + this.sliderIndex);
 var sEle;
 if (this.isVertical && (this._opts.animateType == 'rotate' || this._opts.animateType == 'flip')) {
  if (n > 0) {
   sEle = els.pop();
   els.unshift(sEle);
  } else if (n < 0) {
   sEle = els.shift();
   els.push(sEle);
  }
 } else {
  if (n > 0) {
   sEle = els.shift();
   els.push(sEle);
  } else if (n < 0) {
   sEle = els.pop();
   els.unshift(sEle);
  }
 }
 if (n !== 0) {
  sEle.innerHTML = this._renderItem(idx + n);
  sEle.style.webkitTransition = 'none';
  sEle.style.visibility = 'hidden';
  setTimeout(function() {
   sEle.style.visibility = 'visible';
  },
  200);
  this.onslidechange && this.onslidechange(this.sliderIndex);
 }
 for (var i = 0; i < 3; i++) {
  if (els[i] !== sEle) {
   els[i].style.webkitTransition = 'all .3s ease';
  }
  this._animateFunc(els[i], this.axis, this.scale, i, 0);
 }
 if (this.isAutoplay) {
  if (this.sliderIndex === data.length - 1 && !this.isLooping) {
   this.pause();
  }
 }
};
iSlider.prototype._bindHandler = function() {
 var self = this;
 var scaleW = self.scaleW;
 var outer = self.outer;
 var len = self.data.length;
 var startHandler = function(evt) {
  self.pause();
  self.onslidestart && self.onslidestart();
  self.log('Event: beforeslide');
  self.startTime = new Date().getTime();
  self.startX = evt.targetTouches[0].pageX;
  self.startY = evt.targetTouches[0].pageY;
  var target = evt.target;
  while (target.nodeName != 'LI' && target.nodeName != 'BODY') {
   target = target.parentNode;
  }
  self.target = target;
 };
 var moveHandler = function(evt) {
  evt.preventDefault();
  self.onslide && self.onslide();
  self.log('Event: onslide');
  var axis = self.axis;
  var offset = evt.targetTouches[0]['page' + axis] - self['start' + axis];
  if (!self.isLooping) {
   if (offset > 0 && self.sliderIndex === 0 || offset < 0 && self.sliderIndex === self.data.length - 1) {
    offset = self._damping(offset);
   }
  }
  for (var i = 0; i < 3; i++) {
   var item = self.els[i];
   item.style.webkitTransition = 'all 0s';
   self._animateFunc(item, axis, self.scale, i, offset);
  }
  self.offset = offset;
 };
 var endHandler = function(evt) {
  evt.preventDefault();
  var boundary = self.scale / 2;
  var metric = self.offset;
  var endTime = new Date().getTime();
  boundary = endTime - self.startTime > 300 ? boundary: 14;
  if (metric >= boundary) {
   self._slide( - 1);
  } else if (metric < -boundary) {
   self._slide(1);
  } else {
   self._slide(0);
  }
  self.isAutoplay && self.play();
  self.offset = 0;
  self.onslideend && self.onslideend();
  self.log('Event: afterslide');
 };
 var orientationchangeHandler = function(evt) {
  setTimeout(function() {
   self.reset();
   self.log('Event: orientationchange');
  },
  100);
 };
 outer.addEventListener('touchstart', startHandler);
 outer.addEventListener('touchmove', moveHandler);
 outer.addEventListener('touchend', endHandler);
 window.addEventListener('orientationchange', orientationchangeHandler);
};
iSlider.prototype.reset = function() {
 this.pause();
 this._setting();
 this._renderHTML();
 this.isAutoplay && this.play();
};
iSlider.prototype.play = function() {
 var self = this;
 var duration = this.duration;
 clearInterval(this.autoPlayTimer);
 this.autoPlayTimer = setInterval(function() {
  self._slide(1);
 },
 duration);
};
iSlider.prototype.pause = function() {
 clearInterval(this.autoPlayTimer);
};
iSlider.prototype.extend = function(plugin) {
 var fn = iSlider.prototype;
 Object.keys(plugin).forEach(function(property) {
  Object.defineProperty(fn, property, Object.getOwnPropertyDescriptor(plugin, property));
 })
}
iSlider.prototype.extend({
 bindMouse: function() {
  var self = this;
  var scaleW = self.scaleW;
  var outer = self.outer;
  var len = self.data.length;
  var bDrag = false;
  var mouseStart = function(evt) {
   bDrag = true;
   self.pause();
   self.onslidestart && self.onslidestart();
   self.startTime = new Date().getTime();
   self.startX = evt.clientX;
   self.startY = evt.clientY;
   var target = evt.target;
   while (target.nodeName != 'LI' && target.nodeName != 'BODY') {
    target = target.parentNode;
   }
   self.target = target;
  };
  var mouseMove = function(evt) {
   if (bDrag) {
    evt.preventDefault();
    self.onslide && self.onslide();
    var axis = self.axis;
    var offset = evt['client' + axis] - self['start' + axis];
    if (!self.isLooping) {
     if (offset > 0 && self.sliderIndex === 0 || offset < 0 && self.sliderIndex === self.data.length - 1) {
      offset = self._damping(offset);
     }
    }
    for (var i = 0; i < 3; i++) {
     var item = self.els[i];
     item.style.webkitTransition = 'all 0s';
     self._animateFunc(item, axis, self.scale, i, offset);
    }
    self.offset = offset;
   }
  };
  var mouseEnd = function(evt) {
   evt.preventDefault();
   bDrag = false;
   var boundary = self.scale / 2;
   var metric = self.offset;
   var endTime = new Date().getTime();
   boundary = endTime - self.startTime > 300 ? boundary: 14;
   if (metric >= boundary) {
    self._slide( - 1);
   } else if (metric < -boundary) {
    self._slide(1);
   } else {
    self._slide(0);
   }
   self.isAutoplay && self.play();
   self.offset = 0;
   self.onslideend && self.onslideend();
   self.log('Event: afterslide');
  };
  outer.addEventListener('mousedown', mouseStart);
  outer.addEventListener('mousemove', mouseMove);
  outer.addEventListener('mouseup', mouseEnd);
 }
})

html:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style type="text/css">
  *{
   padding: 0;
   list-style: none;
   margin: 0;
  }
  /*容器高度*/
  #iSlider-effect-wrapper {
   height: 400px;
   width: 500px;
   margin: 0 auto;
   margin-top: 4.6rem;
   overflow: hidden;
   position: relative;
  }
  .iSlider-effect ul{
   list-style: none;
   padding: 0;
   margin: 0;
   height: 100%;
   overflow: hidden
  }
  .iSlider-effect li {
   position: absolute;
   margin: 0;
   padding: 0;
   height: 100%;
   overflow: hidden;
   display: -webkit-box;
   -webkit-box-pack: center;
   -webkit-box-align: center;
   list-style: none
  }
  .iSlider-effect ul li img {
   max-width: 100%;
   max-height: 100%;
   margin: 0;
   padding: 0
  }
  .iSlider-effect div {
   background-color: #fff;
   padding: 3px
  }
 </style>
</head>
<body>
 <script type="text/javascript" src="mobile_slider.js"></script>
 <!--组件容器-->
 <div id="iSlider-effect-wrapper"> </div>
 <script>
  //组件注册
  var islider1 = new iSlider({
   //节点获取
   dom: document.getElementById("iSlider-effect-wrapper"),
   //图片配置
   data: [
    {
     content: "images/01.jpeg",
    },
    {
     content: "images/04.jpg",
    },
    {
     content: "images/05.jpg",
    }
   ],
   //播放间隔
   duration: 3000,
   //animateType切换方式
   //default:默认
   //rotate:旋转
   //flip:弹出
   animateType: 'rotate',
   //是否自动播放
   isAutoplay: true,
   //是否循环播放
   isLooping: true,
   // isVertical: true, 是否垂直滚动
  });
  islider1.bindMouse();
 </script>
</body>
</html>

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

Javascript 相关文章推荐
jquery异步请求实例代码
Jun 21 Javascript
jquery一般方法介绍 入门参考
Jun 21 Javascript
JavaScript中的style.display属性操作
Mar 27 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
Vue中添加过渡效果的方法
Mar 16 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
React Native实现进度条弹框的示例代码
Jul 17 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
基于JavaScript 实现拖放功能
Sep 12 Javascript
vue input标签通用指令校验的实现
Nov 05 Javascript
Javascript实现简易天数计算器
May 18 Javascript
微信小程序自定义模态弹窗组件详解
Dec 24 #Javascript
js实现鼠标点击页面弹出自定义文字效果
Dec 24 #Javascript
javascript实现鼠标点击生成文字特效
Dec 24 #Javascript
Javascript实现鼠标点击冒泡特效
Dec 24 #Javascript
javascript实现点击星星小游戏
Dec 24 #Javascript
JS实现小星星特效
Dec 24 #Javascript
JS实现星星海特效
Dec 24 #Javascript
You might like
php 变量定义方法
2009/06/14 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP中的替代语法简介
2014/08/22 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
js比较日期大小的方法
2015/05/12 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
翻译专业应届生求职信
2013/11/23 职场文书
营销团队口号
2014/06/06 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
MySQL 全文检索的使用示例
2021/06/07 MySQL