แทนที่ เพิ่ม หรือสะสม นั่นคือคำถาม
การรวมเอฟเฟกต์ภาพเคลื่อนไหวหลายรายการ
พร็อพเพอร์ตี้ animation-composition
ช่วยให้ควบคุมสิ่งที่ควรเกิดขึ้นเมื่อภาพเคลื่อนไหวหลายรายการส่งผลต่อพร็อพเพอร์ตี้เดียวกันพร้อมกัน
สมมติว่าคุณมีการเปลี่ยนรูปแบบพื้นฐานนี้ที่ใช้กับองค์ประกอบ
transform-origin: 50% 50%;
transform: translateX(50px) rotate(45deg);
และคุณยังมีชุดคีย์เฟรมนี้ด้วย
@keyframes adjust {
to {
transform: translateX(100px);
}
}
เมื่อใช้คีย์เฟรมเหล่านี้กับองค์ประกอบ transform
ในคีย์เฟรม to
จะแทนที่ transform
ที่มีอยู่ นี่คือลักษณะการทำงานเริ่มต้น
animation-composition
ช่วยให้คุณควบคุมได้ว่าจะให้เกิดอะไรขึ้นแทน replace
เริ่มต้น ค่าที่ยอมรับมีดังนี้
replace
: ค่าเอฟเฟกต์จะแทนที่ค่าพื้นฐาน (ค่าเริ่มต้น)add
: ระบบจะเพิ่มมูลค่าเอฟเฟกต์ลงในมูลค่าพื้นฐานaccumulate
: ระบบจะรวมค่าเอฟเฟกต์กับค่าพื้นฐาน
ความแตกต่างระหว่างการเพิ่มและการสะสมนั้นเล็กน้อย เช่น พิจารณาค่า 2 ค่า ได้แก่ blur(2)
และ blur(3)
เมื่อรวมกันแล้วจะได้ blur(2) blur(3)
แต่เมื่อสะสมแล้วจะได้ blur(5)
คุณเปรียบเทียบสิ่งนี้กับถ้วยที่เต็มไปด้วยชาได้ เมื่อเทนมลงในแก้ว สิ่งที่จะเกิดขึ้นคือ
replace
: ชาจะถูกนำออกและแทนที่ด้วยนมadd
: มีการเติมนมลงในแก้ว แต่ยังคงเป็นชั้นอยู่เหนือชาaccumulate
: เมื่อเติมนมลงในชาและเนื่องจากทั้ง 2 อย่างเป็นของเหลว จึงผสมกันได้ดี
สาธิต
ในเดโมด้านล่างมีกล่องสีเทา 3 กล่องที่มีการใช้transform
และanimation
แม้ว่ากล่องเหล่านี้จะมีภาพเคลื่อนไหวเหมือนกัน แต่จะให้ผลลัพธ์ที่แตกต่างกันเนื่องจากมีanimation-composition
ที่แตกต่างกัน ดังนี้
ช่องแรกตั้งค่าไว้เป็น animation-composition: replace
นี่คือลักษณะการทำงานเริ่มต้น ในตำแหน่งสุดท้าย ระบบจะแทนที่ค่า translateX(50px) rotate(45deg)
เดิมสำหรับ transform
ด้วย translateX(100px)
ช่องที่ 2 ตั้งค่าไว้เป็น animation-composition: add
ในตำแหน่งสุดท้าย ระบบจะเพิ่ม translateX(100px)
ลงใน translateX(50px) rotate(45deg)
เดิม ทำให้ได้ translateX(50px) rotate(45deg) translateX(100px)
ซึ่งจะย้ายกล่องไป 50 พิกเซล จากนั้นหมุน 45 องศา แล้วย้ายไป 100 พิกเซล
ช่องที่ 3 ตั้งค่าเป็น animation-composition: accumulate
ในตำแหน่งสุดท้าย ระบบจะนำ translateX(100px)
มาบวกกับ translateX(50px)
จากการเปลี่ยนรูปแบบเดิม ซึ่งส่งผลให้เกิดการเปลี่ยนรูปแบบเป็น translateX(150px) rotate(45deg)