Style Sheet/CSS

🎨 transition / transform / animation 속성 μ‚¬μš©λ²•

인파_ 2021. 10. 19. 12:17

cssμ• λ‹ˆλ©”μ΄μ…˜

CSS νŠΈλžœμ§€μ…˜

νŠΈλžœμ§€μ…˜(transition)은 CSS ν”„λ‘œνΌν‹°μ˜ 값이 λ³€ν™”ν•  λ•Œ, ν”„λ‘œνΌν‹° κ°’μ˜ λ³€ν™”κ°€ 일정 μ‹œκ°„(duration)에 걸쳐 μΌμ–΄λ‚˜λ„λ‘ ν•˜λŠ” 것이닀. μƒνƒœ 변화에 λ™λ°˜ν•˜μ—¬ λ³€κ²½λ˜λŠ” CSS ν”„λ‘œνΌν‹° 값에 μ˜ν•œ ν‘œμ‹œμ˜ λ³€ν™”λ₯Ό λΆ€λ“œλŸ½κ²Œ ν•˜κΈ° μœ„ν•΄ μ• λ‹ˆλ©”μ΄μ…˜ 속도λ₯Ό μ‘°μ ˆν•œλ‹€. μ‰½κ²Œ λ§ν•˜μžλ©΄ μš”μ†Œμ— 마우슀λ₯Ό μ˜¬λ Έμ„ 경우, 색 ν˜Ήμ€ 크기가 λ³€ν™”ν•˜λŠ” 섀정을 κ°€λ―Έν–ˆλŠ”λ°, 뚝뚝 λ°”λ‘œλ°”λ‘œ λ³€ν™”ν•˜λŠ” 것 보단 λΆ€λ“œλŸ½κ²Œ μ „ν™˜λ˜λŠ” 효과λ₯Ό 지정해 쀄 λ•Œ μ‚¬μš©ν•œλ‹€κ³  보면 λœλ‹€

transition은 μ „ν™˜λ˜λŠ” λͺ¨μ…˜μ„ μΆ”κ°€λ‘œ κ°€λ―Έν•˜λŠ” 속성이지 κ·Έ 자체둜 μŠ€νƒ€μΌμ„ μ£ΌλŠ” 속성은 μ•„λ‹ˆλ‹€. κ·Έλž˜μ„œ :hover와 같은 가상 클래슀 μ„ νƒμž(Pseudo-Classes) λ˜λŠ” JavaScript의 λΆ€μˆ˜μ μΈ μ•‘μ…˜μ— μ˜ν•΄ λ°œλ™ν•œλ‹€. 그리고 뒀에 배울 transform 속성과 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄μ§€λŠ” κ²½μš°κ°€ 많이 μžˆλ‹€.

Transition 속성

속성 μ„€λͺ…
transition λͺ¨λ“  transition 속성을 μ΄μš©ν•œ μŠ€νƒ€μΌμ„ ν•œ 쀄에 μ„€μ •ν•  수 있음.
transition-property μš”μ†Œμ— μΆ”κ°€ν•  μ „ν™˜(transition) 효과λ₯Ό 섀정함.
transition-duration μ „ν™˜(transition) νš¨κ³Όκ°€ 지속될 μ‹œκ°„μ„ 섀정함.
transition-timing-function μ „ν™˜(transition) 효과의 μ‹œκ°„λ‹Ή 속도λ₯Ό 섀정함.
transition-delay μ „ν™˜(transition) νš¨κ³Όκ°€ λ‚˜νƒ€λ‚˜κΈ° μ „κΉŒμ§€μ˜ 지연 μ‹œκ°„μ„ 섀정함.

​

transition-property

νŠΈλžœμ§€μ…˜μ˜ λŒ€μƒμ΄ λ˜λŠ” CSS ν”„λ‘œνΌν‹°λͺ…을 μ§€μ •ν•œλ‹€. μ§€μ •ν•˜μ§€ μ•ŠλŠ” 경우 λͺ¨λ“  ν”„λ‘œνΌν‹°κ°€ νŠΈλžœμ§€μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.

볡수의 ν”„λ‘œνΌν‹°λ₯Ό μ§€μ •ν•˜λŠ” 경우 μ‰Όν‘œ(,)둜 κ΅¬λΆ„ν•œλ‹€.

div {
   width: 100px;
   height: 50px;
   background-color: red;
   margin-bottom: 10px;

   transition-property: width, background-color; /* μ–΄λ–€ css ν”„λ‘œνΌν‹°λ₯Ό transition할지 지정 */
   transition-duration: 2s, 2s; /* width와 bg-colorκ°€ 2μ΄ˆλ™μ•ˆ λ³€ν™” */
}

div:hover { /* 마우슀λ₯Ό 올리면 transitionλ°œλ™ν•΄μ„œ 적용될 μƒνƒœ */
   width: 300px;
   background-color: blue;
}

