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>

以上是 iSlider手机端图片滑动切换插件使用详解 的全部内容, 来源链接: utcz.com/z/339246.html

回到顶部