วิธีสร้างภาพเคลื่อนไหว CSS ประสิทธิภาพสูง

คู่มือนี้จะสอนวิธีสร้างภาพเคลื่อนไหว CSS ที่มีประสิทธิภาพสูง

ดูทำไมภาพเคลื่อนไหวบางภาพจึงช้าเพื่อเรียนรู้ทฤษฎีเบื้องหลังคำแนะนำเหล่านี้

พร็อพเพอร์ตี้ CSS ทั้งหมดที่คู่มือนี้แนะนำมีการรองรับข้ามเบราว์เซอร์ที่ดี

transform

การรองรับเบราว์เซอร์

  • Chrome: 36
  • Edge: 12.
  • Firefox: 16.
  • Safari: 9.

แหล่งที่มา

opacity

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • Edge: 12.
  • Firefox: 1.
  • Safari: 2.

แหล่งที่มา

will-change

การรองรับเบราว์เซอร์

  • Chrome: 36
  • ขอบ: 79
  • Firefox: 36
  • Safari: 9.1

แหล่งที่มา

ย้ายองค์ประกอบ

หากต้องการย้ายองค์ประกอบ ให้ใช้ค่าคีย์เวิร์ด translate หรือ rotation ของพร็อพเพอร์ตี้ transform

เช่น หากต้องการเลื่อนรายการให้แสดง ให้ใช้ translate

.animate {
  animation: slide-in 0.7s both;
}

@keyframes slide-in {
  0% {
    transform: translateY(-1000px);
  }
  100% {
    transform: translateY(0);
  }
}

ใช้ rotate เพื่อหมุนองค์ประกอบ ตัวอย่างต่อไปนี้จะหมุนองค์ประกอบ 360 องศา

.animate {
  animation: rotate 0.7s ease-in-out both;
}

@keyframes rotate {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}

ปรับขนาดองค์ประกอบ

หากต้องการปรับขนาดองค์ประกอบ ให้ใช้ค่าคีย์เวิร์ด scale ของพร็อพเพอร์ตี้ transform

.animate {
  animation: scale 1.5s both;
}

@keyframes scale {
  50% {
    transform: scale(0.5);
  }
  100% {
    transform: scale(1);
  }
}

เปลี่ยนระดับการมองเห็นขององค์ประกอบ

หากต้องการแสดงหรือซ่อนองค์ประกอบ ให้ใช้ opacity

.animate {
  animation: opacity 2.5s both;
}