See the Pen transition 1 by barzz12 (@inpaSkyrim) on CodePen.

 

 

μ£Όμ˜ν•΄μ•Ό ν•  사항은 λͺ¨λ“  CSS ν”„λ‘œνΌν‹°κ°€ νŠΈλžœμ§€μ…˜μ˜ λŒ€μƒμ΄ 될 수 μ—†λ‹€λŠ” 것이닀. 예λ₯Ό λ“€μ–΄ width, font-size, background-color 등은 ν•˜λ‚˜μ˜ λ²”μ£Όμ•ˆμ—μ„œ ν¬κΈ°λ‚˜ μƒ‰μƒμ˜ 값이 λ³€ν™”κ°€ κ°€λŠ₯ν•˜μ§€λ§Œ display ν”„λ‘œνΌν‹°λŠ” 그렇지 μ•Šλ‹€.

λ”°λΌμ„œ νŠΈλžœμ§€μ…˜μ˜ λŒ€μƒμ΄ 될 수 μžˆλŠ” CSS ν”„λ‘œνΌν‹°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

[Box model]

  • width height, max-width, max-height, min-width, min-height
  • padding, margin
  • border-color, border-width, border-spacing

​

[Background]

  • background-color, background-position

​

[μ’Œν‘œ]

  • top, left, right, bottom

​

[ν…μŠ€νŠΈ]

  • color font-size, font-weight, letter-spacing, line-height
  • text-indent, text-shadow, vertical-align, word-spacing

​

[기타]

  • opacity, outline-color, outline-offset, outline-width
  • visibility, z-index

 

transition-duration

νŠΈλžœμ§€μ…˜μ—β€‹ μΌμ–΄λ‚˜λŠ” μ§€μ†μ‹œκ°„(duration)을 초 λ‹¨μœ„(s) λ˜λŠ” 밀리 초 λ‹¨μœ„(ms)둜 μ§€μ •ν•œλ‹€.

ν”„λ‘œνΌν‹°κ°’μ„ μ§€μ •ν•˜μ§€ μ•Šμ„ 경우 κΈ°λ³Έκ°’ 0s이 μ μš©λ˜μ–΄ μ–΄λ– ν•œ νŠΈλžœμ§€μ…˜ νš¨κ³Όλ„ λ³Ό 수 μ—†λ‹€.

transition-duration ν”„λ‘œνΌν‹°κ°’μ€ transition-property ν”„λ‘œνΌν‹°κ°’κ³Ό 1:1 λŒ€μ‘ν•œλ‹€.

div {
  transition-property: width;
  transition-duration: 2s; /* widthκ°€ 2μ΄ˆμ— 걸쳐 λ³€ν™” */
}

div {
  transition-property: width, opacity;
  transition-duration: 2s, 4s; /* width와 opacityκ°€ 2초 4μ΄ˆμ— 걸쳐 λ³€ν™” */
}

div {
  transition-property: width, opacity, left, top;
  transition-duration: 2s, 1s; /* width, leftλŠ” 2초 opacity top은 1μ΄ˆμ— 걸쳐 λ³€ν™” */
}

div {
  /* shorthand syntax */
  transition: width 2s, opacity 4s; /* μΆ•μ•½ ν‘œν˜„ */
}

​

transition-timing-function

νŠΈλžœμ§€μ…˜ 효과의 λ³€ν™” 흐름, μ‹œκ°„μ— λ”°λ₯Έ λ³€ν™” 속도와 같은 μΌμ’…μ˜ λ³€ν™”μ˜ 리듬을 μ§€μ •ν•œλ‹€.

λŒ€λΆ€λΆ„μ˜ 타이밍 ν•¨μˆ˜λŠ” 큐빅 베이지어(cubic bezier)λ₯Ό μ •μ˜ν•˜λŠ” λ„€ 점에 μ˜ν•΄ μ •μ˜λ˜λ―€λ‘œ μƒμ‘ν•˜λŠ” ν•¨μˆ˜μ˜ κ·Έλž˜ν”„λ‘œ μ œκ³΅ν•΄μ„œ λͺ…μ‹œν•  수 μžˆλ‹€.

transition-timing-function: ease;
transition-timing-function: linear;
transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: ease-in-out;

cssμ• λ‹ˆλ©”μ΄μ…˜

​

transition-delay

νŠΈλžœμ§€μ…˜ λ°œλ™ λŒ€κΈ°μ‹œκ°„. μ‹œκ°„μ„ 초 λ‹¨μœ„(s) λ˜λŠ” 밀리 초 λ‹¨μœ„(ms)둜 지정 ν•œλ‹€.

