HTML เชิงความหมาย

ด้วยองค์ประกอบ HTML กว่า 100 รายการและความสามารถในการสร้างองค์ประกอบที่กำหนดเอง คุณจึงมีวิธีมาร์กอัปเนื้อหาได้ไม่จำกัด แต่บางวิธีก็ดีกว่าวิธีอื่นๆ โดยเฉพาะวิธีที่มีความหมาย

Semantic หมายถึง "เกี่ยวข้องกับความหมาย" การเขียน HTML เชิงความหมายหมายถึงการใช้องค์ประกอบ HTML เพื่อจัดโครงสร้างเนื้อหาตามความหมายของแต่ละองค์ประกอบ ไม่ใช่ลักษณะที่ปรากฏ

แม้ว่าซีรีส์นี้จะยังไม่ได้กล่าวถึงองค์ประกอบ HTML มากนัก แต่แม้จะไม่มีความรู้ด้าน HTML เลยก็ตาม ข้อมูลโค้ด 2 รายการต่อไปนี้จะแสดงให้เห็นว่ามาร์กอัปเชิงความหมายช่วยให้บริบทแก่เนื้อหาได้อย่างไร ทั้ง 2 อย่างใช้จำนวนคำแทน ipsum lorem เพื่อประหยัดการเลื่อน ให้ใช้จินตนาการของคุณขยาย "30 คำ" เป็น 30 คำ

โค้ด Snippet แรกใช้ <div> และ <span> ซึ่งเป็น 2 องค์ประกอบที่ไม่มีค่าเชิงความหมาย

<div>
  <span>Three words</span>
  <div>
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
  </div>
</div>
<div>
  <div>
    <div>five words</div>
  </div>
  <div>
    <div>three words</div>
    <div>forty-six words</div>
    <div>forty-four words</div>
  </div>
  <div>
    <div>seven words</div>
    <div>sixty-eight words</div>
    <div>forty-four words</div>
  </div>
</div>
<div>
   <span>five words</span>
</div>

คุณพอจะนึกออกไหมว่าคำเหล่านั้นขยายความไปถึงอะไร ไม่ครับ

มาเขียนโค้ดนี้ใหม่ด้วยองค์ประกอบเชิงความหมายกัน

<header>
  <h1>Three words</h1>
  <nav>
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
  </nav>
</header>
<main>
  <header>
    <h2>five words</h2>
  </header>
  <section>
    <h2>three words</h2>
    <p>forty-six words</p>
    <p>forty-four words</p>
  </section>
  <section>
    <h3>seven words</h3>
    <p>sixty-eight words</p>
    <p>forty-four words</p>
  </section>
</main>
<footer>
  <p>five words</p>
</footer>

โค้ดบล็อกใดสื่อความหมาย การใช้เฉพาะองค์ประกอบที่ไม่ใช่เชิงความหมายของ <div> และ <span> ทำให้คุณไม่สามารถบอกได้ว่าเนื้อหาในบล็อกโค้ดแรกแสดงถึงอะไร ตัวอย่างโค้ดที่ 2 ซึ่งมีองค์ประกอบเชิงความหมายจะให้บริบทเพียงพอสำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์ในการถอดรหัสวัตถุประสงค์และความหมายโดยไม่ต้องเคยพบแท็ก HTML ซึ่งจะให้บริบทเพียงพอสำหรับนักพัฒนาแอปในการทำความเข้าใจโครงร่างของหน้าเว็บอย่างแน่นอน แม้ว่านักพัฒนาแอปจะไม่เข้าใจเนื้อหา เช่น เนื้อหาในภาษาต่างประเทศก็ตาม

ในบล็อกโค้ดที่ 2 เราจะเข้าใจสถาปัตยกรรมได้แม้จะไม่เข้าใจเนื้อหา เนื่องจากองค์ประกอบเชิงความหมายให้ความหมายและโครงสร้าง คุณจะเห็นว่าส่วนหัวแรกคือแบนเนอร์ของเว็บไซต์ โดยมี <h1> ที่น่าจะเป็นชื่อเว็บไซต์ ส่วนท้ายคือส่วนท้ายของเว็บไซต์ โดยคำ 5 คำอาจเป็นข้อความลิขสิทธิ์หรือที่อยู่ธุรกิจ

