๐ŸŽจ CSS ๐Ÿ”ป

transform, @keyframes animation

output7 2022. 1. 14. 23:19

transform

https://developer.mozilla.org/ko/docs/Web/CSS/transform

 

transform - CSS: Cascading Style Sheets | MDN

CSS transform ์†์„ฑ์œผ๋กœ ์š”์†Œ์— ํšŒ์ „, ํฌ๊ธฐ ์กฐ์ ˆ, ๊ธฐ์šธ์ด๊ธฐ, ์ด๋™ ํšจ๊ณผ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

developer.mozilla.org

 

@keyframes

 

@keyframes - CSS: Cascading Style Sheets | MDN

@keyframes @๊ทœ์น™์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘๊ฐ„์ค‘๊ฐ„์˜ ํŠน์ • ์ง€์ ๋“ค์„ ๊ฑฐ์น  ์ˆ˜ ์žˆ๋Š” ํ‚คํ”„๋ ˆ์ž„๋“ค์„ ์„ค์ •ํ•จ์œผ๋กœ์จ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ณผ์ •์˜ ์ค‘๊ฐ„ ์ ˆ์ฐจ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฃฐ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™

developer.mozilla.org

 

animation

https://developer.mozilla.org/ko/docs/Web/CSS/animation

 

animation - CSS: Cascading Style Sheets | MDN

animation CSS ์†์„ฑ์€ ๋‹ค์ˆ˜์˜ ์Šคํƒ€์ผ์„ ์ „ํ™˜ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. animation-name (en-US), animation-duration, animation-timing-function (en-US), animation-delay, animation-iteration-count (en-US), animation-direction, anima

developer.mozilla.org

 

animation์—์„œ margin, width, left, ์ด๋Ÿฐ๊ฑฐ ๋ง๊ณ  transform ์“ฐ๋Š” ์ด์œ 

  • html css๋ฅผ ๊ทธ๋ž˜ํ”ฝ์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ layout โžก paint โžก transform ์ˆœ์„œ๋กœ ๋™์ž‘ํ•จ
  • ๊ทธ๋ž˜์„œ transform์„ ๋ฐ”๊พธ๋ฉด ๋งˆ์ง€๋ง‰ transform ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋˜์„œ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•จ 

 

 

๋”๋ณด๊ธฐ

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>Document</title>
    <link rel="stylesheet" href="./animation.css" />
  </head>
  <body>
    <div class="btn">
      <p>๋ฒ„ํŠผ</p>
    </div>

    <div class="cross">+</div>

    <div class="menu-box">
      <p class="menu">Menu</p>
      <p class="item">item</p>
    </div>
  </body>
</html>

 

๋”๋ณด๊ธฐ

SCSS

 

body {
  margin: 0;
}

// BTN
.btn {
  width: 100px;
  padding: 10px;
  margin-top: 20px;
  margin-left: 20px;
  text-align: center;
  color: #fff;
  box-sizing: border-box;
  background-color: #0b7285;
  border-radius: 5px;
}
.btn:hover {
  animation-name: aniBtn;
  animation-duration: 1s;
}

@keyframes aniBtn {
  0% {
    transform: rotate(0deg);
  }
  25% {
    transform: rotate(8deg);
  }
  50% {
    transform: rotate(-8deg);
  }
  75% {
    transform: rotate(8deg);
  }
  100% {
    transform: rotate(0deg);
  }
}

// CROSS
.cross {
  margin:150px auto;
  text-align: center;
  font-size: 70px;
  line-height: 65px;
  width: 80px;
  height: 80px;
  cursor: pointer;
}
.cross:hover {
    animation-name: aniCross;
    animation-duration: 1s;
    animation-fill-mode: forwards;
}

@keyframes aniCross {
  0% {
    transform: rotate(0deg);
  }
  25% {
    transform: rotate(-15deg);
  }
  100% {
    transform: rotate(45deg) scale(1.5);
  }
}

// MENU-BOX
.menu-box {
  width: 200px;
  height: 500px;
  background: #000;
  color: #fff;
  box-sizing: border-box;
  padding: 20px;
  transform: translateX(-100px);
  transition: transform 1s;
  .menu {
    font-size: 20px;
    text-align: right;
  }
  .item {
    text-align-last: left;
  }
}

.menu-box:hover {
    transform: translateX(0);
    .menu {
      text-align: center;
    }
    .item {
      animation-name: aniMenuItem;
      animation-duration: 1s;
      animation-fill-mode: forwards;
    }
}

@keyframes aniMenuItem {
  0% {
    transform: translateX(-100px);
  }
  80% {
    transform: translateX(130px) skew(-30deg);
  }
  100% {
    transform: translateX(60px);
  }
}