แทนที่ JavaScript ด้วย HTML เพียงอย่างเดียว
(htmhell.dev)- แนะนำวิธีสมัยใหม่ในการ แทนที่ฟังก์ชันที่พึ่งพา JS บนเว็บด้วย HTML/CSS
- ใช้องค์ประกอบมาตรฐานอย่าง
details·summary,datalist,popoverเพื่อสร้างแอคคอร์เดียน การเติมข้อความอัตโนมัติ โมดัล และการนำทางแบบออฟสกรีน - แนวทางนี้ช่วย ลดการดาวน์โหลด·การประเมินผล·การใช้หน่วยความจำ จึงปรับปรุงทั้งประสิทธิภาพและประสบการณ์ผู้ใช้
- มี ตัวอย่าง CodePen, เอกสาร MDN, และข้อมูลความเข้ากันได้ของเบราว์เซอร์ สำหรับแต่ละความสามารถ
- ควรใช้ JS เฉพาะในส่วนที่จำเป็นจริง ๆ และ ใช้ความสามารถที่พัฒนาขึ้นของ HTML/CSS ให้เต็มที่
แทนที่ฟังก์ชัน JS ด้วย HTML และ CSS
- เป็นเวลานานที่ JavaScript รับหน้าที่ในส่วนที่ HTML และ CSS ทำไม่ได้
- แต่เมื่อความสามารถของ HTML และ CSS ขยายตัวขึ้น ฟังก์ชัน JS บางส่วนก็สามารถ แทนที่ด้วยเทคโนโลยีเว็บแบบเนทีฟ ได้
- เนื่องจาก JS ต้องดาวน์โหลด·แตกไฟล์บีบอัด·ประเมินผล·และคงอยู่ในหน่วยความจำ จึงมีประสิทธิภาพกว่าหาก ย้ายสิ่งที่ทำได้ไปใช้ HTML/CSS
- แนวคิดคือให้ JS โฟกัสกับลอจิกที่ซับซ้อน และมอบการควบคุม UI แบบง่ายให้กับ HTML/CSS
แอคคอร์เดียน / แผงเนื้อหาแบบขยายได้
- สามารถสร้างแอคคอร์เดียนได้โดยไม่ใช้ JS ด้วยองค์ประกอบ
detailsและsummary- ผู้ใช้คลิกเพื่อเปิดและปิดเนื้อหาได้ และกำหนดสถานะเริ่มต้นด้วยแอตทริบิวต์
open - หากใช้แอตทริบิวต์
nameเดียวกัน จะ เปิดได้เพียงหนึ่งแผงเท่านั้น
- ผู้ใช้คลิกเพื่อเปิดและปิดเนื้อหาได้ และกำหนดสถานะเริ่มต้นด้วยแอตทริบิวต์
- สามารถตกแต่งด้วย CSS หรือใช้ JS ควบคุมการเปิด/ปิดเพิ่มเติมได้
- แหล่งข้อมูลที่เกี่ยวข้อง: เอกสาร MDN ของ
details, ตัวอย่าง CodePen, ตารางความเข้ากันได้ของเบราว์เซอร์
ช่องกรอกพร้อมคำแนะนำอัตโนมัติ
- ใช้
inputร่วมกับdatalistเพื่อสร้าง ดรอปดาวน์กรองอัตโนมัติ- เมื่อพิมพ์ รายการคำแนะนำจะถูกกรองโดยอัตโนมัติ
- รองรับชนิดอินพุตได้หลากหลาย ไม่ใช่แค่ข้อความ เช่น
number,time
- ขณะนี้ Firefox รองรับเฉพาะอินพุตแบบข้อความ และยังมีข้อจำกัดด้านการเข้าถึงบนมือถือ
- แหล่งข้อมูลที่เกี่ยวข้อง: เอกสาร MDN ของ
datalist, บทสอนจาก SitePoint, ตารางความเข้ากันได้ของเบราว์เซอร์
โมดัล / ป๊อปโอเวอร์
- ใช้แอตทริบิวต์
popoverและpopovertargetเพื่อสร้างโมดัลและป๊อปโอเวอร์โดยไม่ใช้ JS- มีให้เลือก 3 โหมดคือ
auto,hint,manual autoจะปิดเมื่อคลิกด้านนอกหรือกด ESC ส่วนmanualจะปิดได้ด้วยการสั่งเองเท่านั้น
- มีให้เลือก 3 โหมดคือ
- Firefox และ iOS ยังไม่รองรับโหมด
hint - แหล่งข้อมูลที่เกี่ยวข้อง: เอกสาร MDN ของ
popover, บล็อก Chrome, ตัวอย่าง CodePen, วิดีโอเกี่ยวกับการเข้าถึง
การนำทาง / เนื้อหาแบบออฟสกรีน
- ใช้ความสามารถของ
popoverเพื่อสร้าง เมนูนำทางแบบออฟสกรีน ได้- ใช้องค์ประกอบ
navเพื่อสื่อความหมาย และใช้ CSStranslateในการเลื่อนเข้าออกจากหน้าจอ - ปิดได้เมื่อคลิกด้านนอก และสามารถตั้งค่าให้ปิดแบบแมนนวลด้วย
popover="manual" - ใช้องค์ประกอบเสมือน
::backdropเพื่อทำพื้นหลังให้โปร่งแสงได้
- ใช้องค์ประกอบ
- แหล่งข้อมูลที่เกี่ยวข้อง: MDN Popover API, บล็อก Chrome, ตัวอย่าง CodePen
บทสรุป
- แม้จะยอมรับพลังของ JS แต่ก็ควร ใช้เฉพาะในจุดที่จำเป็น
- ความก้าวหน้าล่าสุดของ HTML/CSS ทำให้มี ทางเลือกแบบไม่ใช้ JS เพิ่มขึ้นมาก
- ตัวอย่างเพิ่มเติมดูได้จากบทความในบล็อกของผู้เขียน “Replace JS with No-JS or Lo-JS Options”
- เน้นการปรับปรุงประสบการณ์ผู้ใช้ผ่าน การลดการใช้ JS และการเพิ่มประสิทธิภาพ
5 ความคิดเห็น
เหมือนว่ามีบางส่วนของเนื้อหาหายไปครับ
แก้ไขไว้แล้ว~!
ข้อจำกัดก็ค่อนข้างชัดเจนอยู่แล้ว และพอ AI ถูกใช้งานอย่างจริงจังขึ้นมา.. ยังจำเป็นต้องทำรีแฟกเตอร์แบบนี้อยู่ไหม? ได้คำนึงถึงส่วนอย่างการบล็อกเนื้อหา JS ไว้ด้วยหรือเปล่า?
ความคิดเห็นจาก Hacker News
ถ้าใส่ตัวอย่างการแทนที่ด้วย HTML ลงในหน้าโดยตรงแทนลิงก์ CodePen ก็น่าจะน่าเชื่อถือกว่านี้มาก
<details>/<summary>มีศักยภาพสูงมากจริงๆแทบจะทำได้เกือบทุกอย่าง แต่ไลบรารีคอมโพเนนต์ส่วนใหญ่กลับมองข้ามมัน
ไม่ต้องมี aria attribute และมี accessibility มาให้โดยพื้นฐาน
<details>ยังใช้งานได้บนเว็บที่อิง Markdown อย่าง GitHub ด้วย สามารถพับ log ยาวๆ ให้ดูเรียบร้อยได้ตอนเขียนหนังสือ “You Don’t Need JavaScript” สิ่งที่รู้สึกคือ หลายครั้ง JS ไม่ได้เพิ่มความสามารถใหม่ แต่เป็นการ เสริมสิ่งที่แพลตฟอร์มมีอยู่เดิม มากกว่า
<input>และ<datalist>ยังไม่พอสำหรับการใช้งานจริงผู้ใช้คาดหวังเรื่อง การยอมรับคำสะกดผิด, ข้อความช่วยอธิบาย, ประสบการณ์ใช้งานบนมือถือ ฯลฯ แต่ datalist ยังตอบโจทย์ไม่ได้
แทบไม่สนใจเลยว่าจะใช้ HTML เชิงความหมายหรือ accessibility ได้ดีแค่ไหน
เป็นบทความที่บอกว่า “มาทำด้วย HTML อย่างเดียว” แต่กลับพึ่งพาบริการภายนอก ก็เลยดูย้อนแย้ง
ตอนนี้อยู่ใน WHATWG stage 3 และน่าจะมาแทนการทำดรอปดาวน์ด้วย JS แบบ ฝันร้าย ได้
ดู บทความใน Chrome blog ได้
ผมลองทางเลือกอย่าง HTMX หรือ Phoenix LiveView แล้ว แต่มันก็ไม่ใช่คำตอบที่สมบูรณ์
สุดท้ายเลยรู้สึกว่า การยอมรับ JS สมัยใหม่คือทางที่สมจริงกว่า
<marquee>เคยเหมาะกับการทำ เลื่อนแนวนอน บนเว็บขายของ แต่ตอนนี้กลับต้องฝืนทำด้วย JS อยากให้ HTML รองรับแพตเทิร์น UI ได้ มากขึ้นในตัวเองเว็บแอปที่ซับซ้อนจำเป็นต้องมี JS แต่ก็ยังมีหลายพื้นที่ที่ HTML อย่างเดียวก็เพียงพอ
แต่ตอนนี้ JS กลายเป็นเครื่องมือหลักของ การเก็บข้อมูลและติดตามโฆษณา ไปแล้ว
เลยสงสัยว่าถ้าไม่มี JS บริษัทยักษ์ใหญ่จะยังทำ ระบบเฝ้าติดตามและบริการโฆษณา ได้ในระดับเดิมหรือไม่
สุดท้ายแล้วความรู้สึกต่อต้าน JS ก็ไม่ได้มาจากปัญหาทางเทคนิคอย่างเดียว แต่เกิดจาก ความไม่ไว้วางใจต่อระบบนิเวศโฆษณา ด้วย
ความพยายามแบบนี้บางครั้งก็ทำให้ผมได้ทบทวนว่าตัวเองกำลังทำ over-engineering อยู่หรือเปล่า แต่หากมองจากมุมของงานจริงที่มีข้อกำหนดมากมาย มันก็แทบไม่ต่างจากการแสดงผาดโผน