มาร์กอัปเชิงความหมายไม่ได้มีไว้เพื่อให้ผู้พัฒนาอ่านมาร์กอัปได้ง่ายขึ้นเท่านั้น แต่ส่วนใหญ่แล้วมีความสำคัญในการช่วยให้เครื่องมืออัตโนมัติถอดรหัสมาร์กอัปได้ เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์แสดงให้เห็นว่าองค์ประกอบเชิงความหมายมีโครงสร้างที่เครื่องอ่านได้ด้วยเช่นกัน

โมเดลออบเจ็กต์การช่วยเหลือพิเศษ (AOM)

ขณะที่เบราว์เซอร์แยกวิเคราะห์เนื้อหาที่ได้รับ เบราว์เซอร์จะสร้าง Document Object Model (DOM) และ CSS Object Model (CSSOM) จากนั้นก็จะสร้างแผนผังการช่วยเหลือพิเศษด้วย อุปกรณ์ช่วยเหลือพิเศษ เช่น โปรแกรมอ่านหน้าจอ ใช้ AOM เพื่อแยกวิเคราะห์และตีความเนื้อหา DOM คือแผนผังของโหนดทั้งหมดในเอกสาร AOM เปรียบเสมือน DOM เวอร์ชันเชิงความหมาย

มาเปรียบเทียบวิธีแสดงโครงสร้างเอกสารทั้ง 2 แบบนี้ในแผงการช่วยเหลือพิเศษของ Firefox กัน

แผนผังการช่วยเหลือพิเศษของ DOM ที่ไม่มี HTML เชิงความหมาย
รูปที่ 1 รายการโหนดซึ่งเป็นลิงก์หรือข้อความทั้งหมด
แผนผังการช่วยเหลือพิเศษของ DOM ที่มี HTML เชิงความหมาย
รูปที่ 2 รายการโหนดที่มีสถานที่สำคัญที่ชัดเจน

ในรูปที่ 2 มีบทบาทของจุดสังเกต 4 รายการในบล็อกโค้ดที่ 2 โดยใช้จุดสังเกตเชิงความหมายที่ตั้งชื่ออย่างสะดวกว่า <header>, <main>, <footer> และ <nav> สำหรับ "การนำทาง" จุดสังเกตช่วยจัดโครงสร้างเนื้อหาเว็บและช่วยระบุส่วนสำคัญของเนื้อหาเพื่อให้ผู้ใช้โปรแกรมอ่านหน้าจอไปยังส่วนต่างๆ ได้โดยใช้แป้นพิมพ์

<header> และ <footer> เป็นสถานที่สำคัญที่มีบทบาทเป็น banner และ contentinfo ตามลำดับ เมื่อไม่ได้ซ้อนอยู่ในสถานที่สำคัญอื่นๆ AOM ของ Chrome แสดงข้อมูลนี้ดังนี้

โหนดข้อความทั้งหมดจะแสดงเป็นข้อความแบบคงที่
รูปที่ 3 ข้อมูลโค้ดแรก
โหนดข้อความทั้งหมดมีคำอธิบาย
รูปที่ 4 ข้อมูลโค้ดที่ 2

เมื่อดูเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome คุณจะเห็นความแตกต่างอย่างมากระหว่างโมเดลออบเจ็กต์การช่วยเหลือพิเศษเมื่อใช้องค์ประกอบเชิงความหมายกับเมื่อไม่ได้ใช้

เห็นได้ชัดว่าการใช้องค์ประกอบเชิงความหมายช่วยเรื่องการช่วยเหลือพิเศษ และการใช้องค์ประกอบที่ไม่ใช่เชิงความหมายจะลดการช่วยเหลือพิเศษ โดยทั่วไป HTML จะเข้าถึงได้โดยค่าเริ่มต้น งานของเราในฐานะนักพัฒนาซอฟต์แวร์คือการปกป้องลักษณะการเข้าถึงเริ่มต้นของ HTML และเพิ่มการช่วยเหลือพิเศษให้ผู้ใช้ได้มากที่สุด คุณตรวจสอบ AOM ในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ได้

แอตทริบิวต์ role

แอตทริบิวต์ role อธิบายบทบาทขององค์ประกอบในบริบทของเอกสาร แอตทริบิวต์ role เป็นแอตทริบิวต์ส่วนกลาง ซึ่งหมายความว่าใช้ได้กับทุกองค์ประกอบ โดยกำหนดโดยข้อกำหนด ARIA ไม่ใช่ข้อกำหนด HTML ของ WHATWG ซึ่งเป็นที่กำหนดเกือบทุกอย่างในชุดนี้