@keyframes opacity {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

หลีกเลี่ยงพร็อพเพอร์ตี้ที่ทริกเกอร์เลย์เอาต์หรือการวาด

ก่อนใช้พร็อพเพอร์ตี้ CSS สำหรับภาพเคลื่อนไหว (นอกเหนือจาก transform และ opacity) ให้พิจารณาผลกระทบของพร็อพเพอร์ตี้ที่มีต่อไปป์ไลน์การแสดงผล หลีกเลี่ยงพร็อพเพอร์ตี้ที่ทริกเกอร์เลย์เอาต์หรือสีเว้นแต่จะจำเป็นจริงๆ

บังคับการสร้างเลเยอร์

ตามที่อธิบายไว้ในทำไมภาพเคลื่อนไหวบางภาพจึงช้า การวางองค์ประกอบบนเลเยอร์ใหม่จะช่วยให้เบราว์เซอร์ทาสีองค์ประกอบใหม่ได้โดยไม่ต้องปรับเลย์เอาต์ที่เหลือใหม่

โดยปกติแล้ว เบราว์เซอร์จะตัดสินใจได้ดีว่าจะวางรายการใดในเลเยอร์ใหม่ แต่คุณสามารถบังคับให้สร้างเลเยอร์ด้วยตนเองได้โดยใช้พร็อพเพอร์ตี้ will-change พร็อพเพอร์ตี้นี้จะบอกให้เบราว์เซอร์ทราบว่าองค์ประกอบนี้จะมีการเปลี่ยนแปลงในทางใดทางหนึ่งเหมือนกับชื่อ

ใน CSS คุณสามารถใช้ will-change กับตัวเลือกใดก็ได้ ดังนี้

body > .sidebar {
  will-change: transform;
}

อย่างไรก็ตาม ข้อกําหนดเฉพาะแนะนําว่าควรทําเช่นนี้กับองค์ประกอบที่กําลังจะมีการเปลี่ยนแปลงอยู่เสมอเท่านั้น เช่น อาจเป็นจริงสำหรับแถบด้านข้างที่ผู้ใช้สามารถเลื่อนเข้าและออกได้ สําหรับองค์ประกอบที่มีการเปลี่ยนแปลงไม่บ่อย เราขอแนะนําให้ใช้ will-change โดยใช้ JavaScript เมื่อมีแนวโน้มที่จะมีการเปลี่ยนแปลง อย่าลืมให้เวลาเบราว์เซอร์ในการเพิ่มประสิทธิภาพที่จำเป็น และนําพร็อพเพอร์ตี้ออกเมื่อการเปลี่ยนแปลงหยุดลง

หากต้องการบังคับให้สร้างเลเยอร์ในเบราว์เซอร์ที่ไม่รองรับ will-change (ซึ่งมักจะเป็น Internet Explorer) ให้ตั้งค่า transform: translateZ(0)

แก้ไขข้อบกพร่องของภาพเคลื่อนไหวที่ช้าหรือกระตุก

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

ตรวจสอบว่าภาพเคลื่อนไหวทริกเกอร์เลย์เอาต์หรือไม่

ภาพเคลื่อนไหวที่ย้ายองค์ประกอบโดยใช้อย่างอื่นที่ไม่ใช่ transform มีแนวโน้มที่จะทำงานช้า ตัวอย่างต่อไปนี้เปรียบเทียบภาพเคลื่อนไหวที่ใช้ transform กับภาพเคลื่อนไหวโดยใช้ top และ left

ไม่ควรทำ
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     top: calc(90vh - 160px);
     left: calc(90vw - 200px);
  }
}
ควรทำ
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     transform: translate(calc(90vw - 200px), calc(90vh - 160px));
  }
}

คุณสามารถทดสอบได้ในตัวอย่าง Glitch 2 รายการต่อไปนี้ และสำรวจประสิทธิภาพโดยใช้เครื่องมือสำหรับนักพัฒนาเว็บ

เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome

  1. เปิดแผงประสิทธิภาพ
  2. บันทึกประสิทธิภาพรันไทม์ ขณะที่ภาพเคลื่อนไหวกำลังดำเนินอยู่
  3. ตรวจสอบแท็บสรุป

หากเห็นค่าที่ไม่ใช่ 0 สำหรับการแสดงผลในแท็บสรุป อาจหมายความว่าภาพเคลื่อนไหวทําให้เบราว์เซอร์ต้องจัดวาง

แผงสรุปจะแสดง 37 มิลลิวินาทีสําหรับการแสดงผล และ 79 มิลลิวินาทีสําหรับการแสดงผล
ตัวอย่าง animation-with-top-left ทำให้เกิดการแสดงผล
แผงสรุปจะแสดงค่าเป็น 0 สําหรับการแสดงผลและการวาดภาพ
ตัวอย่าง animation-with-transform ไม่ทําให้เกิดการเรนเดอร์

เครื่องมือสำหรับนักพัฒนาเว็บของ Firefox

ใน Firefox DevTools Waterfall ช่วยให้คุณเข้าใจว่าเบราว์เซอร์ใช้เวลาไปกับอะไรบ้าง

  1. เปิดแผงประสิทธิภาพ
  2. เริ่มบันทึกประสิทธิภาพขณะที่ภาพเคลื่อนไหวกำลังเล่น
  3. หยุดการบันทึกและตรวจสอบแท็บ Waterfall

หากเห็นรายการคำนวณสไตล์ใหม่ หมายความว่าเบราว์เซอร์ต้องกลับไปที่จุดเริ่มต้นของการแสดงผล Waterfall เพื่อแสดงผลภาพเคลื่อนไหว

ตรวจสอบเฟรมที่หายไป

  1. เปิดแท็บการแสดงผลในเครื่องมือสำหรับนักพัฒนาเว็บของ Chrome
  2. เปิดใช้ช่องทำเครื่องหมายเครื่องมือวัด FPS
  3. ดูค่าขณะที่ภาพเคลื่อนไหวทำงาน