transition-duration이 νŠΈλžœμ§€μ…˜ 지속 μ‹œκ°„μ΄λΌλ©΄, transition-delayλŠ” λ°œλ™ λŒ€κΈ° 사간이라고 보면 λœλ‹€. κ·Έλž˜μ„œ ν”„λ‘œνΌν‹°μ˜ 값이 λ³€ν™”ν•˜μ—¬λ„ μ¦‰μ‹œ νŠΈλžœμ§€μ…˜μ΄ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , 일정 μ‹œκ°„ λŒ€κΈ°ν•œ ν›„ νŠΈλžœμ§€μ…˜μ΄ μ‹€ν–‰λ˜λ„λ‘ ν•œλ‹€.

transition-delay: 3s;

​

transition

λͺ¨λ“  νŠΈλžœμ§€μ…˜ ν”„λ‘œνΌν‹°λ₯Ό ν•œλ²ˆμ— 지정할 수 μžˆλŠ” shorthand이닀. 값을 μ§€μ •ν•˜μ§€ μ•Šμ€ ν”„λ‘œνΌν‹°μ—λŠ” 기본값이 μ§€μ •λœλ‹€.

단, transition-duration은 λ°˜λ“œμ‹œ 지정해야 ν•œλ‹€. μ§€μ •ν•˜μ§€ μ•ŠλŠ” 경우 κΈ°λ³Έκ°’ 0이 μ…‹νŒ…λ˜μ–΄ μ–΄λ– ν•œ νŠΈλžœμ§€μ…˜λ„ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

transition: property duration function delay
  κΈ°λ³Έκ°’      all      0        ease     0
/* duration */
transition: 1s

/* property duration */
transition: width 1s

/* duration function */
transition: 1s ease-in;

/* duration delay*/
transition: 1s 1s;

/* property duration function delay */
transition: width 1s ease-in 1s;

CSS 트랜슀폼

트랜슀폼(Transform)은 μš”μ†Œμ— μ΄λ™(translate), νšŒμ „(rotate), ν™•λŒ€/μΆ•μ†Œ(scale), λΉ„ν‹€κΈ°(skew) 효과λ₯Ό λΆ€μ—¬ν•΄μ€€λ‹€.

단, κ·Έ 자체둜 μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μ œκ³΅ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— μ •μ˜λœ ν”„λ‘œνΌν‹°κ°€ λ°”λ‘œ μ μš©λ˜μ–΄ 화면에 ν‘œμ‹œλ˜μ–΄, 만일 μ• λ‹ˆλ©”μ΄μ…˜ νš¨κ³Όλ„ 같이 μ£Όκ³  μ‹Άλ‹€λ©΄ μœ„μ—μ„œ 배운 transitionκ³Ό μ‘°ν•©ν•˜λ©΄ λœλ‹€.


Transform 속성

 

2D Transform

κΈ°λ³Έ x, y 두 μ’Œν‘œλ‘œλ§Œ μš”μ†Œλ₯Ό λ³€ν™”μ‹œμΌœ 2d적인 λ³€ν™”λ₯Ό κ°€λ―Έν•  수 μžˆλ‹€.

transform function μ„€λͺ… λ‹¨μœ„
translate(x,y) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό XμΆ•μœΌλ‘œ x만큼, YμΆ•μœΌλ‘œ y만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
translateX(n) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό XμΆ•μœΌλ‘œ x만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
translateY(n) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό YμΆ•μœΌλ‘œ y만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
scale(x,y) μš”μ†Œμ˜ 크기λ₯Ό XμΆ•μœΌλ‘œ xλ°°, YμΆ•μœΌλ‘œ yλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
scaleX(n) μš”μ†Œμ˜ 크기λ₯Ό XμΆ•μœΌλ‘œ xλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
scaleY(n) μš”μ†Œμ˜ 크기λ₯Ό YμΆ•μœΌλ‘œ yλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
skew(x-angle,y-angle) μš”μ†Œλ₯Ό XμΆ•μœΌλ‘œ x κ°λ„λ§ŒνΌ, YμΆ•μœΌλ‘œ y κ°λ„λ§ŒνΌ κΈ°μšΈμΈλ‹€. +/- 각도(deg)
skewX(x-angle) μš”μ†Œλ₯Ό XμΆ•μœΌλ‘œ x κ°λ„λ§ŒνΌ κΈ°μšΈμΈλ‹€. +/- 각도(deg)
skewY(y-angle) μš”μ†Œλ₯Ό YμΆ•μœΌλ‘œ y κ°λ„λ§ŒνΌ κΈ°μšΈμΈλ‹€. +/- 각도(deg)
rotate(angle) μš”μ†Œλ₯Ό angle만큼 νšŒμ „μ‹œν‚¨λ‹€. +/- 각도(deg)

​

3D Transform

x, y, z μ„Έ μ’Œν‘œλ₯Ό μ΄μš©ν•΄ μš”μ†Œλ₯Ό λ³€ν™”μ‹œμΌœ 3d적인 λ³€ν™”λ₯Ό κ°€λ―Έν•  수 μžˆλ‹€.

