แอนิเมชันคีย์เฟรมในตัว
ใช้ animate-spin, animate-ping, animate-pulse และ animate-bounce ซึ่งมีใน Tailwind สำหรับรูปแบบการโหลดและการดึงดูดความสนใจที่ใช้บ่อย
แอนิเมชันคีย์เฟรมในตัว เป็นบทเรียน Tailwind CSS Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Tailwind CSS Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Tailwind CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพเคลื่อนไหวคีย์เฟรมของ CSS เทียบกับการเปลี่ยนผ่าน
การเปลี่ยนผ่านของ CSS ทำภาพเคลื่อนไหวระหว่างสองสถานะที่กำหนดด้วยค่าเริ่มต้นและค่าสุดท้าย ส่วน ภาพเคลื่อนไหวคีย์เฟรม ของ CSS จะกำหนดลำดับของหลายสถานะและสามารถวนซ้ำได้ไม่สิ้นสุด Tailwind มีภาพเคลื่อนไหวคีย์เฟรมในตัวสี่แบบผ่านยูทิลิตี animate-* ซึ่งครอบคลุมรูปแบบภาพเคลื่อนไหวของส่วนติดต่อผู้ใช้ที่ใช้บ่อยที่สุด ได้แก่ วงแหวนหมุนขณะโหลด โครงร่างที่เต้นเป็นจังหวะ แสงกระเพื่อมเพื่อดึงดูดความสนใจ และตัวบ่งชี้ที่เด้งขึ้นลง ทั้งหมดนี้ทำได้โดยไม่ต้องเขียน CSS แบบกำหนดเอง
animate-spin
animate-spin ทำให้องค์ประกอบหมุนอย่างต่อเนื่องด้วยความเร็วคงที่ โดยหมุนครบ 360 องศาหนึ่งรอบต่อวินาที เป็นยูทิลิตีมาตรฐานสำหรับวงแหวนหมุนขณะโหลด ใช้กับองค์ประกอบทรงกลมหรือไอคอน SVG เพื่อแสดงว่าการทำงานกำลังดำเนินอยู่ ภาพเคลื่อนไหวจะวนซ้ำไม่สิ้นสุดจนกว่าจะนำคลาสออก โดยทั่วไปมักใช้คู่กับไอคอนวงแหวน SVG ที่มีช่องว่าง เพื่อสร้างลักษณะวงแหวนหมุนที่คุ้นเคย
<!-- Loading spinner using animate-spin -->
<svg class="animate-spin h-5 w-5 text-blue-600"
xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">
</path>
</svg>
<!-- Button with spinner -->
<button class="flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg" disabled>
<svg class="animate-spin h-4 w-4" ...></svg>
Loading...
</button>animate-ping
animate-ping สร้างเอฟเฟกต์คล้ายระลอกคลื่นหรือการกวาดของเรดาร์ โดยองค์ประกอบจะขยายขนาดและค่อย ๆ จางหายเป็นวงรอบ มักใช้เป็นจุดแจ้งเตือนหรือตัวบ่งชี้กิจกรรมที่วางซ้อนบนองค์ประกอบคงที่ ควรวางองค์ประกอบที่ส่งสัญญาณไว้ด้านบนขององค์ประกอบจริงแบบสัมบูรณ์ โดยใช้ตัวห่อที่มี relative เอฟเฟกต์นี้ช่วยดึงสายตาไปยังการแจ้งเตือนโดยไม่รบกวนมากเกินไป
<!-- Notification badge with ping effect -->
<div class="relative inline-flex">
<button class="p-2 rounded-full bg-gray-100">
<!-- Bell icon -->
<svg class="w-5 h-5 text-gray-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
</svg>
</button>
<!-- Ping indicator -->
<span class="absolute top-0 right-0 -mt-0.5 -mr-0.5">
<span class="animate-ping absolute inline-flex h-3 w-3 rounded-full bg-red-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-3 w-3 bg-red-500"></span>
</span>
</div>animate-pulse
animate-pulse ทำให้ความทึบขององค์ประกอบค่อย ๆ จางไปมา จากทึบเต็มที่เป็น 50% แล้วกลับมาเท่าเดิมภายในรอบเวลา 2 วินาที เป็นภาพเคลื่อนไหวที่เหมาะอย่างยิ่งสำหรับ ตัวโหลดโครงร่าง ซึ่งแสดงรูปร่างของเนื้อหาระหว่างที่กำลังดึงข้อมูล ใช้กับบล็อกตัวแทนสีเทาที่มีรูปแบบตรงกับโครงร่างของเนื้อหาที่กำลังโหลด การเต้นเป็นจังหวะอย่างละเอียดอ่อนนี้สื่อว่ากำลังโหลดอยู่โดยไม่รบกวนสายตา
<!-- Skeleton loader using animate-pulse -->
<div class="p-6 space-y-4">
<!-- Avatar + title skeleton -->
<div class="flex items-center gap-3">
<div class="animate-pulse bg-gray-200 rounded-full h-10 w-10"></div>
<div class="space-y-2 flex-1">
<div class="animate-pulse bg-gray-200 rounded h-4 w-1/3"></div>
<div class="animate-pulse bg-gray-200 rounded h-3 w-1/4"></div>
</div>
</div>
<!-- Content lines skeleton -->
<div class="space-y-2">
<div class="animate-pulse bg-gray-200 rounded h-4 w-full"></div>
<div class="animate-pulse bg-gray-200 rounded h-4 w-5/6"></div>
<div class="animate-pulse bg-gray-200 rounded h-4 w-4/5"></div>
</div>
</div>animate-bounce
animate-bounce ทำให้องค์ประกอบเคลื่อนขึ้นลงในลักษณะเด้ง โดยใช้ฟังก์ชันกำหนดเวลาแบบ cubic-bezier ที่สร้างการชะลออย่างเป็นธรรมชาติเมื่อถึงจุดสูงสุดของการเด้งแต่ละครั้ง กรณีใช้งานทั่วไป ได้แก่ ตัวบ่งชี้รูปลูกศรชี้ลงเพื่อกระตุ้นให้ผู้ใช้เลื่อนหน้า ตัวบ่งชี้ว่ากำลังพิมพ์ในกล่องแชต หรือไอคอนแจ้งเตือนที่ดึงความสนใจไปยังเนื้อหาใหม่ ค่าเริ่มต้นของการเด้งคือวนซ้ำอย่างต่อเนื่อง
<!-- Scroll indicator using animate-bounce -->
<div class="flex flex-col items-center gap-2 mt-16">
<p class="text-sm text-gray-500">Scroll to explore</p>
<svg class="animate-bounce w-6 h-6 text-gray-400"
fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</div>
<!-- Typing indicator (three bouncing dots) -->
<div class="flex gap-1 p-3 bg-gray-100 rounded-2xl rounded-tl-none w-16">
<div class="animate-bounce h-2 w-2 bg-gray-400 rounded-full" style="animation-delay: 0ms"></div>
<div class="animate-bounce h-2 w-2 bg-gray-400 rounded-full" style="animation-delay: 150ms"></div>
<div class="animate-bounce h-2 w-2 bg-gray-400 rounded-full" style="animation-delay: 300ms"></div>
</div>การใช้ animate-none เพื่อหยุดภาพเคลื่อนไหว
animate-none ลบภาพเคลื่อนไหวที่กำลังทำงานอยู่ออกจากองค์ประกอบ มีประโยชน์เมื่อใช้ร่วมกับรูปแบบตามหน้าจอหรือสถานะเพื่อปิดภาพเคลื่อนไหวในขนาดหน้าจอหรือเงื่อนไขบางอย่าง ตัวอย่างเช่น คุณอาจใช้ motion-reduce:animate-none เพื่อปิดภาพเคลื่อนไหวทั้งหมดสำหรับผู้ใช้ที่ต้องการลดการเคลื่อนไหว หรือหยุดวงแหวนหมุนขณะโหลดเมื่อโหลดข้อมูลเสร็จแล้วด้วยการสลับคลาสโดยใช้ JavaScript
<!-- Stop animation for reduced-motion users -->
<svg class="animate-spin motion-reduce:animate-none h-5 w-5 text-blue-600">
...
</svg>
<!-- Stop animation at large screens -->
<div class="animate-pulse lg:animate-none bg-gray-200 rounded h-4 w-48">
<!-- Only pulses on mobile/tablet, static on desktop -->
</div>
<!-- JavaScript: remove animation when done -->
<!-- spinner.classList.remove('animate-spin'); -->การผสาน animate กับการแสดงผลแบบมีเงื่อนไข
ในเฟรมเวิร์กที่ใช้คอมโพเนนต์ โดยทั่วไปคุณจะแสดงสถานะการหมุนหรือการเต้นเป็นจังหวะตามเงื่อนไขโดยอิงจากสถานะการโหลด คลาสภาพเคลื่อนไหวจะเป็นส่วนหนึ่งของคอมโพเนนต์โครงร่างหรือคอมโพเนนต์การโหลดที่แสดงระหว่างดึงข้อมูล จากนั้นจะแทนที่ด้วยเนื้อหาจริงเมื่อการดึงข้อมูลเสร็จสิ้น แนวทางนี้ทำให้จัดการเรื่องภาพเคลื่อนไหวไว้ในส่วนติดต่อผู้ใช้ของสถานะการโหลด แทนการเพิ่มหรือลบคลาสด้วยโปรแกรม
// React: conditional rendering for loading state
function UserCard({ user, isLoading }) {
if (isLoading) {
return (
<div class="p-6 space-y-3">
<div class="animate-pulse bg-gray-200 rounded-full h-12 w-12"></div>
<div class="animate-pulse bg-gray-200 rounded h-4 w-32"></div>
<div class="animate-pulse bg-gray-200 rounded h-3 w-24"></div>
</div>
);
}
return (
<div class="p-6">
<img src={user.avatar} class="h-12 w-12 rounded-full" />
<p class="font-semibold mt-3">{user.name}</p>
<p class="text-gray-500 text-sm">{user.role}</p>
</div>
);
}จำนวนรอบของภาพเคลื่อนไหวและโหมดเติมพื้นที่
ภาพเคลื่อนไหวในตัวของ Tailwind จะวนซ้ำไม่สิ้นสุดเป็นค่าเริ่มต้น หากต้องการให้ภาพเคลื่อนไหวทำงานตามจำนวนครั้งที่กำหนด เช่น หนึ่งครั้งสำหรับภาพเคลื่อนไหวตอนเข้าสู่หน้าจอ หรือสองครั้งสำหรับการกะพริบเพื่อดึงดูดความสนใจ คุณต้องใช้คุณสมบัติแบบกำหนดเองของ CSS หรือคลาสภาพเคลื่อนไหวแบบกำหนดเอง ขยาย theme.extend.keyframes และ theme.extend.animation ในไฟล์ตั้งค่าเพื่อเพิ่มภาพเคลื่อนไหวที่ควบคุมจำนวนรอบและโหมดเติมพื้นที่ได้
// tailwind.config.js — add a one-shot animation
module.exports = {
theme: {
extend: {
keyframes: {
'shake': {
'0%, 100%': { transform: 'translateX(0)' },
'20%, 60%': { transform: 'translateX(-6px)' },
'40%, 80%': { transform: 'translateX(6px)' },
},
},
animation: {
'shake': 'shake 0.5s ease-in-out 1', // runs once
},
},
},
};
<!-- Usage -->
<input class="animate-shake border-red-500" type="text" placeholder="Shake on error" />การทยอยแสดงภาพเคลื่อนไหวในตัว
การทยอยหน่วงเวลาภาพเคลื่อนไหวระหว่างองค์ประกอบพี่น้องจะสร้างเอฟเฟกต์ต่อเนื่องที่น่าสนใจ Tailwind ไม่มียูทิลิตีสำหรับการทยอยแสดงในตัว แต่คุณสามารถใช้แอตทริบิวต์ style แบบอินไลน์เพื่อกำหนดค่า animation-delay แยกกันได้ สำหรับรายการหลายรายการ ให้เลื่อนเวลาหน่วงของแต่ละรายการออกไป 50–100ms ควรจำกัดเวลาการทยอยแสดงทั้งหมดให้ต่ำกว่า 300ms เพื่อไม่ให้ผู้ใช้ต้องรอรายการสุดท้ายปรากฏ
<!-- Staggered skeleton loaders -->
<ul class="space-y-3">
<li class="animate-pulse bg-gray-200 rounded h-12" style="animation-delay: 0ms"></li>
<li class="animate-pulse bg-gray-200 rounded h-12" style="animation-delay: 75ms"></li>
<li class="animate-pulse bg-gray-200 rounded h-12" style="animation-delay: 150ms"></li>
<li class="animate-pulse bg-gray-200 rounded h-12" style="animation-delay: 225ms"></li>
</ul>
<!-- Staggered bounce dots -->
<div class="flex gap-1">
<div class="animate-bounce w-2 h-2 bg-blue-500 rounded-full" style="animation-delay: 0ms"></div>
<div class="animate-bounce w-2 h-2 bg-blue-500 rounded-full" style="animation-delay: 150ms"></div>
<div class="animate-bounce w-2 h-2 bg-blue-500 rounded-full" style="animation-delay: 300ms"></div>
</div>การใช้ภาพเคลื่อนไหวตามขนาดหน้าจอ
เช่นเดียวกับยูทิลิตีทั้งหมดของ Tailwind คลาส animate ทำงานร่วมกับคำนำหน้าแบบตอบสนองได้ คุณสามารถปิดภาพเคลื่อนไหวบนหน้าจอขนาดใหญ่ซึ่งสถานะการโหลดอาจไม่จำเป็นมากนัก หรือใช้ภาพเคลื่อนไหวที่แตกต่างกันในจุดเปลี่ยนขนาดหน้าจอที่ต่างกัน ใช้คำนำหน้า sm:, md:, lg: ร่วมกับ animate-none เพื่อค่อย ๆ ปิดภาพเคลื่อนไหวเมื่อพื้นที่แสดงผลกว้างขึ้น ทำให้ประสบการณ์ใช้งานบนเดสก์ท็อปไม่หนักเกินไป
<!-- Animate on mobile, static on desktop -->
<div class="animate-pulse md:animate-none bg-gray-200 rounded h-12 w-full">
Pulses on mobile, static on md+ screens
</div>
<!-- Spinner only visible on small screens -->
<svg class="animate-spin sm:hidden h-5 w-5 text-blue-600" ...></svg>
<!-- Use different animations at different breakpoints -->
<div class="animate-bounce md:animate-ping lg:animate-spin h-4 w-4 rounded-full bg-green-500">
Different animation per breakpoint
</div>รูปแบบการโหลดในสถานการณ์จริง
ประสบการณ์การโหลดที่มีคุณภาพระดับใช้งานจริงจะผสานยูทิลิตีภาพเคลื่อนไหวหลายแบบ พื้นที่เนื้อหาหลักจะแสดงโครงร่างโดยใช้ animate-pulse กับบล็อกตัวแทน ตัวบ่งชี้สถานะจะใช้ animate-ping หากมีวงแหวนหมุนที่มองเห็นได้ในปุ่มหรือส่วนหัว ให้ใช้ animate-spin กับ SVG ของวงแหวนหมุน ภาพเคลื่อนไหวทั้งหมดควรหยุดเมื่อเนื้อหาโหลดเสร็จ และถูกแทนที่ด้วยเนื้อหาจริงโดยไม่เกิดการกระตุกหรือเปลี่ยนตำแหน่งอย่างฉับพลัน
<!-- Full loading state with multiple animations -->
<div class="border border-gray-200 rounded-xl p-6">
<!-- Status indicator -->
<div class="flex items-center gap-2 mb-4">
<div class="relative">
<span class="animate-ping absolute h-3 w-3 rounded-full bg-blue-400 opacity-75"></span>
<span class="h-3 w-3 rounded-full bg-blue-600 block relative"></span>
</div>
<span class="text-sm text-gray-500">Fetching data...</span>
<svg class="animate-spin h-4 w-4 text-blue-500 ml-auto" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
</svg>
</div>
<!-- Skeleton content -->
<div class="space-y-3">
<div class="animate-pulse h-4 bg-gray-200 rounded w-3/4"></div>
<div class="animate-pulse h-4 bg-gray-200 rounded w-1/2"></div>
<div class="animate-pulse h-4 bg-gray-200 rounded w-5/6"></div>
</div>
</div>ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับภาพเคลื่อนไหวคีย์เฟรมในตัวของ Tailwind
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า animate-spin สร้างวงแหวนหมุนขณะโหลด animate-ping สร้างระลอกคลื่นแจ้งเตือน animate-pulse สร้างตัวโหลดโครงร่าง และ animate-bounce สร้างตัวบ่งชี้ที่เด้งขึ้นลง ใช้ motion-reduce:animate-none เพื่อปิดภาพเคลื่อนไหวสำหรับผู้ใช้ที่ต้องการลดการเคลื่อนไหว บทถัดไป เราจะสร้างภาพเคลื่อนไหวคีย์เฟรมแบบกำหนดเองผ่านไฟล์ตั้งค่า Tailwind
เรียนรู้ HTML ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “แอนิเมชันคีย์เฟรมในตัว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แอนิเมชันคีย์เฟรมในตัว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Tailwind CSS Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Tailwind CSS Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แอนิเมชันคีย์เฟรมในตัว”
ใช้ animate-spin, animate-ping, animate-pulse และ animate-bounce ซึ่งมีใน Tailwind สำหรับรูปแบบการโหลดและการดึงดูดความสนใจที่ใช้บ่อย คุณปฏิบัติ Tailwind CSS Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Tailwind CSS Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Tailwind CSS Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “แอนิเมชันคีย์เฟรมในตัว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Tailwind CSS Academy นี้ได้ไหม
ได้ บทเรียน Tailwind CSS Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ยูทิลิตีการเปลี่ยนผ่าน
- ระยะเวลาและการผ่อนจังหวะ
- แอนิเมชันคีย์เฟรมในตัว
- แอนิเมชันแบบกำหนดเองในไฟล์กำหนดค่า