3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
您永遠(yuǎn)不應(yīng)該使用 setInterval/setTimeout 進(jìn)行動(dòng)畫(huà),因?yàn)槟O(shè)置的延遲 X 實(shí)際上是“當(dāng) X 過(guò)去時(shí)”。動(dòng)畫(huà)也可能發(fā)生在屏幕的幀更新之間,這使得動(dòng)畫(huà)看起來(lái)很卡頓。
var counter = 0,
running = true;
function runLoop() {
counter = counter + 1;
var redBlock = document.getElementById("block");
redBlock.style.left = counter + "px";
}
setInterval(function () {
runLoop();
}, 60)
#block {
background-color: red;
width: 100px;
height: 100px;
position: absolute;
display: block;
}
<div id="block"></block>
我建議使用requestAnimationFramewhich 進(jìn)行計(jì)算,然后等待下一個(gè)屏幕更新來(lái)繪制新位置。它可能看起來(lái)很棘手,但一旦您意識(shí)到這只是對(duì)自身的回調(diào),它就會(huì)比看起來(lái)更容易。
我添加了兩個(gè)按鈕,以便您可以播放動(dòng)畫(huà)。
請(qǐng)注意與 相比,動(dòng)畫(huà)有多流暢setInterval。
此外,在循環(huán)之外進(jìn)行變量聲明以提高性能。
let counter = 0,
isRunning = true;
const redBlock = document.getElementById("block");
function runLoop() {
counter = counter + 1;
redBlock.style.left = counter + "px";
if (isRunning) {
requestAnimationFrame(runLoop);
}
}
function restart() {
counter = 0;
if (!isRunning) { runLoop(); }
}
function pause() {
isRunning = !isRunning;
if (isRunning) { runLoop(); }
}
requestAnimationFrame(runLoop);
#block {
background-color: red;
width: 100px;
height: 100px;
position: absolute;
top: 30px;
display: block;
}
<div id="block"></div>
<button onclick="pause()">Pause</button>
<button onclick="restart()">Restart</button>

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
要讓該函數(shù)runLoop每秒調(diào)用 60 次,需要以 (1000 / 60) 毫秒的間隔調(diào)用。
另外,還counter需要進(jìn)行初始化。
(您還需要一些條件來(lái)確定何時(shí)停止計(jì)數(shù)以避免溢出)。
<script>
function runLoop(xcoord) {
var redBlock = document.getElementById("block");
redBlock.style.left = xcoord + "px";
}
var counter = 0;
setInterval(runLoop, 16.7, counter++);
</script>

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
setInterval的參數(shù)是錯(cuò)誤的,如果你想每秒運(yùn)行60次,你需要將間隔設(shè)置為1000 / 60。
現(xiàn)在我猜你正在嘗試設(shè)置動(dòng)畫(huà)循環(huán)。您可能想看看為此目的而制作的函數(shù)。
requestAnimationFrame(someCallback);
基本上,它是一個(gè)函數(shù),它將注冊(cè)一個(gè)回調(diào),以便在下一個(gè)瀏覽器渲染調(diào)用之前執(zhí)行。這意味著最多 60 次/秒,但如果瀏覽器難以計(jì)算,則可能會(huì)更少。
應(yīng)用于您的示例,它可能很簡(jiǎn)單:
function runLoop() {
var redBlock = document.getElementById("block");
redBlock.style.left = xcoord + "px";
requestAnimationFrame(runLoop()); // register recursivaly a call for next animationFrame
}
var counter = 0;
runLoop()
添加回答
舉報(bào)