transform function μ„€λͺ… λ‹¨μœ„
translate3d(x,y,z) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό XμΆ•μœΌλ‘œ x만큼, YμΆ•μœΌλ‘œ y만큼 ZμΆ•μœΌλ‘œ z만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
translateX(n) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό XμΆ•μœΌλ‘œ x만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
translateY(n) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό YμΆ•μœΌλ‘œ y만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
translateZ(n) μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό ZμΆ•μœΌλ‘œ z만큼 μ΄λ™μ‹œν‚¨λ‹€. px, %, em λ“±
scale3d(x,y) μš”μ†Œμ˜ 크기λ₯Ό XμΆ•μœΌλ‘œ xλ°°, YμΆ•μœΌλ‘œ yλ°°, ZμΆ•μœΌλ‘œ zλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
scaleX(n) μš”μ†Œμ˜ 크기λ₯Ό XμΆ•μœΌλ‘œ xλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
scaleY(n) μš”μ†Œμ˜ 크기λ₯Ό YμΆ•μœΌλ‘œ yλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
scaleZ(n) μš”μ†Œμ˜ 크기λ₯Ό ZμΆ•μœΌλ‘œ zλ°° ν™•λŒ€ λ˜λŠ” μΆ•μ†Œ μ‹œν‚¨λ‹€. 0κ³Ό μ–‘μˆ˜
rotate3d(x,y,z) μš”μ†Œλ₯Ό XμΆ•μœΌλ‘œ x각도, YμΆ•μœΌλ‘œ y각도, ZμΆ•μœΌλ‘œ z각도 νšŒμ „μ‹œν‚¨λ‹€. +/- 각도(deg)
rotateX(x) μš”μ†Œλ₯Ό XμΆ•μœΌλ‘œ x각도 νšŒμ „μ‹œν‚¨λ‹€. +/- 각도(deg)
rotateY(y) μš”μ†Œλ₯Ό YμΆ•μœΌλ‘œ y각도 νšŒμ „μ‹œν‚¨λ‹€. +/- 각도(deg)
rotateZ(z) μš”μ†Œλ₯Ό ZμΆ•μœΌλ‘œ z각도 νšŒμ „μ‹œν‚¨λ‹€. +/- 각도(deg)

​

transform

λ³€ν™˜ν•¨μˆ˜λ₯Ό ν”„λ‘œνΌν‹°κ°’μœΌλ‘œ μ‰Όν‘œμ—†μ΄ λ‚˜μ—΄ν•œλ‹€. λ‚˜μ—΄μˆœμ„œμ— 따라 μ°¨λ‘€λŒ€λ‘œ νš¨κ³Όκ°€ μ μš©λœλ‹€.

transform: func1 func2 func3 ...;
<div class="box">
	<div class="translate">translate</div>
</div>
<div class="box">
	<div class="scale">scale</div>
</div>
<div class="box">
	<div class="skew">skew</div>
</div>
<div class="box">
	<div class="rotate">rotate</div>
</div>
<div class="box">
	<div class="complex">complex</div>
</div>
.translate {
    transform: translate(10px, 50px);
}
.scale {
    transform: scale(0.75);
}
.skew {
    transform: skew(5deg, -20deg);
}
.rotate {
    transform: rotate(70deg);
}
.complex {
    transform: scale(0.5) rotate(20deg);
}

/* Animation Effect */
.translate:hover {
    transition: transform 1s linear;
    transform: translate(0px, 0px);
}
.scale:hover {
    transition: transform 1s linear;
    transform: scale(1);
}
.skew:hover {
    transition: transform 1s linear;
    transform: skew(0, 0);
}
.rotate:hover {
    transition: transform 1s linear;
    transform: rotate(0);
}
.complex:hover {
    transition: transform 1s linear;
    transform: scale(1) rotate(0);
}

See the Pen transform by barzz12 (@inpaSkyrim) on CodePen.

 

 

 

transform-origin

μš”μ†Œμ˜ 기본기쀀점을 μ„€μ •ν•  λ•Œ μ‚¬μš©λœλ‹€. κΈ°λ³Έ 기쀀점은 μš”μ†Œμ˜ 정쀑앙이닀 (50%,50%).

μ„€μ •κ°’μœΌλ‘œ %, px, top left, bottom right을 μ‚¬μš©ν•  수 μžˆλ‹€. 0, 0은 top left / 100% 100%λŠ” bottom rightκ³Ό 같은 값이닀.

transform-origin: 0 0;
transform-origin: 50% 50%;
<div class="box">
	<div class="child box scale1">scale1</div>
</div>
<div class="box">
	<div class="child box scale2">scale2</div>
</div>
<div class="box">
	<div class="child box scale3">scale3</div>
</div>
<div class="box">
	<div class="child box translate">translate</div>
