UNPKG

3.19 kBJavaScriptView Raw
1import createShadow from '../../shared/create-shadow.js';
2import effectInit from '../../shared/effect-init.js';
3import effectTarget from '../../shared/effect-target.js';
4import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';
5export default function EffectFlip({
6 swiper,
7 extendParams,
8 on
9}) {
10 extendParams({
11 flipEffect: {
12 slideShadows: true,
13 limitRotation: true,
14 transformEl: null
15 }
16 });
17
18 const setTranslate = () => {
19 const {
20 slides,
21 rtlTranslate: rtl
22 } = swiper;
23 const params = swiper.params.flipEffect;
24
25 for (let i = 0; i < slides.length; i += 1) {
26 const $slideEl = slides.eq(i);
27 let progress = $slideEl[0].progress;
28
29 if (swiper.params.flipEffect.limitRotation) {
30 progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
31 }
32
33 const offset = $slideEl[0].swiperSlideOffset;
34 const rotate = -180 * progress;
35 let rotateY = rotate;
36 let rotateX = 0;
37 let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
38 let ty = 0;
39
40 if (!swiper.isHorizontal()) {
41 ty = tx;
42 tx = 0;
43 rotateX = -rotateY;
44 rotateY = 0;
45 } else if (rtl) {
46 rotateY = -rotateY;
47 }
48
49 $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
50
51 if (params.slideShadows) {
52 // Set shadows
53 let shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
54 let shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
55
56 if (shadowBefore.length === 0) {
57 shadowBefore = createShadow(params, $slideEl, swiper.isHorizontal() ? 'left' : 'top');
58 }
59
60 if (shadowAfter.length === 0) {
61 shadowAfter = createShadow(params, $slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
62 }
63
64 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
65 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
66 }
67
68 const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
69 const $targetEl = effectTarget(params, $slideEl);
70 $targetEl.transform(transform);
71 }
72 };
73
74 const setTransition = duration => {
75 const {
76 transformEl
77 } = swiper.params.flipEffect;
78 const $transitionElements = transformEl ? swiper.slides.find(transformEl) : swiper.slides;
79 $transitionElements.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
80 effectVirtualTransitionEnd({
81 swiper,
82 duration,
83 transformEl
84 });
85 };
86
87 effectInit({
88 effect: 'flip',
89 swiper,
90 on,
91 setTranslate,
92 setTransition,
93 perspective: () => true,
94 overwriteParams: () => ({
95 slidesPerView: 1,
96 slidesPerGroup: 1,
97 watchSlidesProgress: true,
98 spaceBetween: 0,
99 virtualTranslate: !swiper.params.cssMode
100 })
101 });
102}
\No newline at end of file