เปลี่ยนรูปแบบองค์ประกอบด้วยพร็อพเพอร์ตี้ translate
, rotate
และ scale
พร็อพเพอร์ตี้ transform
ของ CSS
หากต้องการใช้การแปลงกับองค์ประกอบ ให้ใช้พร็อพเพอร์ตี้ CSS transform
พร็อพเพอร์ตี้ยอมรับ <transform-function>
อย่างน้อย 1 รายการ ซึ่งจะนำไปใช้ทีละรายการ
.target {
transform: translateX(50%) rotate(30deg) scale(1.2);
}
องค์ประกอบเป้าหมายได้รับการแปล 50% บนแกน X โดยหมุน 30 องศา และท้ายที่สุดก็ได้รับการปรับขนาดเป็น 120%
แม้ว่าพร็อพเพอร์ตี้ transform
จะทำงานได้ตามปกติ แต่ก็อาจจะน่าเบื่อหน่ายเมื่อคุณต้องการปรับเปลี่ยนค่าเหล่านี้ทีละรายการ
หากต้องการเปลี่ยนมาตราส่วนเมื่อวางเมาส์เหนือฟังก์ชัน คุณต้องทำซ้ำฟังก์ชันทั้งหมดในพร็อพเพอร์ตี้การเปลี่ยนรูปแบบ แม้ว่าค่าของฟังก์ชันเหล่านั้นจะยังคงเหมือนเดิมก็ตาม
.target:hover {
transform: translateX(50%) rotate(30deg) scale(2); /* Only the value of scale() changed */
}
คุณสมบัติการเปลี่ยนรูปแบบแต่ละรายการ
การจัดส่งด้วย Chrome 104 เป็นพร็อพเพอร์ตี้แต่ละรายการสำหรับการแปลง CSS พร็อพเพอร์ตี้คือ scale
, rotate
และ translate
ซึ่งคุณใช้เพื่อกําหนดส่วนต่างๆ ของการเปลี่ยนรูปแบบแยกกันได้
เมื่อทำเช่นนี้ Chrome จะรวม Firefox และ Safari ซึ่งสนับสนุนคุณสมบัติเหล่านี้อยู่แล้ว
เขียนตัวอย่าง transform
ก่อนหน้านี้ใหม่ด้วยพร็อพเพอร์ตี้แต่ละรายการ ข้อมูลโค้ดจะกลายเป็นดังนี้
.target {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
การสั่งซื้อมีความสำคัญ
ความแตกต่างหลักอย่างหนึ่งระหว่างพร็อพเพอร์ตี้ CSS transform
เดิมกับพร็อพเพอร์ตี้ใหม่คือลำดับการใช้การเปลี่ยนรูปแบบที่ประกาศ
เมื่อใช้ transform
ฟังก์ชันการเปลี่ยนรูปแบบจะทำงานตามลำดับที่เขียนจากซ้าย (ภายนอก) ไปขวา (ด้านใน)
หากพร็อพเพอร์ตี้การเปลี่ยนรูปแบบแต่ละรายการไม่ได้เรียงตามลำดับ จึงจะประกาศไม่ได้ ลำดับจะเหมือนเดิมเสมอ นั่นคือ translate
(ภายนอก) ก่อน จากนั้นตามด้วย rotate
และ scale
(ภายใน)
ซึ่งหมายความว่าข้อมูลโค้ดทั้ง 2 รายการต่อไปนี้จะให้ผลลัพธ์เดียวกัน
.transform--individual {
translate: 50% 0;
rotate: 30deg;
scale: 1.2;
}
.transform--individual-alt {
rotate: 30deg;
translate: 50% 0;
scale: 1.2;
}
ในทั้งสองกรณี องค์ประกอบเป้าหมายจะได้รับการแปลโดย 50%
บนแกน X ก่อน จากนั้นจะหมุนโดย 30deg
และสุดท้ายคือปรับขนาดเป็น 1.2
หากมีการประกาศพร็อพเพอร์ตี้การเปลี่ยนรูปแบบรายการใดรายการหนึ่งพร้อมกับพร็อพเพอร์ตี้ transform
ระบบจะใช้การเปลี่ยนรูปแบบแต่ละรายการก่อน (translate
, rotate
แล้วตามด้วย scale
) โดยมี transform
สุดท้าย (ภายใน) รายละเอียดเพิ่มเติมอยู่ในข้อกำหนดซึ่งระบุวิธีคำนวณเมทริกซ์การเปลี่ยนรูปแบบ
ภาพเคลื่อนไหว
เหตุผลหลักที่เพิ่มคุณสมบัติเหล่านี้คือทำให้ภาพเคลื่อนไหวง่ายขึ้น สมมติว่าคุณต้องการให้องค์ประกอบเคลื่อนไหวดังนี้
ใช้ไป transform
หากต้องการใช้ภาพเคลื่อนไหวนี้โดยใช้ transform
คุณจะต้องคำนวณค่าระหว่างค่าทั้งหมดสำหรับการเปลี่ยนรูปแบบที่กำหนดไว้ทั้งหมด และรวมค่าเหล่านั้นไว้ในแต่ละคีย์เฟรม เช่น หากต้องการหมุนที่เครื่องหมาย 10% จะต้องคํานวณค่าสำหรับการเปลี่ยนรูปแบบอื่นๆ ด้วย เนื่องจากพร็อพเพอร์ตี้ transform
ต้องใช้ค่าทั้งหมด
โค้ด CSS ที่ได้จะกลายเป็นดังนี้
@keyframes anim {
0% { transform: translateX(0%); }
5% { transform: translateX(5%) rotate(90deg) scale(1.2); }
10% { transform: translateX(10%) rotate(180deg) scale(1.2); }
90% { transform: translateX(90%) rotate(180deg) scale(1.2); }
95% { transform: translateX(95%) rotate(270deg) scale(1.2); }
100% { transform: translateX(100%) rotate(360deg); }
}
.target {
animation: anim 2s;
animation-fill-mode: forwards;
}
การใช้คุณสมบัติการเปลี่ยนรูปแบบแต่ละรายการ
คุณสมบัติ Transform แต่ละรายการช่วยให้เขียนได้ง่ายขึ้นมาก แทนที่จะลากการเปลี่ยนรูปแบบทั้งหมดจากคีย์เฟรมไปยังคีย์เฟรม คุณสามารถกำหนดเป้าหมายการเปลี่ยนรูปแบบแต่ละรายการแยกกันได้ นอกจากนี้ คุณจึงไม่จำเป็นต้องคำนวณค่าเหล่านั้นทั้งหมดอีกต่อไป
@keyframes anim {
0% { translate: 0% 0; }
100% { translate: 100% 0; }
0%, 100% { scale: 1; }
5%, 95% { scale: 1.2; }
0% { rotate: 0deg; }
10%, 90% { rotate: 180deg; }
100% { rotate: 360deg; }
}
.target {
animation: anim 2s;
animation-fill-mode: forwards;
}
การใช้คุณสมบัติการเปลี่ยนรูปแบบแต่ละรายการและคีย์เฟรมหลายรายการ
ในการสร้างโค้ดเป็นโมดูล คุณสามารถแยกภาพเคลื่อนไหวย่อยแต่ละภาพเคลื่อนไหวเป็นชุดคีย์เฟรมของตัวเองได้
@keyframes move {
0% { translate: 0% 0; }
100% { translate: 100% 0; }
}
@keyframes scale {
0%, 100% { scale: 1; }
5%, 95% { scale: 1.2; }
}
@keyframes rotate {
0% { rotate: 0deg; }
10%, 90% { rotate: 180deg; }
100% { rotate: 360deg; }
}
.target {
animation: move 2s, scale 2s, rotate 2s;
animation-fill-mode: forwards;
}
การแยกนี้ทำให้คุณสามารถใช้ชุดคีย์เฟรมแต่ละชุดแยกกันได้ตามต้องการ เนื่องจากพร็อพเพอร์ตี้ transform
ซึ่งตอนนี้ได้กลายเป็นพร็อพเพอร์ตี้เดี่ยว จะไม่มีการเขียนทับกันอีกต่อไป ที่ด้านบน คุณสามารถกำหนดช่วงเวลาที่แตกต่างกันสำหรับการเปลี่ยนรูปแบบแต่ละรายการโดยไม่ต้องเขียนล็อตใหม่ทั้งตัว
การแสดง
ภาพเคลื่อนไหวที่ใช้คุณสมบัติใหม่เหล่านี้มีประสิทธิภาพเทียบเท่ากับภาพเคลื่อนไหวของพร็อพเพอร์ตี้ transform
ที่มีอยู่
ภาพเคลื่อนไหวของ translate
, rotate
และ scale
ทำงานบนตัวจัดวางองค์ประกอบในลักษณะเดียวกับภาพเคลื่อนไหวของ transform
จึงดีต่อประสิทธิภาพของภาพเคลื่อนไหวเช่นเดียวกับ transform
พร็อพเพอร์ตี้ใหม่เหล่านี้ยังใช้งานร่วมกับพร็อพเพอร์ตี้ will-change
ได้ด้วย โดยทั่วไปแล้ว คุณควรหลีกเลี่ยงการใช้ will-change
มากเกินไป โดยนำไปใช้กับองค์ประกอบให้น้อยที่สุดเท่าที่จำเป็น และใช้เวลาน้อยที่สุดเท่าที่จะเป็นไปได้ แต่คุณควรระบุให้เฉพาะเจาะจงที่สุดเท่าที่จะทำได้ ตัวอย่างเช่น หากคุณใช้ will-change
เพื่อเพิ่มประสิทธิภาพภาพเคลื่อนไหวด้วยพร็อพเพอร์ตี้ rotate
และ filter
คุณควรประกาศโดยใช้ will-change: rotate, filter
ซึ่งดีกว่าการใช้ will-change: transform, filter
เล็กน้อยในกรณีที่คุณทำให้ rotate
และ filter
เคลื่อนไหว เนื่องจากโครงสร้างข้อมูลบางอย่างที่ Chrome สร้างขึ้นล่วงหน้าเมื่อคุณใช้ will-change
นั้นแตกต่างจาก rotate
สำหรับ transform
ส่วนหนึ่งของชุดหนังสือที่ทำงานร่วมกันแบบใหม่