</div>
.scale1:hover {
    transition: transform 1s linear;
    transform-origin: 0 0;
    transform: scale(0.5);
}
.scale2:hover {
    transition: transform 1s linear;
    transform-origin: 50% 50%;
    transform: scale(0.5);
}
.scale3:hover {
    transition: transform 1s linear;
    transform-origin: 100% 100%;
    transform: scale(0.5);
}
.translate:hover {
    transition: transform 1s linear;
    /*transform-origin: 100% 100%;*/
    transform: translate(10px, 10px);
}

See the Pen transform-origin by barzz12 (@inpaSkyrim) on CodePen.

 

 


CSS μ• λ‹ˆλ©”μ΄μ…˜

μ• λ‹ˆλ©”μ΄μ…˜(animation) 속성은 말 κ·ΈλŒ€λ‘œ html μš”μ†Œμ— μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μ μš©μ‹œμΌœ μ€€λ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜κΈ° μœ„ν•΄μ„  νŠΉλ³„ν•œ 속성이 μ“°μ—¬ μ§€λŠ”λ° 이λ₯Ό @keyframes 이라 ν•œλ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ€ ν•˜λ‚˜μ˜ 쀄거리(keyframes)λ₯Ό κ΅¬μ„±ν•˜μ—¬ 쀄거리 λ‚΄μ—μ„œ μ„ΈλΆ€ μ›€μ§μž„μ„ μ‹œκ°„ 흐름 λ‹¨μœ„λ‘œ μ œμ–΄ν•˜μ—¬ μš”μ†Œμ˜ μ›€μ§μž„μ„ ν‘œν˜„ν•œλ‹€.

λ¬Όλ‘  μœ„μ—μ„œ 배운 transitionμœΌλ‘œλ„ μ–΄λŠ μ •λ„μ˜ μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό ν‘œν˜„ν•  수 μžˆμœΌλ‚˜ animationλ³΄λ‹€λŠ” 쒀더 μΈν„°λž™ν‹°λΈŒ(interactive)ν•˜κ²Œ ν‘œν˜„μ΄ κ°€λŠ₯ν•œ μƒμœ„ ν˜Έν™˜ μ •λ„λ‘œ 봐도 λœλ‹€.

λ‘˜μ΄ λΉ„κ΅ν•˜μžλ©΄,

  • 일반적으둜 νŠΈλžœμ§€μ…˜ νš¨κ³ΌλŠ” μš”μ†Œ ν”„λ‘œνΌν‹°κ°’μ΄ λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€ν™”ν•  λ•Œ 주둜 μ‚¬μš©ν•˜λ©° μš”μ†Œμ˜ λ‘œλ“œμ™€ ν•¨κ»˜ μžλ™μœΌλ‘œ λ°œλ™λ˜μ§€ μ•ŠλŠ”λ‹€.
  • animation ν”„λ‘œνΌν‹°λŠ” ν•˜λ‚˜μ˜ 쀄거리λ₯Ό κ΅¬μ„±ν•˜μ—¬ 쀄거리 λ‚΄μ—μ„œ μ„ΈλΆ€ μ›€μ§μž„μ„ μ‹œκ°„ 흐름 λ‹¨μœ„λ‘œ μ œμ–΄ν•  수 있고 전체 μ€„κ±°λ¦¬μ˜ μž¬μƒκ³Ό 정지, λ°˜λ³΅κΉŒμ§€ μ œμ–΄ν•  수 μžˆλ‹€.

Animation 속성

ν”„λ‘œνΌν‹° μ„€λͺ… κΈ°λ³Έκ°’
animation-name @keyframes μ• λ‹ˆλ©”μ΄μ…˜ 이름을 μ§€μ •ν•œλ‹€  
animation-duration ν•œ μ‹Έμ΄ν΄μ˜ μ• λ‹ˆλ©”μ΄μ…˜μ— μ†Œμš”λ˜λŠ” μ‹œκ°„μ„ 초 λ‹¨μœ„(s) λ˜λŠ” 밀리 초 λ‹¨μœ„(ms)둜 μ§€μ •ν•œλ‹€. 0s
animation-timing-function μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μœ„ν•œ 타이밍 ν•¨μˆ˜λ₯Ό μ§€μ •ν•œλ‹€. ease
animation-delay μš”μ†Œκ°€ λ‘œλ“œλœ μ‹œμ κ³Ό μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹€μ œλ‘œ μ‹œμž‘ν•˜λŠ” 사이에 λŒ€κΈ°ν•˜λŠ” μ‹œκ°„μ„ 초 λ‹¨μœ„(s) λ˜λŠ” 밀리 초 λ‹¨μœ„(ms)둜 μ§€μ •ν•œλ‹€ 0s
animation-iteration-count μ• λ‹ˆλ©”μ΄μ…˜ μž¬μƒ 횟수λ₯Ό μ§€μ •ν•œλ‹€. 1
animation-direction μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ’…λ£Œλœ 이후 반볡될 λ•Œ μ§„ν–‰ν•˜λŠ” λ°©ν–₯을 μ§€μ •ν•œλ‹€. normal
animation-fill-mode μ• λ‹ˆλ©”μ΄μ…˜ λ―Έμ‹€ν–‰ μ‹œ(μ’…λ£Œ λ˜λŠ” λŒ€κΈ°) μš”μ†Œμ˜ μŠ€νƒ€μΌμ„ μ§€μ •ν•œλ‹€.  
animation-play-state μ• λ‹ˆλ©”μ΄μ…˜ μž¬μƒ μƒνƒœ(μž¬μƒ λ˜λŠ” 쀑지)λ₯Ό μ§€μ •ν•œλ‹€. running
animation λͺ¨λ“  μ• λ‹ˆλ©”μ΄μ…˜ ν”„λ‘œνΌν‹°λ₯Ό ν•œλ²ˆμ— μ§€μ •ν•œλ‹€ (shorthand syntax)  

