å¨è¿ä¸ªä¾åä¸ï¼ä¸ä¸ªå
ç´ çå¨ç»æ¶é´æ¯ 2 ç§ï¼2000 毫ç§ï¼ã该å
ç´ ä»¥ 0.1px/ms çé度åå³ç§»å¨ï¼æä»¥å®çç¸å¯¹ä½ç½®ï¼ä»¥ CSS åç´ ä¸ºåä½ï¼å¯ä»¥éè¿å¨ç»å¼å§åæç»è¿çæ¶é´ï¼ä»¥æ¯«ç§ä¸ºåä½ï¼ç彿°æ¥è®¡ç®ï¼å³ 0.1 * elapsed
ã该å
ç´ çæç»ä½ç½®æ¯å¨å
¶åå§ä½ç½®çå³è¾¹ 200pxï¼0.1 * 2000
ï¼ã
const element = document.getElementById("some-element-you-want-to-animate");
let start, previousTimeStamp;
let done = false;
function step(timestamp) {
if (start === undefined) {
start = timestamp;
}
const elapsed = timestamp - start;
if (previousTimeStamp !== timestamp) {
// è¿éä½¿ç¨ Math.min() ç¡®ä¿å
ç´ å¨æ°å¥½ä½äº 200px æ¶åæ¢è¿å¨
const count = Math.min(0.1 * elapsed, 200);
element.style.transform = `translateX(${count}px)`;
if (count === 200) done = true;
}
if (elapsed < 2000) {
// 2 ç§ä¹å忢å¨ç»
previousTimeStamp = timestamp;
if (!done) {
window.requestAnimationFrame(step);
}
}
}
window.requestAnimationFrame(step);
以ä¸ä¸ä¸ªç¤ºä¾è¯´æäºè®¾ç½®æ¶é´é¶ç¹çä¸åæ¹æ³ï¼æ¶é´é¶ç¹æ¯è®¡ç®æ¯å¸§ä¸å¨ç»è¿åº¦çèµ·ç¹ãå¦æä½ æ³åæ¥å°å¤é¨æ¶éï¼ä¾å¦ BaseAudioContext.currentTime
ï¼å¯ç¨çæé«ç²¾åº¦æ¯å帧çæç»æ¶é´ï¼16.67ms @60hzï¼ãåè°å½æ°çæ¶é´æ³åæ°è¡¨ç¤ºä¸ä¸å¸§çç»æï¼å æ¤æå¿«å°å¨ä¸ä¸å¸§ä¸åç°æ°è®¡ç®çå¼ã
æ¤ç¤ºä¾ä¼çå¾
第ä¸ä¸ªåè°å½æ°æ§è¡æ¶è®¾ç½® zero
ãå¦æä½ çå¨ç»å¨å¼å§æ¶è·³è½¬å°æ°å¼ï¼åå¿
é¡»éç¨è¿ç§ç»æãå¦æä½ æ éä¸ä»»æå¤é¨åæ¥ï¼ä¾å¦é³é¢ï¼ï¼åå»ºè®®ä½¿ç¨æ¤æ¹æ³ï¼å 为æäºæµè§å¨å¨é¦æ¬¡è°ç¨ requestAnimationFrame()
å馿¬¡è°ç¨åè°å½æ°ä¹é´ä¼æå¤å¸§å»¶è¿ã
let zero;
requestAnimationFrame(firstFrame);
function firstFrame(timeStamp) {
zero = timeStamp;
animate(timeStamp);
}
function animate(timeStamp) {
const value = (timeStamp - zero) / duration;
if (value < 1) {
element.style.opacity = value;
requestAnimationFrame((t) => animate(t));
} else element.style.opacity = 1;
}
æ¤ç¤ºä¾å¨ç¬¬ä¸æ¬¡è°ç¨ requestAnimationFrame
åä½¿ç¨ document.timeline.currentTime
设置äºä¸ä¸ªé¶å¼ãdocument.timeline.currentTime
ä¸ timeStamp
忰坹é½ï¼å æ¤é¶å¼çä»·äºç¬¬ 0 å¸§çæ¶é´æ³ã
const zero = document.timeline.currentTime;
requestAnimationFrame(animate);
function animate(timeStamp) {
const value = (timeStamp - zero) / duration; // animation-timing-function: linear
if (value < 1) {
element.style.opacity = value;
requestAnimationFrame((t) => animate(t));
} else element.style.opacity = 1;
}
æ¤ç¤ºä¾ä½¿ç¨ performance.now()
è䏿¯åè°çæ¶é´æ³å¼å»è®¾ç½®å¨ç»ãä½ å¯ä»¥ä½¿ç¨å®æ¥å®ç°ç¨é«çåæ¥ç²¾åº¦ï¼å°½ç®¡éå ç²¾ç¡®åº¦æ¯æåçä¸å¢é¿ä¸å¤§ã夿³¨ï¼æ¤ç¤ºä¾ä¸è½è®©ä½ å¯é å°åæ¥å¨ç»åè°å½æ°ã
const zero = performance.now();
requestAnimationFrame(animate);
function animate() {
const value = (performance.now() - zero) / duration;
if (value < 1) {
element.style.opacity = value;
requestAnimationFrame((t) => animate(t));
} else element.style.opacity = 1;
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4