Day4 - wjddnjswjd12/fe-w3-shopping GitHub Wiki

์˜ค๋Š˜ ๊ทธ๋ฃน ํ”ผ์–ด์„ธ์…˜์—์„œ ๋ฉค๋ฒ„๋ถ„๋“ค์ด transitionend๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ์…”์„œ...!
์ „์— ๋งŒ๋“ค์–ด๋‘” ์•ผ๋งค ์บ๋กœ์…€์„ ์‹น ๊ฐˆ์•„์—Ž๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค..ใ… ใ… 
๋„์ €ํžˆ ๊ฐ์ด ์•ˆ์žกํ˜€์„œ ๋”ฐ๋กœ ์—ฐ์Šต์šฉ์œผ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•ด๋ดค์Šต๋‹ˆ๋‹น...

Carousel ๊ตฌํ˜„๋กœ์ง

์šฐ์„  html ์ฝ”๋“œ์™€ css๋Š” ์ด๋Ÿฐ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค:

HTML์ฝ”๋“œ :

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Transition Practice</title>
    <link rel="stylesheet" href="./style.css" />
  </head>
  <body>
    <div class="slide_box">
      <div class="slide_list">
        <div id="lastClone" class="slide_item">5</div>
        <div class="slide_item">1</div>
        <div class="slide_item">2</div>
        <div class="slide_item">3</div>
        <div class="slide_item">4</div>
        <div class="slide_item">5</div>
        <div id="firstClone" class="slide_item">1</div>
      </div>
    </div>
    <button class="prevBtn">prev</button>
    <button class="nextBtn">next</button>
    <script src="transition.js"></script>
  </body>
</html>

CSS ์ฝ”๋“œ:

.slide_box {
  margin: 500px 0 0 700px;
  border: rgb(255, 14, 135) 3px dotted;
  width: 100px;
  height: 100px;
  /* overflow: hidden; */
}

.slide_item {
  background-color: rgb(255, 215, 187);
  width: 100px;
  height: 100px;
  text-align: center;
  line-height: 100px;
  font-size: larger;
  border: rgb(165, 165, 165) 0.5px solid;
}
.slide_list {
  width: 900px;
  display: flex;
  height: 100px;
}

button {
  margin-left: 610px;
}

image

์—ฐ์Šต์šฉ์ด๋ผ css๋ฅผ ๋Œ€์ถฉ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค..๐Ÿ˜‚
์ผ๋‹จ slide_box์— overflow:hidden์„ ์ฃผ์ง€ ์•Š๊ณ  ์ง„ํ–‰์ด ์–ด๋–ป๊ฒŒ๋˜๋‚˜ ํ™•์ธํ•˜๋ฉด์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

overflow:hidden์„ ์ฃผ๋ฉด,

image

์ด๋ ‡๊ฒŒ slide_box์œ„์น˜๋งŒ ๋˜ฎ! ํ•˜๊ณ  ๋ณด์ž…๋‹ˆ๋‹ค..!!

์˜๋ฌธ์ : ์™œ 5๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‚˜. 1, 2, 3, 4, 5 ์ด๋ ‡๊ฒŒ ์ง„ํ–‰๋˜๋Š”๋ฐ???

transition์„ ์ค„ ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์ธ 5๋ฒˆ์„ ์•ž์— ์ถ”๊ฐ€ํ•˜๊ณ ,
๋งจ ์•ž์˜ 1๋ฒˆ ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋งจ ๋’ค์— ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜์ค‘์— javascript ์ฝ”๋“œ ์„ค๋ช…๋•Œ ๋” ์‰ฝ๊ฒŒ ์•Œ์ˆ˜์žˆ์ง€๋งŒ,
translateX()๋กœ ํ•œ ์Šฌ๋ผ์ด๋“œ ํฌ๊ธฐ๋‹น ์›€์ง์ด๋‹ค๊ฐ€, ๋งˆ์ง€๋ง‰ 5๋ฒˆ ์Šฌ๋ผ์ด๋“œ์— ๋‹ค๋‹ค๋ฅด๋ฉด
๋‹ค์‹œ ๋งจ ์•ž์œผ๋กœ ์ด๋™์‹œ์ผœ์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ์˜†์œผ๋กœ ๋„˜๊ธฐ๋Š”๊ฑฐ๋ณด๋‹ค ์Šˆ๋ฃจ๋ฃฉ ํ•˜๊ณ  ์•ž์œผ๋กœ ์ด๋™ํ•˜๋Š”?๋Š๋‚Œ์ด ๋“ค์–ด์„œ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜ ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฐธ๊ณ ํ•œ ๋™์˜์ƒ์„ ๋ณด๋‹ˆ ์ €๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰์Šฌ๋ผ์ด๋“œ์™€ ์ฒซ๋ฒˆ์งธ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋์— ์ถ”๊ฐ€ํ•˜๊ณ  js์ฝ”๋“œ๋กœ ์–ด์ฐŒ์–ด์ฐŒ ์„ค์ •์„ ํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋„˜์–ด๊ฐ€๊ฒŒ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ js์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

const carouselSlide = document.querySelector(".slide_list");
const carouselContents = document.querySelectorAll(".slide_item");

const prevBtn = document.querySelector(".prevBtn");
const nextBtn = document.querySelector(".nextBtn");

//counter
let counter = 1;
const size = carouselContents[0].clientWidth;

carouselSlide.style.transform = "translateX(" + -size * counter + "px)";

์ผ๋‹จ document.querySelector์„ ์‚ฌ์šฉํ•˜์—ฌ js์ฝ”๋“œ ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ ,

๋ช‡๋ฒˆ์งธ slide์— ์™€์žˆ๋Š”์ง€๋ฅผ(index๊ฐœ๋…) ์•Œ์ˆ˜์žˆ๋„๋ก counter์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

counter์— 1์„ ์ค€ ์ด์œ ๋Š” html๊ตฌ์กฐ์ƒ 5->1->2->3->4->5->1 ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ๊ธฐ์—, carouselSlide.style.transform = "translateX(" + -size * counter + "px)"; ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์™ผ์ชฝ์œผ๋กœ ์Šฌ๋ผ์ด๋“œ width๋งŒํผ ์‚ฌ์ „์— ๋จผ์ € ์›€์ง์—ฌ์ค๋‹ˆ๋‹ค.

image

๊ทธ๋Ÿผ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

//Button Listeners
nextBtn.addEventListener("click", () => {
  if (counter >= carouselContents.length - 1) return;
  carouselSlide.style.transition = "transform 0.3s ease-in-out";
  counter++;
  carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
});

prevBtn.addEventListener("click", () => {
  if (counter <= 0) return;
  carouselSlide.style.transition = "transform 0.3s ease-in-out";
  counter--;
  carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
});
console.log(carouselContents.length);

์ด์ „ ๋ฒ„ํŠผ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๋ฒ„ํŠผ์— ํด๋ฆญ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ์•„์ฃผ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. if (counter >= carouselContents.length - 1) return; ์ด ์ฝ”๋“œ์™€ if (counter <= 0) return; ์ด ์ฝ”๋“œ๋ฅผ ๋‹ฌ๊ฒŒ๋œ ์ด์œ ๋Š” ๋‚˜์ค‘์— ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

(-size*counter) ๋งŒํผ์ด ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

carouselSlide.addEventListener("transitionend", function () {
  if (carouselContents[counter].id === "lastClone") {
    carouselSlide.style.transition = "none";
    counter = carouselContents.length - 2;
    carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
  }
  if (carouselContents[counter].id === "firstClone") {
    carouselSlide.style.transition = "none";
    counter = carouselContents.length - counter;
    carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
  }
});

์š”๊ธฐ๊ฐ€ ๋Œ€๋ง์˜ transitionend๋ฅผ ์จ๋ณธ ์ฝ”๋“œ์ธ๋ฐ...

if (carouselContents[counter].id === "lastClone") ์ด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š”, ์•„๊นŒ ์œ„์˜ html์—์„œ querySelectorAll๋กœ ๋ถˆ๋Ÿฌ์˜จ ์Šฌ๋ผ์ด๋“œ ๋…ธ๋“œ๋ฆฌ์ŠคํŠธ๋“ค์ด
carouselContents๋ณ€์ˆ˜ ์•ˆ์— ํ•˜๋‚˜์”ฉ ๋‹ด๊ฒจ์žˆ๊ณ , ๊ทธ๊ฑธ index๋กœ ์ ‘๊ทผํ•œ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์† ์ด์ „ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋‹ค๊ฐ€

counter์ด 0์ด ๋˜์–ด์„œ ๋งจ ์•ž์— ์ถ”๊ฐ€ํ•ด๋‘” <div id="lastClone" class="slide_item">5</div>์— ๋„๋‹ฌํ•˜๋ฉด,

carouselSlide.style.transition="none";์„ ์„ค์ •ํ•ด์„œ ์›€์ง์—ฌ๋„ ์•„๋ฌด๋Ÿฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๊ฐ€ ์—†๋„๋ก ์„ค์ •ํ•˜๊ณ 

counter=carouselContents.length - 2;๋ฅผ ์ ์šฉํ•˜๊ณ 

carouselSlide.style.transform = "translateX(" + -size * counter + "px)"; ๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ image