​

@keyframes

CSS μ• λ‹ˆλ©”μ΄μ…˜κ³Ό νŠΈλžœμ§€μ…˜ λ°©μ‹μ˜ 주된 μ°¨μ΄λŠ” @keyframes rule에 μžˆλ‹€.

이 rule을 μ‚¬μš©ν•˜λ©΄ μ• λ‹ˆλ©”μ΄μ…˜μ˜ 흐름(sequence) μ€‘μ˜ μ—¬λŸ¬ μ‹œμ (breakpoint)μ—μ„œ CSS ν”„λ‘œνΌν‹°κ°’μ„ 지정할 수 μžˆλ‹€.

@keyframes rule은 μ‹œκ°„μ˜ 흐름에 따라 μ• λ‹ˆλ©”μ΄μ…˜μ„ μ •μ˜ν•œλ‹€. μ—¬λŸ¬ 개의 ν‚€ν”„λ ˆμž„μ„ μ •μ˜ν•˜κ±°λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜ 쀑에 νŠΉμ • CSS ν”„λ‘œνΌν‹°μ— 값을 μ§€μ •ν•˜λŠ” 지점을 μ •μ˜ν•  수 μžˆλ‹€.

@keyframes move { /* @keyframes 뒀에 μ• λ‹ˆλ©”μ΄μ…˜μ„ λŒ€ν‘œν•˜λŠ” μž„μ˜μ˜ 이름 moveλ₯Ό λΆ€μ—¬ */
   from { /* μ• λ‹ˆλ©”μ΄μ…˜ μ‹œμž‘ μ‹œμ  */
       left: 0;
   }
   to { /* μ• λ‹ˆλ©”μ΄μ…˜ μ’…λ£Œ μ‹œμ  */
       left: 300px;
   }
}
/* from, to ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜μ˜ μ‹œμž‘κ³Ό 끝 μ‹œμ μ„ μ •μ˜ν•˜μ˜€λ‹€. 
   μ• λ‹ˆλ©”μ΄μ…˜μ˜ μ‹œμž‘ μ‹œμ μ„ μ˜λ―Έν•˜λŠ” from ν‚€ν”„λ ˆμž„ λ‚΄μ—λŠ” left ν”„λ‘œνΌν‹°μ— κ°’ 0을, 
   μ• λ‹ˆλ©”μ΄μ…˜μ˜ 끝 μ‹œμ μ„ μ˜λ―Έν•˜λŠ” to ν‚€ν”„λ ˆμž„ λ‚΄μ—λŠ” left ν”„λ‘œνΌν‹°μ— κ°’ 300px을 μ§€μ •ν•˜μ˜€λ‹€. 
   κ·Έ κ²°κ³Ό, 정지 μƒνƒœμ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 300px μ΄λ™ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹€ν–‰λœλ‹€. */
div {
      position: absolute;
      width: 100px;
      height: 100px;
      background-color: red;
      
      animation-name: move; /* @keyframes에 μ§€μ •ν•œ 이름을 μ—¬κΈ°λ‹€ μ“΄λ‹€ */
      animation-duration: 5s; /* μ• λ‹ˆλ©”μ΄μ…˜ λ™μž‘ μ‹œκ°„ */
      animation-iteration-count: infinite; /* μ• λ‹ˆλ©”μ΄μ…˜ μž¬μƒ 횟수 λ¬΄ν•œ */
}

See the Pen animation 1 by barzz12 (@inpaSkyrim) on CodePen.

 

 

 

from, to ν‚€μ›Œλ“œ λŒ€μ‹  쒀더 μƒμ„Έν•œ μ‘°μž‘μ„ μœ„ν•΄ 퍼센티지(%)도 μ‚¬μš©ν•  수 μžˆλ‹€.

@keyframes move {
  0%   { left: 0; }
  50%  { left: 100px; }
  100% { left: 300px; }
}

​

animation-name

