swiper
Version:
Most modern mobile touch slider and framework with hardware accelerated transitions
121 lines (112 loc) • 4.35 kB
JavaScript
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import $ from '../../utils/dom';
import { bindModuleMethods } from '../../utils/utils';
var Parallax = {
setTransform: function setTransform(el, progress) {
var swiper = this;
var rtl = swiper.rtl;
var $el = $(el);
var rtlFactor = rtl ? -1 : 1;
var p = $el.attr('data-swiper-parallax') || '0';
var x = $el.attr('data-swiper-parallax-x');
var y = $el.attr('data-swiper-parallax-y');
var scale = $el.attr('data-swiper-parallax-scale');
var opacity = $el.attr('data-swiper-parallax-opacity');
if (x || y) {
x = x || '0';
y = y || '0';
} else if (swiper.isHorizontal()) {
x = p;
y = '0';
} else {
y = p;
x = '0';
}
if (x.indexOf('%') >= 0) {
x = parseInt(x, 10) * progress * rtlFactor + "%";
} else {
x = x * progress * rtlFactor + "px";
}
if (y.indexOf('%') >= 0) {
y = parseInt(y, 10) * progress + "%";
} else {
y = y * progress + "px";
}
if (typeof opacity !== 'undefined' && opacity !== null) {
var currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
$el[0].style.opacity = currentOpacity;
}
if (typeof scale === 'undefined' || scale === null) {
$el.transform("translate3d(" + x + ", " + y + ", 0px)");
} else {
var currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
$el.transform("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")");
}
},
setTranslate: function setTranslate() {
var swiper = this;
var $el = swiper.$el,
slides = swiper.slides,
progress = swiper.progress,
snapGrid = swiper.snapGrid;
$el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
swiper.parallax.setTransform(el, progress);
});
slides.each(function (slideEl, slideIndex) {
var slideProgress = slideEl.progress;
if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
}
slideProgress = Math.min(Math.max(slideProgress, -1), 1);
$(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
swiper.parallax.setTransform(el, slideProgress);
});
});
},
setTransition: function setTransition(duration) {
if (duration === void 0) {
duration = this.params.speed;
}
var swiper = this;
var $el = swiper.$el;
$el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (parallaxEl) {
var $parallaxEl = $(parallaxEl);
var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
if (duration === 0) parallaxDuration = 0;
$parallaxEl.transition(parallaxDuration);
});
}
};
export default {
name: 'parallax',
params: {
parallax: {
enabled: false
}
},
create: function create() {
var swiper = this;
bindModuleMethods(swiper, {
parallax: _extends({}, Parallax)
});
},
on: {
beforeInit: function beforeInit(swiper) {
if (!swiper.params.parallax.enabled) return;
swiper.params.watchSlidesProgress = true;
swiper.originalParams.watchSlidesProgress = true;
},
init: function init(swiper) {
if (!swiper.params.parallax.enabled) return;
swiper.parallax.setTranslate();
},
setTranslate: function setTranslate(swiper) {
if (!swiper.params.parallax.enabled) return;
swiper.parallax.setTranslate();
},
setTransition: function setTransition(swiper, duration) {
if (!swiper.params.parallax.enabled) return;
swiper.parallax.setTransition(duration);
}
}
};