ไลบรารีแอนิเมชัน confetti สำหรับฟรอนต์เอนด์ที่ใช้งานได้สะดวก
(github.com/catdad)-
วิธีติดตั้ง
- ติดตั้งเป็นโมดูลผ่าน NPM ได้
npm install --save canvas-confetti - ใช้งานในโปรเจกต์ได้ด้วย
require('canvas-confetti') - เนื่องจากเป็นคอมโพเนนต์ฝั่งไคลเอนต์ จึงไม่ทำงานบน Node ต้องบิลด์โปรเจกต์ด้วย webpack เป็นต้น
- สามารถใส่ลงในหน้า HTML ได้โดยตรงผ่าน CDN
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.2/…; - เมื่อนำไปใช้ในโปรเจกต์ แนะนำให้ใช้เวอร์ชันล่าสุดจากหน้า releases
- ติดตั้งเป็นโมดูลผ่าน NPM ได้
-
โหมดลดแอนิเมชัน
- ผู้ใช้บางคนไม่ชอบการเคลื่อนไหว จึงควรคำนึงถึงเรื่องนี้
- สามารถดูแลผู้ใช้ที่ไม่ต้องการแอนิเมชันที่รบกวนสายตาได้ด้วยตัวเลือก
disableForReducedMotion - โดยค่าเริ่มต้นจะปิดอยู่ แต่มีแผนจะเปลี่ยนค่าเริ่มต้นในเมเจอร์รีลีสถัดไป
API
-
confetti([options {Object}])→Promise|null- รับอ็อบเจ็กต์ตัวเลือกเพียงตัวเดียวเป็นพารามิเตอร์
- หากใช้
window.Promiseได้ จะคืนค่า Promise และหากใช้ไม่ได้ (เช่น IE) จะคืนค่าnull - สามารถส่ง implementation ของ Promise ผ่าน Polyfill หรือ
confetti.Promiseได้ - หากเรียก
confettiหลายครั้งก่อนเสร็จ จะคืน Promise เดิม และภายในจะใช้ element canvas เดิมซ้ำ - เมื่อแอนิเมชันทั้งหมดเสร็จสิ้น Promise ที่คืนจากแต่ละการเรียกจะถูก resolve
- พร็อพเพอร์ตีหลักของอ็อบเจ็กต์
optionsparticleCount,angle,spread,startVelocity,decay,gravity,drift,ticks,origin,colors,shapes,scalar,zIndexเป็นต้น
-
confetti.shapeFromPath({ path, matrix? })→Shape- สร้างรูปทรง confetti แบบกำหนดเองด้วยสตริง SVG Path
- รองรับเฉพาะสีเดียว และยังไม่รองรับ Stroke
- ต้องใช้เมทริกซ์การแปลง สามารถส่งมาเองหรือคำนวณด้วย helper ก็ได้
- ใช้ได้เฉพาะเบราว์เซอร์ที่รองรับ
Path2D - คืนค่าอ็อบเจ็กต์
Shape
-
confetti.shapeFromText({ text, scalar?, color?, fontFamily? })→Shape- ฟีเจอร์สำหรับเรนเดอร์ confetti แบบอีโมจิ
- แนะนำให้ใช้ตัวอักษรเดี่ยว โดยเฉพาะอีโมจิ
- เนื่องจากข้อความจะถูกแปลงเป็นแรสเตอร์ จึงไม่เหมาะกับการปรับขนาดหลังจากสร้างแล้ว
- หากปรับขนาดด้วย
scalarต้องใช้ค่าเดียวกันที่นี่ด้วย - ตัวเลือก
text,scalar,color,fontFamily
-
confetti.create(canvas, [globalOptions])→function- สร้างอินสแตนซ์ของฟังก์ชัน
confettiที่ใช้ canvas แบบกำหนดเอง - สามารถจำกัดขนาดของ canvas ได้
- ตัวเลือกแบบโกลบอล
resize: ตั้งค่าขนาดภาพของ canvas และจะคงไว้เมื่อขนาดหน้าต่างเปลี่ยนหรือไม่useWorker: จะใช้ asynchronous web worker สำหรับการเรนเดอร์เมื่อเป็นไปได้หรือไม่disableForReducedMotion: จะปิดการทำงานของ confetti ทั้งหมดหรือไม่สำหรับผู้ใช้ที่เปิดโหมดลดแอนิเมชัน
- ข้อควรระวังเมื่อใช้
useWorker: true- ห้ามจัดการ canvas โดยตรง เพราะสิทธิ์ควบคุมจะถูกย้ายไปยัง web worker
- สร้างอินสแตนซ์ของฟังก์ชัน
-
confetti.reset()- หยุดแอนิเมชันและลบ confetti ทั้งหมด
- resolve Promise ที่ยังไม่ถูก resolve ทันที
- อินสแตนซ์ที่สร้างด้วย
confetti.createจะมีเมธอดresetของตัวเอง
ตัวอย่างการใช้งาน
-
การใช้งานพื้นฐาน
confetti(); -
ใช้ confetti จำนวนมาก
confetti({ particleCount: 150 }); -
กระจายให้กว้าง
confetti({ spread: 180 }); -
ยิงปริมาณน้อยจากตำแหน่งแบบสุ่ม
confetti({ particleCount: 100, startVelocity: 30, spread: 360, origin: { x: Math.random(), y: Math.random() - 0.2 } }); -
ยิงต่อเนื่องจากหลายทิศทางเป็นเวลา 30 วินาที
var duration = 30 * 1000; var end = Date.now() + duration; (function frame() { confetti({ particleCount: 7, angle: 60, spread: 55, origin: { x: 0 } }); confetti({ particleCount: 7, angle: 120, spread: 55, origin: { x: 1 } }); if (Date.now() < end) { requestAnimationFrame(frame); } }());
ความเห็นของ GN⁺
-
canvas-confettiดูเป็นไลบรารีขนาดเบาที่ช่วยใส่เอฟเฟกต์คอนเฟตตีลงในเว็บเพจได้ง่าย รองรับทั้งการติดตั้งผ่าน NPM และการใช้งานผ่าน CDN จึงดูสะดวกสำหรับนักพัฒนา -
รองรับการตั้งค่าเอฟเฟกต์คอนเฟตตีได้หลากหลาย จึงมีความยืดหยุ่นสูง สามารถปรับจำนวนคอนเฟตตี ระดับการกระจาย ขนาด รูปทรง สีสัน ฯลฯ ได้อย่างอิสระ น่าจะเหมาะกับการสร้างบรรยากาศได้หลายแบบ
-
การสร้างคอนเฟตตีรูปทรงกำหนดเองด้วยข้อความหรือ SVG path ก็น่าสนใจ โดยเฉพาะคอนเฟตตีที่ใช้อีโมจิถือเป็นไอเดียที่สนุกดี
-
การใช้ Web Worker เพื่อรันแอนิเมชันโดยไม่บล็อกเมนเธรดก็ดูเป็นข้อดี อย่างไรก็ตาม ในกรณีนี้จะไม่สามารถควบคุม canvas โดยตรงได้ จึงมี trade-off อยู่
-
การรองรับโหมดลดแอนิเมชันเพื่อคำนึงถึงผู้ใช้บางส่วนที่ไวต่อการเคลื่อนไหวเป็นเรื่องที่ดีในแง่ของการเข้าถึงเว็บ และควรทราบว่าในเวอร์ชันถัดไปโหมดนี้มีแผนจะถูกเปิดใช้เป็นค่าเริ่มต้น
-
โดยรวมแล้วดูเป็นไลบรารีที่ใช้งานง่ายและมีตัวเลือกหลากหลาย น่าจะเหมาะกับหน้าฉลองหรือเกมที่ต้องการบรรยากาศสนุกสนาน แต่หากใช้มากเกินไปก็อาจกระทบต่อประสบการณ์ผู้ใช้ได้ จึงควรใช้งานอย่างพอเหมาะ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News