테스트 사이트 - 개발 중인 베타 버전입니다

Swiper, GSAP 작동 문제 채택완료

ㅅㅇ2 3년 전 조회 1,901

https://codepen.io/alexandrebuffet/pen/wYvEGK

 

이 효과를 적용하고 싶은데

 

Swiper

( <link rel="stylesheet"  href="https://unpkg.com/swiper@8/swiper-bundle.min.css"/>

<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>

)

 


GSAP 코드

(<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.10.4/gsap.min.js"></script>)

 

를 넣어도 작동하지 않습니다 어떻게 해야하나요?

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
들레아빠

css

</p>

<p><style></p>

<p>section {

  width: 100%;

  height: 100vh;

}

.swiper-container {

  width: 100%;

  height: 100%;

}

.slide {

  display: flex;

  justify-content: center;

  align-items: center;

  position: relative;

  text-align: center;

  font-size: 18px;

  background: #fff;

  overflow: hidden;

}

.slide-image {

  position: absolute;

  top: -200px;

  left: -200px;

  width: calc(100% + 400px);

  height: calc(100% + 400px);

  background-position: 50% 50%;

  background-size: cover;

}

.slide-title {

  font-size: 4rem;

  line-height: 1;

  max-width: 50%;

  white-space: normal;

  word-break: break-word;

  color: #fff;

  z-index: 100;

  font-family: 'Oswald', sans-serif;

  text-transform: uppercase;

  font-weight: normal;

}

@media (min-width: 45em) {

  .slide-title {

    font-size: 7vw;

    max-width: none;

  }

}

.slide-title span {

  white-space: pre;

  display: inline-block;

  opacity: 0;

}

.slideshow {

  position: relative;

}

.slideshow-pagination {

  position: absolute;

  bottom: 5rem;

  left: 0;

  width: 100%;

  display: flex;

  flex-wrap: wrap;

  justify-content: center;

  align-items: center;

  transition: 0.3s opacity;

  z-index: 10;

}

.slideshow-pagination-item {

  display: flex;

  align-items: center;

}

.slideshow-pagination-item .pagination-number {

  opacity: 0.5;

}

.slideshow-pagination-item:hover,

.slideshow-pagination-item:focus {

  cursor: pointer;

}

.slideshow-pagination-item:last-of-type .pagination-separator {

  width: 0;

}

.slideshow-pagination-item.active .pagination-number {

  opacity: 1;

}

.slideshow-pagination-item.active .pagination-separator {

  width: 10vw;

}

.slideshow-navigation-button {

  position: absolute;

  top: 0;

  display: flex;

  justify-content: center;

  align-items: center;

  height: 100%;

  width: 5rem;

  z-index: 1000;

  transition: all 0.3s ease;

  color: #fff;

}

.slideshow-navigation-button:hover,

.slideshow-navigation-button:focus {

  cursor: pointer;

  background: rgba(0,0,0,0.5);

}

.slideshow-navigation-button.prev {

  left: 0;

}

.slideshow-navigation-button.next {

  right: 0;

}

.pagination-number {

  font-size: 1.8rem;

  color: #fff;

  font-family: 'Oswald', sans-serif;

  padding: 0 0.5rem;

}

.pagination-separator {

  display: none;

  position: relative;

  width: 40px;

  height: 2px;

  background: rgba(255,255,255,0.25);

  transition: all 0.3s ease;

}

@media (min-width: 45em) {

  .pagination-separator {

    display: block;

  }

}

.pagination-separator-loader {

  position: absolute;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  background: #fff;

  transform-origin: 0 0;

}

</style></p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

들레아빠
3년 전
html
[code]
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/css/swiper.min.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/js/swiper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.0.2/TweenMax.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
<script>!function(e){"undefined"==typeof module?this.charming=e:module.exports=e}(function(e,n){"use strict";n=n||{};var t=n.tagName||"span",o=null!=n.classPrefix?n.classPrefix:"char",r=1,a=function(e){for(var n=e.parentNode,a=e.nodeValue,c=a.length,l=-1;++l<c;){var d=document.createElement(t);o&&(d.className=o+r,r++),d.appendChild(document.createTextNode(a[l])),n.insertBefore(d,e)}n.removeChild(e)};return function c(e){for(var n=[].slice.call(e.childNodes),t=n.length,o=-1;++o<t;)c(n[o]);e.nodeType===Node.TEXT_NODE&&a(e)}(e),e});</script>
<section>

<div class="swiper-container slideshow">

<div class="swiper-wrapper">

<div class="swiper-slide slide">
<div class="slide-image" style="background-image: url(https://images.unsplash.com/photo-1538083024336-555cf8943ddc?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=66b476a51b19889e13182c0e4827af18&auto=format&fit=crop&w=1950&q=80)"></div>
<span class="slide-title">Exotic places</span>
</div>

<div class="swiper-slide slide">
<div class="slide-image" style="background-image: url(https://images.unsplash.com/photo-1500375592092-40eb2168fd21?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=e07d2457879a4e15577ec75a31023e47&auto=format&fit=crop&w=2134&q=80"></div>
<span class="slide-title">Meet ocean</span>
</div>

<div class="swiper-slide slide">
<div class="slide-image" style="background-image: url(https://images.unsplash.com/photo-1482059470115-0aadd6bf6834?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=267bba9a4e280ec64388fe8fb01e9d1b&auto=format&fit=crop&w=1950&q=80"></div>
<span class="slide-title">Around the world</span>
</div>

<!-- <div class="swiper-slide slide">
<div class="slide-imageswiper-lazy" data-background="https://images.unsplash.com/photo-1538083024336-555cf8943ddc?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=66b476a51b19889e13182c0e4827af18&auto=format&fit=crop&w=1950&q=80">
</div>
</div>
<span class="slide-title">Exotic places</span>
</div>

<div class="swiper-slide slide">
<div class="slide-image swiper-lazy" data-background="https://images.unsplash.com/photo-1500375592092-40eb2168fd21?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=e07d2457879a4e15577ec75a31023e47&auto=format&fit=crop&w=2134&q=80">
</div>
<span class="slide-title">Meet ocean</span>
</div>

<div class="swiper-slide slide">
<div class="slide-image swiper-lazy" data-background="https://images.unsplash.com/photo-1482059470115-0aadd6bf6834?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=267bba9a4e280ec64388fe8fb01e9d1b&auto=format&fit=crop&w=1950&q=80">
</div>
<span class="slide-title">Around the world</span>
</div> -->

</div>

<div class="slideshow-pagination"></div>

<div class="slideshow-navigation">
<div class="slideshow-navigation-button prev"><span class="fas fa-chevron-left"></span></div>
<div class="slideshow-navigation-button next"><span class="fas fa-chevron-right"></span></div>
</div>

</div>

</section>
[/code]

댓글을 작성하려면 로그인이 필요합니다.

들레아빠

script

</p>

<p><script>

// The Slideshow class.

class Slideshow {

    constructor(el) {

        

        this.DOM = {el: el};

      

        this.config = {

          slideshow: {

            delay: 3000,

            pagination: {

              duration: 3,

            }

          }

        };

        

        // Set the slideshow

        this.init();

      

    }

    init() {

      

      var self = this;

      

      // Charmed title

      this.DOM.slideTitle = this.DOM.el.querySelectorAll('.slide-title');

      this.DOM.slideTitle.forEach((slideTitle) => {

        charming(slideTitle);

      });

      

      // Set the slider

      this.slideshow = new Swiper (this.DOM.el, {

          

          loop: true,

          autoplay: {

            delay: this.config.slideshow.delay,

            disableOnInteraction: false,

          },

          speed: 500,

          preloadImages: true,

          updateOnImagesReady: true,

          

          // lazy: true,

          // preloadImages: false,</p>

<p>          pagination: {

            el: '.slideshow-pagination',

            clickable: true,

            bulletClass: 'slideshow-pagination-item',

            bulletActiveClass: 'active',

            clickableClass: 'slideshow-pagination-clickable',

            modifierClass: 'slideshow-pagination-',

            renderBullet: function (index, className) {

              

              var slideIndex = index,

                  number = (index <= 8) ? '0' + (slideIndex + 1) : (slideIndex + 1);

              

              var paginationItem = '<span class="slideshow-pagination-item">';

              paginationItem += '<span class="pagination-number">' + number + '</span>';

              paginationItem = (index <= 8) ? paginationItem + '<span class="pagination-separator"><span class="pagination-separator-loader"></span></span>' : paginationItem;

              paginationItem += '</span>';

            

              return paginationItem;

              

            },

          },</p>

<p>          // Navigation arrows

          navigation: {

            nextEl: '.slideshow-navigation-button.next',

            prevEl: '.slideshow-navigation-button.prev',

          },</p>

<p>          // And if we need scrollbar

          scrollbar: {

            el: '.swiper-scrollbar',

          },

        

          on: {

            init: function() {

              self.animate('next');

            },

          }

        

        });

      

        // Init/Bind events.

        this.initEvents();

        

    }

    initEvents() {

        

        this.slideshow.on('paginationUpdate', (swiper, paginationEl) => this.animatePagination(swiper, paginationEl));

        //this.slideshow.on('paginationRender', (swiper, paginationEl) => this.animatePagination());</p>

<p>        this.slideshow.on('slideNextTransitionStart', () => this.animate('next'));

        

        this.slideshow.on('slidePrevTransitionStart', () => this.animate('prev'));

            

    }

    animate(direction = 'next') {

      

        // Get the active slide

        this.DOM.activeSlide = this.DOM.el.querySelector('.swiper-slide-active'),

        this.DOM.activeSlideImg = this.DOM.activeSlide.querySelector('.slide-image'),

        this.DOM.activeSlideTitle = this.DOM.activeSlide.querySelector('.slide-title'),

        this.DOM.activeSlideTitleLetters = this.DOM.activeSlideTitle.querySelectorAll('span');

      

        // Reverse if prev  

        this.DOM.activeSlideTitleLetters = direction === "next" ? this.DOM.activeSlideTitleLetters : [].slice.call(this.DOM.activeSlideTitleLetters).reverse();

      

        // Get old slide

        this.DOM.oldSlide = direction === "next" ? this.DOM.el.querySelector('.swiper-slide-prev') : this.DOM.el.querySelector('.swiper-slide-next');

        if (this.DOM.oldSlide) {

          // Get parts

          this.DOM.oldSlideTitle = this.DOM.oldSlide.querySelector('.slide-title'),

          this.DOM.oldSlideTitleLetters = this.DOM.oldSlideTitle.querySelectorAll('span'); 

          // Animate

          this.DOM.oldSlideTitleLetters.forEach((letter,pos) => {

            TweenMax.to(letter, .3, {

              ease: Quart.easeIn,

              delay: (this.DOM.oldSlideTitleLetters.length-pos-1)*.04,

              y: '50%',

              opacity: 0

            });

          });

        }

      

        // Animate title

        this.DOM.activeSlideTitleLetters.forEach((letter,pos) => {

          TweenMax.to(letter, .6, {

            ease: Back.easeOut,

            delay: pos*.05,

            startAt: {y: '50%', opacity: 0},

            y: '0%',

            opacity: 1

          });

        });

      

        // Animate background

        TweenMax.to(this.DOM.activeSlideImg, 1.5, {

            ease: Expo.easeOut,

            startAt: {x: direction === 'next' ? 200 : -200},

            x: 0,

        });

      

        //this.animatePagination()

    

    }

    animatePagination(swiper, paginationEl) {

            

      // Animate pagination

      this.DOM.paginationItemsLoader = paginationEl.querySelectorAll('.pagination-separator-loader');

      this.DOM.activePaginationItem = paginationEl.querySelector('.slideshow-pagination-item.active');

      this.DOM.activePaginationItemLoader = this.DOM.activePaginationItem.querySelector('.pagination-separator-loader');

      

      console.log(swiper.pagination);

      // console.log(swiper.activeIndex);

      

      // Reset and animate

        TweenMax.set(this.DOM.paginationItemsLoader, {scaleX: 0});

        TweenMax.to(this.DOM.activePaginationItemLoader, this.config.slideshow.pagination.duration, {

          startAt: {scaleX: 0},

          scaleX: 1,

        });

      

      

    }

    

}</p>

<p>const slideshow = new Slideshow(document.querySelector('.slideshow'));

</script></p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

ㅅㅇ2
3년 전
감사합니다! 해결했습니다!!
들레아빠
3년 전
수고 하셨습니다. 채택 감사드려요.

댓글을 작성하려면 로그인이 필요합니다.

세크티
3년 전
로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

ㅅㅇ2
3년 전
넣어봤는데 안되네요ㅜ
세크티
3년 전
작업중인 홈페이지 주소 있나요?

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인