การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา
สร้างลูปภาพเคลื่อนไหวขนาดเล็ก ใช้การอัปเดตตามเวลา (เดลตา) จำลอง requestAnimationFrame และเพิ่มการผ่อนจังหวะแบบง่าย
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
เหตุใดจึงใช้ภาพเคลื่อนไหวตามเวลา
เป้าหมาย: ขับเคลื่อนการเคลื่อนไหวที่ราบรื่นด้วยการอัปเดตตามเวลา
- จำลอง requestAnimationFrame
- วัด เวลาที่ผ่านไประหว่างเฟรม
- เคลื่อนที่ด้วยหน่วยต่อวินาที
- เพิ่ม การผ่อนความเร็ว เล็กน้อย

rAF จำลอง
ที่นี่ไม่มี DOM เราจึงจำลอง requestAnimationFrame โดยใช้ setTimeout ประมาณ 16 มิลลิวินาที
// requestFrame: simulate ~60 FPS with setTimeout
function requestFrame(fn) {
// ~16ms between frames for ~60fps
return setTimeout(function () { fn(Date.now()); }, 16);
}
function cancelFrame(id) {
clearTimeout(id);
}
// Tiny demo: schedule one frame
requestFrame(function (ts) {
console.log("frame at", ts);
});

พื้นฐานเวลาที่ผ่านไประหว่างเฟรม
คำนวณ เวลาที่ผ่านไประหว่างเฟรม ในแต่ละเฟรม: (now − last) / 1000 วิธีนี้จะปรับขนาดการเคลื่อนไหวตามเวลาจริง
// Time-based loop: compute delta time in seconds
let running = true;
let last = Date.now();
function loop() {
if (!running) { return; }
const now = Date.now();
const dt = (now - last) / 1000; // seconds
last = now;
// Print a tiny delta preview
console.log("dt", dt.toFixed(3), "s");
requestFrame(loop);
}
// Start the loop and stop after a few frames
loop();
setTimeout(function () {
running = false;
console.log("stop");
}, 60);

หน่วยต่อวินาที
ใช้ speed คูณกับเวลาที่ผ่านไประหว่างเฟรมเพื่ออัปเดตตำแหน่ง ทำให้การเคลื่อนไหวยังคงสม่ำเสมอแม้อัตราเฟรมต่างกัน
// Move with a speed in units/second
let x = 0; // position
const speed = 50; // units per second
let lastT = Date.now();
let frames = 0;
function moveLoop() {
const now = Date.now();
const dt = (now - lastT) / 1000;
lastT = now;
// Distance = speed * time
x = x + speed * dt;
frames = frames + 1;
console.log("x", Math.round(x));
if (frames < 5) {
requestFrame(moveLoop);
} else {
console.log("final x", Math.round(x));
}
}
moveLoop();

สาธิตการผ่อนความเร็วเล็กน้อย
การผ่อนความเร็ว จะกำหนดรูปทรงของเส้นโค้ง ในที่นี้ easeOutQuad เริ่มต้นเร็วและช้าลงเมื่อใกล้จบ
// Ease from 0 to 1 over duration using easeOutQuad
function easeOutQuad(t) {
// t in [0,1]
return 1 - (1 - t) * (1 - t);
}
async function tween(durationMs) {
let start = Date.now();
let id = null;
function step() {
const now = Date.now();
const t = Math.min(1, (now - start) / durationMs);
const eased = easeOutQuad(t);
console.log("eased", eased.toFixed(2));
if (t < 1) {
id = requestFrame(step);
} else {
cancelFrame(id);
console.log("done");
}
}
step();
}
tween(60);

ลองใช้ขั้นคงที่
ขั้นคงที่ ช่วยให้ตรรกะมีเสถียรภาพ ตัวสะสมจะทำงานชดเชยหากเฟรมมาช้า
// Fixed-step taste: step a physics tick and catch up using an accumulator
let acc = 0; // accumulated time
const step = 1 / 30; // 30 FPS fixed step in seconds
let lastTime = Date.now();
let value = 0;
let fixedFrames = 0;
function fixedLoop() {
const now = Date.now();
const dt = (now - lastTime) / 1000;
lastTime = now;
acc = acc + dt;
// Run zero or more fixed steps to catch up
while (acc >= step) {
// Update logic at a fixed rate
value = value + 1; // pretend physics
acc = acc - step;
}
console.log("value", value);
fixedFrames = fixedFrames + 1;
if (fixedFrames < 5) {
requestFrame(fixedLoop);
} else {
console.log("fixed stop");
}
}
fixedLoop();

แบบทดสอบเวลาส่วนต่างเทียบกับขั้นคงที่
ตรวจสอบอย่างรวดเร็ว: เหตุใดจึงใช้เวลาที่ผ่านไประหว่างเฟรม

ทบทวน
ทบทวน: คุณจำลอง rAF ด้วย setTimeout วัด เวลาที่ผ่านไประหว่างเฟรม เคลื่อนที่ด้วยหน่วยต่อวินาที เพิ่ม การผ่อนความเร็วช่วงท้าย และได้ลองใช้ขั้นคงที่พร้อมตัวสะสม

คำถามที่พบบ่อย
บทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา”
สร้างลูปภาพเคลื่อนไหวขนาดเล็ก ใช้การอัปเดตตามเวลา (เดลตา) จำลอง requestAnimationFrame และเพิ่มการผ่อนจังหวะแบบง่าย คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- setTimeout, setInterval และการคลาดเคลื่อนของตัวจับเวลา
- Debounce กับ Throttle — เขียนเอง
- การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา