๐ŸŽจCSS | ์›๊ทผ๋ฒ•(perspective) ํ™œ์šฉํ•ด ๋’ค์ง‘ํžˆ๋Š” ์นด๋“œ ๋งŒ๋“ค๊ธฐ

์›์˜ยท2023๋…„ 4์›” 5์ผ
3

๋งŒ๋“ค์–ด๋ณด๊ธฐ๐Ÿคฉ

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

๐Ÿง์ƒํ™ฉ

์š”์†Œ์— ๊ฑฐ๋ฆฌ๊ฐ์„ ์ค˜์„œ ์›๊ทผ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” perspective ์†์„ฑ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•ž, ๋’ท๋ฉด์— ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์ค˜์„œ ๋’ค์ง‘ํžˆ๋Š” ์นด๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜๋‹ค..๐Ÿ‘€!
๋‹น์žฅ ์กฐ์›์˜ ์ €์—์š”..ใ…Žใ…Ž ์นด๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๋งŒ๋“ค์–ด๋ด„


๐Ÿ”Ž์•ž, ๋’ค ๋‹ค๋ฅธ ์นด๋“œ UI ๋งŒ๋“ค๊ธฐ

  • ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ์นด๋“œ UI
    1. ํ™”๋ฉด ๋กœ๋”ฉ์„ ํ•˜๋ฉด ์ค‘์•™์—์„œ ํœ˜๋ฆฌ๋ฆญ ๋’ค์ง‘ํžˆ๋ฉด์„œ ์ ์  ์ปค์ง
    2. ์ผ์ • ํฌ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ์ž๋ฆฌ์—์„œ ๋‘ฅ๋‘ฅ ๋– ๋‹ค๋‹˜
    3. ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜๋ฉด ์›€์ง์ž„์ด ๋ฉˆ์ถ”๊ณ  ์นด๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง

๐Ÿ’ก ์ „์ฒด ์ฝ”๋“œ

  • HTML
    - <div class='front'>, <div class='back'>์„ ๊ฐ์‹ธ๋Š” <div> 2๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋‚˜์ค‘์— animation ๋‘ ๊ฐœ๋ฅผ ์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ
<div class="container">
  <div class="flip">
    <div class="front">์•ž๋ฉด</div>
    <div class="back">๋’ท๋ฉด</div>
  </div>
</div>
  • CSS - ๊พธ๋ฉฐ์ฃผ๋Š” ์†์„ฑ์€ ํŽธ์˜์ƒ ์ œ๊ฑฐ
.container {
  width: 300px;
  height: 460px;

  animation-name: changeScale;
  animation-delay: 0;
  animation-duration: 2s;
  animation-iteration-count: 1;
}

.container:hover {
  transform: scale(1.1);
}

.flip {
  perspective: 1000px;
  width: 100%;
  height: 100%;
  position: relative;

  animation-name: changeTranslation;
  animation-delay: 2s;
  animation-duration: 2s;
  animation-iteration-count: infinite;
  animation-timing-function: cubic-bezier(0.2, 0.15, 0.48, 1.02);
}

.flip:hover {
  animation-play-state: paused;
}

.front,
.back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
}

.front {
  animation-name: ํœ˜๋ฆฌ๋ฆญ-front;
  animation-delay: 0;
  animation-duration: 2s;
  animation-iteration-count: 1;
}

.back {
  transform: rotateY(180deg);

  animation-name: ํœ˜๋ฆฌ๋ฆญ-back;
  animation-delay: 0;
  animation-duration: 2s;
  animation-iteration-count: 1;
}

@keyframes changeScale {
  0% {
    transform: scale(0);
  }
  100% {
    transform: scale(1);
  }
}

@keyframes ํœ˜๋ฆฌ๋ฆญ-front {
  100% {
    transform: rotateY(720deg);
  }
}

@keyframes ํœ˜๋ฆฌ๋ฆญ-back {
  100% {
    transform: rotateY(900deg);
  }
}

@keyframes changeTranslation {
  35% {
    transform: translateY(-50px);
  }
  90% {
    transform: translateY(0px);
  }
}

๐Ÿ’ก1๋ฒˆ ๊ตฌํ˜„

  • 1. ํ™”๋ฉด ๋กœ๋”ฉ์„ ํ•˜๋ฉด ์ค‘์•™์—์„œ ํœ˜๋ฆฌ๋ฆญ ๋’ค์ง‘ํžˆ๋ฉด์„œ ์ ์  ์ปค์ง

  • .container์— changeScale animation ์คŒ
    ํŽ˜์ด์ง€ ๋กœ๋“œ ๋˜์ž๋งˆ์ž 1๋ฒˆ ์‹คํ–‰
    2์ดˆ๋™์•ˆ ํฌ๊ธฐ 0 -> ์›๋ž˜ํฌ๊ธฐ ๋กœ ํ‚ค์›€

.container {
  animation-name: changeScale;
  animation-delay: 0;
  animation-duration: 2s;
  animation-iteration-count: 1;
}

@keyframes changeScale {
  0% {
    transform: scale(0);
  }
  100% {
    transform: scale(1);
  }
}
  • .front์— ํœ˜๋ฆฌ๋ฆญ-front animation ์คŒ
    ํŽ˜์ด์ง€ ๋กœ๋“œ ๋˜์ž๋งˆ์ž 1๋ฒˆ ์‹คํ–‰
    2์ดˆ๋™์•ˆ 720deg ํšŒ์ „
.front {
  backface-visibility: hidden;

  animation-name: ํœ˜๋ฆฌ๋ฆญ-front;
  animation-delay: 0;
  animation-duration: 2s;
  animation-iteration-count: 1;
}

@keyframes ํœ˜๋ฆฌ๋ฆญ-front {
  100% {
    transform: rotateY(720deg);
  }
}
  • .back์€ ์ดˆ๊ธฐ๊ฐ’์„ 180deg ๋Œ๋ ค ๋’ท๋ฉด์œผ๋กœ ๋ฐฐ์น˜
    ํœ˜๋ฆฌ๋ฆญ-back animation์œผ๋กœ ๋˜‘๊ฐ™์ด 2์ดˆ๋™์•ˆ 720deg ํšŒ์ „
    ์ฆ‰, animation ๋๋‚  ๋•Œ 180deg + 720deg = 900deg
.back {
  backface-visibility: hidden;
  transform: rotateY(180deg);
}

@keyframes ํœ˜๋ฆฌ๋ฆญ-back {
  100% {
    transform: rotateY(900deg);
  }
}

backface-visibility

  • ์š”์†Œ์˜ ๋’ท๋ฉด์„ ๋ณด์—ฌ์ค„ ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
  • ๊ธฐ๋ณธ๊ฐ’ : visible
  • ์—ฌ๊ธฐ์„œ backface-visibility: hidden์€ ๋’ท๋ฉด์„ ์•ˆ๋ณด์ด๊ฒŒ ์„ค์ •

๐Ÿ’ก2๋ฒˆ ๊ตฌํ˜„

  • 2. ์ผ์ • ํฌ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ์ž๋ฆฌ์—์„œ ๋‘ฅ๋‘ฅ ๋– ๋‹ค๋‹˜

  • .flip ์— ๋‘ฅ๋‘ฅ ๋– ๋‹ค๋‹ˆ๋Š” changeTranslation animation์„ ์คŒ
    1๋ฒˆ ํšจ๊ณผ๊ฐ€ ๋‹ค ๋๋‚œ ๋’ค์ธ 2์ดˆ ์ง€๋‚˜์„œ๋ถ€ํ„ฐ ์‹œ์ž‘
    ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์† ์‹คํ–‰

  • cf) perspective: 3d ํšจ๊ณผ ๋‚ด๋ฉด์„œ rotate

.flip {
  perspective: 1000px;

  animation-name: changeTranslation;
  animation-delay: 2s;
  animation-duration: 2s;
  animation-iteration-count: infinite;
  animation-timing-function: cubic-bezier(0.2, 0.15, 0.48, 1.02);
}

@keyframes changeTranslation {
  35% {
    transform: translateY(-50px);
  }
  90% {
    transform: translateY(0px);
  }
}

๐Ÿ’ก3๋ฒˆ ๊ตฌํ˜„

  • 3. ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜๋ฉด ์›€์ง์ž„์ด ๋ฉˆ์ถ”๊ณ  ์นด๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง
  • ๋งˆ์šฐ์Šค ํ˜ธ๋ฒ„๋˜๋ฉด
    .flip์˜ ๋‘ฅ๋‘ฅ๋– ๋‹ค๋‹ˆ๋Š” animation ์ค‘์ง€
    .container์˜ ํฌ๊ธฐ ํ‚ค์›€
.container:hover {
  transform: scale(1.1);
}

.flip:hover {
  animation-play-state: paused;
}

๐Ÿ’ก๊ตฌํ˜„ ๊ฒฐ๊ณผ



๐ŸŽˆ๋‚˜๋งŒ์˜ ์นด๋“œ ๋งŒ๋“ค๊ธฐ

  • ์œ„ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•ด์„œ ์กฐ์›์˜ ์นด๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค! ๊นƒํ—ˆ๋ธŒ ๋งํฌ๐Ÿ˜†
  • ํด๋ฆญํ•˜๋ฉด ์ด๋ ฅ์„œ๋กœ ๊ฐ€๊ฒŒ ์—ฐ๊ฒฐํ•จ


์ œ ์นด๋“œ ํš๋“ํ•˜์‹ค ํšŒ์‚ฌ ๊ตฌํ•ฉ๋‹ˆ๋‹ค~~ใ…Žใ…Žโœจ

profile
ํ™”์ดํŒ…~~^ใ…^/

0๊ฐœ์˜ ๋Œ“๊ธ€