123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- export default function Panorama({
- swiper,
- extendParams,
- on
- }) {
- extendParams({
- panorama: {
- depth: 200,
- rotate: 30,
- stretch: 1
- },
- });
- on('beforeInit', () => {
- if (swiper.params.effect !== 'panorama') return;
- swiper.classNames.push(`${swiper.params.containerModifierClass}panorama`);
- swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);
- const overwriteParams = {
- watchSlidesProgress: true,
- };
- Object.assign(swiper.params, overwriteParams);
- Object.assign(swiper.originalParams, overwriteParams);
- });
- on('progress', () => {
- if (swiper.params.effect !== 'panorama') return;
- const sizesGrid = swiper.slidesSizesGrid;
- const {
- depth = 200, rotate = 30, stretch = 1
- } = swiper.params.panorama;
- const angleRad = (rotate * Math.PI) / 180;
- const halfAngleRad = angleRad / 2;
- const angleModifier = 1 / (180 / rotate);
- for (let i = 0; i < swiper.slides.length; i += 1) {
- const slideEl = swiper.slides[i];
- const slideProgress = slideEl.progress;
- const slideSize = sizesGrid[i];
- const progressModifier = swiper.params.centeredSlides ?
- 0 :
- (swiper.params.slidesPerView - 1) * 0.5;
- const modifiedProgress = slideProgress + progressModifier;
- const angleCos = 1 - Math.cos(modifiedProgress * angleModifier * Math.PI);
- const translateX = `${modifiedProgress * (stretch * slideSize / 3) * angleCos}px`;
- const rotateY = modifiedProgress * rotate;
- const radius = (slideSize * 0.5) / Math.sin(halfAngleRad);
- const translateZ = `${radius * angleCos - depth}px`;
- slideEl.transform(
- `translateX(${translateX}) translateZ(${translateZ}) rotateY(${rotateY}deg)`);
- if (swiper.params.willChange) {
- slideEl.willChange("transform");
- }
- slideEl.addClass('swiper-slide-panorama')
- }
- });
- on('setTransition', (s, duration) => {
- if (swiper.params.effect !== 'panorama') return;
- swiper.slides.forEach((slideEl) => {
- slideEl.transition(duration);
- });
- });
- }
|