CSS å¨ç»å¯ä»¥å¨ä¸åå© Javascript çæ åµä¸ååºä¸äºç®åçå¨ç»ææã
ä½ ä¹å¯ä»¥éè¿ Javascript æ§å¶ CSS å¨ç»ï¼ä½¿ç¨å°éç代ç ï¼å°±è½è®©å¨ç»è¡¨ç°æ´å åºè²ã
CSS è¿æ¸¡ï¼transitionï¼[#css-transition]
CSS è¿æ¸¡çç念é常ç®åï¼æä»¬åªéè¦å®ä¹æä¸ä¸ªå±æ§ä»¥åå¦ä½å¨æå°è¡¨ç°å ¶ååãå½å±æ§ååæ¶ï¼æµè§å¨å°ä¼ç»å¶åºç¸åºçè¿æ¸¡å¨ç»ã
ä¹å°±æ¯è¯´ï¼æä»¬åªéè¦æ¹åæä¸ªå±æ§ï¼ç¶åæææµç çå¨ç»é½ç±æµè§å¨çæã
举个ä¾åï¼ä»¥ä¸ CSS ä¼ä¸º backgroud-color çååçæä¸ä¸ª 3 ç§çè¿æ¸¡å¨ç»ï¼
.animated {
transition-property: background-color;
transition-duration: 3s;
}
ç°å¨ï¼åªè¦ä¸ä¸ªå
ç´ æ¥æå为 .animated çç±»ï¼é£ä¹ä»»ä½èæ¯é¢è²çååé½ä¼è¢«æ¸²æä¸º 3 ç§éçå¨ç»ã
åå»ä»¥ä¸æé®ä»¥æ¼ç¤ºå¨ç»ï¼
<button id="color">Click me</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 ä¸ä»¥ property duration timing-function delay ç顺åºä¸æ¬¡æ§å®ä¹å®ä»¬ï¼å¹¶ä¸å¯ä»¥åæ¶ä¸ºå¤ä¸ªå±æ§è®¾ç½®è¿æ¸¡å¨ç»ã
请ç以ä¸ä¾åï¼ç¹å»æé®çæ color å font-size çè¿æ¸¡å¨ç»ï¼
<button id="growing">Click me</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ã
䏿¯ææç CSS 屿§é½å¯ä»¥ä½¿ç¨è¿æ¸¡å¨ç»ï¼ä½æ¯å®ä»¬ä¸ç大夿°é½æ¯å¯ä»¥çãall 表示åºç¨å¨ææå±æ§ä¸ã
transition-duration
transition-duration å
许æä»¬æå®å¨ç»æç»çæ¶é´ãæ¶é´çæ ¼å¼åç
§ CSS æ¶é´æ ¼å¼ï¼åä½ä¸ºç§ s æè
æ¯«ç§ msã
transition-delay
transition-delay å
许æä»¬è®¾å®å¨ç»å¼å§åçå»¶è¿æ¶é´ãä¾å¦ï¼å¯¹äº transition-delay: 1sï¼å¨ç»å°ä¼å¨å±æ§åååç 1 ç§åå¼å§æ¸²æã
ä½ ä¹å¯ä»¥æä¾ä¸ä¸ªè´å¼ãé£ä¹å¨ç»å°ä¼ä»æ´ä¸ªè¿æ¸¡çä¸é´æ¶å»å¼å§æ¸²æãä¾å¦ï¼å¯¹äº transition-duration: 2sï¼åæ¶æ delay 设置为 -1sï¼é£ä¹è¿ä¸ªå¨ç»å°ä¼æç» 1 ç§éï¼å¹¶ä¸ä»æ£ä¸é´å¼å§æ¸²æã
è¿éæ¼ç¤ºäºæ°åä» 0 å° 9 çå¨ç»ï¼ä½¿ç¨äº CSS translate æ¹æ³ï¼
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>
Click below to animate:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>å¦ä¸å¨ tranform 屿§ä¸åºç¨å¨ç»ï¼
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
}
å¨ä»¥ä¸çä¾åä¸ï¼JavaScript æ .animate 类添å å°äºå
ç´ ä¸ï¼ç±æ¤è§¦åäºå¨ç»ï¼
stripe.classList.add('animate');
æä»¬ä¹å¯ä»¥ãä»ä¸é´ãå¼å§ï¼ä¹å°±æ¯è¯´ä»æä¸ªç¹å®æ°åå¼å§ï¼æ¯æ¹è¯´ï¼ä»å½åçæ¶é´çç§æ°å¼å§ãè¿å°±è¦ç¨å°è´ç transition-delayã
æ¤å¤ï¼å¦æä½ åå»è¿ä¸ªæ°åï¼é£ä¹å®ä¼ä»å½åçç§æ°å¼å§æ¸²æï¼
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>
Click below to animate:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>åªéæ·»å ä¸è¡ JavaScript 代ç ï¼
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
// for instance, -3s here starts the animation from the 3rd second
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};
transition-timing-function
æ¶é´å½æ°æè¿°äºå¨ç»è¿ç¨å¨æ¶é´ä¸çåå¸ã宿¯å æ ¢åå¿«è¿æ¯å å¿«åæ ¢ï¼
ä¹ä¸çï¼è¿å¯è½æ¯æå¤æç屿§äºï¼ä½æ¯ç¨å¾®è±ç¹æ¶é´ï¼ä½ å°±ä¼åç°å ¶å®ä¹å¾ç®åã
è¿ä¸ªå±æ§æ¥å两ç§å¼ï¼ä¸ä¸ªè´å¡å°æ²çº¿ï¼Bezier curveï¼æè é¶è·å½æ°ï¼stepsï¼ãæä»¬å ä»è´å¡å°æ²çº¿å¼å§ï¼è¿ä¹æ¯è¾ä¸ºå¸¸ç¨çã
è´å¡å°æ²çº¿ï¼Bezier curveï¼
æ¶é´å½æ°å¯ä»¥ç¨è´å¡å°æ²çº¿æè¿°ï¼éè¿è®¾ç½®åä¸ªæ»¡è¶³ä»¥ä¸æ¡ä»¶çæ§å¶ç¹ï¼
- 第ä¸ä¸ªåºä¸ºï¼
(0,0)ã - æåä¸ä¸ªåºä¸ºï¼
(1,1)ã - 对äºä¸é´å¼ï¼
xå¿ é¡»ä½äº0..1ä¹é´ï¼yå¯ä»¥ä¸ºä»»æå¼ã
CSS ä¸è®¾ç½®ä¸è´å¡å°æ²çº¿çè¯æ³ä¸ºï¼cubic-bezier(x2, y2, x3, y3)ãè¿éæä»¬åªéè¦è®¾ç½®ç¬¬äºä¸ªå第ä¸ä¸ªå¼ï¼å 为第ä¸ä¸ªç¹åºå®ä¸º (0,0)ï¼ç¬¬å个ç¹åºå®ä¸º (1,1)ã
æ¶é´å½æ°æè¿°äºå¨ç»è¿è¡çå¿«æ ¢ã
x轴表示æ¶é´ï¼0ââ å¼å§æ¶å»ï¼1ââtransition-durationçç»ææ¶å»ãy轴表示è¿ç¨çå®æåº¦ï¼0ââ 屿§çèµ·å§å¼ï¼1ââ 屿§çæç»å¼ã
æç®åçä¸ç§æ
åµå°±æ¯å¨ç»åéè¿è¡ï¼å¯ä»¥éè¿è®¾ç½®æ²çº¿ä¸º cubic-bezier(0, 0, 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>è¿ä¸ªéé¢ç CSS å°±æ¯åºäºåæé£æ¡æ²çº¿çï¼
.train {
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
/* JavaScript sets left to 450px */
}
â¦é£ä¹ï¼æä»¬å¦æè¡¨ç°åºåéè¡é©¶çå车å¢ï¼
æä»¬å¯ä»¥ä½¿ç¨å¦ä¸æ¡è´å¡å°æ²çº¿ï¼cubic-bezier(0.0, 0.5, 0.5 ,1.0)ã
å¾åå¦ä¸ï¼
æ£å¦æä»¬æè§ï¼è¿ä¸ªè¿ç¨èµ·åå¾å¿«ï¼æ²çº¿å¼å§è¿ éåé«ï¼ç¶åè¶æ¥è¶æ ¢ã
è¿æ¯å®é çæææ¼ç¤ºï¼
.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);
/* JavaScript sets left to 450px */
}
CSS æä¾å æ¡å
å»ºçæ²çº¿ï¼linearãeaseãease-inãease-out å ease-in-outã
linear å
¶å®å°±æ¯ 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 ä½ä¸ºé»è®¤å¼ã
æä»¥ï¼æä»¬å¯ä»¥ä½¿ç¨ ease-out æ¥è¡¨ç°åéè¡é©¶çå车ï¼
.train {
left: 0;
transition: left 5s ease-out;
/* transition: left 5s cubic-bezier(0, .5, .5, 1); */
}
使¯è¿çèµ·æ¥æç¹æªæªçã
è´å¡å°æ²çº¿å¯ä»¥ä½¿å¨ç»ãè¶ åºãå ¶åæ¬çèå´ã
æ²çº¿ä¸çæ§å¶ç¹ç y å¼å¯ä»¥ä½¿ä»»æçï¼ä¸ç®¡æ¯è´å¼è¿æ¯ä¸ä¸ªå¾å¤§çå¼ã妿¤ï¼è´å¡å°æ²çº¿å°±ä¼åå¾å¾ä½æè
å¾é«ï¼è®©å¨ç»è¶
åºå
¶æ£å¸¸çèå´ã
å¨ä¸ä¸çä¾åä¸ä½¿ç¨ç代ç ï¼
.train {
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
/* JavaScript sets left to 400px */
}
left æ¬è¯¥å¨ 100px å° 400px ä¹é´ååã
使¯å¦æä½ ç¹å»å车ï¼ä½ ä¼åç°ï¼
- èµ·åï¼å车ä¼ååè¿å¨ï¼
leftä¼åå¾å°äº100pxã - ç¶åï¼å®ä¼ååå¾åè¿å¨ï¼å¹¶ä¸è¶
è¿
400pxã - æååè¿å ââ åå°
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 çä½ç½®ï¼åæ¶æç¬¬ä¸ä¸ªç¹ç y åæ ç§»å¨å°äºå¤§äº 1 çä½ç½®ï¼å æ¤æ²çº¿å·²ç»ä¸ååä¸ä¸ªååä¹ä¸åäºãy åæ è¶
åºäºå¸¸è§ç 0..1 çèå´ã
æ£å¦æä»¬æç¥ï¼y 表示ãå¨ç»è¿ç¨çå®æåº¦ããy = 0 è¡¨ç¤ºå±æ§çåå§å¼ï¼y = 1 åè¡¨ç¤ºå±æ§çæç»å¼ãå æ¤ï¼y < 0 æå³ç屿§å¼è¦æ¯åå§å¼å°ï¼è y > 1 å表æå±æ§å¼è¦æ¯æç»å¼å¤§ã
å½ç¶äºï¼-1 å 2 è¿æ¯æ¯è¾ç¼åçå¼ã妿æä»¬æ y 设为 -99 å 99ï¼é£ä¹å车å°ä¼åç¦»å°æ´è¿ã
使¯ï¼å¦ä½é对ç¹å®çä»»å¡å¯»æ¾å°åéçè´å¡å°æ²çº¿å¢ï¼äºå®ä¸ï¼æå¾å¤å·¥å ·å¯ä»¥å¸®å°ä½ ãæ¯æ¹è¯´ï¼æä»¬å¯ä»¥å©ç¨è¿ä¸ªç½ç«ï¼http://cubic-bezier.com/ã
é¶è·å½æ°ï¼Stepsï¼
æ¶é´å½æ° steps(number of steps[, start/end]) å
è®¸ä½ è®©å¨ç»å段è¿è¡ï¼number of steps 表示éè¦æå为å¤å°æ®µã
让æä»¬éè¿ä¸ä¸ªæ°åçä¾åæ¥æ¼ç¤ºä¸ä¸ãæä»¬å°ä¼è®©æ°å以离æ£çæ¹å¼ååï¼è䏿¯ä»¥è¿ç»çæ¹å¼ã
为äºè¾¾å°ææï¼æä»¬æå¨ç»æå为 9 段ï¼
#stripe.animate {
transform: translate(-90%);
transition: transform 9s steps(9, start);
}
step(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>
Click below to animate:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>steps ç第ä¸ä¸ªåæ°è¡¨ç¤ºæ®µæ°ãè¿ä¸ªè¿æ¸¡å¨ç»å°ä¼è¢«æå为 9 个é¨åï¼æ¯ä¸ªå 10%ï¼ãæ¶é´é´éä¹ä¼ä»¥åæ ·çæ¹å¼è¢«æåï¼9 ç§ä¼è¢«åå²ä¸ºå¤ä¸ªæ¶é¿ 1 ç§çé´éã
第äºä¸ªåæ°å¯ä»¥å start æ end 两è
å
¶ä¸ã
start 表示å¨å¨ç»å¼å§æ¶ï¼æä»¬éè¦ç«å³å¼å§ç¬¬ä¸æ®µçå¨ç»ã
å¯ä»¥è§å¯å°ï¼å¨å¨ç»è¿ç¨ä¸ï¼å½æä»¬å廿°åä¹åï¼å®ä¼ç«é©¬å为 1ï¼å³ç¬¬ä¸æ®µï¼ï¼ç¶åå¨ä¸ä¸ç§å¼å§çæ¶åç»§ç»ååã
å ·ä½çæµç¨å¦ä¸ï¼
0sââ-10%ï¼å¨ç¬¬ä¸ç§å¼å§çæ¶åç«å³ååï¼1sââ-20%- â¦
8sâ-80%- ï¼æåä¸ç§ï¼æ¾ç¤ºæç»å¼ï¼
å¦ä¸ä¸ªå¼ end è¡¨ç¤ºï¼æ¹åä¸åºè¯¥å¨æå¼å§çæ¶ååçï¼èæ¯åç卿¯ä¸æ®µçæåæ¶å»ã
å ¶æµç¨å¦ä¸ï¼
0sââ01sââ-10%ï¼å¨ç¬¬ä¸ç§ç»ææ¶ç¬¬ä¸æ¬¡ååï¼2sââ-20%- â¦
9sââ-90%
step(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>
Click below to animate:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>å¦å¤è¿æä¸äºç®åå¼ï¼
step-startââ çåäºsteps(1, start)ãå³ï¼å¨ç»ç«å»å¼å§ï¼å¹¶ä¸åªæä¸æ®µãä¹å°±æ¯è¯´ï¼ä¼ç«å»å¼å§ï¼ç´§æ¥çå°±ç»æäºï¼å®å¦æ²¡æå¨ç»ä¸æ ·ãstep-endââ çåäºsteps(1, end)ãå³ï¼å¨transition-durationç»ææ¶çæä¸æ®µå¨ç»ã
è¿äºå¼å¾å°ä¼è¢«ç¨å°ï¼å 为å®ä»¬å¹¶ä¸ç®æ¯çæ£çå¨ç»ï¼èæ¯åæ¥çååã
transitionend äºä»¶
CSS å¨ç»å®æåï¼ä¼è§¦å 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();
});
};
transitionend çäºä»¶å¯¹è±¡æå 个ç¹å®ç屿§ï¼
event.propertyName
ï¼å½å宿å¨ç»ç屿§ï¼è¿å¨æä»¬åæ¶ä¸ºå¤ä¸ªå±æ§å ä¸å¨ç»æ¶ä¼å¾æç¨ã
event.elapsedTime
ï¼å¨ç»å®æçæ¶é´ï¼æç§è®¡ç®ï¼ï¼ä¸å
æ¬ transition-delayã
å ³é®å¸§å¨ç»ï¼Keyframesï¼
æä»¬å¯ä»¥éè¿ CSS æä¾ç @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 å¨ç»å è®¸ä½ ä¸ºä¸ä¸ªæè å¤ä¸ªå±æ§çåååå»ºä¸æ»æµç ï¼ä¹å¯è½ä¸æ¯ï¼çè¿æ¸¡å¨ç»ã
å®ä»¬éç¨äºå¤§å¤æ°çå¨ç»éæ±ãæä»¬ä¹å¯ä»¥ä½¿ç¨ JavaScript å建å¨ç»ï¼ä¸ä¸ç« å°ä¼è¯¦ç»è®²è§£ç¸å ³å 容ã
ç¸å¯¹äº JavaScript å¨ç»ï¼CSS å¨ç»åå¨çç¹ç¹å¦ä¸ï¼
- ç®åçäºï¼ç®åå°åã
- å¿«éï¼èä¸å¯¹ CPU é æçååå¾å°ã
- JavaScript å¨ç»æ´å çµæ´»ãå®ä»¬å¯ä»¥å®ç°ä»»ä½å¨ç»é»è¾ï¼æ¯å¦æä¸ªå ç´ ççç¸ææã
- ä¸ä» ä» åªæ¯å±æ§çååãæä»¬è¿å¯ä»¥å¨ JavaScript ä¸çææ°å ç´ ç¨äºå¨ç»ã
æ¬èå·²ç»ä»ç»äºå¯ä»¥ä½¿ç¨ CSS å®ç°ç主è¦å¨ç»ç±»åï¼èä¸ transitionend è¿å
许å¨å¨ç»ç»æåæ§è¡ JavaScript 代ç ï¼å æ¤å®å¯ä»¥æ¹ä¾¿å¾ä¸ä»£ç ç»åèµ·æ¥ã
使¯å¨ä¸ä¸èï¼æä»¬å°ä¼å¦ä¹ ä¸äº JavaScript å¨ç»æ¥å®ç°æ´å å¤æçææã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