이름을 animation-name ν”„λ‘œνΌν‹°κ°’μœΌλ‘œ μ§€μ •ν•˜μ—¬ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” @keyframes rule을 μ„ νƒν•œλ‹€. ν•˜λ‚˜ μ΄μƒμ˜ μ• λ‹ˆλ©”μ΄μ…˜ 이름을 지정할 수 μžˆλ‹€.

μœ„ μ˜ˆμ œμ—μ„œ 보면 @keyframes 뒀에 μ• λ‹ˆλ©”μ΄μ…˜μ„ λŒ€ν‘œν•˜λŠ” μž„μ˜μ˜ 이름λ₯Ό λΆ€μ—¬ν•˜μ˜€λ‹€. 그것을 μ–΄λŠ μš”μ†Œμ— 등둝할지 μ •ν•˜λŠ” κ²ƒμœΌλ‘œ 보면 λœλ‹€.

div {
	position: absolute;
	width: 100px;
	height: 100px;

	animation-name: move, fadeOut, changeColor; /* keyframe을 νƒœκ·Έμ— 등둝 */
	animation-duration: 5s; /* 5μ΄ˆλ™μ•ˆ μ‹€ν–‰ */
	animation-iteration-count: infinite; /* aλ¬΄ν•œ 반볡 */
}

@keyframes move {
	from {
		left: 0;
	}
	to {
		left: 300px;
	}
}
@keyframes fadeOut {
	from {
		opacity: 1;
	}
	to {
		opacity: 0;
	}
}
@keyframes changeColor {
	from {
		background-color: red;
	}
	to {
		background-color: blue;
	}
}

See the Pen animation 2 by barzz12 (@inpaSkyrim) on CodePen.

 

 

 

animation-duration

ν•œ μ‹Έμ΄ν΄μ˜ μ• λ‹ˆλ©”μ΄μ…˜μ— μ†Œμš”λ˜λŠ” μ‹œκ°„μ„ 초 λ‹¨μœ„(s) λ˜λŠ” 밀리 초 λ‹¨μœ„(ms)둜 μ§€μ •ν•œλ‹€.

animation-duration은 λ°˜λ“œμ‹œ 지정해야 ν•œλ‹€. μ§€μ •ν•˜μ§€ μ•ŠλŠ” 경우 κΈ°λ³Έκ°’ 0sκ°€ μ…‹νŒ…λ˜μ–΄ μ–΄λ– ν•œ μ• λ‹ˆλ©”μ΄μ…˜λ„ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

animation-duration: .5s; 
animation-duration: 500ms;

​

animation-timing-function

μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό μœ„ν•œ 수치 ν•¨μˆ˜λ₯Ό μ§€μ •ν•œλ‹€.

​

animation-delay

μ• λ‹ˆλ©”μ΄μ…˜ μ‹€ν–‰ λŒ€κΈ° μ‹œκ°„

animation-delay: 2s;

​

animation-iteration-count

μ• λ‹ˆλ©”μ΄μ…˜ 주기의 μž¬μƒ 횟수λ₯Ό μ§€μ •ν•œλ‹€. 기본값은 1이며 infinite둜 λ¬΄ν•œλ°˜λ³΅ ν•  수 μžˆλ‹€.

animation-iteration-count: 3;

​

animation-direction

μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ’…λ£Œλœ 이후 반볡될 λ•Œ μ§„ν–‰ν•˜λŠ” λ°©ν–₯을 μ§€μ •ν•œλ‹€.

ν”„λ‘œνΌν‹°κ°’ μ„€λͺ…
normal κΈ°λ³Έκ°’μœΌλ‘œ from(0%)μ—μ„œ to(100%) λ°©ν–₯으둜 μ§„ν–‰ν•œλ‹€.
reverse toμ—μ„œ from λ°©ν–₯으둜 μ§„ν–‰ν•œλ‹€.
alternate ν™€μˆ˜λ²ˆμ§ΈλŠ” normal둜, μ§μˆ˜λ²ˆμ§ΈλŠ” reverse둜 μ§„ν–‰ν•œλ‹€.
alternate-reverse ν™€μˆ˜λ²ˆμ§ΈλŠ” reverse둜, μ§μˆ˜λ²ˆμ§ΈλŠ” normal둜 μ§„ν–‰ν•œλ‹€.
<head>
  <style>
    div {
      width: 100px;
      height: 100px;
      background: red;
      position: relative;
      animation: myAnimation 5s infinite;
      /*ν™€μˆ˜λ²ˆμ§ΈλŠ” normal둜, μ§μˆ˜λ²ˆμ§ΈλŠ” reverse둜 진행*/
      animation-direction: alternate;
    }
    @keyframes myAnimation {
      0%   { background: red;    left: 0px;   top: 0px; }
      25%  { background: yellow; left: 200px; top: 0px; }
      50%  { background: blue;   left: 200px; top: 200px; }
      75%  { background: green;  left: 0px;   top: 200px; }
      100% { background: red;    left: 0px;   top: 0px; }
    }
  </style>
  </head>
  <body>
    <div></div>
  </body>

