- ภาพ SVG แบบเคลื่อนไหว ยังคงความ ความละเอียดสูง ไว้ได้ ขณะเดียวกันก็มีขนาดไฟล์ เล็กมาก (49KB)
- ให้ เอฟเฟกต์ภาพคล้าย GIF แบบเดิม แต่จริง ๆ แล้วใช้ความสามารถของ SVG animation
- สามารถ ใช้งานได้โดยตรงแม้ในไฟล์ Github README.md
- ใช้เครื่องมือ asciinema และ svg-term-cli เพื่อบันทึกเซสชันเทอร์มินัล → แปลงเป็น SVG animation ได้
- ใช้องค์ประกอบ แอนิเมชันของ SVG (
<animate>, <animateTransform>, <animateMotion>)
จุดเด่นของ SVG แบบเคลื่อนไหว
- ภาพเคลื่อนไหวที่สร้างด้วย SVG ดูคล้าย GIF แบบเดิม แต่จริง ๆ แล้วใช้ความสามารถ แอนิเมชันแบบเวกเตอร์ของ SVG
- วิธีนี้ทำให้ ขนาดไฟล์เล็กมาก และสามารถ ปรับขนาดหรือซูมได้โดยไม่เสียคุณภาพ
- ข้อดีสำคัญคือสามารถนำไปใช้ได้ทันทีในที่อย่าง README.md ของ Github
- ตัวอย่างที่ยกมาคือ parrot SVG แบบเคลื่อนไหวความละเอียดสูงที่มีขนาดเพียง 49KB
วิธีสร้าง
- บันทึกเซสชันเทอร์มินัลผ่าน asciinema
- นำไฟล์ asciinema ที่บันทึกไว้มาแปลงด้วยเครื่องมือ svg-term-cli เพื่อสร้างไฟล์ SVG animation
- ไฟล์ SVG ที่สร้างขึ้นสามารถเพิ่มลงใน README.md ได้อย่างง่ายดาย
- ผู้เขียนกำลังใช้วิธีนี้อย่างจริงจังในหลายโปรเจ็กต์ เช่น bespoken
หลักการทำงานของ SVG animation
- ในสเปกของ SVG มี ความสามารถด้านแอนิเมชัน ฝังมาอยู่แล้ว
<animate>: ทำให้แอตทริบิวต์แต่ละรายการเคลื่อนไหวตามเวลา
<animateTransform>: ใช้กับแอนิเมชันการแปลง เช่น การหมุน การปรับขนาด และการย้ายตำแหน่ง
<animateMotion>: ทำให้วัตถุเคลื่อนที่ไปตามเส้นทาง
- svg-term-cli ทำงานโดยอาศัยความสามารถแอนิเมชันที่มีอยู่ใน SVG เหล่านี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
กำลังทึ่งมากว่าแค่ใช้ SVG อย่างเดียวก็ทำงานที่หลากหลายและน่าประทับใจได้มากจริง ๆ ตัวอย่างที่เจอในวิกิพีเดียและสะดุดตาได้แก่ แอนิเมชันโคลน Missile Command, แผนที่ London Tube, แอนิเมชัน rolling shutter
SVG เดิมทีมีประวัติเริ่มต้นในฐานะคู่แข่งแบบเปิดของ Shockwave/Flash Player และเป็นฟอร์แมตแอปสำหรับ PDA อีกทั้งยังเคยมีการพิจารณาเพิ่มการรองรับเครือข่ายจริง ๆ ด้วย
ที่ แผนที่ London Tube น่าประทับใจมากก็เพราะมีการระบุสถานี "ไม่มีบันได" สำหรับผู้ใช้วีลแชร์และผู้โดยสารที่มีข้อจำกัดด้านการเดินทาง พอเห็นตัวอย่างมิสไซล์อันแรกก็คิดวิธีเขียนโปรแกรมให้คลิกหัวรบได้ทันที รู้สึกเหมือนได้ช่วยโลกไว้เลย
สงสัยว่าทำไมลิงก์ Missile Command อันแรกถึงทำงานไม่ถูกต้องใน Safari กดปุ่มได้ แต่คลิกหัวรบแล้วไม่ตอบสนอง ใน Firefox ยังเห็นเคอร์เซอร์แบบกากบาท แต่ Safari เหมือนมีอะไรบางอย่างใช้ไม่ได้
ฟังก์ชัน checkbox ในแผนที่ Tube เจ๋งมาก ทำให้อยากฝึกสกิล SVG ให้มากขึ้น จดบุ๊กมาร์กไว้แล้ว
เห็นแค่ชื่อบทความตอนแรกก็นึกว่าเป็นเครื่องมือแสดงแฮชของไฟล์ README แบบภาพ แต่ถ้ามีฟีเจอร์แสดงผลแบบนั้นจริงก็น่าจะช่วยให้ผู้ใช้สังเกตได้ง่ายขึ้นเวลาที่ TOS หรือ EULA ถูกแก้แบบเนียน ๆ
มีคนแชร์ประสบการณ์ว่าเคยฝัง SVG แบบแอนิเมชันไว้ใน README และทำให้ SVG นี้อัปเดตข้อมูลสภาพอากาศกับวันในสัปดาห์วันละครั้ง อ้างอิง จริง ๆ แล้วเป็นโปรเจ็กต์ที่ทำไว้เมื่อหลายปีก่อนช่วงโดนเรียกไปทำหน้าที่ลูกขุน
ถ้าเป้าหมายคือ Github README ก็สามารถฝังวิดีโอโดยตรงได้เหมือนกัน พร้อมยกตัวอย่างลิงก์ git-recent README แต่ถ้าเป็นแค่การแคปเจอร์เทอร์มินัลธรรมดา การใช้วิธี SVG ของ OP อาจเป็นตัวเลือกที่ฉลาดกว่า
ข้อดีของการใช้วิดีโอคือมี UI สำหรับเล่น/หยุด/เลื่อนสไลด์ บางแพลตฟอร์มก็เติม UI ควบคุมให้ GIF ด้วย JavaScript ได้ แต่เพราะเบราว์เซอร์ไม่ได้รองรับเป็นพื้นฐานจึงมีข้อจำกัด เลยเป็นเหตุผลที่บางครั้งชอบวิดีโอมากกว่า ตอนทำ SVG animation สำหรับ RevealJS ก็จะควบคุมด้วย CSS/JS ตามต้องการ
ถ้าจะเพิ่มไฟล์วิดีโอ การอัปโหลดผ่านการแก้ README บน Github โดยตรงเพื่อให้ไฟล์ไปเก็บบน githubusercontent ก็เป็นทางเลือกที่ดีกับขนาดของ repository ด้วย
SVG ต่างจากวิดีโอตรงที่สามารถตอบสนองต่อการตั้งค่าธีมสว่าง/มืดของผู้ใช้ได้ และยังรองรับการปรับขนาดแบบ responsive ซึ่งวิดีโอทำไม่ได้ มีการแนะนำ เดโมที่เกี่ยวข้อง แต่ก็เสียดายว่าฟีเจอร์นี้แม้จะทำงานดีใน Firefox/Chrome กลับยังทำได้ยากใน Safari อยู่เหมือนเดิม
มีการเอ่ยถึง Paul หลังจากไม่ได้พูดถึงมานาน พร้อมแสดงความชอบต่องานเก่าอย่าง Echo Nest และงานกับ Rdio API
ในความเห็นของฉัน ถ้าเป็นการแคปเจอร์เทอร์มินัล วิธี SVG ยังใช้งานจริงได้ไม่มากเพราะขาดความสามารถในการควบคุม เหมาะกับการอธิบาย motion สั้น ๆ ราว 5 วินาทีเพื่อเดโมซอฟต์แวร์ แต่ในบางกรณีวิดีโอก็อาจดีกว่า
ความสามารถในการคัดลอกข้อความได้ตรงจากแอนิเมชันดูเป็นสิ่งที่ไม่ได้ชัดเจนในทันที แต่กลับดูเป็นฟีเจอร์ที่เจ๋งที่สุด
มีคำเตือนว่า SVG บางไฟล์มีบั๊กที่ทำให้หน้าเว็บค้างได้ ดังนั้นควรหลีกเลี่ยงการฝังลิงก์ SVG จากบุคคลที่สาม ทั้งฝั่ง Google Chrome และ Firefox ก็ไม่มีแผนจะแก้บั๊กนี้ พร้อมแนบ ตัวอย่าง SVG อันตรายสำหรับทดสอบ แต่เตือนว่าคลิกแล้วเบราว์เซอร์อาจล่ม
มีความเห็นว่าปัญหาหน้าเว็บหรือเบราว์เซอร์ค้างไม่ใช่ประเด็นด้านความปลอดภัยเสียทีเดียว แต่เป็นเรื่องทั่วไปที่เกิดได้จากการใช้ฟังก์ชันในตัวหลายแบบมากเกินไป ตัวอย่างเช่นการใช้ blur filter chain ยาว ๆ อาจทำให้เรนเดอร์หนักจน Chrome ค้างได้ ถ้าผลกระทบลามเกินแท็บก็ยิ่งแย่ แต่โดยพื้นฐานแล้วน่าจะเป็นปัญหาด้านการใช้งาน UI มากกว่า
มีคนตั้งคำถามว่าช่องโหว่ที่เกี่ยวกับ SVG แบบนี้ เช่นการโจมตี XXE ยังทำได้หรือไม่ในสภาพแวดล้อมที่ถูกจำกัดอย่าง Github README และถ้าทำได้ Github ป้องกันไว้อย่างไร
ความจริงที่ว่า "SVG เป็นแอนิเมชันโดยเนื้อแท้" ทำให้รู้สึกสดใหม่มากและจุดประกายไอเดียหลายอย่าง เลยสงสัยว่าสามารถทำให้เล่นวนไม่สิ้นสุดได้หรือไม่
ตั้งค่า repeatCount หรือ repeatDur ของแท็ก
<animate>เป็นindefiniteก็ทำให้เล่นวนไม่สิ้นสุดได้ เนื่องจากการวนเป็นระดับแอตทริบิวต์ องค์ประกอบแต่ละส่วนของภาพจึงขยับคนละจังหวะกันได้มีการแชร์โค้ดตัวอย่างที่ดูได้จาก เอกสารทางการของ SVG animation
นอกจากแอนิเมชันแบบอิงแอตทริบิวต์แล้ว SVG ยังฝัง Ecmascript (Javascript) ได้ด้วย จึงสามารถเติมฟังก์ชันอะไรก็ได้ผ่านสคริปต์ตามต้องการ เอกสารสคริปต์ของ W3C
มีการแชร์ ตัวอย่างและโค้ดตัวอย่าง SVG animation เพิ่มเติมด้วย บางอันจะเห็นเมื่อรีเฟรชหน้าเว็บ
มีคนฝันถึงระบบที่ในอนาคตเบราว์เซอร์จะรองรับการเสียบ execution engine อะไรก็ได้ เช่น WASM, JVM, CLR โดยให้ผลลัพธ์ออกมาเป็น SVG (ข้อความ/ไบนารี) เพื่อให้นักพัฒนาเลือกจับคู่ execution model กับ view ได้อย่างอิสระ และไม่ต้องผูกติดกับ DOM อีกต่อไป
แอปอย่าง AutoCAD Web, Photopea, Figma, Google Docs, Google Earth Web, Flutter for Web(CanvasKit) ก็เข้าใกล้วิธีนี้อยู่แล้ว เพราะเลือกเลี่ยง DOM หรือใช้ rendering engine แบบอื่น กล่าวคือเราไม่ได้อยู่ในยุคที่ DOM เป็นข้อบังคับเพียงอย่างเดียวแล้ว
ในอดีตเคยมี runtime จากภายนอกอย่าง Flash, Java, Silverlight, ActiveX ที่ครองเว็บ แต่ตอนนี้หลายคนยังเชื่อว่าการมีภาษา/แพลตฟอร์มร่วมกันคือข้อได้เปรียบ และในสภาพแวดล้อมด้านความปลอดภัยทุกวันนี้ เทคโนโลยีเสริมแบบยุคก่อนก็อยู่รอดได้ยาก
ข้อดีของ DOM (HTML) คือออกแบบให้ตอบสนองต่อสภาพแวดล้อมการแสดงผลที่หลากหลายได้ดี ส่วน SVG มีอิสระด้านนี้น้อยกว่า
แม้จะฟังดูแปลกมาก แต่ก็อยากลองทำแผนภาพสถาปัตยกรรมแบบ SVG ให้เป็นแอนิเมชัน โดยให้โหนดต่าง ๆ แสดงด้วยแอนิเมชันดรามาติก เช่น ซูมแบบฉากต่อสู้ ค้างเฟรม หรือเอฟเฟกต์เส้นแสงวาบ
โพสต์สไตล์ TIL แบบนี้มีส่วนช่วยกระตุ้นความคิดสร้างสรรค์มาก เพราะแชร์ประสบการณ์ใช้เครื่องมือใหม่โดยตรง แถมยังเสนอวิธีฝ่าข้อจำกัดของ Github Markdown ด้วย พอเห็นผลลัพธ์ SVG (ตัวอย่าง) แล้วก็รู้สึกสดใหม่มาก เพราะนี่เป็นครั้งแรกที่ได้เห็นโครงสร้าง inline SVG ซ้อน inline SVG
เป็นไอเดียที่เจ๋งมาก อยากลองทดสอบว่าใน README จะจับคู่กับเอฟเฟกต์ที่ terminaltexteffects ทำไว้ได้อย่างไรบ้าง แม้จะไม่ได้รู้เรื่อง SVG มากนัก แต่ก็พอเข้าใจว่าถ้าเก็บข้อความจริงทั้งหมดไว้ ไฟล์ข้อมูลอาจใหญ่ได้ ถึงอย่างนั้นก็ยังอยากลองทำเล่นดู