สังเกตป้ายกํากับเฟรมที่ด้านบนของ UI เครื่องวัด FPS ซึ่งจะแสดงค่า เช่น 50% 1 (938 m) dropped of 1878 ภาพเคลื่อนไหวที่มีประสิทธิภาพสูงจะมีเปอร์เซ็นต์สูง เช่น 99% ซึ่งหมายความว่ามีการทิ้งเฟรมเพียงไม่กี่เฟรมและภาพเคลื่อนไหวดูราบรื่น

เครื่องวัด FPS แสดงว่าเฟรมถูกทิ้ง 50%
ตัวอย่าง animation-with-top-left ทำให้เฟรมลดลง 50%
เครื่องวัด FPS แสดงว่ามีเฟรมที่ถูกทิ้งเพียง 1%
ตัวอย่าง animation-with-transform ทำให้เฟรมหลุดไปเพียง 1%

ตรวจสอบว่าภาพเคลื่อนไหวทริกเกอร์การแสดงผลหรือไม่

เบราว์เซอร์จะแสดงผลพร็อพเพอร์ตี้บางรายการได้ช้ากว่าพร็อพเพอร์ตี้อื่นๆ เช่น สิ่งต่างๆ ที่เกี่ยวข้องกับความเบลอ (เช่น เงา) จะใช้เวลาในการวาดนานกว่าการวาดกล่องสีแดง ความแตกต่างเหล่านี้อาจไม่เด่นชัดใน CSS เสมอไป แต่ DevTools ของเบราว์เซอร์ช่วยให้คุณระบุส่วนที่จำเป็นต้องทำการทาสีใหม่ รวมถึงปัญหาประสิทธิภาพอื่นๆ ที่เกี่ยวข้องกับภาพวาดได้

เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome

  1. เปิดแท็บการแสดงผลใน Chrome DevTools
  2. เลือกการกะพริบของสี
  3. เลื่อนเคอร์เซอร์ไปรอบๆ หน้าจอ
องค์ประกอบ UI ที่ไฮไลต์ด้วยสีเขียวเพื่อแสดงให้เห็นว่าระบบจะทาสีใหม่
ในตัวอย่างนี้จาก Google Maps คุณจะเห็นองค์ประกอบที่วาดใหม่

หากเห็นทั้งหน้าจอกะพริบหรือมีไฮไลต์บริเวณที่คุณคิดว่าไม่ควรมี ให้ตรวจสอบเพิ่มเติม

หากต้องการทราบว่าพร็อพเพอร์ตี้หนึ่งๆ ทำให้เกิดปัญหาด้านประสิทธิภาพที่เกี่ยวข้องกับการทาสีหรือไม่ เครื่องมือสร้างโปรไฟล์สีในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ช่วยคุณได้

เครื่องมือสำหรับนักพัฒนาเว็บของ Firefox

  1. เปิดการตั้งค่า แล้วเพิ่มปุ่มกล่องเครื่องมือสำหรับเปิด/ปิดการกะพริบของสี
  2. ในหน้าที่ต้องการตรวจสอบ ให้เปิดปุ่มแล้วเลื่อนเมาส์หรือเลื่อนดูเพื่อดูพื้นที่ที่ไฮไลต์

บทสรุป

หากเป็นไปได้ ให้จำกัดภาพเคลื่อนไหวเป็น opacity และ transform เพื่อเก็บภาพเคลื่อนไหวไว้ในขั้นตอนการจัดวางองค์ประกอบของเส้นทางการแสดงผล ใช้เครื่องมือสำหรับนักพัฒนาเว็บเพื่อตรวจสอบว่าภาพเคลื่อนไหวส่งผลต่อระยะใดของเส้นทาง

ใช้เครื่องมือสร้างโปรไฟล์การวาดภาพเพื่อดูว่าการดำเนินการวาดภาพใดมีค่าใช้จ่ายสูงเป็นพิเศษหรือไม่ หากพบผลลัพธ์ที่ต้องการ ให้ตรวจสอบว่าพร็อพเพอร์ตี้ CSS ที่ต่างกันมีรูปลักษณ์และความรู้สึกเดียวกันแต่มีประสิทธิภาพดีกว่าหรือไม่

ใช้พร็อพเพอร์ตี้ will-change อย่างประหยัด และเฉพาะในกรณีที่พบปัญหาด้านประสิทธิภาพเท่านั้น