안녕하세요

6월15일21일차 - slide-up page num, gage, play-pause btn 본문

프론트엔드 국비교육

6월15일21일차 - slide-up page num, gage, play-pause btn

sakuraop 2022. 6. 16. 00:00

[슬라이드 페이지 버튼, 이전과 다음 페이지, 재생과 정지 버튼, 페이지넘버 무한반복 구현]

[ html / css / js ]

 

슬라이드가 변함에 따라 페이지 넘버가 올라가는 모션을 추가합니다.

슬라이드 게이지를 구현합니다.

재생과 일시정지 버튼이 전환되어 나타나도록 구현합니다.

 

js는 코드가 복잡하지만 잘 살펴보면서 이해하는 재미가 있습니다.


Wrap은 overflow: hidden; 으로 스크롤 바를 없애는 역할을 할 수 있습니다.

id는 보통 가장 바깥쪽 박스에 부여합니다. 여기저기 사용하면 시스템에 부하를 많이 줍니다.

시안을 만들 때는 정보를 잘 전달할 수 있는 방법을 강구하는게 제일 우선됩니다.
디자인은 나중입니다.


html 가장 기본 형태입니다.
  <body>
    <div class="Wrap">
      <header id=" header">
        <div class="container">
          <h1>
            <a href="/">
              <img src="../img/logo.png" alt="" />
            </a>
          </h1>
          <nav class="gnb">
            <ul>
              <li><a href="">MENU01</a></li>
              <li><a href="">MENU02</a></li>
              <li><a href="">MENU03</a></li>
              <li><a href="">MENU04</a></li>
              <li><a href="">MENU05</a></li>
            </ul>
          </nav>
        </div>
      </header>
      <main id="main" role="main"></main>
      <footer id="footer"></footer>
    </div>
  </body>
 


높이를 특정하는 것은 좋은 방법이 아닙니다. 반응형이 되었을 때 레이아웃이 엉망이 됩니다.
배경을 차지하도록 할 때, absolute가 되었을 때를 제외하고는 높이를 주지 않습니다.
슬라이더 안에 들어갈 이미지에 높이를 주는 것이 한 예시입니다.
.main_slider figure {
  height: 600px;
}

   
silde를 만들 때 내용이 될 컨텐츠들은 figure안에 넣어 속성을 관리합니다.
.main_slider figure {
  height: 600px;
  background-repeat: no-repeat;
  background-position: center center;
  background-size: cover;
}
  
  
컬러에도 transition 적용이 가능합니다. 
.main_slider figure.slick-current h2 {
  color: #f00;
  transition: 2s;
}
  
  
슬라이드 초기화면에 afterChange를 적용하는 방법은 init afterChange 앞에 넣어주고 slick() 위로 올려주는 것입니다.
  $(".main_slider").on("init afterChange", function (e, s, c) {
    $(".main_slider figure.slick-current").addClass("on").siblings().removeClass("on");
  });


  ★★★★★
올라가는 슬라이드 번호를 구현합니다.
원리는 background(01, 02, 03 이 일렬로 배치된 이미지)가 무한히 자기 이미지를 반복한다는 속성을 이용합니다.
.main_visual .num {
  background-position-y: 0;
  background-image: url(../img/num.png);
}

css에서는 -로 인식하지만 js에 입력할 때에는 -대신에 대문자로 입력합니다.    
    $(".num").css({ background-position-y: -100 + "px" }); 이것은 js에서 오류가 생깁니다.
    $(".num").css({ backgroundPositionY: -100 + "px" }); 카멜케이스로 입력합니다.

