1/** 2 * Swiper 3.4.2 3 * Most modern mobile touch slider and framework with hardware accelerated transitions 4 * 5 * http://www.idangero.us/swiper/ 6 * 7 * Copyright 2017, Vladimir Kharlampidi 8 * The iDangero.us 9 * http://www.idangero.us/ 10 * 11 * Licensed under MIT 12 * 13 * Released on: March 10, 2017 14 */ 15(function () { 16 'use strict'; 17 var $; 18 19 /*=========================== 20 Swiper 21 ===========================*/ 22 var Swiper = function (container, params) { 23 if (!(this instanceof Swiper)) return new Swiper(container, params); 24 25 26 var defaults = { 27 direction: 'horizontal', 28 touchEventsTarget: 'container', 29 initialSlide: 0, 30 speed: 300, 31 // autoplay 32 autoplay: false, 33 autoplayDisableOnInteraction: true, 34 autoplayStopOnLast: false, 35 // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). 36 iOSEdgeSwipeDetection: false, 37 iOSEdgeSwipeThreshold: 20, 38 // Free mode 39 freeMode: false, 40 freeModeMomentum: true, 41 freeModeMomentumRatio: 1, 42 freeModeMomentumBounce: true, 43 freeModeMomentumBounceRatio: 1, 44 freeModeMomentumVelocityRatio: 1, 45 freeModeSticky: false, 46 freeModeMinimumVelocity: 0.02, 47 // Autoheight 48 autoHeight: false, 49 // Set wrapper width 50 setWrapperSize: false, 51 // Virtual Translate 52 virtualTranslate: false, 53 // Effects 54 effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' 55 coverflow: { 56 rotate: 50, 57 stretch: 0, 58 depth: 100, 59 modifier: 1, 60 slideShadows : true 61 }, 62 flip: { 63 slideShadows : true, 64 limitRotation: true 65 }, 66 cube: { 67 slideShadows: true, 68 shadow: true, 69 shadowOffset: 20, 70 shadowScale: 0.94 71 }, 72 fade: { 73 crossFade: false 74 }, 75 // Parallax 76 parallax: false, 77 // Zoom 78 zoom: false, 79 zoomMax: 3, 80 zoomMin: 1, 81 zoomToggle: true, 82 // Scrollbar 83 scrollbar: null, 84 scrollbarHide: true, 85 scrollbarDraggable: false, 86 scrollbarSnapOnRelease: false, 87 // Keyboard Mousewheel 88 keyboardControl: false, 89 mousewheelControl: false, 90 mousewheelReleaseOnEdges: false, 91 mousewheelInvert: false,
92 mousewheelForceToAxis: false, 93 mousewheelSensitivity: 1, 94 mousewheelEventsTarged: 'container', 95 // Hash Navigation 96 hashnav: false, 97 hashnavWatchState: false, 98 // History 99 history: false, 100 // Commong Nav State 101 replaceState: false, 102 // Breakpoints 103 breakpoints: undefined, 104 // Slides grid 105 spaceBetween: 0, 106 slidesPerView: 1, 107 slidesPerColumn: 1, 108 slidesPerColumnFill: 'column', 109 slidesPerGroup: 1, 110 centeredSlides: false, 111 slidesOffsetBefore: 0, // in px 112 slidesOffsetAfter: 0, // in px 113 // Round length 114 roundLengths: false, 115 // Touches 116 touchRatio: 1, 117 touchAngle: 45, 118 simulateTouch: true, 119 shortSwipes: true, 120 longSwipes: true, 121 longSwipesRatio: 0.5, 122 longSwipesMs: 300, 123 followFinger: true, 124 onlyExternal: false, 125 threshold: 0, 126 touchMoveStopPropagation: true, 127 touchReleaseOnEdges: false, 128 // Unique Navigation Elements 129 uniqueNavElements: true, 130 // Pagination 131 pagination: null, 132 paginationElement: 'span', 133 paginationClickable: false, 134 paginationHide: false, 135 paginationBulletRender: function (swiper, index, className) { 136 var businessCategory = ["í 목ì¬ì ", "ê±´ì¶ì¬ì ", "주íì¬ì ", "íëí¸/íê²½ì¬ì ", "í´ì¸ì¬ì "]; 137 return '<li class="' + className + '">' + businessCategory[index] + '</li>'; 138 }, 139 paginationProgressRender: null, 140 paginationFractionRender: null, 141 paginationCustomRender: null, 142 paginationType: 'bullets', // 'bullets' or 'progress' or 'fraction' or 'custom' 143 // Resistance 144 resistance: true, 145 resistanceRatio: 0.85, 146 // Next/prev buttons 147 nextButton: null, 148 prevButton: null, 149 // Progress 150 watchSlidesProgress: false, 151 watchSlidesVisibility: false, 152 // Cursor 153 grabCursor: false, 154 // Clicks 155 preventClicks: true, 156 preventClicksPropagation: true, 157 slideToClickedSlide: false, 158 // Lazy Loading 159 lazyLoading: false, 160 lazyLoadingInPrevNext: false, 161 lazyLoadingInPrevNextAmount: 1, 162 lazyLoadingOnTransitionStart: false, 163 // Images 164 preloadImages: true, 165 updateOnImagesReady: true, 166 // loop 167 loop: false, 168 loopAdditionalSlides: 0, 169 loopedSlides: null, 170 // Control 171 control: undefined, 172 controlInverse: false, 173 controlBy: 'slide', //or 'container' 174 normalizeSlideIndex: true, 175 // Swiping/no swiping 176 allowSwipeToPrev: true, 177 allowSwipeToNext: true, 178 swipeHandler: null, //'.swipe-handler', 179 noSwiping: true, 180 noSwipingClass: 'swiper-no-swiping', 181 // Passive Listeners 182 passiveListeners: true, 183 // NS 184 containerModifierClass: 'swiper-container-', // NEW 185 slideClass: 'swiper-slide', 186 slideActiveClass: 'swiper-slide-active', 187 slideDuplicateActiveClass: 'swiper-slide-duplicate-active', 188 slideVisibleClass: 'swiper-slide-visible', 189 slideDuplicateClass: 'swiper-slide-duplicate', 190 slideNextClass: 'swiper-slide-next', 191 slideDuplicateNextClass: 'swiper-slide-duplicate-next', 192 slidePrevClass: 'swiper-slide-prev', 193 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', 194 wrapperClass: 'swiper-wrapper', 195 bulletClass: 'swiper-pagination-bullet', 196 bulletActiveClass: 'swiper-pagination-bullet-active', 197 buttonDisabledClass: 'swiper-button-disabled', 198 paginationCurrentClass: 'swiper-pagination-current', 199 paginationTotalClass: 'swiper-pagination-total', 200 paginationHiddenClass: 'swiper-pagination-hidden', 201 paginationProgressbarClass: 'swiper-pagination-progressbar', 202 paginationClickableClass: 'swiper-pagination-clickable', // NEW 203 paginationModifierClass: 'swiper-pagination-', // NEW 204 lazyLoadingClass: 'swiper-lazy', 205 lazyStatusLoadingClass: 'swiper-lazy-loading', 206 lazyStatusLoadedClass: 'swiper-lazy-loaded', 207 lazyPreloaderClass: 'swiper-lazy-preloader', 208 notificationClass: 'swiper-notification', 209 preloaderClass: 'preloader', 210 zoomContainerClass: 'swiper-zoom-container', 211 212 // Observer 213 observer: false, 214 observeParents: false, 215 // Accessibility
216 a11y: false, 217 prevSlideMessage: 'Previous slide', 218 nextSlideMessage: 'Next slide', 219 firstSlideMessage: 'This is the first slide', 220 lastSlideMessage: 'This is the last slide', 221 paginationBulletMessage: 'Go to slide {{index}}', 222 // Callbacks 223 runCallbacksOnInit: true, 224 225 /* 226 Callbacks: 227 onInit: function (swiper) 228 onDestroy: function (swiper) 229 onBeforeResize: function (swiper) 230 onAfterResize: function (swiper) 231 onClick: function (swiper, e) 232 onTap: function (swiper, e) 233 onDoubleTap: function (swiper, e) 234 onSliderMove: function (swiper, e) 235 onSlideChangeStart: function (swiper) 236 onSlideChangeEnd: function (swiper) 237 onTransitionStart: function (swiper) 238 onTransitionEnd: function (swiper) 239 onImagesReady: function (swiper) 240 onProgress: function (swiper, progress) 241 onTouchStart: function (swiper, e) 242 onTouchMove: function (swiper, e) 243 onTouchMoveOpposite: function (swiper, e) 244 onTouchEnd: function (swiper, e) 245 onReachBeginning: function (swiper) 246 onReachEnd: function (swiper) 247 onSetTransition: function (swiper, duration) 248 onSetTranslate: function (swiper, translate) 249 onAutoplayStart: function (swiper) 250 onAutoplayStop: function (swiper), 251 onLazyImageLoad: function (swiper, slide, image) 252 onLazyImageReady: function (swiper, slide, image) 253 onKeyPress: function (swiper, keyCode) 254 */ 255 256 }; 257 var initialVirtualTranslate = params && params.virtualTranslate; 258 259 params = params || {}; 260 var originalParams = {}; 261 for (var param in params) { 262 if (typeof params[param] === 'object' && params[param] !== null && !(params[param].nodeType || params[param] === window || params[param] === document || (typeof Dom7 !== 'undefined' && params[param] instanceof Dom7) || (typeof jQuery !== 'undefined' && params[param] instanceof jQuery))) { 263 originalParams[param] = {}; 264 for (var deepParam in params[param]) { 265 originalParams[param][deepParam] = params[param][deepParam]; 266 } 267 } 268 else { 269 originalParams[param] = params[param]; 270 } 271 } 272 for (var def in defaults) { 273 if (typeof params[def] === 'undefined') { 274 params[def] = defaults[def]; 275 } 276 else if (typeof params[def] === 'object') { 277 for (var deepDef in defaults[def]) { 278 if (typeof params[def][deepDef] === 'undefined') { 279 params[def][deepDef] = defaults[def][deepDef]; 280 } 281 } 282 } 283 } 284 285 // Swiper 286 var s = this; 287 288 // Params 289 s.params = params; 290 s.originalParams = originalParams; 291 292 // Classname 293 s.classNames = []; 294 /*========================= 295 Dom Library and plugins 296 ===========================*/ 297 if (typeof $ !== 'undefined' && typeof Dom7 !== 'undefined'){ 298 $ = Dom7; 299 } 300 if (typeof $ === 'undefined') { 301 if (typeof Dom7 === 'undefined') { 302 $ = window.Dom7 || window.Zepto || window.jQuery; 303 } 304 else { 305 $ = Dom7; 306 } 307 if (!$) return; 308 } 309 // Export it to Swiper instance 310 s.$ = $; 311 312 /*========================= 313 Breakpoints 314 ===========================*/ 315 s.currentBreakpoint = undefined; 316 s.getActiveBreakpoint = function () { 317 //Get breakpoint for window width 318 if (!s.params.breakpoints) return false; 319 var breakpoint = false; 320 var points = [], point; 321 for ( point in s.params.breakpoints ) { 322 if (s.params.breakpoints.hasOwnProperty(point)) { 323 points.push(point); 324 } 325 } 326 points.sort(function (a, b) { 327 return parseInt(a, 10) > parseInt(b, 10); 328 }); 329 for (var i = 0; i < points.length; i++) { 330 point = points[i]; 331 if (point >= window.innerWidth && !breakpoint) { 332 breakpoint = point; 333 } 334 } 335 return breakpoint || 'max'; 336 }; 337 s.setBreakpoint = function () { 338 //Set breakpoint for window width and update parameters 339 var breakpoint = s.getActiveBreakpoint(); 340 if (breakpoint && s.currentBreakpoint !== breakpoint) { 341 var breakPointsParams = breakpoint in s.params.breakpoints ? s.params.breakpoints[breakpoint] : s.originalParams; 342 var needsReLoop = s.params.loop && (breakPointsParams.slidesPerView !== s.params.slidesPerView); 343 for ( var param in breakPointsParams ) { 344 s.params[param] = breakPointsParams[param]; 345 } 346 s.currentBreakpoint = breakpoint; 347 if(needsReLoop && s.destroyLoop) { 348 s.reLoop(true); 349 } 350 } 351 }; 352 // Set breakpoint on load 353 if (s.params.breakpoints) { 354 s.setBreakpoint(); 355 } 356 357 /*=========================
358 Preparation - Define Container, Wrapper and Pagination 359 ===========================*/ 360 s.container = $(container); 361 if (s.container.length === 0) return; 362 if (s.container.length > 1) { 363 var swipers = []; 364 s.container.each(function () { 365 var container = this; 366 swipers.push(new Swiper(this, params)); 367 }); 368 return swipers; 369 } 370 371 // Save instance in container HTML Element and in data 372 s.container[0].swiper = s; 373 s.container.data('swiper', s); 374 375 s.classNames.push(s.params.containerModifierClass + s.params.direction); 376 377 if (s.params.freeMode) { 378 s.classNames.push(s.params.containerModifierClass + 'free-mode'); 379 } 380 if (!s.support.flexbox) { 381 s.classNames.push(s.params.containerModifierClass + 'no-flexbox'); 382 s.params.slidesPerColumn = 1; 383 } 384 if (s.params.autoHeight) { 385 s.classNames.push(s.params.containerModifierClass + 'autoheight'); 386 } 387 // Enable slides progress when required 388 if (s.params.parallax || s.params.watchSlidesVisibility) { 389 s.params.watchSlidesProgress = true; 390 } 391 // Max resistance when touchReleaseOnEdges 392 if (s.params.touchReleaseOnEdges) { 393 s.params.resistanceRatio = 0; 394 } 395 // Coverflow / 3D 396 if (['cube', 'coverflow', 'flip'].indexOf(s.params.effect) >= 0) { 397 if (s.support.transforms3d) { 398 s.params.watchSlidesProgress = true; 399 s.classNames.push(s.params.containerModifierClass + '3d'); 400 } 401 else { 402 s.params.effect = 'slide'; 403 } 404 } 405 if (s.params.effect !== 'slide') { 406 s.classNames.push(s.params.containerModifierClass + s.params.effect); 407 } 408 if (s.params.effect === 'cube') { 409 s.params.resistanceRatio = 0; 410 s.params.slidesPerView = 1; 411 s.params.slidesPerColumn = 1; 412 s.params.slidesPerGroup = 1; 413 s.params.centeredSlides = false; 414 s.params.spaceBetween = 0; 415 s.params.virtualTranslate = true; 416 } 417 if (s.params.effect === 'fade' || s.params.effect === 'flip') { 418 s.params.slidesPerView = 1; 419 s.params.slidesPerColumn = 1; 420 s.params.slidesPerGroup = 1; 421 s.params.watchSlidesProgress = true; 422 s.params.spaceBetween = 0; 423 if (typeof initialVirtualTranslate === 'undefined') { 424 s.params.virtualTranslate = true; 425 } 426 } 427 428 // Grab Cursor 429 if (s.params.grabCursor && s.support.touch) { 430 s.params.grabCursor = false; 431 } 432 433 // Wrapper 434 s.wrapper = s.container.children('.' + s.params.wrapperClass); 435 436 // Pagination 437 if (s.params.pagination) { 438 s.paginationContainer = $(s.params.pagination); 439 if (s.params.uniqueNavElements && typeof s.params.pagination === 'string' && s.paginationContainer.length > 1 && s.container.find(s.params.pagination).length === 1) { 440 s.paginationContainer = s.container.find(s.params.pagination); 441 } 442 443 if (s.params.paginationType === 'bullets' && s.params.paginationClickable) { 444 s.paginationContainer.addClass(s.params.paginationModifierClass + 'clickable'); 445 } 446 else { 447 s.params.paginationClickable = false; 448 } 449 s.paginationContainer.addClass(s.params.paginationModifierClass + s.params.paginationType); 450 } 451 // Next/Prev Buttons 452 if (s.params.nextButton || s.params.prevButton) { 453 if (s.params.nextButton) { 454 s.nextButton = $(s.params.nextButton); 455 if (s.params.uniqueNavElements && typeof s.params.nextButton === 'string' && s.nextButton.length > 1 && s.container.find(s.params.nextButton).length === 1) { 456 s.nextButton = s.container.find(s.params.nextButton); 457 } 458 } 459 if (s.params.prevButton) { 460 s.prevButton = $(s.params.prevButton); 461 if (s.params.uniqueNavElements && typeof s.params.prevButton === 'string' && s.prevButton.length > 1 && s.container.find(s.params.prevButton).length === 1) { 462 s.prevButton = s.container.find(s.params.prevButton); 463 } 464 } 465 } 466 467 // Is Horizontal 468 s.isHorizontal = function () { 469 return s.params.direction === 'horizontal'; 470 }; 471 // s.isH = isH; 472 473 // RTL 474 s.rtl = s.isHorizontal() && (s.container[0].dir.toLowerCase() === 'rtl' || s.container.css('direction') === 'rtl'); 475 if (s.rtl) { 476 s.classNames.push(s.params.containerModifierClass + 'rtl'); 477 } 478 479 // Wrong RTL support 480 if (s.rtl) { 481 s.wrongRTL = s.wrapper.css('display') === '-webkit-box'; 482 } 483 484 // Columns 485 if (s.params.slidesPerColumn > 1) { 486 s.classNames.push(s.params.containerModifierClass + 'multirow'); 487 } 488 489 // Check for Android 490 if (s.device.android) { 491 s.classNames.push(s.params.containerModifierClass + 'android'); 492 } 493 494 // Add classes 495 s.container.addClass(s.classNames.join(' '));
496 497 // Translate 498 s.translate = 0; 499 500 // Progress 501 s.progress = 0; 502 503 // Velocity 504 s.velocity = 0; 505 506 /*========================= 507 Locks, unlocks 508 ===========================*/ 509 s.lockSwipeToNext = function () { 510 s.params.allowSwipeToNext = false; 511 if (s.params.allowSwipeToPrev === false && s.params.grabCursor) { 512 s.unsetGrabCursor(); 513 } 514 }; 515 s.lockSwipeToPrev = function () { 516 s.params.allowSwipeToPrev = false; 517 if (s.params.allowSwipeToNext === false && s.params.grabCursor) { 518 s.unsetGrabCursor(); 519 } 520 }; 521 s.lockSwipes = function () { 522 s.params.allowSwipeToNext = s.params.allowSwipeToPrev = false; 523 if (s.params.grabCursor) s.unsetGrabCursor(); 524 }; 525 s.unlockSwipeToNext = function () { 526 s.params.allowSwipeToNext = true; 527 if (s.params.allowSwipeToPrev === true && s.params.grabCursor) { 528 s.setGrabCursor(); 529 } 530 }; 531 s.unlockSwipeToPrev = function () { 532 s.params.allowSwipeToPrev = true; 533 if (s.params.allowSwipeToNext === true && s.params.grabCursor) { 534 s.setGrabCursor(); 535 } 536 }; 537 s.unlockSwipes = function () { 538 s.params.allowSwipeToNext = s.params.allowSwipeToPrev = true; 539 if (s.params.grabCursor) s.setGrabCursor(); 540 }; 541 542 /*========================= 543 Round helper 544 ===========================*/ 545 function round(a) { 546 return Math.floor(a); 547 } 548 /*========================= 549 Set grab cursor 550 ===========================*/ 551 s.setGrabCursor = function(moving) { 552 s.container[0].style.cursor = 'move'; 553 s.container[0].style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; 554 s.container[0].style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; 555 s.container[0].style.cursor = moving ? 'grabbing': 'grab'; 556 }; 557 s.unsetGrabCursor = function () { 558 s.container[0].style.cursor = ''; 559 }; 560 if (s.params.grabCursor) { 561 s.setGrabCursor(); 562 } 563 /*========================= 564 Update on Images Ready 565 ===========================*/ 566 s.imagesToLoad = []; 567 s.imagesLoaded = 0; 568 569 s.loadImage = function (imgElement, src, srcset, sizes, checkForComplete, callback) { 570 var image; 571 function onReady () { 572 if (callback) callback(); 573 } 574 if (!imgElement.complete || !checkForComplete) { 575 if (src) { 576 image = new window.Image(); 577 image.onload = onReady; 578 image.onerror = onReady; 579 if (sizes) { 580 image.sizes = sizes; 581 } 582 if (srcset) { 583 image.srcset = srcset; 584 } 585 if (src) { 586 image.src = src; 587 } 588 } else { 589 onReady(); 590 } 591 592 } else {//image already loaded... 593 onReady(); 594 } 595 }; 596 s.preloadImages = function () { 597 s.imagesToLoad = s.container.find('img'); 598 function _onReady() { 599 if (typeof s === 'undefined' || s === null || !s) return; 600 if (s.imagesLoaded !== undefined) s.imagesLoaded++; 601 if (s.imagesLoaded === s.imagesToLoad.length) { 602 if (s.params.updateOnImagesReady) s.update(); 603 s.emit('onImagesReady', s); 604 } 605 } 606 for (var i = 0; i < s.imagesToLoad.length; i++) { 607 s.loadImage(s.imagesToLoad[i], (s.imagesToLoad[i].currentSrc || s.imagesToLoad[i].getAttribute('src')), (s.imagesToLoad[i].srcset || s.imagesToLoad[i].getAttribute('srcset')), s.imagesToLoad[i].sizes || s.imagesToLoad[i].getAttribute('sizes'), true, _onReady); 608 } 609 }; 610 611 /*========================= 612 Autoplay 613 ===========================*/ 614 s.autoplayTimeoutId = undefined; 615 s.autoplaying = false; 616 s.autoplayPaused = false; 617 function autoplay() { 618 var autoplayDelay = s.params.autoplay; 619 var activeSlide = s.slides.eq(s.activeIndex); 620 if (activeSlide.attr('data-swiper-autoplay')) { 621 autoplayDelay = activeSlide.attr('data-swiper-autoplay') || s.params.autoplay; 622 } 623 s.autoplayTimeoutId = setTimeout(function () { 624 if (s.params.loop) { 625 s.fixLoop(); 626 s._slideNext(); 627 s.emit('onAutoplay', s); 628 } 629 else { 630 if (!s.isEnd) { 631 s._slideNext(); 632 s.emit('onAutoplay', s); 633 } 634 else { 635 if (!params.autoplayStopOnLast) { 636 s._slideTo(0); 637 s.emit('onAutoplay', s); 638 } 639 else { 640 s.stopAutoplay(); 641 } 642 } 643 } 644 }, autoplayDelay); 645 } 646 s.startAutoplay = function () { 647 if (typeof s.autoplayTimeoutId !== 'undefined') return false; 648 if (!s.params.autoplay) return false; 649 if (s.autoplaying) return false; 650 s.autoplaying = true; 651 s.emit('onAutoplayStart', s); 652 autoplay(); 653 }; 654 s.stopAutoplay = function (internal) { 655 if (!s.autoplayTimeoutId) return; 656 if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); 657 s.autoplaying = false; 658 s.autoplayTimeoutId = undefined; 659 s.emit('onAutoplayStop', s); 660 }; 661 s.pauseAutoplay = function (speed) { 662 if (s.autoplayPaused) return; 663 if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); 664 s.autoplayPaused = true; 665 if (speed === 0) { 666 s.autoplayPaused = false; 667 autoplay(); 668 } 669 else { 670 s.wrapper.transitionEnd(function () { 671 if (!s) return; 672 s.autoplayPaused = false; 673 if (!s.autoplaying) { 674 s.stopAutoplay(); 675 } 676 else { 677 autoplay(); 678 } 679 }); 680 } 681 }; 682 /*========================= 683 Min/Max Translate 684 ===========================*/ 685 s.minTranslate = function () { 686 return (-s.snapGrid[0]); 687 }; 688 s.maxTranslate = function () { 689 return (-s.snapGrid[s.snapGrid.length - 1]); 690 }; 691 /*========================= 692 Slider/slides sizes 693 ===========================*/ 694 s.updateAutoHeight = function () { 695 var activeSlides = []; 696 var newHeight = 0; 697 var i; 698 699 // Find slides currently in view 700 if(s.params.slidesPerView !== 'auto' && s.params.slidesPerView > 1) { 701 for (i = 0;
701 i < Math.ceil(s.params.slidesPerView); i++) { 702 var index = s.activeIndex + i; 703 if(index > s.slides.length) break; 704 activeSlides.push(s.slides.eq(index)[0]); 705 } 706 } else { 707 activeSlides.push(s.slides.eq(s.activeIndex)[0]); 708 } 709 710 // Find new height from heighest slide in view 711 for (i = 0; i < activeSlides.length; i++) { 712 if (typeof activeSlides[i] !== 'undefined') { 713 var height = activeSlides[i].offsetHeight; 714 newHeight = height > newHeight ? height : newHeight; 715 } 716 } 717 718 // Update Height 719 if (newHeight) s.wrapper.css('height', newHeight + 'px'); 720 }; 721 s.updateContainerSize = function () { 722 var width, height; 723 if (typeof s.params.width !== 'undefined') { 724 width = s.params.width; 725 } 726 else { 727 width = s.container[0].clientWidth; 728 } 729 if (typeof s.params.height !== 'undefined') { 730 height = s.params.height; 731 } 732 else { 733 height = s.container[0].clientHeight; 734 } 735 if (width === 0 && s.isHorizontal() || height === 0 && !s.isHorizontal()) { 736 return; 737 } 738 739 //Subtract paddings 740 width = width - parseInt(s.container.css('padding-left'), 10) - parseInt(s.container.css('padding-right'), 10); 741 height = height - parseInt(s.container.css('padding-top'), 10) - parseInt(s.container.css('padding-bottom'), 10); 742 743 // Store values 744 s.width = width; 745 s.height = height; 746 s.size = s.isHorizontal() ? s.width : s.height; 747 }; 748 749 s.updateSlidesSize = function () { 750 s.slides = s.wrapper.children('.' + s.params.slideClass); 751 s.snapGrid = []; 752 s.slidesGrid = []; 753 s.slidesSizesGrid = []; 754 755 var spaceBetween = s.params.spaceBetween, 756 slidePosition = -s.params.slidesOffsetBefore, 757 i, 758 prevSlideSize = 0, 759 index = 0; 760 if (typeof s.size === 'undefined') return; 761 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { 762 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * s.size; 763 } 764 765 s.virtualSize = -spaceBetween; 766 // reset margins 767 if (s.rtl) s.slides.css({marginLeft: '', marginTop: ''}); 768 else s.slides.css({marginRight: '', marginBottom: ''}); 769 770 var slidesNumberEvenToRows; 771 if (s.params.slidesPerColumn > 1) { 772 if (Math.floor(s.slides.length / s.params.slidesPerColumn) === s.slides.length / s.params.slidesPerColumn) { 773 slidesNumberEvenToRows = s.slides.length; 774 } 775 else { 776 slidesNumberEvenToRows = Math.ceil(s.slides.length / s.params.slidesPerColumn) * s.params.slidesPerColumn; 777 } 778 if (s.params.slidesPerView !== 'auto' && s.params.slidesPerColumnFill === 'row') { 779 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, s.params.slidesPerView * s.params.slidesPerColumn); 780 } 781 } 782 783 // Calc slides 784 var slideSize; 785 var slidesPerColumn = s.params.slidesPerColumn; 786 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; 787 var numFullColumns = slidesPerRow - (s.params.slidesPerColumn * slidesPerRow - s.slides.length); 788 for (i = 0; i < s.slides.length; i++) { 789 slideSize = 0; 790 var slide = s.slides.eq(i); 791 if (s.params.slidesPerColumn > 1) { 792 // Set slides order 793 var newSlideOrderIndex; 794 var column, row; 795 if (s.params.slidesPerColumnFill === 'column') { 796 column = Math.floor(i / slidesPerColumn); 797 row = i - column * slidesPerColumn; 798 if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn-1)) { 799 if (++row >= slidesPerColumn) { 800 row = 0; 801 column++; 802 } 803 } 804 newSlideOrderIndex = column + row * slidesNumber
804EvenToRows / slidesPerColumn; 805 slide 806 .css({ 807 '-webkit-box-ordinal-group': newSlideOrderIndex, 808 '-moz-box-ordinal-group': newSlideOrderIndex, 809 '-ms-flex-order': newSlideOrderIndex, 810 '-webkit-order': newSlideOrderIndex, 811 'order': newSlideOrderIndex 812 }); 813 } 814 else { 815 row = Math.floor(i / slidesPerRow); 816 column = i - row * slidesPerRow; 817 } 818 slide 819 .css( 820 'margin-' + (s.isHorizontal() ? 'top' : 'left'), 821 (row !== 0 && s.params.spaceBetween) && (s.params.spaceBetween + 'px') 822 ) 823 .attr('data-swiper-column', column) 824 .attr('data-swiper-row', row); 825 826 } 827 if (slide.css('display') === 'none') continue; 828 if (s.params.slidesPerView === 'auto') { 829 slideSize = s.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); 830 if (s.params.roundLengths) slideSize = round(slideSize); 831 } 832 else { 833 slideSize = (s.size - (s.params.slidesPerView - 1) * spaceBetween) / s.params.slidesPerView; 834 if (s.params.roundLengths) slideSize = round(slideSize); 835 836 if (s.isHorizontal()) { 837 s.slides[i].style.width = slideSize + 'px'; 838 } 839 else { 840 s.slides[i].style.height = slideSize + 'px'; 841 } 842 } 843 s.slides[i].swiperSlideSize = slideSize; 844 s.slidesSizesGrid.push(slideSize); 845 846 847 if (s.params.centeredSlides) { 848 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; 849 if(prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; 850 if (i === 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; 851 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; 852 if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); 853 s.slidesGrid.push(slidePosition); 854 } 855 else { 856 if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); 857 s.slidesGrid.push(slidePosition); 858 slidePosition = slidePosition + slideSize + spaceBetween; 859 } 860 861 s.virtualSize += slideSize + spaceBetween; 862 863 prevSlideSize = slideSize; 864 865 index ++; 866 } 867 s.virtualSize = Math.max(s.virtualSize, s.size) + s.params.slidesOffsetAfter; 868 var newSlidesGrid; 869 870 if ( 871 s.rtl && s.wrongRTL && (s.params.effect === 'slide' || s.params.effect === 'coverflow')) { 872 s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); 873 } 874 if (!s.support.flexbox || s.params.setWrapperSize) { 875 if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); 876 else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); 877 } 878 879 if (s.params.slidesPerColumn > 1) { 880 s.virtualSize = (slideSize + s.params.spaceBetween) * slidesNumberEvenToRows; 881 s.virtualSize = Math.ceil(s.virtualSize / s.params.slidesPerColumn) - s.params.spaceBetween; 882 if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); 883 else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); 884 if (s.params.centeredSlides) { 885 newSlidesGrid = []; 886 for (i = 0; i < s.snapGrid.length; i++) { 887 if (s.snapGrid[i] < s.virtualSize + s.snapGrid[0]) newSlidesGrid.push(s.snapGrid[i]); 888 } 889 s.snapGrid = newSlidesGrid; 890 } 891 } 892 893 // Remove last grid elements depending on width 894 if (!s.params.centeredSlides) { 895 newSlidesGrid = []; 896 for (i = 0; i < s.snapGrid.length; i++) { 897 if (s.snapGrid[i] <= s.virtualSize - s.size) { 898 newSlidesGrid.push(s.snapGrid[i]); 899 } 900 } 901 s.snapGrid = newSlidesGrid; 902 if (Math.floor(s.virtualSize - s.size) - Math.floor(s.snapGrid[s.snapGrid.length - 1]) > 1) { 903 s.snapGrid.push(s.virtualSize - s.size); 904 } 905 } 906 if (s.snapGrid.length === 0) s.snapGrid = [0]; 907 908 if (s.params.spaceBetween !== 0) { 909 if (s.isHorizontal()) { 910 if (s.rtl) s.slides.css({marginLeft: spaceBetween + 'px'}); 911 else s.slides.css({marginRight: spaceBetween + 'px'}); 912 } 913 else s.slides.css({marginBottom: spaceBetween + 'px'}); 914 } 915 if (s.params.watchSlidesProgress) { 916 s.updateSlidesOffset(); 917 } 918 }; 919 s.updateSlidesOffset = function () { 920 for (var i = 0; i < s.slides.length; i++) { 921 s.slides[i].swiperSlideOffset = s.isHorizontal() ? s.slides[i].offsetLeft : s.slides[i].offsetTop; 922 } 923 }; 924 925 /*========================= 926 Dynamic Slides Per View 927 ===========================*/ 928 s.currentSlidesPerView = function () { 929 var spv = 1, i, j; 930 if (s.params.centeredSlides) { 931 var size = s.slides[s.activeIndex].swiperSlideSize; 932 var breakLoop; 933 for (i = s.activeIndex + 1; i < s.slides.length; i++) { 934 if (s.slides[i] && !breakLoop) { 935 size += s.slides[i].swiperSlideSize; 936 spv ++; 937 if (size > s.size) breakLoop = true; 938 } 939 } 940 for (j = s.activeIndex - 1; j >= 0; j--) { 941 if (s.slides[j] && !breakLoop) { 942 size += s.slides[j].swiperSlideSize; 943 spv ++; 944 if (size > s.size) breakLoop = true; 945 } 946 } 947 } 948 else { 949 for (i = s.activeIndex + 1; i < s.slides.length; i++) { 950 if (s.slidesGrid[i] - s.slidesGrid[s.activeIndex] < s.size) { 951 spv++; 952 } 953 } 954 } 955 return spv; 956 }; 957 /*========================= 958 Slider/slides progress 959 ===========================*/ 960 s.updateSlidesProgress = function (translate) { 961 if (typeof translate === 'undefined') { 962 translate = s.translate || 0; 963 } 964 if (s.slides.length === 0) return; 965 if (typeof s.slides[0].swiperSlideOffset === 'undefined') s.updateSlidesOffset(); 966 967 var offsetCenter = -translate; 968 if (s.rtl) offsetCenter = translate; 969 970 // Visible Slides 971 s.slides.removeClass(s.params.slideVisibleClass); 972 for (var i = 0; i < s.slides.length; i++) { 973 var slide = s.slides[i];
974 var slideProgress = (offsetCenter + (s.params.centeredSlides ? s.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + s.params.spaceBetween); 975 if (s.params.watchSlidesVisibility) { 976 var slideBefore = -(offsetCenter - slide.swiperSlideOffset); 977 var slideAfter = slideBefore + s.slidesSizesGrid[i]; 978 var isVisible = 979 (slideBefore >= 0 && slideBefore < s.size) || 980 (slideAfter > 0 && slideAfter <= s.size) || 981 (slideBefore <= 0 && slideAfter >= s.size); 982 if (isVisible) { 983 s.slides.eq(i).addClass(s.params.slideVisibleClass); 984 } 985 } 986 slide.progress = s.rtl ? -slideProgress : slideProgress; 987 } 988 }; 989 s.updateProgress = function (translate) { 990 if (typeof translate === 'undefined') { 991 translate = s.translate || 0; 992 } 993 var translatesDiff = s.maxTranslate() - s.minTranslate(); 994 var wasBeginning = s.isBeginning; 995 var wasEnd = s.isEnd; 996 if (translatesDiff === 0) { 997 s.progress = 0; 998 s.isBeginning = s.isEnd = true; 999 } 1000 else { 1001 s.progress = (translate - s.minTranslate()) / (translatesDiff); 1002 s.isBeginning = s.progress <= 0; 1003 s.isEnd = s.progress >= 1; 1004 } 1005 if (s.isBeginning && !wasBeginning) s.emit('onReachBeginning', s); 1006 if (s.isEnd && !wasEnd) s.emit('onReachEnd', s); 1007 1008 if (s.params.watchSlidesProgress) s.updateSlidesProgress(translate); 1009 s.emit('onProgress', s, s.progress); 1010 }; 1011 s.updateActiveIndex = function () { 1012 var translate = s.rtl ? s.translate : -s.translate; 1013 var newActiveIndex, i, snapIndex; 1014 for (i = 0; i < s.slidesGrid.length; i ++) { 1015 if (typeof s.slidesGrid[i + 1] !== 'undefined') { 1016 if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1] - (s.slidesGrid[i + 1] - s.slidesGrid[i]) / 2) { 1017 newActiveIndex = i; 1018 } 1019 else if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1]) { 1020 newActiveIndex = i + 1; 1021 } 1022 } 1023 else { 1024 if (translate >= s.slidesGrid[i]) { 1025 newActiveIndex = i; 1026 } 1027 } 1028 } 1029 // Normalize slideIndex 1030 if(s.params.normalizeSlideIndex){ 1031 if (newActiveIndex < 0 || typeof newActiveIndex === 'undefined') newActiveIndex = 0; 1032 } 1033 // for (i = 0; i < s.slidesGrid.length; i++) { 1034 // if (- translate >= s.slidesGrid[i]) { 1035 // newActiveIndex = i; 1036 // } 1037 // } 1038 snapIndex = Math.floor(newActiveIndex / s.params.slidesPerGroup); 1039 if (snapIndex >= s.snapGrid.length) snapIndex = s.snapGrid.length - 1; 1040 1041 if (newActiveIndex === s.activeIndex) { 1042 return; 1043 } 1044 s.snapIndex = snapIndex; 1045 s.previousIndex = s.activeIndex; 1046 s.activeIndex = newActiveIndex; 1047 s.updateClasses(); 1048 s.updateRealIndex(); 1049 }; 1050 s.updateRealIndex = function(){ 1051 s.realIndex = parseInt(s.slides.eq(s.activeIndex).attr('data-swiper-slide-index') || s.activeIndex, 10); 1052 }; 1053 1054 /*========================= 1055 Classes 1056 ===========================*/ 1057 s.updateClasses = function () { 1058 s.slides.removeClass(s.params.slideActiveClass + ' ' + s.params.slideNextClass + ' ' + s.params.slidePrevClass + ' ' + s.params.slideDuplicateActiveClass + ' ' + s.params.slideDuplicateNextClass + ' ' + s.params.slideDuplicatePrevClass); 1059 var activeSlide = s.slides.eq(s.activeIndex); 1060 // Active classes 1061 activeSlide.addClass(s.params.slideActiveClass); 1062 if (params.loop) { 1063 // Duplicate to all looped slides 1064 if (activeSlide.hasClass(s.params.slideDuplicateClass)) { 1065 s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); 1066 } 1067 else { 1068 s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); 1069 } 1070 } 1071 // Next Slide 1072 var nextSlide = activeSlide.next('.' + s.params.slideClass).addClass(s.params.slideNextClass); 1073 if (s.params.loop && nextSlide.length === 0) { 1074 nextSlide = s.slides.eq(0); 1075 nextSlide.addClass(s.params.slideNextClass); 1076 } 1077 // Prev Slide 1078 var prevSlide = activeSlide.prev('.' + s.params.slideClass).addClass(s.params.slidePrevClass); 1079 if (s.params.loop && prevSlide.length === 0) { 1080 prevSlide = s.slides.eq(-1); 1081 prevSlide.addClass(s.params.slidePrevClass); 1082 } 1083 if (params.loop) { 1084 // Duplicate to all looped slides 1085 if (nextSlide.hasClass(s.params.slideDuplicateClass)) { 1086 s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); 1087 } 1088 else { 1089 s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); 1090 } 1091 if (prevSlide.hasClass(s.params.slideDuplicateClass)) { 1092 s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); 1093 } 1094 else { 1095 s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); 1096 } 1097 } 1098 1099 // Pagination 1100 if (s.paginationContainer && s.paginationContainer.length > 0) { 1101 // Current/Total 1102 var current, 1103 total = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; 1104 if (s.params.loop) {
1105 current = Math.ceil((s.activeIndex - s.loopedSlides)/s.params.slidesPerGroup); 1106 if (current > s.slides.length - 1 - s.loopedSlides * 2) { 1107 current = current - (s.slides.length - s.loopedSlides * 2); 1108 } 1109 if (current > total - 1) current = current - total; 1110 if (current < 0 && s.params.paginationType !== 'bullets') current = total + current; 1111 } 1112 else { 1113 if (typeof s.snapIndex !== 'undefined') { 1114 current = s.snapIndex; 1115 } 1116 else { 1117 current = s.activeIndex || 0; 1118 } 1119 } 1120 // Types 1121 if (s.params.paginationType === 'bullets' && s.bullets && s.bullets.length > 0) { 1122 s.bullets.removeClass(s.params.bulletActiveClass); 1123 if (s.paginationContainer.length > 1) { 1124 s.bullets.each(function () { 1125 if ($(this).index() === current) $(this).addClass(s.params.bulletActiveClass); 1126 }); 1127 } 1128 else { 1129 s.bullets.eq(current).addClass(s.params.bulletActiveClass); 1130 } 1131 } 1132 if (s.params.paginationType === 'fraction') { 1133 s.paginationContainer.find('.' + s.params.paginationCurrentClass).text(current + 1); 1134 s.paginationContainer.find('.' + s.params.paginationTotalClass).text(total); 1135 } 1136 if (s.params.paginationType === 'progress') { 1137 var scale = (current + 1) / total, 1138 scaleX = scale, 1139 scaleY = 1; 1140 if (!s.isHorizontal()) { 1141 scaleY = scale; 1142 scaleX = 1; 1143 } 1144 s.paginationContainer.find('.' + s.params.paginationProgressbarClass).transform('translate3d(0,0,0) scaleX(' + scaleX + ') scaleY(' + scaleY + ')').transition(s.params.speed); 1145 } 1146 if (s.params.paginationType === 'custom' && s.params.paginationCustomRender) { 1147 s.paginationContainer.html(s.params.paginationCustomRender(s, current + 1, total)); 1148 s.emit('onPaginationRendered', s, s.paginationContainer[0]); 1149 } 1150 } 1151 1152 // Next/active buttons 1153 if (!s.params.loop) { 1154 if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { 1155 if (s.isBeginning) { 1156 s.prevButton.addClass(s.params.buttonDisabledClass); 1157 if (s.params.a11y && s.a11y) s.a11y.disable(s.prevButton); 1158 } 1159 else { 1160 s.prevButton.removeClass(s.params.buttonDisabledClass); 1161 if (s.params.a11y && s.a11y) s.a11y.enable(s.prevButton); 1162 } 1163 } 1164 if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { 1165 if (s.isEnd) { 1166 s.nextButton.addClass(s.params.buttonDisabledClass); 1167 if (s.params.a11y && s.a11y) s.a11y.disable(s.nextButton); 1168 } 1169 else { 1170 s.nextButton.removeClass(s.params.buttonDisabledClass); 1171 if (s.params.a11y && s.a11y) s.a11y.enable(s.nextButton); 1172 } 1173 } 1174 } 1175 }; 1176 1177 /*========================= 1178 Pagination 1179 ===========================*/ 1180 s.updatePagination = function () { 1181 if (!s.params.pagination) return; 1182 if (s.paginationContainer && s.paginationContainer.length > 0) { 1183 var paginationHTML = ''; 1184 if (s.params.paginationType === 'bullets') { 1185 var numberOfBullets = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; 1186 for (var i = 0; i < numberOfBullets; i++) { 1187 if (s.params.paginationBulletRender) { 1188 paginationHTML += s.params.paginationBulletRender(s, i, s.params.bulletClass); 1189 } 1190 else { 1191 paginationHTML += '<' + s.params.paginationElement+' class="' + s.params.bulletClass + '"></' + s.params.paginationElement + '>'; 1192 } 1193 } 1194 s.paginationContainer.html(paginationHTML); 1195 s.bullets = s.paginationContainer.find('.' + s.params.bulletClass); 1196 if (s.params.paginationClickable && s.params.a11y && s.a11y) { 1197 s.a11y.initPagination(); 1198 } 1199 } 1200 if (s.params.paginationType === 'fraction') { 1201 if (s.params.paginationFractionRender) { 1202 paginationHTML = s.params.paginationFractionRender(s, s.params.paginationCurrentClass, s.params.paginationTotalClass); 1203 } 1204 else { 1205 paginationHTML = 1206 '<span class="' + s.params.paginationCurrentClass + '"></span>' + 1207 ' / ' + 1208 '<span class="' + s.params.paginationTotalClass+'"></span>'; 1209 } 1210 s.paginationContainer.html(paginationHTML); 1211 } 1212 if (s.params.paginationType === 'progress') { 1213 if (s.params.paginationProgressRender) { 1214 paginationHTML = s.params.paginationProgressRender(s, s.params.paginationProgressbarClass); 1215 } 1216 else { 1217 paginationHTML = '<span class="' + s.params.paginationProgressbarClass + '"></span>'; 1218 } 1219 s.paginationContainer.html(paginationHTML); 1220 } 1221 if (s.params.paginationType !== 'custom') { 1222 s.emit('onPaginationRendered', s, s.paginationContainer[0]); 1223 } 1224 } 1225 }; 1226 /*========================= 1227 Common update method 1228 ===========================*/ 1229 s.update = function (updateTranslate) { 1230 if (!s) return; 1231 s.updateContainerSize(); 1232 s.updateSlidesSize(); 1233 s.updateProgress(); 1234 s.updatePagination(); 1235 s.updateClasses(); 1236 if (s.params.scrollbar && s.scrollbar) { 1237 s.scrollbar.set(); 1238 } 1239 var newTranslate; 1240 function forceSetTranslate() { 1241 var translate = s.rtl ? -s.translate : s.translate; 1242 newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); 1243 s.setWrapperTranslate(newTranslate); 1244 s.updateActiveIndex(); 1245 s.updateClasses(); 1246 } 1247 if (updateTranslate) { 1248 var translated; 1249 if (s.controller && s.controller.spline) { 1250 s.controller.spline = undefined; 1251 } 1252 if (s.params.freeMode) { 1253 forceSetTranslate(); 1254 if (s.params.autoHeight) { 1255 s.updateAutoHeight(); 1256 } 1257 } 1258 else { 1259 if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { 1260 translated = s.slideTo(s.slides.length - 1, 0, false, true); 1261 } 1262 else { 1263 translated = s.slideTo(s.activeIndex, 0, false, true); 1264 } 1265 if (!translated) { 1266 forceSetTranslate(); 1267 } 1268 } 1269 } 1270 else if (s.params.autoHeight) { 1271 s.updateAutoHeight(); 1272 } 1273 }; 1274 1275 /*========================= 1276 Resize Handler 1277 ===========================*/ 1278 s.onResize = function (forceUpdatePagination) { 1279 if (s.params.onBeforeResize) s.params.onBeforeResize(s); 1280 //Breakpoints 1281 if (s.params.breakpoints) { 1282 s.setBreakpoint(); 1283 } 1284 1285 // Disable locks on resize 1286 var allowSwipeToPrev = s.params.allowSwipeToPrev; 1287 var allowSwipeToNext = s.params.allowSwipeToNext; 1288 s.params.allowSwipeToPrev = s.params.allowSwipeToNext = true; 1289 1290 s.updateContainerSize(); 1291 s.updateSlidesSize(); 1292 if (s.params.slidesPerView === 'auto' || s.params.freeMode || force
1292UpdatePagination) s.updatePagination(); 1293 if (s.params.scrollbar && s.scrollbar) { 1294 s.scrollbar.set(); 1295 } 1296 if (s.controller && s.controller.spline) { 1297 s.controller.spline = undefined; 1298 } 1299 var slideChangedBySlideTo = false; 1300 if (s.params.freeMode) { 1301 var newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); 1302 s.setWrapperTranslate(newTranslate); 1303 s.updateActiveIndex(); 1304 s.updateClasses(); 1305 1306 if (s.params.autoHeight) { 1307 s.updateAutoHeight(); 1308 } 1309 } 1310 else { 1311 s.updateClasses(); 1312 if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { 1313 slideChangedBySlideTo = s.slideTo(s.slides.length - 1, 0, false, true); 1314 } 1315 else { 1316 slideChangedBySlideTo = s.slideTo(s.activeIndex, 0, false, true); 1317 } 1318 } 1319 if (s.params.lazyLoading && !slideChangedBySlideTo && s.lazy) { 1320 s.lazy.load(); 1321 } 1322 // Return locks after resize 1323 s.params.allowSwipeToPrev = allowSwipeToPrev; 1324 s.params.allowSwipeToNext = allowSwipeToNext; 1325 if (s.params.onAfterResize) s.params.onAfterResize(s); 1326 }; 1327 1328 /*========================= 1329 Events 1330 ===========================*/ 1331 1332 //Define Touch Events 1333 s.touchEventsDesktop = {start: 'mousedown', move: 'mousemove', end: 'mouseup'}; 1334 if (window.navigator.pointerEnabled) s.touchEventsDesktop = {start: 'pointerdown', move: 'pointermove', end: 'pointerup'}; 1335 else if (window.navigator.msPointerEnabled) s.touchEventsDesktop = {start: 'MSPointerDown', move: 'MSPointerMove', end: 'MSPointerUp'}; 1336 s.touchEvents = { 1337 start : s.support.touch || !s.params.simulateTouch ? 'touchstart' : s.touchEventsDesktop.start, 1338 move : s.support.touch || !s.params.simulateTouch ? 'touchmove' : s.touchEventsDesktop.move, 1339 end : s.support.touch || !s.params.simulateTouch ? 'touchend' : s.touchEventsDesktop.end 1340 }; 1341 1342 1343 // WP8 Touch Events Fix 1344 if (window.navigator.pointerEnabled || window.navigator.msPointerEnabled) { 1345 (s.params.touchEventsTarget === 'container' ? s.container : s.wrapper).addClass('swiper-wp8-' + s.params.direction); 1346 } 1347 1348 // Attach/detach events 1349 s.initEvents = function (detach) { 1350 var actionDom = detach ? 'off' : 'on'; 1351 var action = detach ? 'removeEventListener' : 'addEventListener'; 1352 var touchEventsTarget = s.params.touchEventsTarget === 'container' ? s.container[0] : s.wrapper[0]; 1353 var target = s.support.touch ? touchEventsTarget : document; 1354 1355 var moveCapture = s.params.nested ? true : false; 1356 1357 //Touch Events 1358 if (s.browser.ie) { 1359 touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, false); 1360 target[action](s.touchEvents.move, s.onTouchMove, moveCapture); 1361 target[action](s.touchEvents.end, s.onTouchEnd, false); 1362 } 1363 else { 1364 if (s.support.touch) { 1365 var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; 1366 touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, passiveListener); 1367 touchEventsTarget[action](s.touchEvents.move, s.onTouchMove, moveCapture); 1368 touchEventsTarget[action](s.touchEvents.end, s.onTouchEnd, passiveListener); 1369 } 1370 if ((params.simulateTouch && !s.device.ios && !s.device.android) || (params.simulateTouch && !s.support.touch && s.device.ios)) { 1371 touchEventsTarget[action]('mousedown', s.onTouchStart, false); 1372 document[action]('mousemove', s.onTouchMove, moveCapture); 1373 document[action]('mouseup', s.onTouchEnd, false); 1374 } 1375 } 1376 window[action]('resize', s.onResize); 1377 1378 // Next, Prev, Index 1379 if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { 1380 s.nextButton[actionDom]('click', s.onClickNext); 1381 if (s.params.a11y && s.a11y) s.nextButton[actionDom]('keydown', s.a11y.onEnterKey); 1382 } 1383 if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { 1384 s.prevButton[actionDom]('click', s.onClickPrev); 1385 if (s.params.a11y && s.a11y) s.prevButton[actionDom]('keydown', s.a11y.onEnterKey); 1386 } 1387 if (s.params.pagination && s.params.paginationClickable) { 1388 s.paginationContainer[actionDom]('click', '.' + s.params.bulletClass, s.onClickIndex); 1389 if (s.params.a11y && s.a11y) s.paginationContainer[actionDom]('keydown', '.' + s.params.bulletClass, s.a11y.onEnterKey); 1390 } 1391 1392 // Prevent Links Clicks 1393 if (s.params.preventClicks || s.params.preventClicksPropagation) touchEventsTarget[action]('click', s.preventClicks, true); 1394 }; 1395 s.attachEvents = function () { 1396 s.initEvents(); 1397 }; 1398 s.detachEvents = function () { 1399 s.initEvents(true); 1400 }; 1401 1402 /*========================= 1403 Handle Clicks 1404 ===========================*/ 1405 // Prevent Clicks 1406 s.allowClick = true; 1407 s.preventClicks = function (e) { 1408 if (!s.allowClick) { 1409 if (s.params.preventClicks) e.preventDefault(); 1410 if (s.params.preventClicksPropagation && s.animating) { 1411 e.stopPropagation(); 1412 e.stopImmediatePropagation(); 1413 } 1414 } 1415 }; 1416 // Clicks 1417 s.onClickNext = function (e) { 1418 e.preventDefault(); 1419 if (s.isEnd && !s.params.loop) return; 1420 s.slideNext(); 1421 }; 1422 s.onClickPrev = function (e) { 1423 e.preventDefault(); 1424 if (s.isBeginning && !s.params.loop) return; 1425 s.slidePrev(); 1426 }; 1427 s.onClickIndex = function (e) { 1428 e.preventDefault(); 1429 var index = $(this).index() * s.params.slidesPerGroup; 1430 if (s.params.loop) index = index + s.loopedSlides; 1431 s.slideTo(index); 1432 }; 1433 1434 /*========================= 1435 Handle Touches 1436 ===========================*/ 1437 function findElementInEvent(e, selector) { 1438 var el = $(e.target); 1439 if (!el.is(selector)) { 1440 if (typeof selector === 'string') { 1441 el = el.parents(selector); 1442 } 1443 else if (selector.nodeType) { 1444 var found; 1445 el.parents().each(function (index, _el) { 1446 if (_el === selector) found = selector; 1447 }); 1448 if (!found) return undefined; 1449 else return selector; 1450 } 1451 } 1452 if (el.length === 0) { 1453 return undefined; 1454 } 1455 return el[0]; 1456 } 1457 s.updateClickedSlide = function (e) { 1458 var slide = findElementInEvent(e, '.' + s.params.slideClass); 1459 var slideFound = false; 1460 if (slide) { 1461 for (var i = 0; i < s.slides.length; i++) { 1462 if (s.slides[i] === slide) slideFound = true; 1463 } 1464 } 1465 1466 if (slide && slideFound) { 1467 s.clickedSlide = slide; 1468 s.clickedIndex = $(slide).index(); 1469 } 1470 else { 1471 s.clickedSlide = undefined; 1472 s.clickedIndex = undefined; 1473 return; 1474 } 1475 if (s.params.slideToClickedSlide && s.clickedIndex !== undefined && s.clickedIndex !== s.activeIndex) { 1476 var slideToIndex = s.clickedIndex, 1477 realIndex, 1478 duplicatedSlides, 1479 slidesPerView = s.params.slidesPerView === 'auto' ? s.currentSlidesPerView() : s.params.slidesPerView; 1480 if (s.params.loop) { 1481 if (s.animating) return; 1482 realIndex = parseInt($(s.clickedSlide).attr('data-swiper-slide-index'), 10); 1483 if (s.params.centeredSlides) { 1484 if ((slideToIndex < s.loopedSlides - slidesPerView/2) || (slideToIndex > s.slides.length - s.loopedSlides + slidesPerView/2)) { 1485 s.fixLoop(); 1486 slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); 1487 setTimeout(function () { 1488 s.slideTo(slideToIndex); 1489 }, 0); 1490 } 1491 else { 1492 s.slideTo(slideToIndex); 1493 } 1494 } 1495 else { 1496 if (slideToIndex > s.slides.length - slidesPerView) { 1497 s.fixLoop(); 1498 slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); 1499 setTimeout(function () { 1500 s.slideTo(slideToIndex); 1501 }, 0); 1502 } 1503 else { 1504 s.slideTo(slideToIndex); 1505 } 1506 } 1507 } 1508 else { 1509 s.slideTo(slideToIndex); 1510 } 1511 } 1512 }; 1513 1514 var isTouched, 1515 isMoved, 1516 allowTouchCallbacks, 1517 touchStartTime, 1518 isScrolling, 1519 currentTranslate, 1520 startTranslate, 1521 allowThresholdMove, 1522 // Form elements to match 1523 formElements = 'input, select, textarea, button, video', 1524 // Last click time 1525 lastClickTime = Date.now(), clickTimeout, 1526 //Velocities 1527 velocities = [], 1528 allowMomentumBounce; 1529 1530 // Animating Flag 1531 s.animating = false; 1532 1533 // Touches information 1534 s.touches = { 1535 startX: 0, 1536 startY: 0, 1537 currentX: 0, 1538 currentY: 0, 1539 diff: 0 1540 }; 1541 1542 // Touch handlers 1543 var isTouchEvent, startMoving; 1544 s.onTouchStart = function (e) { 1545 if (e.originalEvent) e = e.originalEvent; 1546 isTouchEvent = e.type === 'touchstart'; 1547 if (!isTouchEvent && 'which' in e && e.which === 3) return; 1548 if (s.params.noSwiping && findElementInEvent(e, '.' + s.params.noSwipingClass)) { 1549 s.allowClick = true; 1550 return; 1551 } 1552 if (s.params.swipeHandler) { 1553 if (!findElementInEvent(e, s.params.swipeHandler)) return; 1554 } 1555 1556 var startX = s.touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; 1557 var startY = s.touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; 1558 1559 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore 1560 if(s.device.ios && s.params.iOSEdgeSwipeDetection && startX <= s.params.iOSEdgeSwipeThreshold) { 1561 return; 1562 } 1563 1564 isTouched = true; 1565 isMoved = false; 1566 allowTouchCallbacks = true; 1567 isScrolling = undefined; 1568 startMoving = undefined; 1569 s.touches.startX = startX; 1570 s.touches.startY = startY; 1571 touchStartTime = Date.now(); 1572 s.allowClick = true; 1573 s.updateContainerSize(); 1574 s.swipeDirection = undefined; 1575 if (s.params.threshold > 0) allowThresholdMove = false; 1576 if (e.type !== 'touchstart') { 1577 var preventDefault = true; 1578 if ($(e.target).is(formElements)) preventDefault = false; 1579 if (document.activeElement && $(document.activeElement).is(formElements)) { 1580 document.activeElement.blur(); 1581 } 1582 if (preventDefault) { 1583 e.preventDefault(); 1584 } 1585 } 1586 s.emit('onTouchStart', s, e); 1587 }; 1588 1589 s.onTouchMove = function (e) { 1590 if (e.originalEvent) e = e.originalEvent; 1591 if (isTouchEvent && e.type === 'mousemove') return; 1592 if (e.preventedByNestedSwiper) { 1593 s.touches.startX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; 1594 s.touches.startY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; 1595 return; 1596 } 1597 if (s.params.onlyExternal) { 1598 // isMoved = true; 1599 s.allowClick = false; 1600 if (isTouched) { 1601 s.touches.startX = s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; 1602 s.touches.startY = s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; 1603 touchStartTime = Date.now(); 1604 } 1605 return; 1606 } 1607 if (isTouchEvent && s.params.touchReleaseOnEdges && !s.params.loop) { 1608 if (!s.isHorizontal()) { 1609 // Vertical 1610 if ( 1611 (s.touches.currentY < s.touches.startY && s.translate <= s.maxTranslate()) || 1612 (s.touches.currentY > s.touches.startY && s.translate >= s.minTranslate()) 1613 ) { 1614 return; 1615 } 1616 } 1617 else { 1618 if ( 1619 (s.touches.currentX < s.touches.startX && s.translate <= s.maxTranslate()) || 1620 (s.touches.currentX > s.touches.startX && s.translate >= s.minTranslate()) 1621 ) { 1622 return; 1623 } 1624 } 1625 } 1626 if (isTouchEvent && document.activeElement) { 1627 if (e.target === document.activeElement && $(e.target).is(formElements)) { 1628 isMoved = true; 1629 s.allowClick = false; 1630 return; 1631 } 1632 } 1633 if (allowTouchCallbacks) { 1634 s.emit('onTouchMove', s, e); 1635 } 1636 if (e.targetTouches && e.targetTouches.length > 1) return; 1637 1638 s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; 1639 s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; 1640 1641 if (typeof isScrolling === 'undefined') { 1642 var touchAngle; 1643 if (s.isHorizontal() && s.touches.currentY === s.touches.startY || !s.isHorizontal() && s.touches.currentX === s.touches.startX) { 1644 isScrolling = false; 1645 } 1646 else { 1647 touchAngle = Math.atan2(Math.abs(s.touches.currentY - s.touches.startY), Math.abs(s.touches.currentX - s.touches.startX)) * 180 / Math.PI; 1648 isScroll
1648ing = s.isHorizontal() ? touchAngle > s.params.touchAngle : (90 - touchAngle > s.params.touchAngle); 1649 } 1650 } 1651 if (isScrolling) { 1652 s.emit('onTouchMoveOpposite', s, e); 1653 } 1654 if (typeof startMoving === 'undefined') { 1655 if (s.touches.currentX !== s.touches.startX || s.touches.currentY !== s.touches.startY) { 1656 startMoving = true; 1657 } 1658 } 1659 if (!isTouched) return; 1660 if (isScrolling) { 1661 isTouched = false; 1662 return; 1663 } 1664 if (!startMoving) { 1665 return; 1666 } 1667 s.allowClick = false; 1668 s.emit('onSliderMove', s, e); 1669 e.preventDefault(); 1670 if (s.params.touchMoveStopPropagation && !s.params.nested) { 1671 e.stopPropagation(); 1672 } 1673 1674 if (!isMoved) { 1675 if (params.loop) { 1676 s.fixLoop(); 1677 } 1678 startTranslate = s.getWrapperTranslate(); 1679 s.setWrapperTransition(0); 1680 if (s.animating) { 1681 s.wrapper.trigger('webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd'); 1682 } 1683 if (s.params.autoplay && s.autoplaying) { 1684 if (s.params.autoplayDisableOnInteraction) { 1685 s.stopAutoplay(); 1686 } 1687 else { 1688 s.pauseAutoplay(); 1689 } 1690 } 1691 allowMomentumBounce = false; 1692 //Grab Cursor 1693 if (s.params.grabCursor && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { 1694 s.setGrabCursor(true); 1695 } 1696 } 1697 isMoved = true; 1698 1699 var diff = s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; 1700 1701 diff = diff * s.params.touchRatio; 1702 if (s.rtl) diff = -diff; 1703 1704 s.swipeDirection = diff > 0 ? 'prev' : 'next'; 1705 currentTranslate = diff + startTranslate; 1706 1707 var disableParentSwiper = true; 1708 if ((diff > 0 && currentTranslate > s.minTranslate())) { 1709 disableParentSwiper = false; 1710 if (s.params.resistance) currentTranslate = s.minTranslate() - 1 + Math.pow(-s.minTranslate() + startTranslate + diff, s.params.resistanceRatio); 1711 } 1712 else if (diff < 0 && currentTranslate < s.maxTranslate()) { 1713 disableParentSwiper = false; 1714 if (s.params.resistance) currentTranslate = s.maxTranslate() + 1 - Math.pow(s.maxTranslate() - startTranslate - diff, s.params.resistanceRatio); 1715 } 1716 1717 if (disableParentSwiper) { 1718 e.preventedByNestedSwiper = true; 1719 } 1720 1721 // Directions locks 1722 if (!s.params.allowSwipeToNext && s.swipeDirection === 'next' && currentTranslate < startTranslate) { 1723 currentTranslate = startTranslate; 1724 } 1725 if (!s.params.allowSwipeToPrev && s.swipeDirection === 'prev' && currentTranslate > startTranslate) { 1726 currentTranslate = startTranslate; 1727 } 1728 1729 1730 // Threshold 1731 if (s.params.threshold > 0) { 1732 if (Math.abs(diff) > s.params.threshold || allowThresholdMove) { 1733 if (!allowThresholdMove) { 1734 allowThresholdMove = true; 1735 s.touches.startX = s.touches.currentX; 1736 s.touches.startY = s.touches.currentY; 1737 currentTranslate = startTranslate; 1738 s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; 1739 return; 1740 } 1741 } 1742 else { 1743 currentTranslate = startTranslate; 1744 return; 1745 } 1746 } 1747 1748 if (!s.params.followFinger) return; 1749 1750 // Update active index in free mode 1751 if (s.params.freeMode || s.params.watchSlidesProgress) { 1752 s.updateActiveIndex(); 1753 } 1754 if (s.params.freeMode) { 1755 //Velocity 1756 if (velocities.length === 0) { 1757 velocities.push({ 1758 position: s.touches[s.isHorizontal() ? 'startX' : 'startY'], 1759 time: touchStartTime 1760 }); 1761 } 1762 velocities.push({ 1763 position: s.touches[s.isHorizontal() ? 'currentX' : 'currentY'], 1764 time: (new window.Date()).getTime() 1765 }); 1766 } 1767 // Update progress 1768 s.updateProgress(currentTranslate); 1769 // Update translate 1770 s.setWrapperTranslate(currentTranslate); 1771 }; 1772 s.onTouchEnd = function (e) { 1773 if (e.originalEvent) e = e.originalEvent; 1774 if (allowTouchCallbacks) { 1775 s.emit('onTouchEnd', s, e); 1776 } 1777 allowTouchCallbacks = false; 1778 if (!isTouched) return; 1779 //Return Grab Cursor 1780 if (s.params.grabCursor && isMoved && isTouched && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { 1781 s.setGrabCursor(false); 1782 } 1783 1784 // Time diff 1785 var touchEndTime = Date.now(); 1786 var timeDiff = touchEndTime - touchStartTime; 1787 1788 // Tap, doubleTap, Click 1789 if (s.allowClick) { 1790 s.updateClickedSlide(e); 1791 s.emit('onTap', s, e); 1792 if (timeDiff < 300 && (touchEndTime - lastClickTime) > 300) { 1793 if (clickTimeout) clearTimeout(clickTimeout); 1794 clickTimeout = setTimeout(function () { 1795 if (!s) return; 1796 if (s.params.paginationHide && s.paginationContainer.length > 0 && !$(e.target).hasClass(s.params.bulletClass)) { 1797 s.paginationContainer.toggleClass(s.params.paginationHiddenClass); 1798 } 1799 s.emit('onClick', s, e); 1800 }, 300); 1801 1802 } 1803 if (timeDiff < 300 && (touchEndTime - lastClickTime) < 300) { 1804 if (clickTimeout) clearTimeout(clickTimeout); 1805 s.emit('onDoubleTap', s, e); 1806 } 1807 } 1808 1809 lastClickTime = Date.now(); 1810 setTimeout(function () { 1811 if (s) s.allowClick = true; 1812 }, 0); 1813 1814 if (!isTouched || !isMoved || !s.swipeDirection || s.touches.diff === 0 || currentTranslate === startTranslate) { 1815 isTouched = isMoved = false; 1816 return; 1817 } 1818 isTouched = isMoved = false; 1819 1820 var currentPos; 1821 if (s.params.followFinger) { 1822 currentPos = s.rtl ? s.translate : -s.translate; 1823 } 1824 else { 1825 currentPos = -currentTranslate; 1826 } 1827 if (s.params.freeMode) { 1828 if (currentPos < -s.minTranslate()) { 1829 s.slideTo(s.activeIndex); 1830 return; 1831 } 1832 else if (currentPos > -s.maxTranslate()) { 1833 if (s.slides.length < s.snapGrid.length) { 1834 s.slideTo(s.snapGrid.length - 1); 1835 } 1836 else { 1837 s.slideTo(s.slides.length - 1); 1838 } 1839 return; 1840 } 1841 1842 if (s.params.freeModeMomentum) { 1843 if (velocities.length > 1) { 1844 var lastMoveEvent = velocities.pop(), velocityEvent = velocities.pop(); 1845 1846 var distance = lastMoveEvent.position - velocityEvent.position; 1847 var time = lastMoveEvent.time - velocityEvent.time; 1848 s.velocity = distance / time; 1849 s.velocity = s.velocity / 2; 1850 if (Math.abs(s.velocity) < s.params.freeModeMinimumVelocity) { 1851 s.velocity = 0; 1852 } 1853 // this implies that the user stopped moving a finger then released. 1854 // There would be no events with distance zero, so the last event is stale. 1855 if (time > 150 || (new window.Date().getTime() - lastMoveEvent.time) > 300) { 1856 s.velocity = 0; 1857 } 1858 } else { 1859 s.velocity = 0; 1860 } 1861 s.velocity = s.velocity * s.params.freeModeMomentumVelocityRatio; 1862 1863 velocities.length = 0; 1864 var momentumDuration = 1000 * s.params.freeModeMomentumRatio; 1865 var momentumDistance = s.velocity * momentumDuration; 1866 1867 var newPosition = s.translate + momentumDistance; 1868 if (s.rtl) newPosition = - newPosition; 1869 var doBounce = false; 1870 var afterBouncePosition; 1871 var bounceAmount = Math.abs(s.velocity) * 20 * s.params.freeModeMomentumBounceRatio; 1872 if (newPosition < s.maxTranslate()) { 1873 if (s.params.freeModeMomentumBounce) { 1874 if (newPosition + s.maxTranslate() < -bounceAmount) { 1875 newPosition = s.maxTranslate() - bounceAmount; 1876 } 1877 afterBouncePosition = s.maxTranslate(); 1878 doBounce = true; 1879 allowMomentumBounce = true; 1880 } 1881 else { 1882 newPosition = s.maxTranslate(); 1883 } 1884 } 1885 else if (newPosition > s.minTranslate()) { 1886 if (s.params.freeModeMomentumBounce) { 1887 if (newPosition - s.minTranslate() > bounceAmount) { 1888 newPosition = s.minTranslate() + bounceAmount; 1889 } 1890 afterBouncePosition = s.minTranslate(); 1891 doBounce = true; 1892 allowMomentumBounce = true; 1893 } 1894 else { 1895 newPosition = s.minTranslate(); 1896 } 1897 } 1898 else if (s.params.freeModeSticky) { 1899 var j = 0, 1900 nextSlide; 1901 for (j = 0; j < s.snapGrid.length; j += 1) { 1902 if (s.snapGrid[j] > -newPosition) { 1903 nextSlide = j; 1904 break; 1905 } 1906 1907 } 1908 if (Math.abs(s.snapGrid[nextSlide] - newPosition) < Math.abs(s.snapGrid[nextSlide - 1] - newPosition) || s.swipeDirection === 'next') { 1909 newPosition = s.snapGrid[nextSlide]; 1910 } else { 1911 newPosition = s.snapGrid[nextSlide - 1];
1912 } 1913 if (!s.rtl) newPosition = - newPosition; 1914 } 1915 //Fix duration 1916 if (s.velocity !== 0) { 1917 if (s.rtl) { 1918 momentumDuration = Math.abs((-newPosition - s.translate) / s.velocity); 1919 } 1920 else { 1921 momentumDuration = Math.abs((newPosition - s.translate) / s.velocity); 1922 } 1923 } 1924 else if (s.params.freeModeSticky) { 1925 s.slideReset(); 1926 return; 1927 } 1928 1929 if (s.params.freeModeMomentumBounce && doBounce) { 1930 s.updateProgress(afterBouncePosition); 1931 s.setWrapperTransition(momentumDuration); 1932 s.setWrapperTranslate(newPosition); 1933 s.onTransitionStart(); 1934 s.animating = true; 1935 s.wrapper.transitionEnd(function () { 1936 if (!s || !allowMomentumBounce) return; 1937 s.emit('onMomentumBounce', s); 1938 1939 s.setWrapperTransition(s.params.speed); 1940 s.setWrapperTranslate(afterBouncePosition); 1941 s.wrapper.transitionEnd(function () { 1942 if (!s) return; 1943 s.onTransitionEnd(); 1944 }); 1945 }); 1946 } else if (s.velocity) { 1947 s.updateProgress(newPosition); 1948 s.setWrapperTransition(momentumDuration); 1949 s.setWrapperTranslate(newPosition); 1950 s.onTransitionStart(); 1951 if (!s.animating) { 1952 s.animating = true; 1953 s.wrapper.transitionEnd(function () { 1954 if (!s) return; 1955 s.onTransitionEnd(); 1956 }); 1957 } 1958 1959 } else { 1960 s.updateProgress(newPosition); 1961 } 1962 1963 s.updateActiveIndex(); 1964 } 1965 if (!s.params.freeModeMomentum || timeDiff >= s.params.longSwipesMs) { 1966 s.updateProgress(); 1967 s.updateActiveIndex(); 1968 } 1969 return; 1970 } 1971 1972 // Find current slide 1973 var i, stopIndex = 0, groupSize = s.slidesSizesGrid[0]; 1974 for (i = 0; i < s.slidesGrid.length; i += s.params.slidesPerGroup) { 1975 if (typeof s.slidesGrid[i + s.params.slidesPerGroup] !== 'undefined') { 1976 if (currentPos >= s.slidesGrid[i] && currentPos < s.slidesGrid[i + s.params.slidesPerGroup]) { 1977 stopIndex = i; 1978 groupSize = s.slidesGrid[i + s.params.slidesPerGroup] - s.slidesGrid[i]; 1979 } 1980 } 1981 else { 1982 if (currentPos >= s.slidesGrid[i]) { 1983 stopIndex = i; 1984 groupSize = s.slidesGrid[s.slidesGrid.length - 1] - s.slidesGrid[s.slidesGrid.length - 2]; 1985 } 1986 } 1987 } 1988 1989 // Find current slide size 1990 var ratio = (currentPos - s.slidesGrid[stopIndex]) / groupSize; 1991 1992 if (timeDiff > s.params.longSwipesMs) { 1993 // Long touches 1994 if (!s.params.longSwipes) { 1995 s.slideTo(s.activeIndex); 1996 return; 1997 } 1998 if (s.swipeDirection === 'next') { 1999 if (ratio >= s.params.longSwipesRatio) s.slideTo(stopIndex + s.params.slidesPerGroup); 2000 else s.slideTo(stopIndex); 2001 2002 } 2003 if (s.swipeDirection === 'prev') { 2004 if (ratio > (1 - s.params.longSwipesRatio)) s.slideTo(stopIndex + s.params.slidesPerGroup); 2005 else s.slideTo(stopIndex); 2006 } 2007 } 2008 else { 2009 // Short swipes 2010 if (!s.params.shortSwipes) { 2011 s.slideTo(s.activeIndex); 2012 return; 2013 } 2014 if (s.swipeDirection === 'next') { 2015 s.slideTo(stopIndex + s.params.slidesPerGroup); 2016 2017 } 2018 if (s.swipeDirection === 'prev') { 2019 s.slideTo(stopIndex); 2020 } 2021 } 2022 }; 2023 /*========================= 2024 Transitions 2025 ===========================*/ 2026 s._slideTo = function (slideIndex, speed) { 2027 return s.slideTo(slideIndex, speed, true, true); 2028 }; 2029 s.slideTo = function (slideIndex, speed, runCallbacks, internal) { 2030 if (typeof runCallbacks === 'undefined') runCallbacks = true; 2031 if (typeof slideIndex === 'undefined') slideIndex = 0; 2032 if (slideIndex < 0) slideIndex = 0; 2033 s.snapIndex = Math.floor(slideIndex / s.params.slidesPerGroup); 2034 if (s.snapIndex >= s.snapGrid.length) s.snapIndex = s.snapGrid.length - 1; 2035 2036 var translate = - s.snapGrid[s.snapIndex]; 2037 // Stop autoplay 2038 if (s.params.autoplay && s.autoplaying) { 2039 if (internal || !s.params.autoplayDisableOnInteraction) { 2040 s.pauseAutoplay(speed); 2041 } 2042 else { 2043 s.stopAutoplay(); 2044 } 2045 } 2046 // Update progress 2047 s.updateProgress(translate); 2048 2049 // Normalize slideIndex 2050 if(s.params.normalizeSlideIndex){ 2051 for (var i = 0; i < s.slidesGrid.length; i++) { 2052 if (- Math.floor(translate * 100) >= Math.floor(s.slidesGrid[i] * 100)) { 2053 slideIndex = i; 2054 } 2055 } 2056 } 2057 2058 // Directions locks 2059 if (!s.params.allowSwipeToNext && translate < s.translate && translate < s.minTranslate()) { 2060 return false; 2061 } 2062 if (!s.params.allowSwipeToPrev && translate > s.translate && translate > s.maxTranslate()) { 2063 if ((s.activeIndex || 0) !== slideIndex ) return false; 2064 } 2065 2066 // Update Index 2067 if (typeof speed === 'undefined') speed = s.params.speed; 2068 s.previousIndex = s.activeIndex || 0; 2069 s.activeIndex = slideIndex; 2070 s.updateRealIndex(); 2071 if ((s.rtl && -translate === s.translate) || (!s.rtl && translate === s.translate)) { 2072 // Update Height 2073 if (s.params.autoHeight) { 2074 s.updateAutoHeight(); 2075 } 2076 s.updateClasses(); 2077 if (s.params.effect !== 'slide') { 2078 s.setWrapperTranslate(translate); 2079 } 2080 return false; 2081 } 2082 s.updateClasses(); 2083 s.onTransitionStart(runCallbacks); 2084 2085 if (speed === 0 || s.browser.lteIE9) { 2086 s.setWrapperTranslate(translate); 2087 s.setWrapperTransition(0); 2088 s.onTransitionEnd(runCallbacks); 2089 } 2090 else { 2091 s.setWrapperTranslate(translate); 2092 s.setWrapperTransition(speed); 2093 if (!s.animating) { 2094 s.animating = true; 2095 s.wrapper.transitionEnd(function () { 2096 if (!s) return; 2097 s.onTransitionEnd(runCallbacks); 2098 }); 2099 } 2100 2101 } 2102 2103 return true; 2104 }; 2105 2106 s.onTransitionStart = function (runCallbacks) { 2107 if (typeof runCallbacks === 'undefined') runCallbacks = true; 2108 if (s.params.autoHeight) { 2109 s.updateAutoHeight(); 2110 } 2111 if (s.lazy) s.lazy.onTransitionStart(); 2112 if (runCallbacks) { 2113 s.emit('onTransitionStart', s); 2114 if (s.activeIndex !== s.previousIndex) { 2115 s.emit('onSlideChangeStart', s); 2116 if (s.activeIndex > s.previousIndex) { 2117 s.emit('onSlideNextStart', s); 2118 } 2119 else { 2120 s.emit('onSlidePrevStart', s); 2121 } 2122 } 2123 2124 } 2125 }; 2126 s.onTransitionEnd = function (runCallbacks) { 2127 s.animating = false; 2128 s.setWrapperTransition(0); 2129 if (typeof runCallbacks === 'undefined') runCallbacks = true; 2130 if (s.lazy) s.lazy.onTransitionEnd(); 2131 if (runCallbacks) { 2132 s.emit('onTransitionEnd', s); 2133 if (s.activeIndex !== s.previousIndex) { 2134 s.emit('onSlideChangeEnd', s); 2135 if (s.activeIndex > s.previousIndex) { 2136 s.emit('onSlideNextEnd', s); 2137 } 2138 else { 2139 s.emit('onSlidePrevEnd', s); 2140 } 2141 } 2142 } 2143 if (s.params.history && s.history) { 2144 s.history.setHistory(s.params.history, s.activeIndex); 2145 } 2146 if (s.params.hashnav && s.hashnav) { 2147 s.hashnav.setHash(); 2148 } 2149 2150 }; 2151 s.slideNext = function (runCallbacks, speed, internal) { 2152 if (s.params.loop) { 2153 if (s.animating) return false; 2154 s.fixLoop(); 2155 var clientLeft = s.container[0].clientLeft; 2156 return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); 2157 } 2158 else return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); 2159 }; 2160 s._slideNext = function (speed) { 2161 return s.slideNext(true, speed, true); 2162 }; 2163 s.slidePrev = function (runCallbacks, speed, internal) { 2164 if (s.params.loop) { 2165 if (s.animating) return false; 2166 s.fixLoop(); 2167 var clientLeft = s.container[0].clientLeft; 2168 return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); 2169 } 2170 else return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); 2171 }; 2172 s._slidePrev = function (speed) { 2173 return s.slidePrev(true, speed, true); 2174 }; 2175 s.slideReset = function (runCallbacks, speed, internal) { 2176 return s.slideTo(s.activeIndex, speed, runCallbacks); 2177 }; 2178 2179 s.disableTouchControl = function () { 2180 s.params.onlyExternal = true; 2181 return true; 2182 }; 2183 s.enableTouchControl = function () { 2184 s.params.onlyExternal = false; 2185 return true; 2186 }; 2187 2188 /*========================= 2189 Translate/transition helpers 2190 ===========================*/ 2191 s.setWrapperTransition = function (duration, byController) { 2192 s.wrapper.transition(duration); 2193 if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { 2194 s.effects[s.params.effect].setTransition(duration); 2195 } 2196 if (s.params.parallax && s.parallax) { 2197 s.parallax.setTransition(duration); 2198 } 2199 if (s.params.scrollbar && s.scrollbar) { 2200 s.scrollbar.setTransition(duration); 2201 } 2202 if (s.params.control && s.controller) { 2203 s.controller.setTransition(duration, byController); 2204 } 2205 s.emit('onSetTransition', s, duration); 2206 }; 2207 s.setWrapperTranslate = function (translate, updateActiveIndex, byController) { 2208 var x = 0, y = 0, z = 0; 2209 if (s.isHorizontal()) { 2210 x = s.rtl ? -translate : translate; 2211 } 2212 else { 2213 y = translate; 2214 } 2215 2216 if (s.params.roundLengths) { 2217 x = round(x); 2218 y = round(y); 2219 } 2220 2221 if (!s.params.virtualTranslate) { 2222 if (s.support.transforms3d) s.wrapper.transform('translate3d(' + x + 'px, ' + y + 'px, ' + z + 'px)'); 2223 else s.wrapper.transform('translate(' + x + 'px, ' + y + 'px)'); 2224 } 2225 2226 s.translate = s.isHorizontal() ? x : y; 2227 2228 // Check if we need to update progress 2229 var progress; 2230 var translatesDiff = s.maxTranslate() - s.minTranslate(); 2231 if (translatesDiff === 0) { 2232 progress = 0; 2233 } 2234 else { 2235 progress = (translate - s.minTranslate()) / (translatesDiff); 2236 } 2237 if (progress !== s.progress) { 2238 s.updateProgress(translate); 2239 } 2240 2241 if (updateActiveIndex) s.updateActiveIndex(); 2242 if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { 2243 s.effects[s.params.effect].setTranslate(s.translate); 2244 } 2245 if (s.params.parallax && s.parallax) { 2246 s.parallax.setTranslate(s.translate); 2247 } 2248 if (s.params.scrollbar && s.scrollbar) { 2249 s.scrollbar.setTranslate(s.translate); 2250 } 2251 if (s.params.control && s.controller) { 2252 s.controller.setTranslate(s.translate, byController); 2253 } 2254 s.emit('onSetTranslate', s, s.translate); 2255 }; 2256 2257 s.getTranslate = function (el, axis) { 2258 var matrix, curTransform, curStyle, transformMatrix; 2259 2260 // automatic axis detection 2261 if (typeof axis === 'undefined') { 2262 axis = 'x'; 2263 } 2264 2265 if (s.params.virtualTranslate) { 2266 return s.rtl ? -s.translate : s.translate; 2267 } 2268 2269 curStyle = window.getComputedStyle(el, null); 2270 if (window.WebKitCSSMatrix) { 2271 curTransform = curStyle.transform || curStyle.webkitTransform; 2272 if (curTransform.split(',').length > 6) { 2273 curTransform = curTransform.split(', ').map(function(a){ 2274 return a.replace(',','.'); 2275 }).join(', '); 2276 } 2277 // Some old versions of Webkit choke when 'none' is passed; pass 2278 // empty string instead in this case 2279 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); 2280 } 2281 else { 2282 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); 2283 matrix = transformMatrix.toString().split(','); 2284 } 2285 2286 if (axis === 'x') { 2287 //Latest Chrome and webkits Fix 2288 if (window.WebKitCSSMatrix) 2289 curTransform = transformMatrix.m41; 2290 //Crazy IE10 Matrix 2291 else if (matrix.length === 16) 2292 curTransform = parseFloat(matrix[12]); 2293 //Normal Browsers 2294 else 2295 curTransform = parseFloat(matrix[4]); 2296 } 2297 if (axis === 'y') { 2298 //Latest Chrome and webkits Fix 2299 if (window.WebKitCSSMatrix) 2300 curTransform = transformMatrix.m42; 2301 //Crazy
2301IE10 Matrix 2302 else if (matrix.length === 16) 2303 curTransform = parseFloat(matrix[13]); 2304 //Normal Browsers 2305 else 2306 curTransform = parseFloat(matrix[5]); 2307 } 2308 if (s.rtl && curTransform) curTransform = -curTransform; 2309 return curTransform || 0; 2310 }; 2311 s.getWrapperTranslate = function (axis) { 2312 if (typeof axis === 'undefined') { 2313 axis = s.isHorizontal() ? 'x' : 'y'; 2314 } 2315 return s.getTranslate(s.wrapper[0], axis); 2316 }; 2317 2318 /*========================= 2319 Observer 2320 ===========================*/ 2321 s.observers = []; 2322 function initObserver(target, options) { 2323 options = options || {}; 2324 // create an observer instance 2325 var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; 2326 var observer = new ObserverFunc(function (mutations) { 2327 mutations.forEach(function (mutation) { 2328 s.onResize(true); 2329 s.emit('onObserverUpdate', s, mutation); 2330 }); 2331 }); 2332 2333 observer.observe(target, { 2334 attributes: typeof options.attributes === 'undefined' ? true : options.attributes, 2335 childList: typeof options.childList === 'undefined' ? true : options.childList, 2336 characterData: typeof options.characterData === 'undefined' ? true : options.characterData 2337 }); 2338 2339 s.observers.push(observer); 2340 } 2341 s.initObservers = function () { 2342 if (s.params.observeParents) { 2343 var containerParents = s.container.parents(); 2344 for (var i = 0; i < containerParents.length; i++) { 2345 initObserver(containerParents[i]); 2346 } 2347 } 2348 2349 // Observe container 2350 initObserver(s.container[0], {childList: false}); 2351 2352 // Observe wrapper 2353 initObserver(s.wrapper[0], {attributes: false}); 2354 }; 2355 s.disconnectObservers = function () { 2356 for (var i = 0; i < s.observers.length; i++) { 2357 s.observers[i].disconnect(); 2358 } 2359 s.observers = []; 2360 }; 2361 /*========================= 2362 Loop 2363 ===========================*/ 2364 // Create looped slides 2365 s.createLoop = function () { 2366 // Remove duplicated slides 2367 s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); 2368 2369 var slides = s.wrapper.children('.' + s.params.slideClass); 2370 2371 if(s.params.slidesPerView === 'auto' && !s.params.loopedSlides) s.params.loopedSlides = slides.length; 2372 2373 s.loopedSlides = parseInt(s.params.loopedSlides || s.params.slidesPerView, 10); 2374 s.loopedSlides = s.loopedSlides + s.params.loopAdditionalSlides; 2375 if (s.loopedSlides > slides.length) { 2376 s.loopedSlides = slides.length; 2377 } 2378 2379 var prependSlides = [], appendSlides = [], i; 2380 slides.each(function (index, el) { 2381 var slide = $(this); 2382 if (index < s.loopedSlides) appendSlides.push(el); 2383 if (index < slides.length && index >= slides.length - s.loopedSlides) prependSlides.push(el); 2384 slide.attr('data-swiper-slide-index', index); 2385 }); 2386 for (i = 0; i < appendSlides.length; i++) { 2387 s.wrapper.append($(appendSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); 2388 } 2389 for (i = prependSlides.length - 1; i >= 0; i--) { 2390 s.wrapper.prepend($(prependSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); 2391 } 2392 }; 2393 s.destroyLoop = function () { 2394 s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); 2395 s.slides.removeAttr('data-swiper-slide-index'); 2396 }; 2397 s.reLoop = function (updatePosition) { 2398 var oldIndex = s.activeIndex - s.loopedSlides; 2399 s.destroyLoop(); 2400 s.createLoop(); 2401 s.updateSlidesSize(); 2402 if (updatePosition) { 2403 s.slideTo(oldIndex + s.loopedSlides, 0, false); 2404 } 2405 2406 }; 2407 s.fixLoop = function () { 2408 var newIndex; 2409 //Fix For Negative Oversliding 2410 if (s.activeIndex < s.loopedSlides) { 2411 newIndex = s.slides.length - s.loopedSlides * 3 + s.activeIndex; 2412 newIndex = newIndex + s.loopedSlides; 2413 s.slideTo(newIndex, 0, false, true); 2414 } 2415 //Fix For Positive Oversliding 2416 else if ((s.params.slidesPerView === 'auto' && s.activeIndex >= s.loopedSlides * 2) || (s.activeIndex > s.slides.length - s.params.slidesPerView * 2)) { 2417 newIndex = -s.slides.length + s.activeIndex + s.loopedSlides; 2418 newIndex = newIndex + s.loopedSlides; 2419 s.slideTo(newIndex, 0, false, true); 2420 } 2421 }; 2422 /*========================= 2423 Append/Prepend/Remove Slides 2424 ===========================*/ 2425 s.appendSlide = function (slides) { 2426 if (s.params.loop) { 2427 s.destroyLoop(); 2428 } 2429 if (typeof slides === 'object' && slides.length) { 2430 for (var i = 0; i < slides.length; i++) { 2431 if (slides[i]) s.wrapper.append(slides[i]); 2432 } 2433 } 2434 else { 2435 s.wrapper.append(slides); 2436 } 2437 if (s.params.loop) { 2438 s.createLoop(); 2439 } 2440 if (!(s.params.observer && s.support.observer)) { 2441 s.update(true); 2442 } 2443 }; 2444 s.prependSlide = function (slides) { 2445 if (s.params.loop) { 2446 s.destroyLoop(); 2447 } 2448 var newActiveIndex = s.activeIndex + 1; 2449 if (typeof slides === 'object' && slides.length) { 2450 for (var i = 0; i < slides.length; i++) {
2451 if (slides[i]) s.wrapper.prepend(slides[i]); 2452 } 2453 newActiveIndex = s.activeIndex + slides.length; 2454 } 2455 else { 2456 s.wrapper.prepend(slides); 2457 } 2458 if (s.params.loop) { 2459 s.createLoop(); 2460 } 2461 if (!(s.params.observer && s.support.observer)) { 2462 s.update(true); 2463 } 2464 s.slideTo(newActiveIndex, 0, false); 2465 }; 2466 s.removeSlide = function (slidesIndexes) { 2467 if (s.params.loop) { 2468 s.destroyLoop(); 2469 s.slides = s.wrapper.children('.' + s.params.slideClass); 2470 } 2471 var newActiveIndex = s.activeIndex, 2472 indexToRemove; 2473 if (typeof slidesIndexes === 'object' && slidesIndexes.length) { 2474 for (var i = 0; i < slidesIndexes.length; i++) { 2475 indexToRemove = slidesIndexes[i]; 2476 if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); 2477 if (indexToRemove < newActiveIndex) newActiveIndex--; 2478 } 2479 newActiveIndex = Math.max(newActiveIndex, 0); 2480 } 2481 else { 2482 indexToRemove = slidesIndexes; 2483 if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); 2484 if (indexToRemove < newActiveIndex) newActiveIndex--; 2485 newActiveIndex = Math.max(newActiveIndex, 0); 2486 } 2487 2488 if (s.params.loop) { 2489 s.createLoop(); 2490 } 2491 2492 if (!(s.params.observer && s.support.observer)) { 2493 s.update(true); 2494 } 2495 if (s.params.loop) { 2496 s.slideTo(newActiveIndex + s.loopedSlides, 0, false); 2497 } 2498 else { 2499 s.slideTo(newActiveIndex, 0, false); 2500 } 2501 2502 }; 2503 s.removeAllSlides = function () { 2504 var slidesIndexes = []; 2505 for (var i = 0; i < s.slides.length; i++) { 2506 slidesIndexes.push(i); 2507 } 2508 s.removeSlide(slidesIndexes); 2509 }; 2510 2511 2512 /*=========================
2513 Effects 2514 ===========================*/ 2515 s.effects = { 2516 fade: { 2517 setTranslate: function () { 2518 for (var i = 0; i < s.slides.length; i++) { 2519 var slide = s.slides.eq(i); 2520 var offset = slide[0].swiperSlideOffset; 2521 var tx = -offset; 2522 if (!s.params.virtualTranslate) tx = tx - s.translate; 2523 var ty = 0; 2524 if (!s.isHorizontal()) { 2525 ty = tx; 2526 tx = 0; 2527 } 2528 var slideOpacity = s.params.fade.crossFade ? 2529 Math.max(1 - Math.abs(slide[0].progress), 0) : 2530 1 + Math.min(Math.max(slide[0].progress, -1), 0); 2531 slide 2532 .css({ 2533 opacity: slideOpacity 2534 }) 2535 .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px)'); 2536 2537 } 2538 2539 }, 2540 setTransition: function (duration) { 2541 s.slides.transition(duration); 2542 if (s.params.virtualTranslate && duration !== 0) { 2543 var eventTriggered = false; 2544 s.slides.transitionEnd(function () { 2545 if (eventTriggered) return; 2546 if (!s) return; 2547 eventTriggered = true; 2548 s.animating = false; 2549 var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; 2550 for (var i = 0; i < triggerEvents.length; i++) { 2551 s.wrapper.trigger(triggerEvents[i]); 2552 } 2553 }); 2554 } 2555 } 2556 }, 2557 flip: { 2558 setTranslate: function () { 2559 for (var i = 0; i < s.slides.length; i++) { 2560 var slide = s.slides.eq(i); 2561 var progress = slide[0].progress; 2562 if (s.params.flip.limitRotation) { 2563 progress = Math.max(Math.min(slide[0].progress, 1), -1); 2564 } 2565 var offset = slide[0].swiperSlideOffset; 2566 var rotate = -180 * progress, 2567 rotateY = rotate, 2568 rotateX = 0, 2569 tx = -offset, 2570 ty = 0; 2571 if (!s.isHorizontal()) { 2572 ty = tx; 2573 tx = 0; 2574 rotateX = -rotateY; 2575 rotateY = 0; 2576 } 2577 else if (s.rtl) { 2578 rotateY = -rotateY; 2579 } 2580 2581 slide[0].style.zIndex = -Math.abs(Math.round(progress)) + s.slides.length; 2582 2583 if (s.params.flip.slideShadows) { 2584 //Set shadows 2585 var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); 2586 var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); 2587 if (shadowBefore.length === 0) { 2588 shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>'); 2589 slide.append(shadowBefore); 2590 } 2591 if (shadowAfter.length === 0) { 2592 shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>'); 2593 slide.append(shadowAfter); 2594 } 2595 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); 2596 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); 2597 } 2598 2599 slide 2600 .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'); 2601 } 2602 }, 2603 setTransition: function (duration) { 2604 s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); 2605 if (s.params.virtualTranslate && duration !== 0) { 2606 var eventTriggered = false; 2607 s.slides.eq(s.activeIndex).transitionEnd(function () { 2608 if (eventTriggered) return; 2609 if (!s) return; 2610 if (!$(this).hasClass(s.params.slideActiveClass)) return; 2611 eventTriggered = true; 2612 s.animating = false;
2613 var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; 2614 for (var i = 0; i < triggerEvents.length; i++) { 2615 s.wrapper.trigger(triggerEvents[i]); 2616 } 2617 }); 2618 } 2619 } 2620 }, 2621 cube: { 2622 setTranslate: function () { 2623 var wrapperRotate = 0, cubeShadow; 2624 if (s.params.cube.shadow) { 2625 if (s.isHorizontal()) { 2626 cubeShadow = s.wrapper.find('.swiper-cube-shadow'); 2627 if (cubeShadow.length === 0) { 2628 cubeShadow = $('<div class="swiper-cube-shadow"></div>'); 2629 s.wrapper.append(cubeShadow); 2630 } 2631 cubeShadow.css({height: s.width + 'px'}); 2632 } 2633 else { 2634 cubeShadow = s.container.find('.swiper-cube-shadow'); 2635 if (cubeShadow.length === 0) { 2636 cubeShadow = $('<div class="swiper-cube-shadow"></div>'); 2637 s.container.append(cubeShadow); 2638 } 2639 } 2640 } 2641 for (var i = 0; i < s.slides.length; i++) { 2642 var slide = s.slides.eq(i); 2643 var slideAngle = i * 90; 2644 var round = Math.floor(slideAngle / 360); 2645 if (s.rtl) { 2646 slideAngle = -slideAngle; 2647 round = Math.floor(-slideAngle / 360); 2648 } 2649 var progress = Math.max(Math.min(slide[0].progress, 1), -1); 2650 var tx = 0, ty = 0, tz = 0; 2651 if (i % 4 === 0) { 2652 tx = - round * 4 * s.size; 2653 tz = 0; 2654 } 2655 else if ((i - 1) % 4 === 0) { 2656 tx = 0; 2657 tz = - round * 4 * s.size; 2658 } 2659 else if ((i - 2) % 4 === 0) { 2660 tx = s.size + round * 4 * s.size; 2661 tz = s.size; 2662 } 2663 else if ((i - 3) % 4 === 0) { 2664 tx = - s.size; 2665 tz = 3 * s.size + s.size * 4 * round; 2666 } 2667 if (s.rtl) { 2668 tx = -tx; 2669 } 2670 2671 if (!s.isHorizontal()) { 2672 ty = tx; 2673 tx = 0; 2674 } 2675 2676 var transform = 'rotateX(' + (s.isHorizontal() ? 0 : -slideAngle) + 'deg) rotateY(' + (s.isHorizontal() ? slideAngle : 0) + 'deg) translate3d(' + tx + 'px, ' + ty + 'px, ' + tz + 'px)'; 2677 if (progress <= 1 && progress > -1) { 2678 wrapperRotate = i * 90 + progress * 90; 2679 if (s.rtl) wrapperRotate = -i * 90 - progress * 90; 2680 } 2681 slide.transform(transform); 2682 if (s.params.cube.slideShadows) { 2683 //Set shadows 2684 var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); 2685 var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); 2686 if (shadowBefore.length === 0) { 2687 shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>'); 2688 slide.append(shadowBefore); 2689 } 2690 if (shadowAfter.length === 0) {
2691 shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>'); 2692 slide.append(shadowAfter); 2693 } 2694 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); 2695 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); 2696 } 2697 } 2698 s.wrapper.css({ 2699 '-webkit-transform-origin': '50% 50% -' + (s.size / 2) + 'px', 2700 '-moz-transform-origin': '50% 50% -' + (s.size / 2) + 'px', 2701 '-ms-transform-origin': '50% 50% -' + (s.size / 2) + 'px', 2702 'transform-origin': '50% 50% -' + (s.size / 2) + 'px' 2703 }); 2704 2705 if (s.params.cube.shadow) { 2706 if (s.isHorizontal()) { 2707 cubeShadow.transform('translate3d(0px, ' + (s.width / 2 + s.params.cube.shadowOffset) + 'px, ' + (-s.width / 2) + 'px) rotateX(90deg) rotateZ(0deg) scale(' + (s.params.cube.shadowScale) + ')'); 2708 } 2709 else { 2710 var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; 2711 var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); 2712 var scale1 = s.params.cube.shadowScale, 2713 scale2 = s.params.cube.shadowScale / multiplier, 2714 offset = s.params.cube.shadowOffset; 2715 cubeShadow.transform('scale3d(' + scale1 + ', 1, ' + scale2 + ') translate3d(0px, ' + (s.height / 2 + offset) + 'px, ' + (-s.height / 2 / scale2) + 'px) rotateX(-90deg)'); 2716 } 2717 } 2718 var zFactor = (s.isSafari || s.isUiWebView) ? (-s.size / 2) : 0; 2719 s.wrapper.transform('translate3d(0px,0,' + zFactor + 'px) rotateX(' + (s.isHorizontal() ? 0 : wrapperRotate) + 'deg) rotateY(' + (s.isHorizontal() ? -wrapperRotate : 0) + 'deg)'); 2720 }, 2721 setTransition: function (duration) { 2722 s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); 2723 if (s.params.cube.shadow && !s.isHorizontal()) { 2724 s.container.find('.swiper-cube-shadow').transition(duration); 2725 } 2726 } 2727 }, 2728 coverflow: { 2729 setTranslate: function () { 2730 var transform = s.translate; 2731 var center = s.isHorizontal() ? -transform + s.width / 2 : -transform + s.height / 2; 2732 var rotate = s.isHorizontal() ? s.params.coverflow.rotate: -s.params.coverflow.rotate; 2733 var translate = s.params.coverflow.depth; 2734 //Each slide offset from center 2735 for (var i = 0, length = s.slides.length; i < length; i++) { 2736 var slide = s.slides.eq(i); 2737 var slideSize = s.slidesSizesGrid[i]; 2738 var slideOffset = slide[0].swiperSlideOffset; 2739 var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * s.params.coverflow.modifier; 2740 2741 var rotateY = s.isHorizontal() ? rotate * offsetMultiplier : 0; 2742 var rotateX = s.isHorizontal() ? 0 : rotate * offsetMultiplier; 2743 // var rotateZ = 0 2744 var translateZ = -translate * Math.abs(offsetMultiplier); 2745 2746 var translateY = s.isHorizontal() ? 0 : s.params.coverflow.stretch * (offsetMultiplier); 2747 var translateX = s.isHorizontal() ? s.params.coverflow.stretch * (offsetMultiplier) : 0; 2748 2749 //Fix for ultra small values 2750 if (Math.abs(translateX) < 0.001) translateX = 0; 2751 if (Math.abs(translateY) < 0.001) translateY = 0; 2752 if (Math.abs(translateZ) < 0.001) translateZ = 0; 2753 if (Math.abs(rotateY) < 0.001) rotateY = 0; 2754 if (Math.abs(rotateX) < 0.001) rotateX = 0; 2755 2756 var slideTransform = 'translate3d(' + translateX + 'px,' + translateY + 'px,' + translateZ + 'px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'; 2757 2758 slide.transform(slideTransform); 2759 slide[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; 2760 if (s.params.coverflow.slideShadows) { 2761 //Set shadows 2762 var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); 2763 var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); 2764 if (shadowBefore.length === 0) { 2765 shadowBefore = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '"></div>'); 2766 slide.append(shadowBefore); 2767 } 2768 if (shadowAfter.length === 0) {
2769 shadowAfter = $('<div class="swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '"></div>'); 2770 slide.append(shadowAfter); 2771 } 2772 if (shadowBefore.length) shadowBefore[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; 2773 if (shadowAfter.length) shadowAfter[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; 2774 } 2775 } 2776 2777 //Set correct perspective for IE10 2778 if (s.browser.ie) { 2779 var ws = s.wrapper[0].style; 2780 ws.perspectiveOrigin = center + 'px 50%'; 2781 } 2782 }, 2783 setTransition: function (duration) { 2784 s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); 2785 } 2786 } 2787 }; 2788 2789 2790 /*========================= 2791 Images Lazy Loading 2792 ===========================*/ 2793 s.lazy = { 2794 initialImageLoaded: false, 2795 loadImageInSlide: function (index, loadInDuplicate) { 2796 if (typeof index === 'undefined') return; 2797 if (typeof loadInDuplicate === 'undefined') loadInDuplicate = true; 2798 if (s.slides.length === 0) return; 2799 2800 var slide = s.slides.eq(index); 2801 var img = slide.find('.' + s.params.lazyLoadingClass + ':not(.' + s.params.lazyStatusLoadedClass + '):not(.' + s.params.lazyStatusLoadingClass + ')'); 2802 if (slide.hasClass(s.params.lazyLoadingClass) && !slide.hasClass(s.params.lazyStatusLoadedClass) && !slide.hasClass(s.params.lazyStatusLoadingClass)) { 2803 img = img.add(slide[0]); 2804 } 2805 if (img.length === 0) return; 2806 2807 img.each(function () { 2808 var _img = $(this); 2809 _img.addClass(s.params.lazyStatusLoadingClass); 2810 var background = _img.attr('data-background'); 2811 var src = _img.attr('data-src'), 2812 srcset = _img.attr('data-srcset'), 2813 sizes = _img.attr('data-sizes'); 2814 s.loadImage(_img[0], (src || background), srcset, sizes, false, function () { 2815 if (typeof s === 'undefined' || s === null || !s) return; 2816 if (background) { 2817 _img.css('background-image', 'url("' + background + '")'); 2818 _img.removeAttr('data-background'); 2819 } 2820 else { 2821 if (srcset) { 2822 _img.attr('srcset', srcset); 2823 _img.removeAttr('data-srcset'); 2824 } 2825 if (sizes) { 2826 _img.attr('sizes', sizes); 2827 _img.removeAttr('data-sizes'); 2828 } 2829 if (src) { 2830 _img.attr('src', src); 2831 _img.removeAttr('data-src'); 2832 } 2833 2834 } 2835 2836 _img.addClass(s.params.lazyStatusLoadedClass).removeClass(s.params.lazyStatusLoadingClass); 2837 slide.find('.' + s.params.lazyPreloaderClass + ', .' + s.params.preloaderClass).remove(); 2838 if (s.params.loop && loadInDuplicate) { 2839 var slideOriginalIndex = slide.attr('data-swiper-slide-index'); 2840 if (slide.hasClass(s.params.slideDuplicateClass)) { 2841 var originalSlide = s.wrapper.children('[data-swiper-slide-index="' + slideOriginalIndex + '"]:not(.' + s.params.slideDuplicateClass + ')'); 2842 s.lazy.loadImageInSlide(originalSlide.index(), false); 2843 } 2844 else { 2845 var duplicatedSlide = s.wrapper.children('.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + slideOriginalIndex + '"]'); 2846 s.lazy.loadImageInSlide(duplicatedSlide.index(), false); 2847 } 2848 } 2849 s.emit('onLazyImageReady', s, slide[0], _img[0]); 2850 }); 2851 2852 s.emit('onLazyImageLoad', s, slide[0], _img[0]); 2853 }); 2854 2855 }, 2856 load: function () { 2857 var i; 2858 var slidesPerView = s.params.slidesPerView; 2859 if (slidesPerView === 'auto') { 2860 slidesPerView = 0; 2861 } 2862 if (!s.lazy.initialImageLoaded) s.lazy.initialImageLoaded = true; 2863 if (s.params.watchSlidesVisibility) { 2864 s.wrapper.children('.' + s.params.slideVisibleClass).each(function () { 2865 s.lazy.loadImageInSlide($(this).index()); 2866 }); 2867 } 2868 else { 2869 if (slidesPerView > 1) { 2870 for (i = s.activeIndex; i < s.activeIndex + slidesPerView ; i++) { 2871 if (s.slides[i]) s.lazy.loadImageInSlide(i); 2872 } 2873 } 2874 else { 2875 s.lazy.loadImageInSlide(s.activeIndex); 2876 } 2877 } 2878 if (s.params.lazyLoadingInPrevNext) { 2879 if (slidesPerView > 1 || (s.params.lazyLoadingInPrevNextAmount && s.params.lazyLoadingInPrevNextAmount > 1)) { 2880 var amount = s.params.lazyLoadingInPrevNextAmount; 2881 var spv = slidesPerView; 2882 var maxIndex = Math.min(s.activeIndex + spv + Math.max(amount, spv), s.slides.length); 2883 var minIndex = Math.max(s.activeIndex - Math.max(spv, amount), 0); 2884 // Next Slides 2885 for (i = s.activeIndex + slidesPerView; i < maxIndex; i++) { 2886 if (s.slides[i]) s.lazy.loadImageInSlide(i); 2887 } 2888 // Prev Slides 2889 for (i = minIndex; i < s.activeIndex ; i++) { 2890 if (s.slides[i]) s.lazy.loadImageInSlide(i); 2891 } 2892 } 2893 else { 2894 var nextSlide = s.wrapper.children('.' + s.params.slideNextClass); 2895 if (nextSlide.length > 0) s.lazy.loadImageInSlide(nextSlide.index()); 2896 2897 var prevSlide = s.wrapper.children('.' + s.params.slidePrevClass); 2898 if (prevSlide.length > 0) s.lazy.loadImageInSlide(prevSlide.index()); 2899 } 2900 } 2901 }, 2902 onTransitionStart: function () { 2903 if (s.params.lazyLoading) { 2904 if (s.params.lazyLoadingOnTransitionStart || (!s.params.lazyLoadingOnTransitionStart && !s.lazy.initialImageLoaded)) { 2905 s.lazy.load(); 2906 } 2907 } 2908 }, 2909 onTransitionEnd: function () { 2910 if (s.params.lazyLoading && !s.params.lazyLoadingOnTransitionStart) { 2911 s.lazy.load(); 2912 } 2913 } 2914 }; 2915 2916 2917 /*========================= 2918 Scrollbar 2919 ===========================*/ 2920 s.scrollbar = { 2921 isTouched: false, 2922 setDragPosition: function (e) { 2923 var sb = s.scrollbar; 2924 var x = 0, y = 0; 2925 var translate; 2926 var pointerPosition = s.isHorizontal() ? 2927 ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX) : 2928 ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY) ; 2929 var position = (pointerPosition) - sb.track.offset()[s.isHorizontal() ? 'left' : 'top'] - sb.dragSize / 2; 2930 var positionMin = -s.minTranslate() * sb.moveDivider; 2931 var positionMax = -s.maxTranslate() * sb.moveDivider; 2932 if (position < positionMin) { 2933 position = positionMin; 2934 } 2935 else if (position > positionMax) { 2936 position = positionMax; 2937 } 2938 position = -position / sb.moveDivider; 2939 s.updateProgress(position); 2940 s.setWrapperTranslate(position, true); 2941 }, 2942 dragStart: function (e) { 2943 var sb = s.scrollbar; 2944 sb.isTouched = true; 2945 e.preventDefault(); 2946 e.stopPropagation(); 2947 2948 sb.setDragPosition(e); 2949 clearTimeout(sb.dragTimeout); 2950 2951 sb.track.transition(0); 2952 if (s.params.scrollbarHide) { 2953 sb.track.css('opacity', 1); 2954 } 2955 s.wrapper.transition(100); 2956 sb.drag.transition(100); 2957 s.emit('onScrollbarDragStart', s); 2958 }, 2959 dragMove: function (e) { 2960 var sb = s.scrollbar; 2961 if (!sb.isTouched) return; 2962 if (e.preventDefault) e.preventDefault(); 2963 else e.returnValue = false; 2964 sb.setDragPosition(e); 2965 s.wrapper.transition(0); 2966 sb.track.transition(0); 2967 sb.drag.transition(0); 2968 s.emit('onScrollbarDragMove', s); 2969 }, 2970 dragEnd: function (e) { 2971 var sb = s.scrollbar; 2972 if (!sb.isTouched) return; 2973 sb.isTouched = false; 2974 if (s.params.scrollbarHide) { 2975 clearTimeout(sb.dragTimeout); 2976 sb.dragTimeout = setTimeout(function () { 2977 sb.track.css('opacity', 0); 2978 sb.track.transition(400); 2979 }, 1000); 2980 2981 } 2982 s.emit('onScrollbarDragEnd', s); 2983 if (s.params.scrollbarSnapOnRelease) { 2984 s.slideReset(); 2985 } 2986 }, 2987 draggableEvents: (function () { 2988 if ((s.params.simulateTouch === false && !s.support.touch)) return s.touchEventsDesktop; 2989 else return s.touchEvents; 2990 })(), 2991 enableDraggable: function () { 2992 var sb = s.scrollbar; 2993 var target = s.support.touch ? sb.track : document; 2994 $(sb.track).on(sb.draggableEvents.start, sb.dragStart); 2995 $(target).on(sb.draggableEvents.move, sb.dragMove); 2996 $(target).on(sb.draggableEvents.end, sb.dragEnd); 2997 }, 2998 disableDraggable: function () { 2999 var sb = s.scrollbar; 3000 var target = s.support.touch ? sb.track : document; 3001 $(sb.track).off(sb.draggableEvents.start, sb.dragStart); 3002 $(target).off(sb.draggableEvents.move, sb.dragMove); 3003 $(target).off(sb.draggableEvents.end, sb.dragEnd); 3004 }, 3005 set: function () { 3006 if (!s.params.scrollbar) return; 3007 var sb = s.scrollbar; 3008 sb.track = $(s.params.scrollbar); 3009 if (s.params.uniqueNavElements && typeof s.params.scrollbar === 'string' && sb.track.length > 1 && s.container.find(s.params.scrollbar).length === 1) { 3010 sb.track = s.container.find(s.params.scrollbar); 3011 } 3012 sb.drag = sb.track.find('.swiper-scrollbar-drag'); 3013 if (sb.drag.length === 0) { 3014 sb.drag = $('<div class="swiper-scrollbar-drag"></div>'); 3015 sb.track.append(sb.drag); 3016 } 3017 sb.drag[0].style.width = ''; 3018 sb.drag[0].style.height = ''; 3019 sb.trackSize = s.isHorizontal() ? sb.track[0].offsetWidth : sb.track[0].offsetHeight; 3020 3021 sb.divider = s.size / s.virtualSize; 3022 sb.moveDivider = sb.divider * (sb.trackSize / s.size); 3023 sb.dragSize = sb.trackSize * sb.divider; 3024 3025 if (s.isHorizontal()) { 3026 sb.drag[0].style.width = sb.dragSize + 'px'; 3027 } 3028 else { 3029 sb.drag[0].style.height = sb.dragSize + 'px'; 3030 } 3031 3032 if (sb.divider >= 1) { 3033 sb.track[0].style.display = 'none'; 3034 } 3035 else { 3036 sb.track[0].style.display = ''; 3037 } 3038 if (s.params.scrollbarHide) { 3039 sb.track[0].style.opacity = 0; 3040 } 3041 }, 3042 setTranslate: function () { 3043 if (!s.params.scrollbar) return; 3044 var diff; 3045 var sb = s.scrollbar; 3046 var translate = s.translate || 0; 3047 var newPos; 3048 3049 var newSize = sb.dragSize; 3050 newPos = (sb.trackSize - sb.dragSize) * s.progress; 3051 if (s.rtl && s.isHorizontal()) { 3052 newPos = -newPos; 3053 if (newPos > 0) { 3054 newSize = sb.dragSize - newPos; 3055 newPos = 0; 3056 } 3057 else if (-newPos + sb.dragSize > sb.trackSize) { 3058 newSize = sb.trackSize + newPos; 3059 } 3060 } 3061 else { 3062 if (newPos < 0) { 3063 newSize = sb.dragSize + newPos; 3064 newPos = 0; 3065 } 3066 else if (newPos + sb.dragSize > sb.trackSize) { 3067 newSize = sb.trackSize - newPos; 3068 } 3069 } 3070 if (s.isHorizontal()) { 3071 if (s.support.transforms3d) { 3072 sb.drag.transform('translate3d(' + (newPos) + 'px, 0, 0)'); 3073 } 3074 else { 3075 sb.drag.transform('translateX(' + (newPos) + 'px)'); 3076 } 3077 sb.drag[0].style.width = newSize + 'px'; 3078 } 3079 else { 3080 if (s.support.transforms3d) { 3081 sb.drag.transform('translate3d(0px, ' + (newPos) + 'px, 0)'); 3082 } 3083 else { 3084 sb.drag.transform('translateY(' + (newPos) + 'px)'); 3085 } 3086 sb.drag[0].style.height = newSize + 'px'; 3087 } 3088 if (s.params.scrollbarHide) { 3089 clearTimeout(sb.timeout); 3090 sb.track[0].style.opacity = 1; 3091 sb.timeout = setTimeout(function () { 3092 sb.track[0].style.opacity = 0; 3093 sb.track.transition(400); 3094 }, 1000); 3095 } 3096 }, 3097 setTransition: function (duration) { 3098 if (!s.params.scrollbar) return; 3099 s.scrollbar.drag.transition(duration); 3100 } 3101 }; 3102 3103 3104 /*========================= 3105 Controller 3106 ===========================*/ 3107 s.controller = { 3108 LinearSpline: function (x, y) { 3109 var binarySearch = (function() { 3110 var maxIndex, minIndex, guess; 3111 return function(array, val) { 3112 minIn
3112dex = -1; 3113 maxIndex = array.length; 3114 while (maxIndex - minIndex > 1) 3115 if (array[guess = maxIndex + minIndex >> 1] <= val) { 3116 minIndex = guess; 3117 } else { 3118 maxIndex = guess; 3119 } 3120 return maxIndex; 3121 }; 3122 })(); 3123 this.x = x; 3124 this.y = y; 3125 this.lastIndex = x.length - 1; 3126 // Given an x value (x2), return the expected y2 value: 3127 // (x1,y1) is the known point before given value, 3128 // (x3,y3) is the known point after given value. 3129 var i1, i3; 3130 var l = this.x.length; 3131 3132 this.interpolate = function (x2) { 3133 if (!x2) return 0; 3134 3135 // Get the indexes of x1 and x3 (the array indexes before and after given x2): 3136 i3 = binarySearch(this.x, x2); 3137 i1 = i3 - 1; 3138 3139 // We have our indexes i1 & i3, so we can calculate already: 3140 // y2 := ((x2âx1) à (y3ây1)) ÷ (x3âx1) + y1 3141 return ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]; 3142 }; 3143 }, 3144 //xxx: for now i will just save one spline function to to 3145 getInterpolateFunction: function(c){ 3146 if(!s.controller.spline) s.controller.spline = s.params.loop ? 3147 new s.controller.LinearSpline(s.slidesGrid, c.slidesGrid) : 3148 new s.controller.LinearSpline(s.snapGrid, c.snapGrid); 3149 }, 3150 setTranslate: function (translate, byController) { 3151 var controlled = s.params.control; 3152 var multiplier, controlledTranslate; 3153 function setControlledTranslate(c) { 3154 // this will create an Interpolate function based on the snapGrids 3155 // x is the Grid of the scrolled scroller and y will be the controlled scroller 3156 // it makes sense to create this only once and recall it for the interpolation 3157 // the function does a lot of value caching for performance 3158 translate = c.rtl && c.params.direction === 'horizontal' ? -s.translate : s.translate; 3159 if (s.params.controlBy === 'slide') { 3160 s.controller.getInterpolateFunction(c); 3161 // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid 3162 // but it did not work out 3163 controlledTranslate = -s.controller.spline.interpolate(-translate); 3164 } 3165 3166 if(!controlledTranslate || s.params.controlBy === 'container'){ 3167 multiplier = (c.maxTranslate() - c.minTranslate()) / (s.maxTranslate() - s.minTranslate()); 3168 controlledTranslate = (translate - s.minTranslate()) * multiplier + c.minTranslate(); 3169 } 3170 3171 if (s.params.controlInverse) { 3172 controlledTranslate = c.maxTranslate() - controlledTranslate; 3173 } 3174 c.updateProgress(controlledTranslate); 3175 c.setWrapperTranslate(controlledTranslate, false, s); 3176 c.updateActiveIndex(); 3177 } 3178 if (Array.isArray(controlled)) { 3179 for (var i = 0; i < controlled.length; i++) { 3180 if (controlled[i] !== byController && controlled[i] instanceof Swiper) { 3181 setControlledTranslate(controlled[i]); 3182 } 3183 } 3184 } 3185 else if (controlled instanceof Swiper && byController !== controlled) { 3186 3187 setControlledTranslate(controlled); 3188 } 3189 }, 3190 setTransition: function (duration, byController) { 3191 var controlled = s.params.control; 3192 var i; 3193 function setControlledTransition(c) { 3194 c.setWrapperTransition(duration, s); 3195 if (duration !== 0) { 3196 c.onTransitionStart(); 3197 c.wrapper.transitionEnd(function(){ 3198 if (!controlled) return; 3199 if (c.params.loop && s.params.controlBy === 'slide') { 3200 c.fixLoop(); 3201 } 3202 c.onTransitionEnd(); 3203 3204 }); 3205 } 3206 } 3207 if (Array.isArray(controlled)) { 3208 for (i = 0; i < controlled.length; i++) { 3209 if (controlled[i] !== byController && controlled[i] instanceof Swiper) { 3210 setControlledTransition(controlled[i]); 3211 } 3212 } 3213 } 3214 else if (controlled instanceof Swiper && byController !== controlled) { 3215 setControlledTransition(controlled); 3216 } 3217 } 3218 }; 3219 3220 3221 /*========================= 3222 Hash Navigation 3223 ===========================*/ 3224 s.hashnav = { 3225 onHashCange: function (e, a) { 3226 var newHash = document.location.hash.replace('#', ''); 3227 var activeSlideHash = s.slides.eq(s.activeIndex).attr('data-hash'); 3228 if (newHash !== activeSlideHash) { 3229 s.slideTo(s.wrapper.children('.' + s.params.slideClass + '[data-hash="' + (newHash) + '"]').index()); 3230 } 3231 }, 3232 attachEvents: function (detach) { 3233 var action = detach ? 'off' : 'on'; 3234 $(window)[action]('hashchange', s.hashnav.onHashCange); 3235 }, 3236 setHash: function () { 3237 if (!s.hashnav.initialized || !s.params.hashnav) return; 3238 if (s.params.replaceState && window.history && window.history.replaceState) { 3239 window.history.replaceState(null, null, ('#' + s.slides.eq(s.activeIndex).attr('data-hash') || '')); 3240 } else { 3241 var slide = s.slides.eq(s.activeIndex); 3242 var hash = slide.attr('data-hash') || slide.attr('data-history'); 3243 document.location.hash = hash || ''; 3244 } 3245 }, 3246 init: function () { 3247 if (!s.params.hashnav || s.params.history) return; 3248 s.hashnav.initialized = true; 3249 var hash = document.location.hash.replace('#', ''); 3250 if (hash) { 3251 var speed = 0; 3252 for (var i = 0, length = s.slides.length; i < length; i++) { 3253 var slide = s.slides.eq(i); 3254 var slideHash = slide.attr('data-hash') || slide.attr('data-history'); 3255 if (slideHash === hash && !slide.hasClass(s.params.slideDuplicateClass)) { 3256 var index = slide.index(); 3257 s.slideTo(index, speed, s.params.runCallbacksOnInit, true); 3258 } 3259 } 3260 } 3261 if (s.params.hashnavWatchState) s.hashnav.attachEvents(); 3262 }, 3263 destroy: function () { 3264 if (s.params.hashnavWatchState) s.hashnav.attachEvents(true); 3265 } 3266 }; 3267 3268 3269 /*========================= 3270 History Api with fallback to Hashnav 3271 ===========================*/ 3272 s.history = { 3273 init: function () { 3274 if (!s.params.history) return; 3275 if (!window.history || !window.history.pushState) { 3276 s.params.history = false; 3277 s.params.hashnav = true; 3278 return; 3279 } 3280 s.history.initialized = true; 3281 this.paths = this.getPathValues();
3282 if (!this.paths.key && !this.paths.value) return; 3283 this.scrollToSlide(0, this.paths.value, s.params.runCallbacksOnInit); 3284 if (!s.params.replaceState) { 3285 window.addEventListener('popstate', this.setHistoryPopState); 3286 } 3287 }, 3288 setHistoryPopState: function() { 3289 s.history.paths = s.history.getPathValues(); 3290 s.history.scrollToSlide(s.params.speed, s.history.paths.value, false); 3291 }, 3292 getPathValues: function() { 3293 var pathArray = window.location.pathname.slice(1).split('/'); 3294 var total = pathArray.length; 3295 var key = pathArray[total - 2]; 3296 var value = pathArray[total - 1]; 3297 return { key: key, value: value }; 3298 }, 3299 setHistory: function (key, index) { 3300 if (!s.history.initialized || !s.params.history) return; 3301 var slide = s.slides.eq(index); 3302 var value = this.slugify(slide.attr('data-history')); 3303 if (!window.location.pathname.includes(key)) { 3304 value = key + '/' + value; 3305 } 3306 if (s.params.replaceState) { 3307 window.history.replaceState(null, null, value); 3308 } else { 3309 window.history.pushState(null, null, value); 3310 } 3311 }, 3312 slugify: function(text) { 3313 return text.toString().toLowerCase() 3314 .replace(/\s+/g, '-') 3315 .replace(/[^\w\-]+/g, '') 3316 .replace(/\-\-+/g, '-') 3317 .replace(/^-+/, '') 3318 .replace(/-+$/, ''); 3319 }, 3320 scrollToSlide: function(speed, value, runCallbacks) { 3321 if (value) { 3322 for (var i = 0, length = s.slides.length; i < length; i++) { 3323 var slide = s.slides.eq(i); 3324 var slideHistory = this.slugify(slide.attr('data-history')); 3325 if (slideHistory === value && !slide.hasClass(s.params.slideDuplicateClass)) { 3326 var index = slide.index(); 3327 s.slideTo(index, speed, runCallbacks); 3328 } 3329 } 3330 } else { 3331 s.slideTo(0, speed, runCallbacks); 3332 } 3333 } 3334 }; 3335 3336 3337 /*========================= 3338 Keyboard Control 3339 ===========================*/ 3340 function handleKeyboard(e) { 3341 if (e.originalEvent) e = e.originalEvent; //jquery fix 3342 var kc = e.keyCode || e.charCode; 3343 // Directions locks 3344 if (!s.params.allowSwipeToNext && (s.isHorizontal() && kc === 39 || !s.isHorizontal() && kc === 40)) { 3345 return false; 3346 } 3347 if (!s.params.allowSwipeToPrev && (s.isHorizontal() && kc === 37 || !s.isHorizontal() && kc === 38)) { 3348 return false; 3349 } 3350 if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { 3351 return; 3352 } 3353 if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { 3354 return; 3355 } 3356 if (kc === 37 || kc === 39 || kc === 38 || kc === 40) { 3357 var inView = false; 3358 //Check that swiper should be inside of visible area of window 3359 if (s.container.parents('.' + s.params.slideClass).length > 0 && s.container.parents('.' + s.params.slideActiveClass).length === 0) { 3360 return; 3361 } 3362 var windowScroll = { 3363 left: window.pageXOffset, 3364 top: window.pageYOffset 3365 }; 3366 var windowWidth = window.innerWidth; 3367 var windowHeight = window.innerHeight; 3368 var swiperOffset = s.container.offset(); 3369 if (s.rtl) swiperOffset.left = swiperOffset.left - s.container[0].scrollLeft; 3370 var swiperCoord = [ 3371 [swiperOffset.left, swiperOffset.top], 3372 [swiperOffset.left + s.width, swiperOffset.top], 3373 [swiperOffset.left, swiperOffset.top + s.height], 3374 [swiperOffset.left + s.width, swiperOffset.top + s.height] 3375 ]; 3376 for (var i = 0; i < swiperCoord.length; i++) { 3377 var point = swiperCoord[i]; 3378 if ( 3379 point[0] >= windowScroll.left && point[0] <= windowScroll.left + windowWidth && 3380 point[1] >= windowScroll.top && point[1] <= windowScroll.top + windowHeight 3381 ) { 3382 inView = true; 3383 } 3384 3385 } 3386 if (!inView) return; 3387 } 3388 if (s.isHorizontal()) { 3389 if (kc === 37 || kc === 39) { 3390 if (e.preventDefault) e.preventDefault(); 3391 else e.returnValue = false; 3392 } 3393 if ((kc === 39 && !s.rtl) || (kc === 37 && s.rtl)) s.slideNext(); 3394 if ((kc === 37 && !s.rtl) || (kc === 39 && s.rtl)) s.slidePrev(); 3395 } 3396 else { 3397 if (kc === 38 || kc === 40) { 3398 if (e.preventDefault) e.preventDefault(); 3399 else e.returnValue = false; 3400 } 3401 if (kc === 40) s.slideNext(); 3402 if (kc === 38) s.slidePrev(); 3403 } 3404 s.emit('onKeyPress', s, kc); 3405 } 3406 s.disableKeyboardControl = function () { 3407 s.params.keyboardControl = false; 3408 $(document).off('keydown', handleKeyboard); 3409 }; 3410 s.enableKeyboardControl = function () { 3411 s.params.keyboardControl = true; 3412 $(document).on('keydown', handleKeyboard); 3413 }; 3414 3415 3416 /*========================= 3417 Mousewheel Control 3418 ===========================*/ 3419 s.mousewheel = { 3420 event: false, 3421 lastScrollTime: (new window.Date()).getTime() 3422 }; 3423 function isEventSupported() { 3424 var eventName = 'onwheel'; 3425 var isSupported = eventName in document; 3426 3427 if (!isSupported) { 3428 var element = document.createElement('div'); 3429 element.setAttribute(eventName, 'return;'); 3430 isSupported = typeof element[eventName] === 'function'; 3431 } 3432 3433 if (!isSupported && 3434 document.implementation && 3435 document.implementation.hasFeature && 3436 // always returns true in newer browsers as per the standard. 3437 // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature 3438 document.implementation.hasFeature('', '') !== true ) { 3439 // This is the only way to test support for the `wheel` event in IE9+. 3440 isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); 3441 } 3442 3443 return isSupported; 3444 } 3445 /** 3446 * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is 3447 * complicated, thus this doc is long and (hopefully) detailed enough to answer 3448 * your questions. 3449 * 3450 * If you need to react to the mouse wheel in a predictable way, this code is 3451 * like your bestest friend. * hugs * 3452 * 3453 * As of today, there are 4 DOM event types you can listen to: 3454 * 3455 * 'wheel' -- Chrome(31+), FF(17+), IE(9+) 3456 * 'mousewheel' -- Chrome, IE(6+), Opera, Safari 3457 * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother! 3458 * 'DOMMouseScroll' -- FF(0.9.7+) since 2003 3459 * 3460 * So what to do? The is the best: 3461 * 3462 * normalizeWheel.getEventType(); 3463 * 3464 * In your event callback, use this code to get sane interpretation of the 3465 * deltas. This code will return an object with properties: 3466 * 3467 * spinX -- normalized spin speed (use for zoom) - x plane 3468 * spinY -- " - y plane 3469 * pixelX -- normalized distance (to pixels) - x plane 3470 * pixelY -- " - y plane 3471 * 3472 * Wheel values are provided by the browser assuming you are using the wheel to
3473 * scroll a web page by a number of lines or pixels (or pages). Values can vary 3474 * significantly on different platforms and browsers, forgetting that you can 3475 * scroll at different speeds. Some devices (like trackpads) emit more events 3476 * at smaller increments with fine granularity, and some emit massive jumps with 3477 * linear speed or acceleration. 3478 * 3479 * This code does its best to normalize the deltas for you: 3480 * 3481 * - spin is trying to normalize how far the wheel was spun (or trackpad 3482 * dragged). This is super useful for zoom support where you want to 3483 * throw away the chunky scroll steps on the PC and make those equal to 3484 * the slow and smooth tiny steps on the Mac. Key data: This code tries to 3485 * resolve a single slow step on a wheel to 1. 3486 * 3487 * - pixel is normalizing the desired scroll delta in pixel units. You'll 3488 * get the crazy differences between browsers, but at least it'll be in 3489 * pixels! 3490 * 3491 * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This 3492 * should translate to positive value zooming IN, negative zooming OUT. 3493 * This matches the newer 'wheel' event. 3494 * 3495 * Why are there spinX, spinY (or pixels)? 3496 * 3497 * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn 3498 * with a mouse. It results in side-scrolling in the browser by default. 3499 * 3500 * - spinY is what you expect -- it's the classic axis of a mouse wheel. 3501 * 3502 * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and 3503 * probably is by browsers in conjunction with fancy 3D controllers .. but 3504 * you know. 3505 * 3506 * Implementation info: 3507 * 3508 * Examples of 'wheel' event if you scroll slowly (down) by one step with an 3509 * average mouse: 3510 * 3511 * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120) 3512 * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12) 3513 * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A) 3514 * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120) 3515 * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120) 3516 * 3517 * On the trackpad: 3518 * 3519 * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6) 3520 * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A) 3521 * 3522 * On other/older browsers.. it's more complicated as there can be multiple and 3523 * also missing delta values. 3524 * 3525 * The 'wheel' event is more standard: 3526 * 3527 * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents 3528 * 3529 * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and 3530 * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain 3531 * backward compatibility with older events. Those other values help us 3532 * better normalize spin speed. Example of what the browsers provide: 3533 * 3534 * | event.wheelDelta | event.detail 3535 * ------------------+------------------+-------------- 3536 * Safari v5/OS X | -120 | 0 3537 * Safari v5/Win7 | -120 | 0 3538 * Chrome v17/OS X | -120 | 0 3539 * Chrome v17/Win7 | -120 | 0 3540 * IE9/Win7 | -120 | undefined 3541 * Firefox v4/OS X | undefined | 1 3542 * Firefox v4/Win7 | undefined | 3 3543 * 3544 */ 3545 function normalizeWheel( /*object*/ event ) /*object*/ { 3546 // Reasonable defaults 3547 var PIXEL_STEP = 10; 3548 var LINE_HEIGHT = 40; 3549 var PAGE_HEIGHT = 800; 3550 3551 var sX = 0, sY = 0, // spinX, spinY 3552 pX = 0, pY = 0; // pixelX, pixelY 3553 3554 // Legacy 3555 if( 'detail' in event ) { 3556 sY = event.detail; 3557 } 3558 if( 'wheelDelta' in event ) { 3559 sY = -event.wheelDelta / 120; 3560 } 3561 if( 'wheelDeltaY' in event ) { 3562 sY = -event.wheelDeltaY / 120; 3563 } 3564 if( 'wheelDeltaX' in event ) { 3565 sX = -event.wheelDeltaX / 120; 3566 } 3567 3568 // side scrolling on FF with DOMMouseScroll 3569 if( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) { 3570 sX = sY; 3571 sY = 0; 3572 } 3573 3574 pX = sX * PIXEL_STEP; 3575 pY = sY * PIXEL_STEP; 3576 3577 if( 'deltaY' in event ) { 3578 pY = event.deltaY; 3579 } 3580 if( 'deltaX' in event ) { 3581 pX = event.deltaX; 3582 } 3583 3584 if( (pX || pY) && event.deltaMode ) { 3585 if( event.deltaMode === 1 ) { // delta in LINE units 3586 pX *= LINE_HEIGHT; 3587 pY *= LINE_HEIGHT; 3588 } else { // delta in PAGE units 3589 pX *= PAGE_HEIGHT; 3590 pY *= PAGE_HEIGHT; 3591 } 3592 } 3593 3594 // Fall-back if spin cannot be determined 3595 if( pX && !sX ) { 3596 sX = (pX < 1) ? -1 : 1; 3597 } 3598 if( pY && !sY ) { 3599 sY = (pY < 1) ? -1 : 1; 3600 } 3601 3602 return { 3603 spinX: sX, 3604 spinY: sY, 3605 pixelX: pX, 3606 pixelY: pY 3607 }; 3608 } 3609 if (s.params.mousewheelControl) { 3610 /** 3611 * The best combination if you prefer spinX + spinY normalization. It favors 3612 * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with 3613 * 'wheel' event, making spin speed determination impossible. 3614 */ 3615 s.mousewheel.event = (navigator.userAgent.indexOf('firefox') > -1) ? 3616 'DOMMouseScroll' : 3617 isEventSupported() ? 3618 'wheel' : 'mousewheel'; 3619 } 3620 function handleMousewheel(e) { 3621 if (e.originalEvent) e = e.originalEvent; //jquery fix 3622 var delta = 0; 3623 var rtlFactor = s.rtl ? -1 : 1; 3624 3625 var data = normalizeWheel( e ); 3626 3627 if (s.params.mousewheelForceToAxis) { 3628 if (s.isHorizontal()) { 3629 if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor; 3630 else return; 3631 } 3632 else { 3633 if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY; 3634 else return; 3635 } 3636 } 3637 else { 3638 delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? - data.pixelX * rtlFactor : - data.pixelY; 3639 } 3640 3641 if (delta === 0) return; 3642 3643 if (s.params.mousewheelInvert) delta = -delta; 3644 3645 if (!s.params.freeMode) { 3646 if ((new window.Date()).getTime() - s.mousewheel.lastScrollTime > 60) { 3647 if (delta < 0) { 3648 if ((!s.isEnd || s.params.loop) && !s.animating) { 3649 s.slideNext(); 3650 s.emit('onScroll', s, e); 3651 } 3652 else if (s.params.mousewheelReleaseOnEdges) return true; 3653 } 3654 else {
3655 if ((!s.isBeginning || s.params.loop) && !s.animating) { 3656 s.slidePrev(); 3657 s.emit('onScroll', s, e); 3658 } 3659 else if (s.params.mousewheelReleaseOnEdges) return true; 3660 } 3661 } 3662 s.mousewheel.lastScrollTime = (new window.Date()).getTime(); 3663 3664 } 3665 else { 3666 //Freemode or scrollContainer: 3667 var position = s.getWrapperTranslate() + delta * s.params.mousewheelSensitivity; 3668 var wasBeginning = s.isBeginning, 3669 wasEnd = s.isEnd; 3670 3671 if (position >= s.minTranslate()) position = s.minTranslate(); 3672 if (position <= s.maxTranslate()) position = s.maxTranslate(); 3673 3674 s.setWrapperTransition(0); 3675 s.setWrapperTranslate(position); 3676 s.updateProgress(); 3677 s.updateActiveIndex(); 3678 3679 if (!wasBeginning && s.isBeginning || !wasEnd && s.isEnd) { 3680 s.updateClasses(); 3681 } 3682 3683 if (s.params.freeModeSticky) { 3684 clearTimeout(s.mousewheel.timeout); 3685 s.mousewheel.timeout = setTimeout(function () { 3686 s.slideReset(); 3687 }, 300); 3688 } 3689 else { 3690 if (s.params.lazyLoading && s.lazy) { 3691 s.lazy.load(); 3692 } 3693 } 3694 // Emit event 3695 s.emit('onScroll', s, e); 3696 3697 // Stop autoplay 3698 if (s.params.autoplay && s.params.autoplayDisableOnInteraction) s.stopAutoplay(); 3699 3700 // Return page scroll on edge positions 3701 if (position === 0 || position === s.maxTranslate()) return; 3702 } 3703 3704 if (e.preventDefault) e.preventDefault(); 3705 else e.returnValue = false; 3706 return false; 3707 } 3708 s.disableMousewheelControl = function () { 3709 if (!s.mousewheel.event) return false; 3710 var target = s.container; 3711 if (s.params.mousewheelEventsTarged !== 'container') { 3712 target = $(s.params.mousewheelEventsTarged); 3713 } 3714 target.off(s.mousewheel.event, handleMousewheel); 3715 s.params.mousewheelControl = false; 3716 return true; 3717 }; 3718 3719 s.enableMousewheelControl = function () { 3720 if (!s.mousewheel.event) return false; 3721 var target = s.container; 3722 if (s.params.mousewheelEventsTarged !== 'container') { 3723 target = $(s.params.mousewheelEventsTarged); 3724 } 3725 target.on(s.mousewheel.event, handleMousewheel); 3726 s.params.mousewheelControl = true; 3727 return true; 3728 }; 3729 3730 3731 /*========================= 3732 Parallax 3733 ===========================*/ 3734 function setParallaxTransform(el, progress) { 3735 el = $(el); 3736 var p, pX, pY; 3737 var rtlFactor = s.rtl ? -1 : 1; 3738 3739 p = el.attr('data-swiper-parallax') || '0'; 3740 pX = el.attr('data-swiper-parallax-x'); 3741 pY = el.attr('data-swiper-parallax-y'); 3742 if (pX || pY) { 3743 pX = pX || '0'; 3744 pY = pY || '0'; 3745 } 3746 else { 3747 if (s.isHorizontal()) { 3748 pX = p; 3749 pY = '0'; 3750 } 3751 else { 3752 pY = p; 3753 pX = '0'; 3754 } 3755 } 3756 3757 if ((pX).indexOf('%') >= 0) { 3758 pX = parseInt(pX, 10) * progress * rtlFactor + '%'; 3759 } 3760 else { 3761 pX = pX * progress * rtlFactor + 'px' ; 3762 } 3763 if ((pY).indexOf('%') >= 0) { 3764 pY = parseInt(pY, 10) * progress + '%'; 3765 } 3766 else { 3767 pY = pY * progress + 'px' ; 3768 } 3769 3770 el.transform('translate3d(' + pX + ', ' + pY + ',0px)'); 3771 } 3772 s.parallax = { 3773 setTranslate: function () { 3774 s.container.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ 3775 setParallaxTransform(this, s.progress); 3776 3777 }); 3778 s.slides.each(function () { 3779 var slide = $(this); 3780 slide.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function () { 3781 var progress = Math.min(Math.max(slide[0].progress, -1), 1); 3782 setParallaxTransform(this, progress); 3783 }); 3784 }); 3785 }, 3786 setTransition: function (duration) { 3787 if (typeof duration === 'undefined') duration = s.params.speed; 3788 s.container.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ 3789 var el = $(this); 3790 var parallaxDuration = parseInt(el.attr('data-swiper-parallax-duration'), 10) || duration; 3791 if (duration === 0) parallaxDuration = 0; 3792 el.transition(parallaxDuration); 3793 }); 3794 } 3795 }; 3796 3797 3798 /*========================= 3799 Zoom 3800 ===========================*/ 3801 s.zoom = { 3802 // "Global" Props 3803 scale: 1, 3804 currentScale: 1, 3805 isScaling: false, 3806 gesture: { 3807 slide: undefined, 3808 slideWidth: undefined, 3809 slideHeight: undefined, 3810 image: undefined, 3811 imageWrap: undefined, 3812 zoomMax: s.params.zoomMax 3813 }, 3814 image: { 3815 isTouched: undefined, 3816 isMoved: undefined, 3817 currentX: undefined, 3818 currentY: undefined, 3819 minX: undefined, 3820 minY: undefined, 3821 maxX: undefined, 3822 maxY: undefined, 3823 width: undefined, 3824 height: undefined, 3825 startX: undefined, 3826 startY: undefined, 3827 touchesStart: {}, 3828 touchesCurrent: {} 3829 }, 3830 velocity: { 3831 x: undefined, 3832 y: undefined, 3833 prevPositionX: undefined, 3834 prevPositionY: undefined, 3835 prevTime: undefined 3836 }, 3837 // Calc Scale From Multi-touches 3838 getDistanceBetweenTouches: function (e) { 3839 if (e.targetTouches.length < 2) return 1; 3840 var x1 = e.targetTouches[0].pageX, 3841 y1 = e.targetTouches[0].pageY, 3842 x2 = e.targetTouches[1].pageX, 3843 y2 = e.targetTouches[1].pageY; 3844 var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); 3845 return distance; 3846 }, 3847 // Events 3848 onGestureStart: function (e) { 3849 var z = s.zoom; 3850 if (!s.support.gestures) { 3851 if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { 3852 return; 3853 } 3854 z.gesture.scaleStart = z.getDistanceBetweenTouches(e); 3855 } 3856 if (!z.gesture.slide || !z.gesture.slide.length) { 3857 z.gesture.slide = $(this); 3858 if (z.gesture.slide.length === 0) z.gesture.slide = s.slides.eq(s.activeIndex); 3859 z.gesture.image = z.gesture.slide.find('img, svg, canvas'); 3860 z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); 3861 z.gesture.zoomMax = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax ; 3862 if (z.gesture.imageWrap.length === 0) { 3863 z.gesture.image = undefined; 3864 return; 3865 } 3866 } 3867 z.gesture.image.transition(0); 3868 z.isScaling = true; 3869 }, 3870 onGestureChange: function (e) { 3871 var z = s.zoom; 3872 if (!s.support.gestures) { 3873 if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { 3874 return; 3875 } 3876 z.gesture.scaleMove = z.getDistanceBetweenTouches(e); 3877 } 3878 if (!z.gesture.image || z.gesture.image.length === 0) return; 3879 if (s.support.gestures) { 3880 z.scale = e.scale * z.currentScale; 3881 } 3882 else { 3883 z.scale = (z.gesture.scaleMove / z.gesture.scaleStart) * z.currentScale; 3884 } 3885 if (z.scale > z.gesture.zoomMax) { 3886 z.scale = z.gesture.zoomMax - 1 + Math.pow((z.scale - z.gesture.zoomMax + 1), 0.5); 3887 } 3888 if (z.scale < s.params.zoomMin) { 3889 z.scale = s.params.zoomMin + 1 - Math.pow((s.params.zoomMin - z.scale + 1), 0.5); 3890 }
vendor: 8,727 bytes, lines 3891-4037
3891 z.gesture.image.transform('translate3d(0,0,0) scale(' + z.scale + ')'); 3892 }, 3893 onGestureEnd: function (e) { 3894 var z = s.zoom; 3895 if (!s.support.gestures) { 3896 if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2) { 3897 return; 3898 } 3899 } 3900 if (!z.gesture.image || z.gesture.image.length === 0) return; 3901 z.scale = Math.max(Math.min(z.scale, z.gesture.zoomMax), s.params.zoomMin); 3902 z.gesture.image.transition(s.params.speed).transform('translate3d(0,0,0) scale(' + z.scale + ')'); 3903 z.currentScale = z.scale; 3904 z.isScaling = false; 3905 if (z.scale === 1) z.gesture.slide = undefined; 3906 }, 3907 onTouchStart: function (s, e) { 3908 var z = s.zoom; 3909 if (!z.gesture.image || z.gesture.image.length === 0) return; 3910 if (z.image.isTouched) return; 3911 if (s.device.os === 'android') e.preventDefault(); 3912 z.image.isTouched = true; 3913 z.image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; 3914 z.image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; 3915 }, 3916 onTouchMove: function (e) { 3917 var z = s.zoom; 3918 if (!z.gesture.image || z.gesture.image.length === 0) return; 3919 s.allowClick = false; 3920 if (!z.image.isTouched || !z.gesture.slide) return; 3921 3922 if (!z.image.isMoved) { 3923 z.image.width = z.gesture.image[0].offsetWidth; 3924 z.image.height = z.gesture.image[0].offsetHeight; 3925 z.image.startX = s.getTranslate(z.gesture.imageWrap[0], 'x') || 0; 3926 z.image.startY = s.getTranslate(z.gesture.imageWrap[0], 'y') || 0; 3927 z.gesture.slideWidth = z.gesture.slide[0].offsetWidth; 3928 z.gesture.slideHeight = z.gesture.slide[0].offsetHeight; 3929 z.gesture.imageWrap.transition(0); 3930 if (s.rtl) z.image.startX = -z.image.startX; 3931 if (s.rtl) z.image.startY = -z.image.startY; 3932 } 3933 // Define if we need image drag 3934 var scaledWidth = z.image.width * z.scale; 3935 var scaledHeight = z.image.height * z.scale; 3936 3937 if (scaledWidth < z.gesture.slideWidth && scaledHeight < z.gesture.slideHeight) return; 3938 3939 z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); 3940 z.image.maxX = -z.image.minX; 3941 z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); 3942 z.image.maxY = -z.image.minY; 3943 3944 z.image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; 3945 z.image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; 3946 3947 if (!z.image.isMoved && !z.isScaling) { 3948 if (s.isHorizontal() && 3949 (Math.floor(z.image.minX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x < z.image.touchesStart.x) || 3950 (Math.floor(z.image.maxX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x > z.image.touchesStart.x) 3951 ) { 3952 z.image.isTouched = false; 3953 return; 3954 } 3955 else if (!s.isHorizontal() && 3956 (Math.floor(z.image.minY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y < z.image.touchesStart.y) || 3957 (Math.floor(z.image.maxY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y > z.image.touchesStart.y) 3958 ) { 3959 z.image.isTouched = false; 3960 return; 3961 } 3962 } 3963 e.preventDefault(); 3964 e.stopPropagation(); 3965 3966 z.image.isMoved = true; 3967 z.image.currentX = z.image.touchesCurrent.x - z.image.touchesStart.x + z.image.startX; 3968 z.image.currentY = z.image.touchesCurrent.y - z.image.touchesStart.y + z.image.startY; 3969 3970 if (z.image.currentX < z.image.minX) { 3971 z.image.currentX = z.image.minX + 1 - Math.pow((z.image.minX - z.image.currentX + 1), 0.8); 3972 } 3973 if (z.image.currentX > z.image.maxX) { 3974 z.image.currentX = z.image.maxX - 1 + Math.pow((z.image.currentX - z.image.maxX + 1), 0.8); 3975 } 3976 3977 if (z.image.currentY < z.image.minY) { 3978 z.image.currentY = z.image.minY + 1 - Math.pow((z.image.minY - z.image.currentY + 1), 0.8); 3979 } 3980 if (z.image.currentY > z.image.maxY) { 3981 z.image.currentY = z.image.maxY - 1 + Math.pow((z.image.currentY - z.image.maxY + 1), 0.8); 3982 } 3983 3984 //Velocity 3985 if (!z.velocity.prevPositionX) z.velocity.prevPositionX = z.image.touchesCurrent.x; 3986 if (!z.velocity.prevPositionY) z.velocity.prevPositionY = z.image.touchesCurrent.y; 3987 if (!z.velocity.prevTime) z.velocity.prevTime = Date.now(); 3988 z.velocity.x = (z.image.touchesCurrent.x - z.velocity.prevPositionX) / (Date.now() - z.velocity.prevTime) / 2; 3989 z.velocity.y = (z.image.touchesCurrent.y - z.velocity.prevPositionY) / (Date.now() - z.velocity.prevTime) / 2; 3990 if (Math.abs(z.image.touchesCurrent.x - z.velocity.prevPositionX) < 2) z.velocity.x = 0; 3991 if (Math.abs(z.image.touchesCurrent.y - z.velocity.prevPositionY) < 2) z.velocity.y = 0; 3992 z.velocity.prevPositionX = z.image.touchesCurrent.x; 3993 z.velocity.prevPositionY = z.image.touchesCurrent.y; 3994 z.velocity.prevTime = Date.now(); 3995 3996 z.gesture.imageWrap.transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); 3997 }, 3998 onTouchEnd: function (s, e) { 3999 var z = s.zoom; 4000 if (!z.gesture.image || z.gesture.image.length === 0) return; 4001 if (!z.image.isTouched || !z.image.isMoved) { 4002 z.image.isTouched = false; 4003 z.image.isMoved = false; 4004 return; 4005 } 4006 z.image.isTouched = false; 4007 z.image.isMoved = false; 4008 var momentumDurationX = 300; 4009 var momentumDurationY = 300; 4010 var momentumDistanceX = z.velocity.x * momentumDurationX; 4011 var newPositionX = z.image.currentX + momentumDistanceX; 4012 var momentumDistanceY = z.velocity.y * momentumDurationY; 4013 var newPositionY = z.image.currentY + momentumDistanceY; 4014 4015 //Fix duration 4016 if (z.velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - z.image.currentX) / z.velocity.x); 4017 if (z.velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - z.image.currentY) / z.velocity.y); 4018 var momentumDuration = Math.max(momentumDurationX, momentumDurationY); 4019 4020 z.image.currentX = newPositionX; 4021 z.image.currentY = newPositionY; 4022 4023 // Define if we need image drag 4024 var scaledWidth = z.image.width * z.scale; 4025 var scaledHeight = z.image.height * z.scale; 4026 z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); 4027 z.image.maxX = -z.image.minX; 4028 z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); 4029 z.image.maxY = -z.image.minY; 4030 z.image.currentX = Math.max(Math.min(z.image.currentX, z.image.maxX), z.image.minX); 4031 z.image.currentY = Math.max(Math.min(z.image.currentY, z.image.maxY), z.image.minY); 4032 4033 z.gesture.imageWrap.transition(momentumDuration).transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); 4034 }, 4035 onTransitionEnd: function (s) { 4036 var z = s.zoom; 4037 if (z.gesture.slide && s.previousIndex !== s.activeIndex) {
4038 z.gesture.image.transform('translate3d(0,0,0) scale(1)'); 4039 z.gesture.imageWrap.transform('translate3d(0,0,0)'); 4040 z.gesture.slide = z.gesture.image = z.gesture.imageWrap = undefined; 4041 z.scale = z.currentScale = 1; 4042 } 4043 }, 4044 // Toggle Zoom 4045 toggleZoom: function (s, e) { 4046 var z = s.zoom; 4047 if (!z.gesture.slide) { 4048 z.gesture.slide = s.clickedSlide ? $(s.clickedSlide) : s.slides.eq(s.activeIndex); 4049 z.gesture.image = z.gesture.slide.find('img, svg, canvas'); 4050 z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); 4051 } 4052 if (!z.gesture.image || z.gesture.image.length === 0) return; 4053 4054 var touchX, touchY, offsetX, offsetY, diffX, diffY, translateX, translateY, imageWidth, imageHeight, scaledWidth, scaledHeight, translateMinX, translateMinY, translateMaxX, translateMaxY, slideWidth, slideHeight; 4055 4056 if (typeof z.image.touchesStart.x === 'undefined' && e) { 4057 touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; 4058 touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; 4059 } 4060 else { 4061 touchX = z.image.touchesStart.x; 4062 touchY = z.image.touchesStart.y; 4063 } 4064 4065 if (z.scale && z.scale !== 1) { 4066 // Zoom Out 4067 z.scale = z.currentScale = 1; 4068 z.gesture.imageWrap.transition(300).transform('translate3d(0,0,0)'); 4069 z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(1)'); 4070 z.gesture.slide = undefined; 4071 } 4072 else { 4073 // Zoom In 4074 z.scale = z.currentScale = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax; 4075 if (e) { 4076 slideWidth = z.gesture.slide[0].offsetWidth; 4077 slideHeight = z.gesture.slide[0].offsetHeight; 4078 offsetX = z.gesture.slide.offset().left; 4079 offsetY = z.gesture.slide.offset().top; 4080 diffX = offsetX + slideWidth/2 - touchX; 4081 diffY = offsetY + slideHeight/2 - touchY; 4082 4083 imageWidth = z.gesture.image[0].offsetWidth; 4084 imageHeight = z.gesture.image[0].offsetHeight; 4085 scaledWidth = imageWidth * z.scale; 4086 scaledHeight = imageHeight * z.scale; 4087 4088 translateMinX = Math.min((slideWidth / 2 - scaledWidth / 2), 0); 4089 translateMinY = Math.min((slideHeight / 2 - scaledHeight / 2), 0); 4090 translateMaxX = -translateMinX; 4091 translateMaxY = -translateMinY; 4092 4093 translateX = diffX * z.scale; 4094 translateY = diffY * z.scale; 4095 4096 if (translateX < translateMinX) { 4097 translateX = translateMinX; 4098 } 4099 if (translateX > translateMaxX) { 4100 translateX = translateMaxX; 4101 } 4102 4103 if (translateY < translateMinY) { 4104 translateY = translateMinY; 4105 } 4106 if (translateY > translateMaxY) { 4107 translateY = translateMaxY; 4108 } 4109 } 4110 else { 4111 translateX = 0; 4112 translateY = 0; 4113 } 4114 z.gesture.imageWrap.transition(300).transform('translate3d(' + translateX + 'px, ' + translateY + 'px,0)'); 4115 z.gesture.image.transition(300).transform('translate3d(0,
41150,0) scale(' + z.scale + ')'); 4116 } 4117 }, 4118 // Attach/Detach Events 4119 attachEvents: function (detach) { 4120 var action = detach ? 'off' : 'on'; 4121 4122 if (s.params.zoom) { 4123 var target = s.slides; 4124 var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; 4125 // Scale image 4126 if (s.support.gestures) { 4127 s.slides[action]('gesturestart', s.zoom.onGestureStart, passiveListener); 4128 s.slides[action]('gesturechange', s.zoom.onGestureChange, passiveListener); 4129 s.slides[action]('gestureend', s.zoom.onGestureEnd, passiveListener); 4130 } 4131 else if (s.touchEvents.start === 'touchstart') { 4132 s.slides[action](s.touchEvents.start, s.zoom.onGestureStart, passiveListener); 4133 s.slides[action](s.touchEvents.move, s.zoom.onGestureChange, passiveListener); 4134 s.slides[action](s.touchEvents.end, s.zoom.onGestureEnd, passiveListener); 4135 } 4136 4137 // Move image 4138 s[action]('touchStart', s.zoom.onTouchStart); 4139 s.slides.each(function (index, slide){ 4140 if ($(slide).find('.' + s.params.zoomContainerClass).length > 0) { 4141 $(slide)[action](s.touchEvents.move, s.zoom.onTouchMove); 4142 } 4143 }); 4144 s[action]('touchEnd', s.zoom.onTouchEnd); 4145 4146 // Scale Out 4147 s[action]('transitionEnd', s.zoom.onTransitionEnd); 4148 if (s.params.zoomToggle) { 4149 s.on('doubleTap', s.zoom.toggleZoom); 4150 } 4151 } 4152 }, 4153 init: function () { 4154 s.zoom.attachEvents(); 4155 }, 4156 destroy: function () { 4157 s.zoom.attachEvents(true); 4158 } 4159 }; 4160 4161 4162 /*========================= 4163 Plugins API. Collect all and init all plugins 4164 ===========================*/ 4165 s._plugins = []; 4166 for (var plugin in s.plugins) { 4167 var p = s.plugins[plugin](s, s.params[plugin]); 4168 if (p) s._plugins.push(p); 4169 } 4170 // Method to call all plugins event/method 4171 s.callPlugins = function (eventName) { 4172 for (var i = 0; i < s._plugins.length; i++) { 4173 if (eventName in s._plugins[i]) { 4174 s._plugins[i][eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); 4175 } 4176 } 4177 }; 4178 4179 4180 /*========================= 4181 Events/Callbacks/Plugins Emitter 4182 ===========================*/ 4183 function normalizeEventName (eventName) { 4184 if (eventName.indexOf('on') !== 0) { 4185 if (eventName[0] !== eventName[0].toUpperCase()) { 4186 eventName = 'on' + eventName[0].toUpperCase() + eventName.substring(1); 4187 } 4188 else { 4189 eventName = 'on' + eventName; 4190 } 4191 } 4192 return eventName; 4193 } 4194 s.emitterEventListeners = { 4195 4196 }; 4197 s.emit = function (eventName) { 4198 // Trigger callbacks 4199 if (s.params[eventName]) { 4200 s.params[eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); 4201 } 4202 var i; 4203 // Trigger events 4204 if (s.emitterEventListeners[eventName]) { 4205 for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { 4206 s.emitterEventListeners[eventName][i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); 4207 } 4208 } 4209 // Trigger plugins 4210 if (s.callPlugins) s.callPlugins(eventName, arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); 4211 }; 4212 s.on = function (eventName, handler) { 4213 eventName = normalizeEventName(eventName); 4214 if (!s.emitterEventListeners[eventName]) s.emitterEventListeners[eventName] = []; 4215 s.emitterEventListeners[eventName].push(handler); 4216 return s; 4217 }; 4218 s.off = function (eventName, handler) { 4219 var i; 4220 eventName = normalizeEventName(eventName); 4221 if (typeof handler === 'undefined') { 4222 // Remove all handlers for such event 4223 s.emitterEventListeners[eventName] = []; 4224 return s; 4225 } 4226 if (!s.emitterEventListeners[eventName] || s.emitterEventListeners[eventName].length === 0) return; 4227 for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { 4228 if(s.emitterEventListeners[eventName][i] === handler) s.emitterEventListeners[eventName].splice(i, 1); 4229 } 4230 return s; 4231 }; 4232 s.once = function (eventName, handler) { 4233 eventName = normalizeEventName(eventName); 4234 var _handler = function () { 4235 handler(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); 4236 s.off(eventName, _handler); 4237 }; 4238 s.on(eventName, _handler); 4239 return s; 4240 }; 4241 4242 4243 // Accessibility tools 4244 s.a11y = { 4245 makeFocusable: function ($el) { 4246 $el.attr('tabIndex', '0'); 4247 return $el; 4248 }, 4249 addRole: function ($el, role) { 4250 $el.attr('role', role); 4251 return $el; 4252 }, 4253 4254 addLabel: function ($el, label) { 4255 $el.attr('aria-label', label); 4256 return $el; 4257 }, 4258 4259 disable: function ($el) { 4260 $el.attr('aria-disabled', true); 4261 return $el; 4262 }, 4263 4264 enable: function ($el) { 4265 $el.attr('aria-disabled', false); 4266 return $el; 4267 }, 4268 4269 onEnterKey: function (event) { 4270 if (event.keyCode !== 13) return; 4271 if ($(event.target).is(s.params.nextButton)) { 4272 s.onClickNext(event); 4273 if (s.isEnd) { 4274 s.a11y.notify(s.params.lastSlideMessage); 4275 } 4276 else { 4277 s.a11y.notify(s.params.nextSlideMessage); 4278 } 4279 } 4280 else if ($(event.target).is(s.params.prevButton)) { 4281 s.onClickPrev(event); 4282 if (s.isBeginning) { 4283 s.a11y.notify(s.params.firstSlideMessage); 4284 } 4285 else { 4286 s.a11y.notify(s.params.prevSlideMessage); 4287 } 4288 } 4289 if ($(event.target).is('.' + s.params.bulletClass)) { 4290 $(event.target)[0].click(); 4291 } 4292 }, 4293 4294 liveRegion: $('<span class="' + s.params.notificationClass + '" aria-live="assertive" aria-atomic="true"></span>'), 4295 4296 notify: function (message) { 4297 var notification = s.a11y.liveRegion; 4298 if (notification.length === 0) return; 4299 notification.html(''); 4300 notification.html(message); 4301 }, 4302 init: function () { 4303 // Setup accessibility 4304 if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { 4305 s.a11y.makeFocusable(s.nextButton); 4306 s.a11y.addRole(s.nextButton, 'button'); 4307 s.a11y.addLabel(s.nextButton, s.params.nextSlideMessage); 4308 } 4309 if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { 4310 s.a11y.makeFocusable(s.prevButton); 4311 s.a11y.addRole(s.prevButton, 'button'); 4312 s.a11y.addLabel(s.prevButton, s.params.prevSlideMessage); 4313 } 4314 4315 $(s.container).append(s.a11y.liveRegion); 4316 }, 4317 initPagination: function () { 4318 if (s.params.pagination && s.params.paginationClickable && s.bullets && s.bullets.length) { 4319 s.bullets.each(function () { 4320 var bullet = $(this); 4321 s.a11y.makeFocusable(bullet); 4322 s.a11y.addRole(bullet, 'button'); 4323 s.a11y.addLabel(bullet, s.params.paginationBulletMessage.replace(/{{index}}/, bullet.index() + 1)); 4324 }); 4325 } 4326 }, 4327 destroy: function () { 4328 if (s.a11y.liveRegion && s.a11y.liveRegion.length > 0) s.a11y.liveRegion.remove(); 4329 } 4330 }; 4331 4332 4333 /*========================= 4334 Init/Destroy 4335 ===========================*/ 4336 s.init = function () { 4337 if (s.params.loop) s.createLoop(); 4338 s.updateContainerSize(); 4339 s.updateSlidesSize(); 4340 s.updatePagination(); 4341 if (s.params.scrollbar && s.scrollbar) { 4342 s.scrollbar.set(); 4343 if (s.params.scrollbarDraggable) { 4344 s.scrollbar.enableDraggable(); 4345 } 4346 } 4347 if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { 4348 if (!s.params.loop) s.updateProgress(); 4349 s.effects[s.params.effect].setTranslate(); 4350 } 4351 if (s.params.loop) { 4352 s.slideTo(s.params.initialSlide + s.loopedSlides, 0, s.params.runCallbacksOnInit); 4353 } 4354 else { 4355 s.slideTo(s.params.initialSlide, 0, s.params.runCallbacksOnInit); 4356 if (s.params.initialSlide === 0) { 4357 if (s.parallax && s.params.parallax) s.parallax.setTranslate(); 4358 if (s.lazy && s.params.lazyLoading) { 4359 s.lazy.load(); 4360 s.lazy.initialImageLoaded = true; 4361 } 4362 } 4363 } 4364 s.attachEvents(); 4365 if (s.params.observer && s.support.observer) {
4366 s.initObservers(); 4367 } 4368 if (s.params.preloadImages && !s.params.lazyLoading) { 4369 s.preloadImages(); 4370 } 4371 if (s.params.zoom && s.zoom) { 4372 s.zoom.init(); 4373 } 4374 if (s.params.autoplay) { 4375 s.startAutoplay(); 4376 } 4377 if (s.params.keyboardControl) { 4378 if (s.enableKeyboardControl) s.enableKeyboardControl(); 4379 } 4380 if (s.params.mousewheelControl) { 4381 if (s.enableMousewheelControl) s.enableMousewheelControl(); 4382 } 4383 // Deprecated hashnavReplaceState changed to replaceState for use in hashnav and history 4384 if (s.params.hashnavReplaceState) { 4385 s.params.replaceState = s.params.hashnavReplaceState; 4386 } 4387 if (s.params.history) { 4388 if (s.history) s.history.init(); 4389 } 4390 if (s.params.hashnav) { 4391 if (s.hashnav) s.hashnav.init(); 4392 } 4393 if (s.params.a11y && s.a11y) s.a11y.init(); 4394 s.emit('onInit', s); 4395 }; 4396 4397 // Cleanup dynamic styles 4398 s.cleanupStyles = function () { 4399 // Container 4400 s.container.removeClass(s.classNames.join(' ')).removeAttr('style'); 4401 4402 // Wrapper 4403 s.wrapper.removeAttr('style'); 4404 4405 // Slides 4406 if (s.slides && s.slides.length) { 4407 s.slides 4408 .removeClass([ 4409 s.params.slideVisibleClass, 4410 s.params.slideActiveClass, 4411 s.params.slideNextClass, 4412 s.params.slidePrevClass 4413 ].join(' ')) 4414 .removeAttr('style') 4415 .removeAttr('data-swiper-column') 4416 .removeAttr('data-swiper-row'); 4417 } 4418 4419 // Pagination/Bullets 4420 if (s.paginationContainer && s.paginationContainer.length) { 4421 s.paginationContainer.removeClass(s.params.paginationHiddenClass); 4422 } 4423 if (s.bullets && s.bullets.length) { 4424 s.bullets.removeClass(s.params.bulletActiveClass); 4425 } 4426 4427 // Buttons 4428 if (s.params.prevButton) $(s.params.prevButton).removeClass(s.params.buttonDisabledClass); 4429 if (s.params.nextButton) $(s.params.nextButton).removeClass(s.params.buttonDisabledClass); 4430 4431 // Scrollbar 4432 if (s.params.scrollbar && s.scrollbar) { 4433 if (s.scrollbar.track && s.scrollbar.track.length) s.scrollbar.track.removeAttr('style'); 4434 if (s.scrollbar.drag && s.scrollbar.drag.length) s.scrollbar.drag.removeAttr('style'); 4435 } 4436 }; 4437 4438 // Destroy 4439 s.destroy = function (deleteInstance, cleanupStyles) { 4440 // Detach evebts 4441 s.detachEvents(); 4442 // Stop autoplay 4443 s.stopAutoplay(); 4444 // Disable draggable 4445 if (s.params.scrollbar && s.scrollbar) { 4446 if (s.params.scrollbarDraggable) { 4447 s.scrollbar.disableDraggable(); 4448 } 4449 } 4450 // Destroy loop 4451 if (s.params.loop) { 4452 s.destroyLoop(); 4453 } 4454 // Cleanup styles 4455 if (cleanupStyles) { 4456 s.cleanupStyles(); 4457 } 4458 // Disconnect observer 4459 s.disconnectObservers(); 4460 4461 // Destroy zoom 4462 if (s.params.zoom && s.zoom) { 4463 s.zoom.destroy(); 4464 } 4465 // Disable keyboard/mousewheel 4466 if (s.params.keyboardControl) { 4467 if (s.disableKeyboardControl) s.disableKeyboardControl(); 4468 } 4469 if (s.params.mousewheelControl) { 4470 if (s.disableMousewheelControl) s.disableMousewheelControl(); 4471 } 4472 // Disable a11y 4473 if (s.params.a11y && s.a11y) s.a11y.destroy(); 4474 // Delete history popstate 4475 if (s.params.history && !s.params.replaceState) { 4476 window.removeEventListener('popstate', s.history.setHistoryPopState); 4477 } 4478 if (s.params.hashnav && s.hashnav) { 4479 s.hashnav.destroy(); 4480 } 4481 // Destroy callback 4482 s.emit('onDestroy'); 4483 // Delete instance 4484 if (deleteInstance !== false) s = null; 4485 }; 4486 4487 s.init(); 4488 4489 4490 4491 // Return swiper instance 4492 return s; 4493 }; 4494 4495 4496 /*================================================== 4497 Prototype 4498 ====================================================*/ 4499 Swiper.prototype = { 4500 isSafari: (function () { 4501 var ua = window.navigator.userAgent.toLowerCase(); 4502 return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); 4503 })(),
4504 isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent), 4505 isArray: function (arr) { 4506 return Object.prototype.toString.apply(arr) === '[object Array]'; 4507 }, 4508 /*================================================== 4509 Browser 4510 ====================================================*/ 4511 browser: { 4512 ie: window.navigator.pointerEnabled || window.navigator.msPointerEnabled, 4513 ieTouch: (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 1) || (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 1), 4514 lteIE9: (function() { 4515 // create temporary DIV 4516 var div = document.createElement('div'); 4517 // add content to tmp DIV which is wrapped into the IE HTML conditional statement 4518 div.innerHTML = '<!--[if lte IE 9]><i></i><![endif]-->'; 4519 // return true / false value based on what will browser render 4520 return div.getElementsByTagName('i').length === 1; 4521 })() 4522 }, 4523 /*================================================== 4524 Devices 4525 ====================================================*/ 4526 device: (function () { 4527 var ua = window.navigator.userAgent; 4528 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); 4529 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); 4530 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); 4531 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); 4532 return { 4533 ios: ipad || iphone || ipod, 4534 android: android 4535 }; 4536 })(), 4537 /*================================================== 4538 Feature Detection 4539 ====================================================*/ 4540 support: { 4541 touch : (window.Modernizr && Modernizr.touch === true) || (function () { 4542 return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); 4543 })(), 4544 4545 transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () { 4546 var div = document.createElement('div').style; 4547 return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div); 4548 })(), 4549 4550 flexbox: (function () { 4551 var div = document.createElement('div').style; 4552 var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); 4553 for (var i = 0; i < styles.length; i++) { 4554 if (styles[i] in div) return true; 4555 } 4556 })(), 4557 4558 observer: (function () { 4559 return ('MutationObserver' in window || 'WebkitMutationObserver' in window); 4560 })(), 4561 4562 passiveListener: (function () { 4563 var supportsPassive = false; 4564 try { 4565 var opts = Object.defineProperty({}, 'passive', { 4566 get: function() { 4567 supportsPassive = true; 4568 } 4569 }); 4570 window.addEventListener('testPassiveListener', null, opts); 4571 } catch (e) {} 4572 return supportsPassive; 4573 })(), 4574 4575 gestures: (function () { 4576 return 'ongesturestart' in window; 4577 })() 4578 }, 4579 /*================================================== 4580 Plugins 4581 ====================================================*/ 4582 plugins: {} 4583 }; 4584 4585 4586 /*=========================== 4587 Dom7 Library 4588 ===========================*/ 4589 var Dom7 = (function () { 4590 var Dom7 = function (arr) { 4591 var _this = this, i = 0; 4592 // Create array-like object 4593 for (i = 0; i < arr.length; i++) { 4594 _this[i] = arr[i]; 4595 } 4596 _this.length = arr.length; 4597 // Return collection with methods 4598 return this; 4599 }; 4600 var $ = function (selector, context) { 4601 var arr = [], i = 0; 4602 if (selector && !context) { 4603 if (selector instanceof Dom7) { 4604 return selector; 4605 } 4606 } 4607 if (selector) { 4608 // String 4609 if (typeof selector === 'string') { 4610 var els, tempParent, html = selector.trim(); 4611 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { 4612 var toCreate = 'div'; 4613 if (html.indexOf('<li') === 0) toCreate = 'ul'; 4614 if (html.indexOf('<tr') === 0) toCreate = 'tbody'; 4615 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr'; 4616 if (html.indexOf('<tbody') === 0) toCreate = 'table'; 4617 if (html.indexOf('<option') === 0) toCreate = 'select'; 4618 tempParent = document.createElement(toCreate); 4619 tempParent.innerHTML = selector; 4620 for (i = 0; i < tempParent.childNodes.length; i++) { 4621 arr.push(tempParent.childNodes[i]); 4622 } 4623 } 4624 else { 4625 if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) { 4626 // Pure ID selector 4627 els = [document.getElementById(selector.split('#')[1])]; 4628 } 4629 else { 4630 // Other selectors 4631 els = (context || document).querySelectorAll(selector); 4632 } 4633 for (i = 0; i < els.length; i++) { 4634 if (els[i]) arr.push(els[i]); 4635 } 4636 } 4637 } 4638 // Node/element 4639 else if (selector.nodeType || selector === window || selector === document) { 4640 arr.push(selector); 4641 } 4642 //Array of elements or instance of Dom 4643 else if (selector.length > 0 && selector[0].nodeType) { 4644 for (i = 0; i < selector.length; i++) { 4645 arr.push(selector[i]); 4646 } 4647 } 4648 } 4649 return new Dom7(arr); 4650 }; 4651 Dom7.prototype = { 4652 // Classes and attriutes 4653 addClass: function (className) { 4654 if (typeof className === 'undefined') { 4655 return this; 4656 } 4657 var classes = className.split(' '); 4658 for (var i = 0; i < classes.length; i++) { 4659 for (var j = 0; j < this.length; j++) { 4660 this[j].classList.add(classes[i]); 4661 } 4662 } 4663 return this; 4664 }, 4665 removeClass: function (className) { 4666 var classes = className.split(' '); 4667 for (var i = 0; i < classes.length; i++) { 4668 for (var j = 0; j < this.length; j++) { 4669 this[j].classList.remove(classes[i]); 4670 } 4671 } 4672 return this; 4673 }, 4674 hasClass: function (className) { 4675 if (!this[0]) return false; 4676 else return this[0].classList.contains(className); 4677 }, 4678 toggleClass: function (className) { 4679 var classes = className.split(' '); 4680 for (var i = 0; i < classes.length; i++) { 4681 for (var j = 0; j < this.length; j++) { 4682 this[j].classList.toggle(classes[i]); 4683 } 4684 } 4685 return this; 4686 }, 4687 attr: function (attrs, value) { 4688 if (arguments.length === 1 && typeof attrs === 'string') { 4689 // Get attr 4690 if (this[0]) return this[0].getAttribute(attrs); 4691 else return undefined; 4692 } 4693 else { 4694 // Set attrs 4695 for (var i = 0; i < this.length; i++) { 4696 if (arguments.length === 2) { 4697 // String 4698 this[i].setAttribute(attrs, value); 4699 } 4700 else { 4701 // Object 4702 for (var attrName in attrs) { 4703 this[i][attrName] = attrs[attrName]; 4704 this[i].setAttribute(attrName, attrs[attrName]); 4705 } 4706 } 4707 } 4708 return this; 4709 } 4710 }, 4711 removeAttr: function (attr) { 4712 for (var i = 0; i < this.length; i++) { 4713 this[i].removeAttribute(attr); 4714 } 4715 return this; 4716 }, 4717 data: function (key, value) { 4718 if (typeof value === 'undefined') { 4719 // Get value 4720 if (this[0]) { 4721 var dataKey = this[0].getAttribute('data-' + key); 4722 if (dataKey) return dataKey; 4723 else if (this[0].dom7ElementDataStorage && (key in this[0].dom7ElementDataStorage)) return this[0].dom7ElementDataStorage[key]; 4724 else return undefined; 4725 } 4726 else return undefined; 4727 } 4728 else { 4729 // Set value 4730 for (var i = 0; i < this.length; i++) { 4731 var el = this[i]; 4732 if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {}; 4733 el.dom7ElementDataStorage[key] = value; 4734 } 4735 return this; 4736 } 4737 }, 4738 // Transforms 4739 transform : function (transform) { 4740 for (var i = 0; i < this.length; i++) { 4741 var elStyle = this[i].style; 4742 elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; 4743 } 4744 return this; 4745 }, 4746 transition: function (duration) { 4747 if (typeof duration !== 'string') { 4748 duration = duration + 'ms'; 4749 } 4750 for (var i = 0; i < this.length; i++) { 4751 var elStyle = this[i].style; 4752 elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; 4753 } 4754 return this; 4755 }, 4756 //Events 4757 on: function (eventName, targetSelector, listener, capture) { 4758 function handleLiveEvent(e) { 4759 var target = e.target; 4760 if ($(target).is(targetSelector)) listener.call(target, e); 4761 else { 4762 var parents = $(target).parents(); 4763 for (var k = 0; k < parents.length; k++) { 4764 if ($(parents[k]).is(targetSelector)) listener.call(parents[k], e); 4765 } 4766 } 4767 } 4768 var events = eventName.split(' '); 4769 var i, j; 4770 for (i = 0; i < this.length; i++) { 4771 if (typeof targetSelector === 'function' || targetSelector === false) { 4772 // Usual events 4773 if (typeof targetSelector === 'function') { 4774 listener = arguments[1]; 4775 capture = arguments[2] || false; 4776 } 4777 for (j = 0; j < events.length; j++) { 4778 this[i].addEventListener(events[j], listener, capture); 4779 } 4780 } 4781 else { 4782 //Live events 4783 for (j = 0; j < events.length; j++) { 4784 if (!this[i].dom7LiveListeners) this[i].dom7LiveListeners = []; 4785 this[i].dom7LiveListeners.push({listener: listener, liveListener: handleLiveEvent}); 4786 this[i].addEventListener(events[j], handleLiveEvent, capture); 4787 } 4788 } 4789 } 4790 4791 return this; 4792 }, 4793 off: function (eventName, targetSelector, listener, capture) { 4794 var events = eventName.split(' '); 4795 for (var i = 0; i < events.length; i++) { 4796 for (var j = 0; j < this.length; j++) { 4797 if (typeof targetSelector === 'function' || targetSelector === false) { 4798 // Usual events 4799 if (typeof targetSelector === 'function') { 4800 listener = arguments[1]; 4801 capture = arguments[2] || false; 4802 } 4803 this[j].removeEventListener(events[i], listener, capture); 4804 } 4805 else { 4806 // Live event 4807 if (this[j].dom7LiveListeners) { 4808 for (var k = 0; k < this[j].dom7LiveListeners.length; k++) { 4809 if (this[j].dom7LiveListeners[k].listener === listener) { 4810 this[j].removeEventListener(events[i], this[j].dom7LiveListeners[k].liveListener, capture); 4811 } 4812 } 4813 } 4814 } 4815 } 4816 } 4817 return this; 4818 }, 4819 once: function (eventName, targetSelector, listener, capture) { 4820 var dom = this; 4821 if (typeof targetSelector === 'function') { 4822 targetSelector = false; 4823 listener = arguments[1]; 4824 capture = arguments[2]; 4825 } 4826 function proxy(e) { 4827 listener(e); 4828 dom.off(eventName, targetSelector, proxy, capture); 4829 } 4830 dom.on(eventName, targetSelector, proxy, capture); 4831 }, 4832 trigger: function (eventName, eventData) { 4833 for (var i = 0; i < this.length; i++) { 4834 var evt; 4835 try { 4836 evt = new window.CustomEvent(eventName, {detail: eventData, bubbles: true, cancelable: true}); 4837 } 4838 catch (e) { 4839 evt = document.createEvent('Event'); 4840 evt.initEvent(eventName, true, true); 4841 evt.detail = eventData; 4842 } 4843 this[i].dispatchEvent(evt); 4844 } 4845 return this; 4846 }, 4847 transitionEnd: function (callback) {
4848 var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], 4849 i, j, dom = this; 4850 function fireCallBack(e) { 4851 /*jshint validthis:true */ 4852 if (e.target !== this) return; 4853 callback.call(this, e); 4854 for (i = 0; i < events.length; i++) { 4855 dom.off(events[i], fireCallBack); 4856 } 4857 } 4858 if (callback) { 4859 for (i = 0; i < events.length; i++) { 4860 dom.on(events[i], fireCallBack); 4861 } 4862 } 4863 return this; 4864 }, 4865 // Sizing/Styles 4866 width: function () { 4867 if (this[0] === window) { 4868 return window.innerWidth; 4869 } 4870 else { 4871 if (this.length > 0) { 4872 return parseFloat(this.css('width')); 4873 } 4874 else { 4875 return null; 4876 } 4877 } 4878 }, 4879 outerWidth: function (includeMargins) { 4880 if (this.length > 0) { 4881 if (includeMargins) 4882 return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); 4883 else 4884 return this[0].offsetWidth; 4885 } 4886 else return null; 4887 }, 4888 height: function () { 4889 if (this[0] === window) { 4890 return window.innerHeight; 4891 } 4892 else { 4893 if (this.length > 0) { 4894 return parseFloat(this.css('height')); 4895 } 4896 else { 4897 return null; 4898 } 4899 } 4900 }, 4901 outerHeight: function (includeMargins) { 4902 if (this.length > 0) { 4903 if (includeMargins) 4904 return this[0].offsetHeight + parseFloat(this.css('margin-top')) + parseFloat(this.css('margin-bottom')); 4905 else 4906 return this[0].offsetHeight; 4907 } 4908 else return null; 4909 }, 4910 offset: function () { 4911 if (this.length > 0) { 4912 var el = this[0]; 4913 var box = el.getBoundingClientRect(); 4914 var body = document.body; 4915 var clientTop = el.clientTop || body.clientTop || 0; 4916 var clientLeft = el.clientLeft || body.clientLeft || 0; 4917 var scrollTop = window.pageYOffset || el.scrollTop; 4918 var scrollLeft = window.pageXOffset || el.scrollLeft; 4919 return { 4920 top: box.top + scrollTop - clientTop, 4921 left: box.left + scrollLeft - clientLeft 4922 }; 4923 } 4924 else { 4925 return null; 4926 } 4927 }, 4928 css: function (props, value) { 4929 var i; 4930 if (arguments.length === 1) { 4931 if (typeof props === 'string') { 4932 if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); 4933 } 4934 else { 4935 for (i = 0; i < this.length; i++) { 4936 for (var prop in props) { 4937 this[i].style[prop] = props[prop]; 4938 } 4939 } 4940 return this; 4941 } 4942 } 4943 if (arguments.length === 2 && typeof props === 'string') { 4944 for (i = 0; i < this.length; i++) { 4945 this[i].style[props] = value; 4946 } 4947 return this; 4948 } 4949 return this; 4950 }, 4951 4952 //Dom manipulation 4953 each: function (callback) { 4954 for (var i = 0; i < this.length; i++) { 4955 callback.call(this[i], i, this[i]); 4956 } 4957 return this; 4958 }, 4959 html: function (html) { 4960 if (typeof html === 'undefined') { 4961 return this[0] ? this[0].innerHTML : undefined; 4962 } 4963 else { 4964 for (var i = 0; i < this.length; i++) { 4965 this[i].innerHTML = html; 4966 } 4967 return this; 4968 } 4969 }, 4970 text: function (text) { 4971 if (typeof text === 'undefined') { 4972 if (this[0]) { 4973 return this[0].textContent.trim(); 4974 } 4975 else return null; 4976 } 4977 else { 4978 for (var i = 0; i < this.length; i++) { 4979 this[i].textContent = text; 4980 } 4981 return this; 4982 } 4983 }, 4984 is: function (selector) { 4985 if (!this[0]) return false; 4986 var compareWith, i;
4987 if (typeof selector === 'string') { 4988 var el = this[0]; 4989 if (el === document) return selector === document; 4990 if (el === window) return selector === window; 4991 4992 if (el.matches) return el.matches(selector); 4993 else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); 4994 else if (el.mozMatchesSelector) return el.mozMatchesSelector(selector); 4995 else if (el.msMatchesSelector) return el.msMatchesSelector(selector); 4996 else { 4997 compareWith = $(selector); 4998 for (i = 0; i < compareWith.length; i++) { 4999 if (compareWith[i] === this[0]) return true; 5000 } 5001 return false; 5002 } 5003 } 5004 else if (selector === document) return this[0] === document; 5005 else if (selector === window) return this[0] === window; 5006 else { 5007 if (selector.nodeType || selector instanceof Dom7) { 5008 compareWith = selector.nodeType ? [selector] : selector; 5009 for (i = 0; i < compareWith.length; i++) { 5010 if (compareWith[i] === this[0]) return true; 5011 } 5012 return false; 5013 } 5014 return false; 5015 } 5016 5017 }, 5018 index: function () { 5019 if (this[0]) { 5020 var child = this[0]; 5021 var i = 0; 5022 while ((child = child.previousSibling) !== null) { 5023 if (child.nodeType === 1) i++; 5024 } 5025 return i; 5026 } 5027 else return undefined; 5028 }, 5029 eq: function (index) { 5030 if (typeof index === 'undefined') return this; 5031 var length = this.length; 5032 var returnIndex; 5033 if (index > length - 1) { 5034 return new Dom7([]); 5035 } 5036 if (index < 0) { 5037 returnIndex = length + index; 5038 if (returnIndex < 0) return new Dom7([]); 5039 else return new Dom7([this[returnIndex]]); 5040 } 5041 return new Dom7([this[index]]); 5042 }, 5043 append: function (newChild) { 5044 var i, j; 5045 for (i = 0; i < this.length; i++) { 5046 if (typeof newChild === 'string') { 5047 var tempDiv = document.createElement('div'); 5048 tempDiv.innerHTML = newChild; 5049 while (tempDiv.firstChild) { 5050 this[i].appendChild(tempDiv.firstChild); 5051 } 5052 } 5053 else if (newChild instanceof Dom7) { 5054 for (j = 0; j < newChild.length; j++) { 5055 this[i].appendChild(newChild[j]); 5056 } 5057 } 5058 else { 5059 this[i].appendChild(newChild); 5060 } 5061 } 5062 return this; 5063 }, 5064 prepend: function (newChild) { 5065 var i, j; 5066 for (i = 0; i < this.length; i++) { 5067 if (typeof newChild === 'string') { 5068 var tempDiv = document.createElement('div'); 5069 tempDiv.innerHTML = newChild; 5070 for (j = tempDiv.childNodes.length - 1; j >= 0; j--) { 5071 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); 5072 } 5073 // this[i].insertAdjacentHTML('afterbegin', newChild); 5074 } 5075 else if (newChild instanceof Dom7) { 5076 for (j = 0; j < newChild.length; j++) { 5077 this[i].insertBefore(newChild[j], this[i].childNodes[0]); 5078 } 5079 } 5080 else { 5081 this[i].insertBefore(newChild, this[i].childNodes[0]); 5082 } 5083 } 5084 return this; 5085 }, 5086 insertBefore: function (selector) { 5087 var before = $(selector); 5088 for (var i = 0; i < this.length; i++) { 5089 if (before.length === 1) { 5090 before[0].parentNode.insertBefore(this[i], before[0]); 5091 } 5092 else if (before.length > 1) { 5093 for (var j = 0; j < before.length; j++) { 5094 before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]); 5095 } 5096 } 5097 } 5098 }, 5099 insertAfter: function (selector) { 5100 var after = $(selector); 5101 for (var i = 0; i < this.length; i++) { 5102 if (after.length === 1) { 5103 after[0].parentNode.insertBefore(this[i], after[0].nextSibling); 5104 } 5105 else if (after.length > 1) { 5106 for (var j = 0; j < after.length; j++) { 5107 after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling); 5108 } 5109 } 5110 } 5111 }, 5112 next: function (selector) { 5113 if (this.length > 0) { 5114 if (selector) { 5115 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) return new Dom7([this[0].nextElementSibling]); 5116 else return new Dom7([]); 5117 } 5118 else { 5119 if (this[0].nextElementSibling) return new Dom7([this[0].nextElementSibling]); 5120 else return new Dom7([]); 5121 } 5122 } 5123 else return new Dom7([]); 5124 }, 5125 nextAll: function (selector) { 5126 var nextEls = []; 5127 var el = this[0]; 5128 if (!el) return new Dom7([]); 5129 while (el.nextElementSibling) { 5130 var next = el.nextElementSibling; 5131 if (selector) { 5132 if($(next).is(selector)) nextEls.push(next); 5133 } 5134 else nextEls.push(next); 5135 el = next; 5136 } 5137 return new Dom7(nextEls); 5138 }, 5139 prev: function (selector) { 5140 if (this.length > 0) { 5141 if (selector) { 5142 if (this[0].previousElementSibling && $(this[0].previousElementSibling).is(selector)) return new Dom7([this[0].previousElementSibling]); 5143 else return new Dom7([]); 5144 } 5145 else { 5146 if (this[0].previousElementSibling) return new Dom7([this[0].previousElementSibling]); 5147 else return new Dom7([]); 5148 } 5149 } 5150 else return new Dom7([]); 5151 }, 5152 prevAll: function (selector) { 5153 var prevEls = []; 5154 var el = this[0]; 5155 if (!el) return new Dom7([]); 5156 while (el.previousElementSibling) { 5157 var prev = el.previousElementSibling; 5158 if (selector) { 5159 if($(prev).is(selector)) prevEls.push(prev); 5160 } 5161 else prevEls.push(prev); 5162 el = prev; 5163 } 5164 return new Dom7(prevEls); 5165 }, 5166 parent: function (selector) { 5167 var parents = []; 5168 for (var i = 0; i < this.length; i++) { 5169 if (selector) { 5170 if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); 5171 } 5172 else { 5173 parents.push(this[i].parentNode); 5174 } 5175 } 5176 return $($.unique(parents)); 5177 }, 5178 parents: function (selector) { 5179 var parents = []; 5180 for (var i = 0; i < this.length; i++) { 5181 var parent = this[i].parentNode; 5182 while (parent) { 5183 if (selector) { 5184 if ($(parent).is(selector)) parents.push(parent); 5185 } 5186 else { 5187 parents.push(parent); 5188 } 5189 parent = parent.parentNode; 5190 } 5191 } 5192 return $($.unique(parents)); 5193 }, 5194 find : function (selector) { 5195 var foundElements = []; 5196 for (var i = 0; i < this.length; i++) { 5197 var found = this[i].querySelectorAll(selector); 5198 for (var j = 0; j < found.length; j++) { 5199 foundElements.push(found[j]); 5200 } 5201 } 5202 return new Dom7(foundElements); 5203 }, 5204 children: function (selector) { 5205 var children = []; 5206 for (var i = 0; i < this.length; i++) { 5207 var childNodes = this[i].childNodes; 5208 5209 for (var j = 0; j < childNodes.length; j++) { 5210 if (!selector) { 5211 if (childNodes[j].nodeType === 1) children.push(childNodes[j]); 5212 } 5213 else { 5214 if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) children.push(childNodes[j]); 5215 } 5216 } 5217 } 5218 return new Dom7($.unique(children)); 5219 }, 5220 remove: function () { 5221 for (var i = 0; i < this.length; i++) { 5222 if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); 5223 } 5224 return this; 5225 }, 5226 add: function () { 5227 var dom = this; 5228 var i, j; 5229 for (i = 0; i < arguments.length; i++) { 5230 var toAdd = $(arguments[i]); 5231 for (j = 0; j < toAdd.length; j++) { 5232 dom[dom.length] = toAdd[j];
5233 dom.length++; 5234 } 5235 } 5236 return dom; 5237 } 5238 }; 5239 $.fn = Dom7.prototype; 5240 $.unique = function (arr) { 5241 var unique = []; 5242 for (var i = 0; i < arr.length; i++) { 5243 if (unique.indexOf(arr[i]) === -1) unique.push(arr[i]); 5244 } 5245 return unique; 5246 }; 5247 5248 return $; 5249 })(); 5250 5251 5252 /*=========================== 5253 Get Dom libraries 5254 ===========================*/ 5255 var swiperDomPlugins = ['jQuery', 'Zepto', 'Dom7']; 5256 for (var i = 0; i < swiperDomPlugins.length; i++) { 5257 if (window[swiperDomPlugins[i]]) { 5258 addLibraryPlugin(window[swiperDomPlugins[i]]); 5259 } 5260 } 5261 // Required DOM Plugins 5262 var domLib; 5263 if (typeof Dom7 === 'undefined') { 5264 domLib = window.Dom7 || window.Zepto || window.jQuery; 5265 } 5266 else { 5267 domLib = Dom7; 5268 } 5269 5270 5271 /*=========================== 5272 Add .swiper plugin from Dom libraries 5273 ===========================*/ 5274 function addLibraryPlugin(lib) { 5275 lib.fn.swiper = function (params) { 5276 var firstInstance; 5277 lib(this).each(function () { 5278 var s = new Swiper(this, params); 5279 if (!firstInstance) firstInstance = s; 5280 }); 5281 return firstInstance; 5282 }; 5283 } 5284 5285 if (domLib) { 5286 if (!('transitionEnd' in domLib.fn)) { 5287 domLib.fn.transitionEnd = function (callback) { 5288 var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], 5289 i, j, dom = this; 5290 function fireCallBack(e) { 5291 /*jshint validthis:true */ 5292 if (e.target !== this) return; 5293 callback.call(this, e); 5294 for (i = 0; i < events.length; i++) { 5295 dom.off(events[i], fireCallBack); 5296 } 5297 } 5298 if (callback) { 5299 for (i = 0; i < events.length; i++) { 5300 dom.on(events[i], fireCallBack); 5301 } 5302 } 5303 return this; 5304 }; 5305 } 5306 if (!('transform' in domLib.fn)) { 5307 domLib.fn.transform = function (transform) { 5308 for (var i = 0; i < this.length; i++) { 5309 var elStyle = this[i].style; 5310 elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; 5311 } 5312 return this; 5313 }; 5314 } 5315 if (!('transition' in domLib.fn)) { 5316 domLib.fn.transition = function (duration) { 5317 if (typeof duration !== 'string') { 5318 duration = duration + 'ms'; 5319 } 5320 for (var i = 0; i < this.length; i++) { 5321 var elStyle = this[i].style; 5322 elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; 5323 } 5324 return this; 5325 }; 5326 } 5327 if (!('outerWidth' in domLib.fn)) { 5328 domLib.fn.outerWidth = function (includeMargins) { 5329 if (this.length > 0) { 5330 if (includeMargins) 5331 return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); 5332 else 5333 return this[0].offsetWidth; 5334 } 5335 else return null; 5336 }; 5337 } 5338 } 5339 5340 5341 window.Swiper = Swiper; 5342})(); 5343 5344/*=========================== 5345Swiper AMD Export 5346===========================*/ 5347if (typeof(module) !== 'undefined') 5348{ 5349 module.exports = window.Swiper; 5350} 5351else if (typeof define === 'function' && define.amd) { 5352 define([], function () { 5353 'use strict'; 5354 return window.Swiper; 5355 });
5356} 5357 5358//# sourceMappingURL=maps/swiper.js.map 5359 5360// init 5361var swiper = new Swiper('.silde_banner', { 5362 setWrapperSize:true, 5363 speed:1300, 5364 width: 1100, 5365 slidesPerView: 'auto', 5366 autoHeight:true, 5367 autoplay: 3000, 5368 loop:true, 5369 autoplayDisableOnInteraction:false, 5370 pagination: '.swiper-pagination', 5371 paginationClickable: true, 5372 nextButton: '.swiper-button-next', 5373 prevButton: '.swiper-button-prev' 5374}); 5375 5376$('.swiper-button-next').on('mouseover', function() { 5377 $('.swiper-button-next').animate({"margin-right":"-625px"}, 500, "swing", function(){ 5378 //$('.swiper-button-next').clearQueue(); 5379 }); 5380}); 5381$('.swiper-button-next').on('mouseout', function() { 5382 $('.swiper-button-next').animate({"margin-right":"-605px"}, 500, "swing", function(){ 5383 //$('.swiper-button-next').clearQueue(); 5384 }); 5385}); 5386 5387$('.swiper-button-prev').on('mouseover', function() { 5388 $('.swiper-button-prev').animate({"margin-left":"-625px"}, 500, "swing", function(){ 5389 //$('.swiper-button-prev').clearQueue(); 5390 }); 5391}); 5392$('.swiper-button-prev').on('mouseout', function() { 5393 $('.swiper-button-prev').animate({"margin-left":"-605px"}, 500, "swing", function(){ 5394 //$('.swiper-button-prev').clearQueue(); 5395 }); 5396}); 5397 5398swiper.on('slideChangeStart', function () { 5399 var currentSlide = swiper.activeIndex - (swiper.slides.length / 3) + 1; 5400 if(currentSlide >= 0){ 5401 if(currentSlide == (swiper.slides.length / 3 + 1)) currentSlide = 1; 5402 if(currentSlide == 0) currentSlide = swiper.slides.length / 3; 5403 //$("#banner_txt").attr("src", "image/main/banner" + currentSlide + "_txt.jpg"); 5404 $("#banner_txt").fadeOut(300, function(){ 5405 $(this).attr("src", "image/main/banner" + currentSlide + "_txt.jpg").fadeIn(300) 5406 }); 5407 var href_index = ["html/business/civil.asp", "html/business/building.asp", "html/business/house.asp", "html/business/plant.asp", "html/business/abroad.asp"]; 5408 $(".bannerbox_con a").attr("href", href_index[currentSlide - 1]); 5409 5410 } 5411 //console.log(currentSlide); 5412 5413 5414 5415 5416 5417});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.