องค์ประกอบเชิงความหมายแต่ละรายการมีบทบาทโดยนัย ซึ่งบางรายการขึ้นอยู่กับบริบท ดังที่เราเห็นในภาพหน้าจอเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์เพื่อการช่วยเหลือพิเศษของ Firefox <header>, <main>, <footer> และ <nav> ระดับบนสุดทั้งหมดเป็นจุดสังเกต ขณะที่ <header> ที่ซ้อนอยู่ใน <main> เป็นส่วน ภาพหน้าจอของ Chrome แสดงบทบาท ARIA ขององค์ประกอบเหล่านี้: <main> คือ main, <nav> คือ navigation และ <footer> คือ contentinfo เนื่องจากเป็นส่วนท้ายของเอกสาร เมื่อ <header> เป็นส่วนหัวของเอกสาร บทบาทเริ่มต้นคือ banner ซึ่งกำหนดส่วนเป็นส่วนหัวของเว็บไซต์ทั่วโลก เมื่อ <header> หรือ <footer> ซ้อนอยู่ในองค์ประกอบการแบ่งส่วน จะไม่ใช่บทบาทของจุดสังเกต ภาพหน้าจอของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ทั้ง 2 รายการแสดงให้เห็น

ชื่อบทบาทขององค์ประกอบมีความสำคัญในการสร้าง AOM ความหมายขององค์ประกอบหรือ "บทบาท" มีความสำคัญต่อเทคโนโลยีความช่วยเหลือและเครื่องมือค้นหาในบางกรณี ผู้ใช้เทคโนโลยีความช่วยเหลืออาศัยความหมายเพื่อไปยังส่วนต่างๆ และทำความเข้าใจความหมายของเนื้อหา บทบาทขององค์ประกอบช่วยให้ผู้ใช้เข้าถึงเนื้อหาที่ต้องการได้อย่างรวดเร็ว และที่สำคัญกว่านั้นคือบทบาทจะแจ้งให้ผู้ใช้โปรแกรมอ่านหน้าจอทราบวิธีโต้ตอบกับองค์ประกอบแบบอินเทอร์แอกทีฟเมื่อองค์ประกอบนั้นได้รับโฟกัส

องค์ประกอบแบบอินเทอร์แอกทีฟ เช่น ปุ่ม ลิงก์ ช่วง และช่องทําเครื่องหมาย มีบทบาทโดยนัยทั้งหมด ระบบจะเพิ่มองค์ประกอบทั้งหมดลงในลําดับแท็บของแป้นพิมพ์โดยอัตโนมัติ และองค์ประกอบทั้งหมดมีการรองรับการกระทําของผู้ใช้ที่คาดหวังเริ่มต้น บทบาทโดยนัยหรือค่า role โดยชัดแจ้งจะแจ้งให้ผู้ใช้ทราบว่าควรคาดหวังการโต้ตอบเริ่มต้นของผู้ใช้ที่เฉพาะเจาะจงกับองค์ประกอบ

การใช้แอตทริบิวต์ role จะช่วยให้คุณกำหนดบทบาทให้กับองค์ประกอบใดก็ได้ รวมถึงบทบาทที่แตกต่างจากที่แท็กระบุไว้ เช่น <button> มีบทบาทโดยนัยของ button role="button" ช่วยให้คุณเปลี่ยนองค์ประกอบใดก็ได้ให้เป็นปุ่มตามความหมายได้: <p role="button">Click Me</p>

แม้ว่าการเพิ่ม role="button" ลงในองค์ประกอบจะแจ้งให้โปรแกรมอ่านหน้าจอทราบว่าองค์ประกอบนั้นเป็นปุ่ม แต่ก็ไม่ได้เปลี่ยนลักษณะที่ปรากฏหรือฟังก์ชันการทำงานขององค์ประกอบ องค์ประกอบ button มีฟีเจอร์มากมายโดยที่คุณไม่ต้องทำอะไรเลย ระบบจะเพิ่มองค์ประกอบ button ลงในลำดับการจัดเรียงแท็บของเอกสารโดยอัตโนมัติ ซึ่งหมายความว่าองค์ประกอบนี้จะโฟกัสด้วยแป้นพิมพ์ได้โดยค่าเริ่มต้น ทั้งปุ่ม Enter และแป้นเว้นวรรคจะเปิดใช้งานปุ่ม ปุ่มยังมีเมธอดและพร็อพเพอร์ตี้ทั้งหมดที่อินเทอร์เฟซ HTMLButtonElement จัดเตรียมไว้ให้ด้วย หากไม่ได้ใช้ปุ่มเชิงความหมายสำหรับปุ่ม คุณจะต้องเขียนโปรแกรมฟีเจอร์ทั้งหมดเหล่านั้นอีกครั้ง การใช้ <button> นั้นง่ายกว่ามาก

