UNPKG

swiper

Version:

Most modern mobile touch slider and framework with hardware accelerated transitions

270 lines (235 loc) 8.63 kB
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 { extend, bindModuleMethods } from '../../utils/utils'; var Virtual = { update: function update(force) { var swiper = this; var _swiper$params = swiper.params, slidesPerView = _swiper$params.slidesPerView, slidesPerGroup = _swiper$params.slidesPerGroup, centeredSlides = _swiper$params.centeredSlides; var _swiper$params$virtua = swiper.params.virtual, addSlidesBefore = _swiper$params$virtua.addSlidesBefore, addSlidesAfter = _swiper$params$virtua.addSlidesAfter; var _swiper$virtual = swiper.virtual, previousFrom = _swiper$virtual.from, previousTo = _swiper$virtual.to, slides = _swiper$virtual.slides, previousSlidesGrid = _swiper$virtual.slidesGrid, renderSlide = _swiper$virtual.renderSlide, previousOffset = _swiper$virtual.offset; swiper.updateActiveIndex(); var activeIndex = swiper.activeIndex || 0; var offsetProp; if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top'; var slidesAfter; var slidesBefore; if (centeredSlides) { slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; } else { slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter; slidesBefore = slidesPerGroup + addSlidesBefore; } var from = Math.max((activeIndex || 0) - slidesBefore, 0); var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); extend(swiper.virtual, { from: from, to: to, offset: offset, slidesGrid: swiper.slidesGrid }); function onRendered() { swiper.updateSlides(); swiper.updateProgress(); swiper.updateSlidesClasses(); if (swiper.lazy && swiper.params.lazy.enabled) { swiper.lazy.load(); } } if (previousFrom === from && previousTo === to && !force) { if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) { swiper.slides.css(offsetProp, offset + "px"); } swiper.updateProgress(); return; } if (swiper.params.virtual.renderExternal) { swiper.params.virtual.renderExternal.call(swiper, { offset: offset, from: from, to: to, slides: function getSlides() { var slidesToRender = []; for (var i = from; i <= to; i += 1) { slidesToRender.push(slides[i]); } return slidesToRender; }() }); if (swiper.params.virtual.renderExternalUpdate) { onRendered(); } return; } var prependIndexes = []; var appendIndexes = []; if (force) { swiper.$wrapperEl.find("." + swiper.params.slideClass).remove(); } else { for (var i = previousFrom; i <= previousTo; i += 1) { if (i < from || i > to) { swiper.$wrapperEl.find("." + swiper.params.slideClass + "[data-swiper-slide-index=\"" + i + "\"]").remove(); } } } for (var _i = 0; _i < slides.length; _i += 1) { if (_i >= from && _i <= to) { if (typeof previousTo === 'undefined' || force) { appendIndexes.push(_i); } else { if (_i > previousTo) appendIndexes.push(_i); if (_i < previousFrom) prependIndexes.push(_i); } } } appendIndexes.forEach(function (index) { swiper.$wrapperEl.append(renderSlide(slides[index], index)); }); prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) { swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); }); swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, offset + "px"); onRendered(); }, renderSlide: function renderSlide(slide, index) { var swiper = this; var params = swiper.params.virtual; if (params.cache && swiper.virtual.cache[index]) { return swiper.virtual.cache[index]; } var $slideEl = params.renderSlide ? $(params.renderSlide.call(swiper, slide, index)) : $("<div class=\"" + swiper.params.slideClass + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"); if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index); if (params.cache) swiper.virtual.cache[index] = $slideEl; return $slideEl; }, appendSlide: function appendSlide(slides) { var swiper = this; if (typeof slides === 'object' && 'length' in slides) { for (var i = 0; i < slides.length; i += 1) { if (slides[i]) swiper.virtual.slides.push(slides[i]); } } else { swiper.virtual.slides.push(slides); } swiper.virtual.update(true); }, prependSlide: function prependSlide(slides) { var swiper = this; var activeIndex = swiper.activeIndex; var newActiveIndex = activeIndex + 1; var numberOfNewSlides = 1; if (Array.isArray(slides)) { for (var i = 0; i < slides.length; i += 1) { if (slides[i]) swiper.virtual.slides.unshift(slides[i]); } newActiveIndex = activeIndex + slides.length; numberOfNewSlides = slides.length; } else { swiper.virtual.slides.unshift(slides); } if (swiper.params.virtual.cache) { var cache = swiper.virtual.cache; var newCache = {}; Object.keys(cache).forEach(function (cachedIndex) { var $cachedEl = cache[cachedIndex]; var cachedElIndex = $cachedEl.attr('data-swiper-slide-index'); if (cachedElIndex) { $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1); } newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl; }); swiper.virtual.cache = newCache; } swiper.virtual.update(true); swiper.slideTo(newActiveIndex, 0); }, removeSlide: function removeSlide(slidesIndexes) { var swiper = this; if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return; var activeIndex = swiper.activeIndex; if (Array.isArray(slidesIndexes)) { for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) { swiper.virtual.slides.splice(slidesIndexes[i], 1); if (swiper.params.virtual.cache) { delete swiper.virtual.cache[slidesIndexes[i]]; } if (slidesIndexes[i] < activeIndex) activeIndex -= 1; activeIndex = Math.max(activeIndex, 0); } } else { swiper.virtual.slides.splice(slidesIndexes, 1); if (swiper.params.virtual.cache) { delete swiper.virtual.cache[slidesIndexes]; } if (slidesIndexes < activeIndex) activeIndex -= 1; activeIndex = Math.max(activeIndex, 0); } swiper.virtual.update(true); swiper.slideTo(activeIndex, 0); }, removeAllSlides: function removeAllSlides() { var swiper = this; swiper.virtual.slides = []; if (swiper.params.virtual.cache) { swiper.virtual.cache = {}; } swiper.virtual.update(true); swiper.slideTo(0, 0); } }; export default { name: 'virtual', params: { virtual: { enabled: false, slides: [], cache: true, renderSlide: null, renderExternal: null, renderExternalUpdate: true, addSlidesBefore: 0, addSlidesAfter: 0 } }, create: function create() { var swiper = this; bindModuleMethods(swiper, { virtual: _extends(_extends({}, Virtual), {}, { slides: swiper.params.virtual.slides, cache: {} }) }); }, on: { beforeInit: function beforeInit(swiper) { if (!swiper.params.virtual.enabled) return; swiper.classNames.push(swiper.params.containerModifierClass + "virtual"); var overwriteParams = { watchSlidesProgress: true }; extend(swiper.params, overwriteParams); extend(swiper.originalParams, overwriteParams); if (!swiper.params.initialSlide) { swiper.virtual.update(); } }, setTranslate: function setTranslate(swiper) { if (!swiper.params.virtual.enabled) return; swiper.virtual.update(); } } };