CSS ì ëë©ì´ì ì ì¬ì©íë©´ ìë°ì¤í¬ë¦½í¸ ìì´ë ê°ë¨í ì ëë©ì´ì ì ë§ë¤ ì ììµëë¤.
ì¬ê¸°ì ìë°ì¤í¬ë¦½í¸ë¥¼ ëíë©´ CSS ì ëë©ì´ì ì ì¡°ì í ì ìê³ , ì§§ì ì½ëë¡ë í¨ì¬ ë í¨ê³¼ì ì¸ ì ëë©ì´ì ì ë§ë¤ ì ììµëë¤.
CSS í¸ëì§ì
CSS í¸ëì§ì ì´ ëì¨ ë°°ê²½ì ë¨ìí©ëë¤. ì ëë©ì´ì ê´ë ¨ íë¡í¼í°ë¥¼ ë§ë¤ê³ , íë¡í¼í° ê°ì íµí´ ì ëë©ì´ì í¨ê³¼ë¥¼ ì ìí´ë³´ìë ë°ì ì¶ë°íìµëë¤. íë¡í¼í°ê° ë³íë©´ ë¸ë¼ì°ì ë ìëì¼ë¡ íë¡í¼í° ê°ì í´ë¹íë ì ëë©ì´ì ì íë©´ì ë³´ì¬ì£¼ìë ìëì´ì£ .
ë°ë¼ì ê°ë°ìë ê°ë§ ë³ê²½íë©´ ë©ëë¤. íë¡í¼í° ê°ì´ ë³ê²½ëë©´ ìì°ì¤ë¬ì´ í¸ëì§ì (ì í) í¨ê³¼ë ë¸ë¼ì°ì ê° ììì ì²ë¦¬í´ì¤ëë¤.
ìì를 ì´í´ë´
ìë¤. ìë CSS를 ì ì©íë©´ 3ì´ ëì background-colorê° ììí ë³í©ëë¤.
.animated {
transition-property: background-color;
transition-duration: 3s;
}
ì´ CSS를 ì ì©íë©´ animated í´ëì¤ ìì±ì´ ìë ììì background-colorê° 3ì´ ëì ë³íê² ëì£ .
ë¤ë¥¸ ìì를 ì´í´ë´ ìë¤. ë²í¼ì í´ë¦íë©´ ë²í¼ ë°°ê²½ìì´ ë³í©ëë¤.
<button id="color">í´ë¦</button>
<style>
#color {
transition-property: background-color;
transition-duration: 3s;
}
</style>
<script>
color.onclick = function() {
this.style.backgroundColor = 'red';
};
</script>
CSS í¸ëì§ì ì ì¬ì©ëë íë¡í¼í°ë ë¤ ê°ì§ì ëë¤.
transition-propertytransition-durationtransition-timing-functiontransition-delay
ê° íë¡í¼í°ì ëí´ìë ì ì íì ë¤ë£° ìì ì
ëë¤. ì§ê¸ì transitionì´ë¼ë ê³µíµ íë¡í¼í°ë¥¼ ì¬ì©í´ ì´ ë¤ íë¡í¼í°ë¥¼ í ë²ì ì ì¸í ì ìë¤ë ì¬ì¤ ì ëë§ ììë¡ìë¤. transition íë¡í¼í°ì ê°ì ë£ì´ì£¼ë©´ ì´ ê°ì property, duration, timing-function, delay íë¡í¼í°ì ê°ê° í ë¹ëê³ , ì ëë©ì´ì
í¨ê³¼ë í ë²ì ì ì©ë©ëë¤.
ìëì ê°ì´ transition íë¡í¼í°ë¥¼ ì ìíë©´ font-sizeë 3ì´ ëì, colorë 2ì´ ëì ë³ííë ê²ì íì¸í ì ììµëë¤.
<button id="growing">í´ë¦</button>
<style>
#growing {
transition: font-size 3s, color 2s;
}
</style>
<script>
growing.onclick = function() {
this.style.fontSize = '36px';
this.style.color = 'red';
};
</script>
ì´ì 본격ì ì¼ë¡ ê° íë¡í¼í°ë¥¼ ì´í´ë´ ìë¤.
transition-property
transition-property íë¡í¼í°ì left, margin-left, height, color ê°ì´ ì ëë©ì´ì
í¨ê³¼ë¥¼ ì ì©í íë¡í¼í° 목ë¡ì ì ìí©ëë¤.
ì´ë 주ìí ì ì 모ë íë¡í¼í°ì ì ëë©ì´ì í¨ê³¼ë¥¼ ì ì©í ì ìë¤ë ì¬ì¤ì ëë¤. ì°¸ê³ ë¡ íí ì¬ì©ëë íë¡í¼í° ëë¤ìì ì ëë©ì´ì í¨ê³¼ë¥¼ ì ì©í ì ììµëë¤.
transition-duration
transition-duration íë¡í¼í°ì ì ëë©ì´ì
í¨ê³¼ë¥¼ ì¼ë§ ëì ì¤ì§ë¥¼ ì¤ì í©ëë¤. ìê°ì CSS ìê° íì(CSS time format)ì ë°ë¼ì¼ íëë°, ì´ ë¨ì(s)ë ë°ë¦¬ì´ ë¨ì(ms)를 ì¬ì©í ì ììµëë¤.
transition-delay
transition-delay íë¡í¼í°ì ì ëë©ì´ì
í¨ê³¼ê° ììë기 ì ì ì¼ë§ë§í¼ì ì§ì° ìê°ì ì¤ì§ ì¤ì í©ëë¤. transition-delay ê°ì 1së¡ ì¤ì íë©´ ì ëë©ì´ì
í¨ê³¼ê° 1ì´ íì ëíë©ëë¤.
transition-delayì ìì ê°ë ë£ì ì ììµëë¤. ê°ì´ ììì¼ ë ì ëë©ì´ì
í¨ê³¼ê° ì¤ê°ë¶í° ëíë©ëë¤. transition-durationì 2s, ì§ì° ìê°ì -1së¡ ì¤ì íë©´ ì ëë©ì´ì
í¨ê³¼ë 1ì´ê° ì§ë í 1ì´ ëì ì§ìë©ëë¤.
CSS translate íë¡í¼í°ì ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì ì¬ì©í´ 0ë¶í° 9ê¹ì§ê° íë©´ì ìì°ì¤ë½ê² ëíëëë¡ í´ë´
ìë¤.
stripe.onclick = function() {
stripe.classList.add('animate');
};#digit {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
ìë ì«ì를 í´ë¦íì¸ì.
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>ì°¸ê³ ë¡ ì«ì를 ì¼ìª½ì¼ë¡ ì´ëìí¤ê¸° ìí´ transform íë¡í¼í°ì translate(-90%)를 ë£ììµëë¤.
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
}
ì«ì를 í´ë¦íë©´ ìë°ì¤í¬ë¦½í¸ê° ì¤íëë©´ì ì«ìê° ë¤ì´ ìë ìì(stripe)ì animate í´ëì¤ê° ì¶ê°ëê³ ì ëë©ì´ì
í¨ê³¼ê° ëíë©ëë¤.
stripe.classList.add('animate');
ì´ë²ì transition-delayì ìì를 ì¨ì ìì를 ì½ê° ë³íí´ë´
ìë¤. íì¬ ìê°ì 기ì¤ì¼ë¡ 'ì´â를 ì¶ì¶íê³ , ì´ ê°ì ë§ì´ëì¤ ê¸°í¸ë¥¼ ë¶ì¬ì transition-delay ê°ì¼ë¡ ì§ì íë©´ íì¬ ì´ë¥¼ 기ì¤ì¼ë¡ ì«ìê° ëíëê³ , ì ëë©ì´ì
í¨ê³¼ê° ì ì©ëë ê²ì íì¸í ì ììµëë¤.
ì§ì ì«ì를 í´ë¦í´ë³´ì¸ì. íì¬ ë ì§ê° 2020ë 9ì 12ì¼ ì¤í 12ì 17ë¶ 8ì´ë¼ë©´, ì«ì 8ë¶í° ì¤ë¥´ë¥µ ì´ëí©ëë¤.
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};#digit {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
ìë ì«ì를 í´ë¦íì¸ì.
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>ì¬ì©í ì½ëë ìëì ê°ìµëë¤.
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
// secê° 3ì´ë¼ë©´ transitionDelay ê°ì´ -3sê° ëì´ 3ë¶í° ì ëë©ì´ì
í¨ê³¼ê° ì ì©ë©ëë¤.
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};
transition-timing-function
transition-timing-function íë¡í¼í°ë¥¼ ì¬ì©í´ timing í¨ì를 ë§ë¤ë©´ ìê°ì ë°ë¼ ì ëë©ì´ì
í¨ê³¼ë¥¼ ì´ë»ê² ë¶ë°°í ì§ë¥¼ ì¤ì í ì ììµëë¤. ì ëë©ì´ì
í¨ê³¼ê° ì´ë°ì ì²ì²í ëíëë¤ê° ëì¤ì ë¹ ë¥´ê² ëíëê² í ì ìê³ , ë¬¼ë¡ ì´ ë°ëë ê°ë¥í©ëë¤.
ì²ì ì´ íë¡í¼í°ë¥¼ ì íë©´ ì ëë©ì´ì íë¡í¼í° ì¤ ê°ì¥ ë³µì¡í íë¡í¼í° ê°ë¤ê³ ëë ì ììµëë¤. ê·¸ë ì§ë§ ìê°ì ì¡°ê¸ í¬ìí´ íìµíë©´ ë§¤ì° ê°ë¨í íë¡í¼í°ë¼ë ìê°ì´ ë¤ ê²ëë¤.
transition-timing-function íë¡í¼í° ê°ì ë² ì§ì´ 곡ì (bezier curve)ì´ë ë¨ê³(step)ê° ì¬ ì ììµëë¤. 먼ì ì¬ì© ë¹ëê° ëì ë² ì§ì´ 곡ì ë¶í° ììë´
ìë¤.
ë² ì§ì´ 곡ì
transition-timing-functionì ì¡°ì ì ì´ 4ê°ë©´ì ìë ì¡°ê±´ì ë§ì¡±íë ë² ì§ì´ 곡ì ì ì§ì í ì ììµëë¤.
- 첫 ë²ì§¸ ì¡°ì ì :
(0,0) - ë§ì§ë§ ì¡°ì ì :
(1,1) - ì¤ê° ì¡°ì ì ë¤:
xê°0ê³¼1ì¬ì´ì ìì´ì¼ í¨.yì ì ì½ì´ ìì
CSSìì ë² ì§ì´ 곡ì ì cubic-bezier(x2, y2, x3, y3)ííë¡ ì ìí©ëë¤. ê·ì¹ì ë°ë¼ 첫 ë²ì§¸ ì¡°ì ì ì (0,0), ë¤ ë²ì§¸ ì¡°ì ì ì (1,1)ë¡ ê³ ì ëë¯ë¡ ë ë²ì§¸ì ì¸ ë²ì§¸ ì¡°ì ì ë§ ì¤ì íë©´ ë©ëë¤.
ì¡°ì ì ì ë³ê²½í´ ë§ë ë² ì§ì´ 곡ì ì ì¬ì©í´ ì ìí timing í¨ìë ìê°ì´ ì§ë¨ì ë°ë¼ ì¼ë§ë ë¹ ë¥´ê² ì ëë©ì´ì í¨ê³¼ê° ëíëê² í ì§ë¥¼ ë³´ì¬ì¤ëë¤.
xì¶ì ìê°ì´ ë©ëë¤.0ì ì ëë©ì´ì ììíë ìê°,1ì ëëë ìê°ì ëíë ëë¤.yì¶ì íë¡ì¸ì¤ ìì± ì ë를 ëíë ëë¤.0ì íë¡í¼í° ìì ê°,1ì ìµì¢ ê°ì ëíë ëë¤.
ê°ì¥ ê°ë¨í timing í¨ì를 ì ì©íë©´ ì ëë©ì´ì
í¨ê³¼ê° ì¼ì í ìëë¡ ëíë©ëë¤. cubic-bezier(0, 0, 1, 1)를 ì¬ì©í´ 기ì¸ê¸°ê° 1ì¸ ì§ì í í¨ì를 ë§ë¤ì´ë´
ìë¤.
ë² ì§ì´ 곡ì ì´ ì´ë ê² ê·¸ë ¤ì§ê² ì£ .
ë³´ìë¤ìí¼ ê·¸ë¥ ì§ì ì
ëë¤. ìê°(x)ì´ ì§ëë©´ì ì ëë©ì´ì
ì ìì±ë(y)ê° 0ìì 1ë¡ ê¾¸ì¤í ì¬ë¼ê°ëë¤.
ì´ì ìë 기차를 í´ë¦í´, ê¸°ì°¨ê° ì¼ì í ìëë¡ ì¼ìª½ìì ì¤ë¥¸ìª½ì¼ë¡ ì´ëíê² í´ë´ ìë¤.
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="train" src="https://js.cx/clipart/train.gif" onclick="this.style.left='450px'">
</body>
</html>ì¤ì ì¬ì©í ì¤íì¼ì ë¤ìê³¼ ê°ìµëë¤.
.train {
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
/* left ìì±ê°(450px)ì ìë°ì¤í¬ë¦½í¸ìì ì¤ì í¨ */
}
ì´ì ê¸°ì°¨ê° ì ì ëë¦¬ê² ì´ëíëë¡ ë§ë¤ì´ë´ ìë¤.
ë¤ë¥¸ ë² ì§ì´ 곡ì cubic-bezier(0.0, 0.5, 0.5 ,1.0)ì ì¬ì©í´ì ë§ì´ì£ .
ìë¡ì´ ë² ì§ì´ 곡ì ì ë¤ìê³¼ ê°ìµëë¤.
ê·¸ëíìì ë³¼ ì ìë¯ì´ íë¡ì¸ì¤ë ì´ë°ì ë¹ ë¥´ê² ì§íëë¤ê° ì ì ëë ¤ì§ ê²ëë¤.
기차를 í´ë¦í´ ì¤ì timing í¨ìê° ì´ë»ê² ì ì©ëìëì§ íì¸í´ë´ ìë¤.
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0px;
transition: left 5s cubic-bezier(0.0, 0.5, 0.5, 1.0);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="train" src="https://js.cx/clipart/train.gif" onclick="this.style.left='450px'">
</body>
</html>CSS:
.train {
left: 0;
transition: left 5s cubic-bezier(0, .5, .5, 1);
/* left ìì±ê°(450px)ì ìë°ì¤í¬ë¦½í¸ìì ì¤ì í¨ */
}
ì§ì ë² ì§ì´ 곡ì ì ë§ëë ê² ë§ê³ , ë´ì¥ 곡ì ì ì¬ì©í ìë ììµëë¤. ë´ì¥ 곡ì ì linear, ease, ease-in, ease-out, ease-in-out ë±ì´ ììµëë¤.
linearë ììì 본 ì§ì ííì timing í¨ì를 ì¸ ë ì¬ì©ë cubic-bezier(0, 0, 1, 1)ì ëì¼í í¨ê³¼ë¥¼ ì¤ëë¤.
ê° ë´ì¥ 곡ì ì ëìíë ë² ì§ì´ 곡ì ì ë¤ìê³¼ ê°ìµëë¤.
ease* |
ease-in |
ease-out |
ease-in-out |
|---|---|---|---|
(0.25, 0.1, 0.25, 1.0) |
(0.42, 0, 1.0, 1.0) |
(0, 0, 0.58, 1.0) |
(0.42, 0, 0.58, 1.0) |
*ë¡ íìí ë´ì¥ 곡ì easeë timing í¨ìê° ìì ë 기본ê°ì¼ë¡ ì¬ì©ë©ëë¤.
ì´ì ease-outì ì¬ì©í´ ê¸°ì°¨ê° ì ì ëë ¤ì§ëë¡ í´ë´
ìë¤.
.train {
left: 0;
transition: left 5s ease-out;
/* transition: left 5s cubic-bezier(0, .5, .5, 1); */
}
ë² ì§ì´ 곡ì cubic-bezier(0.0, 0.5, 0.5 ,1.0)ì ì¬ì©í ê²ì²ë¼ ê¸°ì°¨ê° ì ì ëë ¤ì§ê¸´ íì§ë§ íë¡ì¸ì¤ ì ëê° ì¡°ê¸ ë¤ë¥¸ ê²ì íì¸í ì ììµëë¤.
íí¸, ë² ì§ì´ 곡ì ì ì¬ì©íë©´ ì ëë©ì´ì ì´ ì§ì í ë²ì를 âëì´ìâ ì ì©ëê² í ì ììµëë¤.
ë² ì§ì´ 곡ì ìì ì¤ê° ì¡°ì ì ì y ì¢íë ì ì½ì´ ììµëë¤. ìì ëë ë§¤ì° í° ê°ë ê°ë¥íì£ . ê·¸ë°ë° ì¡°ì ì ì y ì¢íê° ìì ëë í° ê°ì¼ ë ë² ì§ì´ 곡ì ì ë§¤ì° ë®ê±°ë ëê² ê·¸ë ¤ì§ëë¤. ì´ë¬ë©´ ì ëë©ì´ì
ì´ ì ì ë²ì를 ë²ì´ë©ëë¤.
ìë쪽 기차 ììì ë¤ìê³¼ ê°ì css를 ì ì©íë¤ê³ ê°ì í´ë´ ìë¤.
.train {
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
/* left ìì±ê°(400px)ì ìë°ì¤í¬ë¦½í¸ìì ì¤ì í¨ */
}
ì´ cssê° ì ì©ëë©´, left íë¡í¼í°ê° 100pxìì 400pxë¡ ì ì°¨ ë³í´ì¼ í©ëë¤.
ê·¸ë°ë° 기차를 í´ë¦íë©´ 기차ë ë¤ìê³¼ ê°ì´ ìì§ì ëë¤.
- 먼ì ê¸°ì°¨ê° ë¤ë¡ ì´ëí©ëë¤.
leftê°ì100pxë³´ë¤ ì¡°ê¸ ìëê² ì¤ì ë©ëë¤. - ê·¸ë¦¬ê³ ëì ë¤ì 기차ë ìì¼ë¡ ì´ëí©ëë¤. ì´ë
leftê°ì400pxë³´ë¤ ì¡°ê¸ í½ëë¤. - ê·¸ë¦¬ê³ ëì
leftê°400pxì¼ ëì ìì¹ë¡ íì§í©ëë¤.
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
}<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<img class="train" src="https://js.cx/clipart/train.gif" onclick="this.style.left='400px'">
</body>
</html>ì ì´ë ê² ì´ëíëì§ë ìëì ë² ì§ì´ 곡ì ê·¸ëí를 ë³´ë©´ ì주 ëª íí ì ì ììµëë¤.
ë ë²ì§¸ ì¡°ì ì ì y ì¢íê° 0ë³´ë¤ ììì§ê³ , ì¸ ë²ì§¸ ì¡°ì ì ì ì¢íê° 1ë³´ë¤ ì»¤ì§ë©´ì 곡ì ì´ âì ìâ ë²ì를 ë²ì´ë ê²ì íì¸í ì ììµëë¤. âì ìâ ë²ìì¸ 0..1ì ë²ì´ë ê²ì´ì£ .
ììë¤ìí¼, timing í¨ìì yì¶ì 'ì ëë©ì´ì
íë¡ì¸ì¤ì ìì±ëâ를 ëíë
ëë¤. yê° 0ì¼ ë íë¡í¼í° ìì ê°ì, yê° 1ì¼ ë íë¡ì¸ì¤ ì¢
ë£ ê°ì ì미íì£ . ê·¸ë 기 ë문ì yê° 0ë³´ë¤ ììì§ë©´ left íë¡í¼í°ê° ìì ê°ì¸ 100px ë³´ë¤ ë®ê² ì¤ì ëê³ , yê° 1ë³´ë¤ ì»¤ì§ë©´ left íë¡í¼í°ê° ëê°ì¸ 400pxë³´ë¤ ì»¤ì§ê² ë©ëë¤.
ì´ ìììì y ê°ì´ ì ì ë²ì를 í¬ê² ë²ì´ëì§ ì기 ë문ì âë¶ëë½ê²â ë³íì´ ì¼ì´ë©ëë¤. ê·¸ë°ë° y ê°ì´ -99ë 99ê° ëë©´ ê¸°ì°¨ê° ì·ë¤ë¡ ì주 í¬ê² ìì§ì´ê² ì£ ?
ì´ì¯¤ ëë©´ ìíë ì ëë©ì´ì í¨ê³¼ë¥¼ ì¤ ì ìë ë² ì§ì´ 곡ì ì ì´ë»ê² ë§ë¤ ì ììì§ ìë¬¸ì´ ë¤ ê²ëë¤. ë² ì§ì´ 곡ì ì ë§ë¤ì´ì£¼ë í´ì ë¤ìíë°, http://cubic-bezier.com/ììë ê°ë¥í©ëë¤.
ë¨ê³
timing í¨ì steps(number of steps[, start/end])를 ì¬ì©íë©´ ì ëë©ì´ì
ì ì¬ë¬ ë¨ê³(step)ë¡ ëë ì ììµëë¤.
ì«ì를 ì¬ì©í´ ìì를 ë§ë¤ì´ë´ ìë¤.
ì§ê¸ì ì ëë©ì´ì ì ì ì©íì§ ìììµëë¤.
#digit {
border: 1px solid red;
width: 1.2em;
}
#stripe {
display: inline-block;
font: 32px monospace;
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="digit"><div id="stripe">0123456789</div></div>
</body>
</html>ì´ì ì ëë©ì´ì ì ì ì©í´ ë¹¨ê° âë°ì¤â ë°ì ìë ì«ìë¤ì ì¨ê¸°ê³ , ë¨ê³ë³ë¡ ì«ì 목ë¡ì ì¼ìª½ì¼ë¡ ì´ë ìì¼, ì¬ì©ì ëì ì«ìê° íëì© ì¦ê°íë ê²ì²ë¼ ë³´ì´ê² í©ìë¤.
9ê¹ì§ ì«ì를 ì¦ê°ìì¼ì¼ íë¯ë¡ ë¨ê³ë ì´ 9ê°ê° ë©ëë¤.
#stripe.animate {
transform: translate(-90%);
transition: transform 9s steps(9, start);
}
ì«ì를 í´ë¦í´ ìíë ëë¡ ëìíëì§ íì¸í´ë´ ìë¤.
#digit {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, start);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
ìë ì«ì를 í´ë¦íì¸ì.
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>timing í¨ì steps(9, start)ìì 첫 ë²ì§¸ ì¸ìë ë¨ê³ì ìì´ë¯ë¡ ì ì²´ íë¡ì¸ì¤ê° 9ë¨ê³ë¡ ëë ì ì©ë 10%ì© ì§íëë ê²ì íì¸í ì ììµëë¤. ì´ë ìê° ê°ê²©ë ìëì¼ë¡ 9ë¨ê³ë¡ ëë기 ë문ì 1ì´ ê°ê²©ì¼ë¡ ì«ìê° ì¦ê°íê² ë©ëë¤.
ë ë²ì§¸ ì¸ìë startë end ì¤ íëì
ëë¤.
ë ë²ì§¸ ì¸ìê° startì¸ ê²½ì°ì ì ëë©ì´ì
ì´ ì²« ë²ì§¸ ë¨ê³ë¶í° ë°ë¡ ììë©ëë¤.
ì«ì를 í´ë¦íë©´ ì«ìê° 1ë¡ ë°ë¡ ë°ëê³ (첫 ë²ì§¸ ë¨ê³), 1ì´ íì ë¤ì ì«ì(ë¤ì ë¨ê³)ë¡ ë°ëë ê²ì íì¸í ì ììµëë¤.
ì´ë³ë¡ íë¡ì¸ì¤ê° ëª %ì© ì§íëëì§ë¥¼ ì 리íë©´ ë¤ìê³¼ ê°ì£ .
0sâ-10%(ì ëë©ì´ì ì´ ììíìë§ì ë°ë¡ 첫 ë²ì§¸ ë¨ê³ê° ìíë¨)1sâ-20%- â¦
8sâ-80%- (ë§ì§ë§ ì´ì ìµì¢ ê°ì´ ëíë¨)
ë°ë©´ ë ë²ì§¸ ì¸ìê° endì¸ ê²½ì°ì ì ëë©ì´ì
ì´ ë°ë¡ ììíì§ ìê³ ê° ì´ê° ëë ë ììë©ëë¤.
ì´ë³ íë¡ì¸ì¤ ì ëë ë¤ìê³¼ ê°ìµëë¤.
0sâ01sâ-10%(1ì´ê° ì§ë íì 첫 ë¨ê³ê° ìíë¨)2sâ-20%- â¦
9sâ-90%
ë ë²ì§¸ ì¸ì를 ë³í ìì¼(steps(9, end)) ì¤ì ì´ë»ê² ì ëë©ì´ì
ì´ ë³ííëì§ íì¸í´ë´
ìë¤.
#digit {
width: .5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, end);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
ìë ì«ì를 í´ë¦íì¸ì.
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>ì°¸ê³ ë¡ ë¤ìê³¼ ê°ì ë´ì¥ ê°ì ì¬ì©í´ timing í¨ì를 ì§ì í ìë ììµëë¤.
step-startâsteps(1, start)ì ê°ìµëë¤. ë°ë¼ì ì ëë©ì´ì ì 첫 ë¨ê³ê° ë°ë¡ ììëê³ ì²« ë²ì§¸ ë¨ê³ë§ ì¤íë©ëë¤. ë§ì¹ ì ëë©ì´ì í¨ê³¼ê° ìë ê²ì²ë¼ ë³´ì ëë¤.step-endâsteps(1, end)ì ê°ìµëë¤.transition-durationì ëì ì ëë©ì´ì ì´ í ë¨ê³ë§ ì§íë©ëë¤.
ì ê°ë¤ì ì¬ì©íë©´ ìì§ì´ë í¨ê³¼ë¥¼ ë³¼ ì ì기 ë문ì ê±°ì ì¬ì©ëì§ ììµëë¤.
transitionend ì´ë²¤í¸
CSS ì ëë©ì´ì
ì´ ëëë©´ transitionend ì´ë²¤í¸ê° ìëì¼ë¡ í¸ë¦¬ê±°ë©ëë¤.
transitionend ì´ë²¤í¸ë ì ëë©ì´ì
ì´ ëë¬ì ë 무ì¸ê°ë¥¼ íê³ ì¶ì ê²½ì° ë§ì´ ì¬ì©ë©ëë¤. ì ëë©ì´ì
ì¬ë¬ ê°ë¥¼ ì¡°í©í ëë ì주 ì°ì´ì£ .
ì를 ë¤ì´ë´ ìë¤. ìë ìììì 배를 í´ë¦íë©´ ë°°ê° ì¤ë¥¸ìª½, ì¼ìª½ì¼ë¡ ìì§ì´ëë° íë² ìë³µí ëë§ë¤ ì¤ë¥¸ìª½ì¼ë¡ ë ë©ë¦¬ ì´ëí©ëë¤.
í¸ëì§ì
ì´ ì¢
ë£ë ëë§ë¤ ë°©í¥ì ë¤ì§ë í¨ì goê° ë¤ì ì¤íëë©´ì ìë¡ì´ ì ëë©ì´ì
ì´ ììëë ê²ì´ì£ .
boat.onclick = function() {
//...
let times = 1;
function go() {
if (times % 2) {
// ì¤ë¥¸ìª½ì¼ë¡ ê°ê¸°
boat.classList.remove('back');
boat.style.marginLeft = 100 * times + 200 + 'px';
} else {
// ì¼ìª½ì¼ë¡ ê°ê¸°
boat.classList.add('back');
boat.style.marginLeft = 100 * times - 200 + 'px';
}
}
go();
boat.addEventListener('transitionend', function() {
times++;
go();
});
};
í¸ë ì§ì ê³¼ ê´ë ¨ë ì´ë²¤í¸ë ëª ê°ì§ í¹ì íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
event.propertyName- ì ëë©ì´ì ì´ ìë£ë íë¡í¼í°ë¡, ëìì ì¬ë¬ ê°ì íë¡í¼í°ì ì ëë©ì´ì í¨ê³¼ë¥¼ ì¤ ë ì¬ì©í ì ììµëë¤.
event.elapsedTimetransition-delayê° ìë¤ë ê°ì íì ì ëë©ì´ì í¨ê³¼ì 걸린 ìê°(ì´)ì ëíë ëë¤.
keyframes
CSS 문ë²ì¸ @keyframesì ì¬ì©íë©´ ê°ë¨í ì ëë©ì´ì
ì¬ë¬ ê°ë¥¼ í꺼ë²ì ì¤íìí¬ ì ììµëë¤.
@keyframesì ì ëë©ì´ì
'ì´ë¦âê³¼ 무ìì, ì¸ì , ì´ëì ìì§ì¼ì§ë¥¼ ì¤ì í ì ììµëë¤. @keyframesì ì ì í ê°ì ë£ì íì animation íë¡í¼í°ë¥¼ ì¬ì©í´ ìíë ììì 커ì¤í
ì ëë©ì´ì
ì ì ì©í ì ììµëë¤. ë¬¼ë¡ ì¶ê° 매ê°ë³ìë ì§ì í ì ììµëë¤.
주ìì ì¤ëª ì ë¬ìëì ìì를 ì´í´ë´ ìë¤.
<div class="progress"></div>
<style>
@keyframes go-left-right { /* ì ëë©ì´ì
ì´ë¦ ì§ì : "go-left-right" */
from { left: 0px; } /* left 0px ë¶í° ì ëë©ì´ì
ìì */
to { left: calc(100% - 50px); } /* left ê°ì´ 100%-50px ë ëê¹ì§ ì ëë©ì´ì
ì ì© */
}
.progress {
animation: go-left-right 3s infinite alternate;
/* í´ë¹ ììì 커ì¤í
ì ëë©ì´ì
'go-left-right' ì ì©
ì§ì ìê°ì 3ì´,
ë°ë³µ íìë 무í(infinite)
ë°©í¥ì ë§¤ë² ë°ë
*/
position: relative;
border: 2px solid green;
width: 50px;
height: 20px;
background: lime;
}
</style>
@keyframesì ë¤ë£¨ë ê¸ì´ë ëª
ì¸ì를 ì½ì¼ë©´ ë ë§ì ì 보를 ì°¾ì ì ìì¼ë ì°¸ê³ í´ë³´ì기 ë°ëëë¤.
ì°¸ê³ ë¡ ì¬ì´í¸ì ìë í¹ì ìì를 ê³ì ì ì ì¸ ííë¡ ìì§ì´ì§ ìë íì @keyframes를 ì¸ ì¼ì ë§ì§ ìì ê²ëë¤.
ìì½
CSS ì ëë©ì´ì ì ì¬ì©íë©´ íë ëë ì¬ë¬ CSS íë¡í¼í°ë¥¼ ë¶ëë½ê²(ë¶ëë½ì§ ìê²ë ê°ë¥) ë³íìí¬ ì ììµëë¤.
CSS ì ëë©ì´ì ì ì íì´ íìí ëë¤ìì ê²½ì°ì í° ëìì ì¤ëë¤. ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©í´ë ì í í¨ê³¼ë¥¼ ì¤ ì ì긴 íë° ì´ì ëí´ì ë¤ì ì±í°ìì ë¤ë£° ìì ì ëë¤.
ì°¸ê³ ë¡ CSS ì ëë©ì´ì ì ìë°ì¤í¬ë¦½í¸ ì ëë©ì´ì ê³¼ ë¹êµí´ ë¤ìê³¼ ê°ì ì¥ë¨ì ì´ ììµëë¤.
- ê°ë¨í ì ëë©ì´ì ì ê°ë¨í ìíí¨
- ë¹ ë¥´ê³ CPU를 ë§ì´ ì모íì§ ìì
- ìë°ì¤í¬ë¦½í¸ ì ëë©ì´ì ë³´ë¤ ë ì ì°í¨. ììì âíë°â ê°ì í¹ìí ì ëë©ì´ì ë¡ì§ì 구íí ì ìì
- ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©íë©´ íë¡í¼í°ì ë³íë¿ë§ ìëë¼, ì ëë©ì´ì ì íìí ìë¡ì´ ìì를 ë§ë¤ ì ìëë°, CSSë§ì¼ë¡ë ë¶ê°ë¥í¨
ì¬ì¤ ëë¶ë¶ì ì ëë©ì´ì
ì ì´ë² ì±í°ì ì¤ëª
í CSS íë¡í¼í°ë¥¼ ì¬ì©í´ 구íí ì ììµëë¤. ì¬ê¸°ì ëíì¬ transitionend ì´ë²¤í¸ë¥¼ ì¬ì©í´ ì ëë©ì´ì
ì´ ëë íì ì¤íìí¬ ìë°ì¤í¬ë¦½í¸ ì½ë를 ì§ì í ìë ìì£ .
íì§ë§ ì¢ ë ë³µì¡í ì¼ì´ì¤ë¥¼ ë¤ë£¨ë ¤ë©´ ìë°ì¤í¬ë¦½í¸ ì ëë©ì´ì ì ììì¼ íë¯ë¡ ë¤ì ì±í°ìì ì´ë¥¼ ë¤ë¤ë³´ê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.