การสร้างภาพเคลื่อนไหวของภาพพื้นหลังโดยใช้โปรแกรม
วิธีหลักๆ ที่ผู้ใช้ใช้เพื่อสร้างภาพเคลื่อนไหวให้กับภาพพื้นหลังมี 2 วิธีดังนี้
- ใช้ CSS Sprite เพื่ออัปเดต
background-positionใน JS - เคล็ดลับเกี่ยวกับ
.toDataURL()
วิธีแรกเหมาะอย่างยิ่งหากคุณมีรูปภาพล่วงหน้า แต่จะทำอย่างไรหากแหล่งที่มาต้องสร้างขึ้นโดยอัตโนมัติ เช่น สร้างโดย <canvas> วิธีแก้ปัญหา #1 คือการใช้ .toDataURL() บน Canvas และตั้งค่าพื้นหลังเป็น URL ที่สร้างขึ้น
while(1) {
var url = canvas.toDataURL('image/jpeg');
el.style.background = 'url(' + url + ')';
}
ซึ่งมีปัญหา 2 อย่างดังนี้
data:URL จะเพิ่มขนาดของรูปภาพที่ได้ประมาณ 33%- การแตะ DOM จำนวนมาก (
el.style)
ทั้ง 2 วิธีนี้ไม่มีประสิทธิภาพและใช้ไม่ได้กับเว็บแอป 60fps ที่ลื่นไหลอยู่เสมอ
การใช้ Canvas แบบ 2 มิติเป็นพื้นหลัง
ปรากฏว่ามี API ที่ไม่เป็นไปตามมาตรฐานซึ่ง WebKit มีมาหลายปีแล้วที่สามารถใช้ Canvas เป็นแหล่งที่มาของพื้นหลังได้ แต่ขออภัย เราไม่มีข้อกำหนดที่เผยแพร่สำหรับฟีเจอร์นี้
ก่อนอื่น ให้ทำดังนี้แทนการระบุ URL สำหรับการย้อนกลับ
.bg {
background: url(bg.png) no-repeat 50% 50%;
}
ใช้ -webkit-canvas() โดยอ้างอิงตัวระบุสตริงไปยังบริบท Canvas ดังนี้
.canvas-bg {
background: -webkit-canvas(animation) no-repeat 50% 50%;
}
จากนั้นเราต้องสร้างบริบท 2 มิติด้วย.getContext()เวอร์ชันพิเศษ
var ctx = document.getCSSCanvasContext('2d', 'animation', 300, 300);
ข้อมูลเพิ่มเติมจาก Dave Hyatt
ภาพเคลื่อนไหว
ดังที่เห็นในการสาธิต เราสามารถนำ requestAnimationFrame() มาใช้ซ้ำเพื่อขับเคลื่อนภาพเคลื่อนไหวได้ ซึ่งเป็นเรื่องดีเพราะเมื่อเชื่อมต่อแล้ว การเชื่อมโยงระหว่าง CSS กับองค์ประกอบ Canvas จะยังคงอยู่ คุณไม่จำเป็นต้องแก้ไข DOM
หากเดโมไม่เคลื่อนไหวใน Chrome
ปัจจุบันช่องทางเสถียรของ Chrome (เวอร์ชัน 23) มี crbug.com/161699 ซึ่งทำให้ภาพเคลื่อนไหว requestAnimationFrame() อัปเดตพื้นหลังไม่ถูกต้อง ปัญหานี้ได้รับการแก้ไขแล้วใน Chrome 25 (ปัจจุบันคือ Canary) การสาธิตควรทำงานได้ดีใน Safari เวอร์ชันปัจจุบันด้วย
สิทธิประโยชน์ด้านประสิทธิภาพ
เรากำลังพูดถึง Canvas ตอนนี้ภาพเคลื่อนไหวที่เร่งด้วยฮาร์ดแวร์พร้อมใช้งานอย่างเต็มรูปแบบแล้ว (อย่างน้อยก็สำหรับเบราว์เซอร์ที่ฟีเจอร์นี้ใช้งานได้) และเพื่อเป็นการย้ำอีกครั้งว่า คุณไม่จำเป็นต้องดัดแปลง DOM จาก JS
การใช้ WebGL เป็นพื้นหลัง
เดี๋ยวนะ นี่หมายความว่าเราสามารถขับเคลื่อนพื้นหลัง CSS โดยใช้ WebGL ได้ไหม แน่นอน WebGL เป็นเพียงบริบท 3 มิติสำหรับ Canvas เพียงแค่เปลี่ยน "2d" เป็น "experimental-webgl" ก็เรียบร้อย
var gl = document.getCSSCanvasContext('experimental-webgl', 'animation', 300, 150);
นี่คือการพิสูจน์แนวคิดที่มี div ที่มีพื้นหลังซึ่งวาดโดยใช้ Vertex และ Fragment Shader: DEMO
วิธีอื่นๆ
โปรดทราบว่า Mozilla มี -moz-element() (MDN) มาสักระยะหนึ่งแล้ว ซึ่งเป็นส่วนหนึ่งของข้อกำหนดค่ารูปภาพ CSS และโมดูลเนื้อหาที่แทนที่ระดับ 4 และช่วยให้คุณสร้างรูปภาพที่สร้างจาก HTML ที่กำหนดเองได้ ไม่ว่าจะเป็นวิดีโอ Canvas เนื้อหา DOM ฯลฯ อย่างไรก็ตาม การให้สิทธิ์เข้าถึงรูปภาพสแนปชอตของ DOM อย่างเต็มรูปแบบอาจทำให้เกิดความกังวลด้านความปลอดภัย นี่คือเหตุผลหลักที่เบราว์เซอร์อื่นๆ ยังไม่ได้นำฟีเจอร์ดังกล่าวมาใช้