배경의 높이(createNum)를 계속해서 높여줄 것입니다.
$(function () {
  var createNum = 0;

  $(".main_slider").on("init afterChange", function (e, s, c) {
    $(".main_slider figure.slick-current").addClass("on").siblings().removeClass("on");
    $(".num").css({ backgroundPositionY: -100 * createNum + "px" });
    $(".custom_dots li").eq(c).addClass("on").siblings().removeClass("on");
    createNum++;  
  });  
  
  

슬라이드 버튼을 커스텀 해봅니다. slide와 같은 레벨에 새로운 ul을 만들어 아이콘을 넣습니다.
          <ul class="custom_dots">
            <li><a href=""><i class="xi-bars"></i>Lorem, ipsum.</a></li>
            <li><a href=""><i class="xi-heart"></i>Lorem, ipsum dolor.</a></li>
            <li><a href=""><i class="xi-arrow-right"></i>Lorem.</a></li>
          </ul>
css 디자인을 한 뒤에, slick의 slickGoTo 펑션을 이용합니다. 
a 를 클릭했을 때 원하는 슬라이드로 이동시킵니다.
  $(".custom_dots a").on("click", function (e) {
    e.preventDefault();
    $(".main_slider").slick("slickGoTo",  >>>슬라이드 넘버(li의 index)가 될 int가 들어갑니다.<<< );
  });
  
jquery를 쓸 때는 let 보다는 var를 쓰는 것이 jquery의 장점을 살리는 방법입니다.
li의 index로 이동을 하도록 합니다.
index는 $(this).parent().index(); 로 찾을 수 있습니다.
  $(".custom_dots a").on("click", function (e) {
    e.preventDefault();
    var idx = $(this).parent().index();
    $(".main_slider").slick("slickGoTo", idx);
    $(".num").css({ backgroundPositionY: -100 * idx + "px" });
    createNum = idx;
  });
createNum == idx 를 주어서 03에서 01로 + 방향으로 되돌아가지 않고 - 방향으로 계속 갈 수 있도록 합니다.



슬라이드버튼에 게이지 효과를 추가합니다.
우선 새로고침을 했을 때도 적용이 되도록 eq(0)에 on 클래스를 부여합니다.
    $(".custom_dots li").eq(0).addClass("on");
    $(".custom_dots li").eq(c).addClass("on").siblings().removeClass("on");

.main_visual .custom_dots li {
  position: relative;
}
.main_visual .custom_dots li a {
  position: relative;
  display: block;
  padding: 10px;
}

가상요소선택자를 이용해 on 이 붙은 슬라이드(현재 슬라이드)에는 붉은 배경을 띄워줍니다.
.main_visual .custom_dots li::before {
  content: "";
  position: absolute;
  width: 0;
  height: 100%;
  background: #f00;
}

width에 transition을 적용하면 게이지가 차오릅니다.
.main_visual .custom_dots li.on::before {
  width: 100%;
  transition: 2s;
}
  
  

화살표 버튼을 커스텀하고 기능을 추가합니다.
이전 슬라이드 slickPrev, 다음 슬라이드 slickNext, 멈추기 slickPause, 재생하기 slickPlay 입니다.
$(".custom_arrow i:nth-child(1)").on("click", function () {
  $(".main_slider").slick("slickPrev");
});
$(".custom_arrow i:nth-child(2)").on("click", function () {
  $(".main_slider").slick("slickNext");
});
$(".custom_play i:nth-child(1)").on("click", function () {
  $(".main_slider").slick("slickPause");
});
$(".custom_play i:nth-child(2)").on("click", function () {
  $(".main_slider").slick("slickPlay");
});
  
    
슬라이드 넘버의 createNum은 계속 ++ 되기 때문에 쌓입니다. 

animation을 자연스럽게 하기 위해서 if문으로 일일이 이동 범위를 정해주어 자연스럽게 만들어 봤습니다.

    if (createNum % 3 == c) {
      createNum = createNum;
    } else if ((createNum % 3) - c == 1) {
      createNum--;
    } else if ((createNum % 3) - c == 2) {
      createNum++;
    } else if ((createNum % 3) - c == -2) {
      createNum = createNum + 2;
    } else {
      createNum++;
    }

 

 

재생 아이콘과 일시정지 아이콘이 전환되도록 합니다.

  $(".custom_play").on("click", function () {
    $(".custom_play i").toggleClass("on");
  });