1 | import createShadow from '../../shared/create-shadow.js';
|
2 | import effectInit from '../../shared/effect-init.js';
|
3 | import effectTarget from '../../shared/effect-target.js';
|
4 | import effectVirtualTransitionEnd from '../../shared/effect-virtual-transition-end.js';
|
5 | export 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 |
|
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 |