กลับไปที่ภาพหน้าจอของ AOM สำหรับบล็อกโค้ดที่ไม่ใช่เชิงความหมาย ในที่นี้ องค์ประกอบที่ไม่ใช่เชิงความหมายจะไม่มีบทบาทโดยนัย เราสามารถทำให้เวอร์ชันที่ไม่ใช่เชิงความหมายเป็นเชิงความหมายได้โดยกำหนดบทบาทให้กับแต่ละองค์ประกอบ ดังนี้

<div role="banner">
  <span role="heading" aria-level="1">Three words</span>
  <div role="navigation">
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
    <a>one word</a>
  </div>
</div>

แม้ว่าจะใช้แอตทริบิวต์ role เพื่อเพิ่มความหมายให้กับองค์ประกอบใดก็ได้ แต่คุณควรใช้องค์ประกอบที่มีบทบาทโดยนัยที่คุณต้องการแทน

องค์ประกอบเชิงความหมาย

หากคุณถามตัวเองว่า "องค์ประกอบใดแสดงถึงฟังก์ชันของส่วนมาร์กอัปนี้ได้ดีที่สุด" คุณก็มีแนวโน้มที่จะเลือกองค์ประกอบที่ดีที่สุดสำหรับงานนั้น องค์ประกอบที่คุณเลือกและแท็กที่คุณใช้ควรเหมาะสมกับเนื้อหาที่คุณแสดง เนื่องจากแท็กมีความหมายเชิงความหมาย

ควรใช้ HTML เพื่อจัดโครงสร้างเนื้อหา ไม่ใช่เพื่อกำหนดลักษณะที่ปรากฏของเนื้อหา ลักษณะที่ปรากฏเป็นขอบเขตของ CSS แม้ว่าองค์ประกอบบางอย่างจะได้รับการกำหนดให้ปรากฏในลักษณะหนึ่งๆ แต่ก็ไม่ควรใช้องค์ประกอบตามลักษณะที่ชีตสไตล์ของ User Agent ทำให้องค์ประกอบนั้นปรากฏโดยค่าเริ่มต้น แต่ให้เลือกแต่ละองค์ประกอบตามความหมายเชิงความหมายและฟังก์ชันการทำงานขององค์ประกอบนั้นๆ การเขียนโค้ด HTML ในลักษณะเชิงตรรกะ เชิงความหมาย และมีความหมายจะช่วยให้ใช้ CSS ได้ตามที่ต้องการ

การเลือกองค์ประกอบที่เหมาะสมกับงานขณะเขียนโค้ดหมายความว่าคุณไม่ต้องปรับโครงสร้างหรือแสดงความคิดเห็นใน HTML หากคุณคิดถึงการใช้ธาตุที่เหมาะสมกับสถานการณ์ คุณก็มักจะเลือกธาตุที่เหมาะสมกับสถานการณ์ได้ เมื่อเข้าใจความหมายของแต่ละองค์ประกอบและทราบว่าเหตุใดการเลือกองค์ประกอบที่เหมาะสมจึงสำคัญ คุณก็จะเลือกได้อย่างถูกต้องโดยไม่ต้องใช้ความพยายามเพิ่มเติมมากนัก

จากนั้นใช้องค์ประกอบเชิงความหมายเพื่อสร้างโครงสร้างเอกสาร

ทดสอบความเข้าใจ

ทดสอบความรู้เกี่ยวกับ HTML เชิงความหมาย

คุณควรเพิ่ม role="button" ลงในองค์ประกอบ <button> เสมอ

เท็จ
ถูกต้อง องค์ประกอบ <button> มีบทบาทนี้อยู่แล้ว
จริง
โปรดลองอีกครั้ง