Tailwind CSS Academy · บทเรียน

แอนิเมชันคีย์เฟรมในตัว

ใช้ animate-spin, animate-ping, animate-pulse และ animate-bounce ซึ่งมีใน Tailwind สำหรับรูปแบบการโหลดและการดึงดูดความสนใจที่ใช้บ่อย

บทเรียน 3 จาก 413 ขั้นตอน

แอนิเมชันคีย์เฟรมในตัว เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ยูทิลิตีการเปลี่ยนผ่าน
  2. ระยะเวลาและการผ่อนจังหวะ
  3. แอนิเมชันคีย์เฟรมในตัว
  4. แอนิเมชันแบบกำหนดเองในไฟล์กำหนดค่า
← กลับไปที่ Tailwind CSS Academy