See the Pen animation 4 by barzz12 (@inpaSkyrim) on CodePen.

 

 

 

animation-fill-mode

μ• λ‹ˆλ©”μ΄μ…˜ λ―Έμ‹€ν–‰ μ‹œ(λŒ€κΈ° λ˜λŠ” μ’…λ£Œ) μš”μ†Œμ˜ μŠ€νƒ€μΌμ„ μ§€μ •ν•œλ‹€.

ν”„λ‘œνΌν‹°κ°’ μƒνƒœ μ„€λͺ…
none λŒ€κΈ° μ‹œμž‘ ν”„λ ˆμž„(from)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜μ§€ μ•Šκ³  λŒ€κΈ°ν•œλ‹€.
  μ’…λ£Œ μ• λ‹ˆλ©”μ΄μ…˜ μ‹€ν–‰ μ „ μƒνƒœλ‘œ μ• λ‹ˆλ©”μ΄μ…˜ μš”μ†Œμ˜ ν”„λ‘œνΌν‹°κ°’μ„ 되돌리고 μ’…λ£Œν•œλ‹€.
forwards λŒ€κΈ° μ‹œμž‘ ν”„λ ˆμž„(from)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜μ§€ μ•Šκ³  λŒ€κΈ°ν•œλ‹€.
  μ’…λ£Œ μ’…λ£Œ ν”„λ ˆμž„(to)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜κ³  μ’…λ£Œν•œλ‹€.
backwards λŒ€κΈ° μ‹œμž‘ ν”„λ ˆμž„(from)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜κ³  λŒ€κΈ°ν•œλ‹€.
  μ’…λ£Œ μ• λ‹ˆλ©”μ΄μ…˜ μ‹€ν–‰ μ „ μƒνƒœλ‘œ μ• λ‹ˆλ©”μ΄μ…˜ μš”μ†Œμ˜ ν”„λ‘œνΌν‹°κ°’μ„ 되돌리고 μ’…λ£Œν•œλ‹€.
both λŒ€κΈ° μ‹œμž‘ ν”„λ ˆμž„(from)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜κ³  λŒ€κΈ°ν•œλ‹€.
  μ’…λ£Œ μ’…λ£Œ ν”„λ ˆμž„(to)에 μ„€μ •ν•œ μŠ€νƒ€μΌμ„ μ μš©ν•˜κ³  μ’…λ£Œν•œλ‹€.
div {
  width: 100px;
  height: 100px;
  font: bold 1em/100px san-serif;
  text-align: center;
  color: #fff;
  background: red;
  margin-bottom: 10px;
  position: relative;


  /*name duration timing-function delay iteration-count direction fill-mode play-state*/
  animation: myAnimation 2s linear 2s;
}

div:nth-of-type(1) {
  animation-fill-mode: none;
}
div:nth-of-type(2) {
  animation-fill-mode: forwards;
}
div:nth-of-type(3) {
  animation-fill-mode: backwards;
}
div:nth-of-type(4) {
  animation-fill-mode: both;
}

@keyframes myAnimation {
  0%   { left: 0px;   background: yellow; }
  100% { left: 200px; background: blue; }
}

See the Pen Untitled by barzz12 (@inpaSkyrim) on CodePen.

 

 

 

animation-play-state

μ• λ‹ˆλ©”μ΄μ…˜ μž¬μƒ μƒνƒœ(μž¬μƒ λ˜λŠ” 쀑지)λ₯Ό μ§€μ •ν•œλ‹€. 기본값은 running이닀

animation-play-state: paused; 
animation-play-state: running;

​

animation

λͺ¨λ“  μ• λ‹ˆλ©”μ΄μ…˜ ν”„λ‘œνΌν‹°λ₯Ό ν•œλ²ˆμ— μ§€μ •ν•œλ‹€. 값을 μ§€μ •ν•˜μ§€ μ•Šμ€ ν”„λ‘œνΌν‹°μ—λŠ” 기본값이 μ§€μ •λœλ‹€.

animation-duration은 λ°˜λ“œμ‹œ 지정해야 ν•œλ‹€. μ§€μ •ν•˜μ§€ μ•ŠλŠ” 경우 κΈ°λ³Έκ°’ 0sκ°€ μ…‹νŒ…λ˜μ–΄ μ–΄λ– ν•œ μ• λ‹ˆλ©”μ΄μ…˜λ„ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

animation: name duration timing-function delay iteration-count direction fill-mode play-state
κΈ°λ³Έκ°’     none    0          ease         0          1          normal     none      running
/*name duration timing-function delay */
animation: myAnimation 2s linear 2s;

# 참고자료

https://poiemaweb.com/css3-transition

https://poiemaweb.com/css3-animation

https://poiemaweb.com/css3-transform