์ด ์œ„์น˜๋กœ ์•„๋ฌด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด ์ด๋™ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ๋น„์Šทํ•œ ๋กœ์ง์œผ๋กœ ๋‹ค์Œ๋ฒ„ํŠผ์„ ๊ณ„์† ๋ˆ„๋ฅด๋‹ค๊ฐ€ counter์ด ๋งˆ์ง€๋ง‰ slide์˜ ์ธ๋ฑ์Šค์™€ ๊ฐ™๊ฒŒ๋˜๋ฉด

counter = carouselContents.length - counter;
carouselSlide.style.transform = "translateX(" + -size * counter + "px)";

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์„œ

image

์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ค๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.
counter = carouselContents.length - counter;

์ด๊ฑฐ ๋ง๊ณ  ๊ทธ๋ƒฅ counter=1; ์ด๋ผ๊ณ  ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.

car1

์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํƒœ์—์„œ overflow:hidden์„ ์ฃผ๋ฉด

car2

์š”๋กœ์ฝ”๋กฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!!!!

์•„๊นŒ ์„ค๋ช…ํ•˜๋ ค๋˜ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ์ชฝ ์ฝ”๋“œ

//Button Listeners
nextBtn.addEventListener("click", () => {
  if (counter >= carouselContents.length - 1) return;
  carouselSlide.style.transition = "transform 0.3s ease-in-out";
  counter++;
  carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
});

prevBtn.addEventListener("click", () => {
  if (counter <= 0) return;
  carouselSlide.style.transition = "transform 0.3s ease-in-out";
  counter--;
  carouselSlide.style.transform = "translateX(" + -size * counter + "px)";
});
console.log(carouselContents.length);

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ if ๋ถ€๋ถ„๋“ค์„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ• ๋•Œ, transition์ด 0.3์ดˆ๋งŒ์— ํœ™ ์›€์ง์ด๋Š” ์†๋„๋ณด๋‹ค ์‚ฌ๋žŒ์˜ ํด๋ฆญ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉด ์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฌดํ•œ์ด๋™ํ•œ๋‹ค..

์š”๋กœ์ผ€... car4

๊ทธ๋ž˜์„œ ๋ฒ„ํŠผํด๋ฆญ ์ด๋ฒคํŠธ๋กœ๋Š” counter์ด 0์ด๊ฑฐ๋‚˜ 0๋ณด๋‹ค ์ž‘์„๋•Œ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€์•Š๊ณ returnํ•˜๋„๋ก ์กฐ๊ฑด์„ ๊ฑธ์–ด์ค˜์•ผํ•œ๋‹ค.ใ… ใ… 

๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋˜‘๊ฐ™์€ ๋กœ์ง์œผ๋กœ if๋ฌธ์„ ๊ฑธ์–ด์ฃผ๋ฉด ๋œ๋‹ค...

์‹ ๊ธฐํ•œ CSS ์š”์†Œ

image

์Šฌ๋ผ์ด๋“œ์ชฝ ๊ตฌํ˜„์„ ๋๋‚ด๊ณ  ์•„๋ž˜์— ๋”๋ณด๊ธฐ์ชฝ ๊ตฌํ˜„์„ ํ•˜๋˜ ์ค‘,
์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๊ธ€์”จ๊ฐ€ ์ •ํ•ด์ง„ width ์ด์ƒ ๋„˜์–ด๊ฐ€๋ฉด ...์œผ๋กœ ๋œจ๊ธธ๋ž˜ ์–ด๋–ป๊ฒŒํ•˜๋‚˜ ๊ตฌ๊ธ€๋งํ•ด๋ดค์Šต๋‹ˆ๋‹ค

.target { 
display: inline-block; 
width: 200px; 
white-space: nowrap; 
overflow: hidden; 
text-overflow: ellipsis; 
}

์š”๋กœ์ฝ”๋กฌ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹น..!

ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ:

๋ถˆํƒœ์› ๋”ฐ

๋ญ”๊ฐ€ ํ–‰๋ณตํ•œ๋ฐ...๋ชจ๋ฅด๊ฒ ๋‹ค..๋‡Œ๊ฐ€...๊ณผ๋ถ€ํ•˜์˜จ ๋Š๋‚Œ์ด๋‹ค..

๊ทธ๋ž˜๋„ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋ถˆํƒœ์šด ๋‚˜ ์ž์‹ ์—๊ฒŒ ์งž์งž์งž์งœ๊นŒใ…‰๊นŒ์งž์งž!!!ํ•˜๊ณ  ๋ฐ•์ˆ˜ ๋ฐฑ๋ฒˆ ์ณ์ฃผ๊ณ ์‹ถ๋‹ค...ใ… ใ… 


์ฐธ๊ณ : https://webdir.tistory.com/483 https://www.youtube.com/watch?v=KcdBOoK3Pfw

โš ๏ธ **GitHub.com Fallback** โš ๏ธ