ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS] Swiper.js ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ๋ฒ• (+๋ฐ˜์‘ํ˜•)
    Coding 2022. 11. 4. 16:58
    ๋ฐ˜์‘ํ˜•

    1. Get Started! Swiper.js ํ”„๋กœ์ ํŠธ์— ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ

    swiper.js๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ž ํ”„๋กœ์ ํŠธ ์–ธ์–ด๋‚˜ ๋ฐฉ์‹์— ๋งž๊ฒŒ ๋ฐ›์•„์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    NPM์œผ๋กœ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•

    $ npm install swiper

    ์ธ์Šคํ†จ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

    // import Swiper JS
    import Swiper from 'swiper';
    // import Swiper styles
    import 'swiper/css';

    ์ธ์Šคํ†จ ํ›„ ๊ธฐ๋ณธ import ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

     

    ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค๋งŒ ๊ณจ๋ผ์„œ import ํ•ด์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ „์ฒด๋ฅผ ๋ฐ›์•„์„œ ์“ฐ๋Š” ๊ฒŒ ๋งˆ์Œ์ด ํŽธํ•ด์„œ ๋”ฐ๋กœ ๋ฐ›์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

    ํ•„์š”ํ•˜์‹  ๋ถ„๋“ค์€ Swiper.js Get Started ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    CDN ์ฃผ์†Œ๋กœ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

    ๊ทธ๋ƒฅ ๋‚ด ํ”„๋กœ์ ํŠธ์— ์•„๋ž˜ cdn ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ ๋„ฃ์œผ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css"
    />
    
    <script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script>

    css๋„ ํ•„์ˆ˜๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ํŒŒ์ผ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ

    ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์„œ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ์ž…๋‹ˆ๋‹ค.

    https://www.jsdelivr.com/package/npm/swiper

     

    jsDelivr - A free, fast, and reliable CDN for Open Source

    Supports npm, GitHub, WordPress, Deno, and more. Largest network and best performance among all CDNs. Serving more than 80 billion requests per month. Built for production use.

    www.jsdelivr.com


    2. ๊ธฐ๋ณธ ์Šฌ๋ผ์ด๋“œ ๋งŒ๋“ค๊ธฐ

    <!-- ์Šฌ๋ผ์ด๋“œ ์ „์ฒด ๊ฐ์‹ธ๋Š” ์ปจํ…Œ์ด๋„ˆ -->
    <div class="swiper mySwiper">
      <!-- wrapper ์ถ”๊ฐ€ ํ•„์ˆ˜ -->
      <div class="swiper-wrapper">
        <!-- ์‹ค์ œ ์ด๋ฏธ์ง€๋‚˜ ์ปจํ…์ธ ๊ฐ€ ๋“ค์–ด๊ฐˆ slide๋“ค -->
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
        ...
      </div>
      <!-- pagination ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€ -->
      <div class="swiper-pagination"></div>
    
      <!-- navigation buttons ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€ -->
      <div class="swiper-button-prev"></div>
      <div class="swiper-button-next"></div>
    </div>
    
    <script>
      var swiper = new Swiper(".mySwiper", {
        // ์˜ต์…˜ ์‹œ์ž‘ ๋ถ€๋ถ„
        navigation: {
          nextEl: ".swiper-button-next",
          prevEl: ".swiper-button-prev",
        },
        pagination: {
          el: ".swiper-pagination",
        },
        // ์˜ต์…˜ ๋ ๋ถ€๋ถ„
      });
    </script>

    ๊ธฐ๋ณธ ์Šฌ๋ผ์ด๋“œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

    Swiper๋Š” ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋‚˜ ํ„ฐ์น˜๋กœ ์ขŒ์šฐ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

    navigation๊ณผ pagination ์ด ํ•„์š” ์—†์œผ๋ฉด ์˜ต์…˜ ๋ถ€๋ถ„์€ ์ง€์šฐ๊ณ  ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ํ•˜์ง€๋งŒ pagination์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ์— ์žˆ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

     

    ์˜ˆ์ œ)

     


    3. ์Šฌ๋ผ์ด๋“œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์Šคํฌ๋กค ๋ฐ” ๋งŒ๋“ค๊ธฐ

    ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณดํ†ต ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์Šคํฌ๋กค๋ฐ” ๋””์ž์ธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ ๊ผญ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด, ์Šคํฌ๋กค๋ฐ” ๋””์ž์ธ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ํ”„๋กœ์ ํŠธ์—์„œ Swiper js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋”ฐ๋กœ ์Šคํฌ๋กค๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    <div class="swiper mySwiper">
      <div class="swiper-wrapper">
        <div class="swiper-slide">
          <h4>Scroll Container</h4>
          <p>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. In luctus,
            ex eu sagittis faucibus, ligula ipsum sagittis magna, et imperdiet
            dolor lectus eu libero. Vestibulum venenatis eget turpis sed
            faucibus. Maecenas in ullamcorper orci, eu ullamcorper sem. Etiam
            elit ante, luctus non ante sit amet, sodales vulputate odio. Aenean
            tristique nisl tellus, sit amet fringilla nisl volutpat cursus.
            Quisque dignissim lectus ac nunc consectetur mattis. Proin vel
            hendrerit ipsum, et lobortis dolor. Vestibulum convallis, nibh et
            tincidunt tristique, nisl risus facilisis lectus, ut interdum orci
            nisl ac nunc. Cras et aliquam felis. Quisque vel ipsum at elit
            sodales posuere eget non est. Fusce convallis vestibulum dolor non
            volutpat. Vivamus vestibulum quam ut ultricies pretium.
          </p>
          <p>
            Suspendisse rhoncus fringilla nisl. Mauris eget lorem ac urna
            consectetur convallis non vel mi. Donec libero dolor, volutpat ut
            urna sit amet, aliquet molestie purus. Phasellus faucibus, leo vel
            scelerisque lobortis, ipsum leo sollicitudin metus, eget sagittis
            ante orci eu ipsum. Nulla ac mauris eu risus sagittis scelerisque
            iaculis bibendum mauris. Cras ut egestas orci. Cras odio risus,
            sagittis ut nunc vitae, aliquam consectetur purus. Vivamus ornare
            nunc vel tellus facilisis, quis dictum elit tincidunt. Donec
            accumsan nisi at laoreet sodales. Cras at ullamcorper massa.
            Maecenas at facilisis ex. Nam mollis dignissim purus id efficitur.
          </p>
          ...
        </div>
      </div>
      <div class="swiper-scrollbar"></div>
    </div>
        
    <script>
      var swiper = new Swiper(".mySwiper", {
        direction: "vertical",
        slidesPerView: "auto",
        freeMode: true,
        scrollbar: {
          el: ".swiper-scrollbar",
        },
        mousewheel: true,
      });
    </script>

    html ๊ตฌ์กฐ์™€ ํ•„์š”ํ•œ script ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

    ์˜ˆ์ œ)

    ๋ฐ์Šคํฌํ†ฑ์—์„œ mousewheel ๋„ ์ž˜ ๋˜๊ณ  ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํ„ฐ์น˜๋„ ์ž˜ ๋ฉ๋‹ˆ๋‹ค.

    mousewheel

    4. ๋ฐ˜์‘ํ˜• ์Šฌ๋ผ์ด๋“œ ์ ์šฉํ•˜๊ธฐ

    Swiper๋Š” ๋ฐ˜์‘ํ˜• ์›น์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

    mobile first๋กœ ์ ์šฉ๋˜๊ณ , breakpoints ๊ธฐ์ค€์„ px์ด๋‚˜ ๋น„์œจ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ์€ window ๋„“์ด๋กœ ๋ฐ˜์‘ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ container ์—˜๋ฆฌ๋จผํŠธ ๊ธฐ์ค€์œผ๋กœ๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (breakpointsBase ํŒŒ๋ผ๋ฏธํ„ฐ)

    <div class="swiper mySwiper">
      <div class="swiper-wrapper">
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
        <div class="swiper-slide">Slide 4</div>
        <div class="swiper-slide">Slide 5</div>
        <div class="swiper-slide">Slide 6</div>
        <div class="swiper-slide">Slide 7</div>
        <div class="swiper-slide">Slide 8</div>
        <div class="swiper-slide">Slide 9</div>
      </div>
      <div class="swiper-pagination"></div>
    </div>
    
    <script>
      var swiper = new Swiper(".mySwiper", {
      	// ๊ธฐ๋ณธ ์˜ต์…˜(parameters)
        // window ๋„“์ด 640px ๋ณด๋‹ค ์ž‘์„๋•Œ
        slidesPerView: 1,
        spaceBetween: 10,
        pagination: {
          el: ".swiper-pagination",
          clickable: true,
        },
        // ๋ฐ˜์‘ํ˜• breakpoints : px ๊ธฐ์ค€
        breakpoints: {
          // window ๋„“์ด 640px ~ 767px
          640: {
            slidesPerView: 2,
            spaceBetween: 20,
          },
          // window ๋„“์ด 768px ~ 1023px
          768: {
            slidesPerView: 4,
            spaceBetween: 40,
          },
          // window ๋„“์ด 1024px ~
          1024: {
            slidesPerView: 5,
            spaceBetween: 50,
          },
        },
        
    	// using "ratio" endpoints : ํ™”๋ฉด ๋น„์œจ ๊ธฐ์ค€
        breakpoints: {
            '@0.75': {
              slidesPerView: 2,
              spaceBetween: 20,
            },
            '@1.00': {
              slidesPerView: 3,
              spaceBetween: 40,
            },
            '@1.50': {
              slidesPerView: 4,
              spaceBetween: 50,
            },
        }
        
        // breakpoints ๊ธฐ์ค€์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜
        breakpointsBase: 'window'
      });
    </script>

    ์˜ˆ์ œ)


    5. ๊ทธ ์™ธ ์ž์ฃผ ์“ฐ๋Š” ์˜ต์…˜(Parameter) ์ •๋ฆฌ

    Parameters Type Default Description
    initialSlide number 0 0๋ฒˆ์ด ์ฒซ๋ฒˆ์งธ ์Šฌ๋ผ์ด๋“œ.
    ๊ทธ ์™ธ ์ˆซ์ž๋กœ ์„ค์ •์‹œ ํ•ด๋‹น ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์ œ์ผ ๋จผ์ € ๋ณด์ž…๋‹ˆ๋‹ค.
    loop boolean false true ๋กœ ์„ค์ •์‹œ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๊ณ„์† ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.
    slidesPerGroup number 1 ์„ค์ •ํ•œ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋Œ€๋กœ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์—ฌ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
    slidesPerView number | 'auto' 1 ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๋ช‡๊ฐœ ๋ณด์ด๊ฒŒ ํ• ์ง€ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    spaceBetween number 0 ์Šฌ๋ผ์ด๋“œ ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1 = 1px
    speed number 300 ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ์†๋„
    autoplay boolean | AutoplayOptions Description ์ฐธ๊ณ  ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์„ค์ •
    {
    delay: number(3000),
    disableOnInteraction: boolean(true),
    pauseOnMouseEnter: boolean(false),
    ...
    }
    delay : ๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๋„˜์–ด๊ฐ€๊ธฐ ์ „๊นŒ์ง€์˜ ์‹œ๊ฐ„
    disableOnInteraction: ์‚ฌ์šฉ์ž๊ฐ€ ์Šฌ๋ผ์ด๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๊ณ  ๋‚œ ํ›„, autoplay๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ• ์ง€ ์—ฌ๋ถ€
    pauseOnMouseEnter: ์Šฌ๋ผ์ด๋“œ์— ๋งˆ์šฐ์Šค ์˜ค๋ฒ„์‹œ autoplay ์ผ์‹œ์ •์ง€ ์—ฌ๋ถ€
    effect 'slide' | 'fade' | .. 'slide' ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ํšจ๊ณผ
    centeredSlides boolean false index ์Šฌ๋ผ์ด๋“œ๊ฐ€ ๊ฐ€์šด๋ฐ ๋ณด์ด๋„๋ก ์„ค์ •

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

JJung-e Tistory.