ID ปะทะ Class จะเลือกใช้อะไรดี?

มาตรฐาน
ID vs. Class
ปัญหาอย่างหนึ่งสำหรับผู้หัดเขียน CSS ใหม่ๆก็คือ ไม่รู้ว่าเมื่อไหร่ควรจะเลือกใช้ ID และเมื่อไหร่ถึงสมควรจะเลือกใช้ Class และไม่รู้ด้วยว่าการเลือกใช้อย่างใดอย่างหนึ่งมีข้อดีข้อเสียอย่างไรบ้าง ด้วยเหตุนี้จึงทำให้เหล่ามือใหม่หัดเขียน CSS (ซึ่งผมก็เคยเป็นหนึ่งในนั้น) ใช้ ID และ Class มั่วกันไปหมด บางคนชอบใช้ Class ก็ใช้แหลกโดยไม่คำนึงถึงความเหมาะสม หรือบางท่านชอบใช้ ID ก็ใช้กับทุกอย่างเหมือนกับไม่มี Class บนโลกนี้ ในบทความนี้ผมจึงอยากช่วยแนะนำวิธีการเลือกใช้ ID และ Class ที่ถูกต้องให้ได้ทราบกันครับ โดยก่อนอื่นเราต้องมาดูกันว่าเจ้า ID และ Class จะมีไว้เพื่ออะไร และทั้งสองตัวมีความแตกต่างกันอย่างไรบ้างกันครับ
สำหรับการเขียน CSS จุดประสงค์หลักของการสร้าง ID หรือ Class ก็คือเพื่อช่วยให้เราสามารถเขียนคำสั่งพิเศษให้สำหรับบางแท็กที่เราต้องการได้ เพื่อให้การแสดงผลมีความแตกต่างจากแท็กเดียวกันที่ไม่มี ID หรือ Class ได้ เช่น
<style type=”text/css” rel=”stylesheet”>
h3 {
font-size: 36px;
color: grey;
}
</style>
.
.
.
<h3>ผมรักแม่ที่สุดในโลก</h3>
<h3>ลูกคือแก้วตาดวงใจของแม่</h3>
ไม่ว่าเราจะเขียนคำสั่ง CSS ให้กับแท็ก <h3> ยังไง ข้อความทั้งสองบรรทัดก็จะแสดงผลเหมือนกันทุกอย่าง คือมีตัวอักษรสีเทาขนาด 36px แต่สมมุติว่าเราต้องการให้ข้อความบรรทัดแรกมีการแสดงผลที่แตกต่างจากข้อความบรรทัดที่สอง หนทางเดียวที่จะทำได้ก็คือใส่ ID หรือ Class ให้กับแท็ก <h3> บรรทัดแรกดังนี้
<style type=”text/css” rel=”stylesheet”>
h3 {
font-size: 36px;
color: grey;
}
#section_header {
font-size: 48px;
color: red;
}
</style>
.
.
.
<h3 id=”section_header“>ผมรักแม่ที่สุดในโลก</h3>
<h3>ลูกคือแก้วตาดวงใจของแม่</h3>
แค่นี้ข้อความ “ผมรักแม่ที่สุดในโลก” จะแสดงเป็นตัวอักษรสีแดงขนาด 48px แทน เป็นยังไงครับ เริ่มเห็นประโยชน์ของการใส่ ID หรือ Class แล้วใช่มั้ยครับ
ความแตกต่างระหว่าง ID และ Class
1. วิธีเขียนที่แตกต่างกัน
การเขียน ID ใน CSS จะเริ่มต้นด้วยสัญญลักษณ์ # แล้วตามด้วยชื่อ ID ที่เราต้องการตั้ง เช่น
#main_header    –> เพื่อสั่งแท็ก <h3 id=”main_header”>……..</h3>
#main_menu    –> เพื่อสั่งแท็ก <ul id=”main_menu”>……..</ul>
#sub_menu    –> เพื่อสั่งแท็ก <ul id=”sub_menu”>……..</ul>
#footer        –> เพื่อสั่งแท็ก <div id=”footer”>……..</div>
การเขียน Class ใน CSS จะเริ่มต้นด้วยสัญญลักษณ์ . แล้วตามด้วยชื่อ Class ที่เราต้องการตั้ง เช่น
.sub_header    –> เพื่อสั่งแท็ก <h4 class=”sub_header”>……..</h4>
.main_list        –> เพื่อสั่งแท็ก <ul class=”main_list”>……..</ul>
.content        –> เพื่อสั่งแท็ก <div class=”content”>……..</div>
.details        –> เพื่อสั่งแท็ก <p class=”details”>……..</p>
โดยตัวแรกของชื่อจะต้องเป็นตัวอักษรระหว่าง A ถึง Z เท่านั้น ห้ามเริ่มต้นชื่อด้วยสัญญลักษณ์หรือตัวเลขเพราะบราวเซอร์จะไม่ตีความว่าเป็น ID หรือ Class ซึ่งจะมีผลทำให้คำสั่ง CSS ที่เราเขียนไม่มีผลใดๆทั้งสิ้น และที่ต้องจำไว้อีกอย่างคือ CSS จะไม่สนใจว่าจะเป็นตัวเล็กหรือตัวใหญ่หรือ Case Insensitive เพราะฉะนั้นการตั้งชื่อว่า SuperAgent กับ superagent จะมีค่าเท่ากันครับ
2. จำนวนครั้งที่ใช้ได้ต่อหน้าเว็บ
ID ที่คุณตั้งขึ้นมาจะอนุญาตให้ใช้ได้ครั้งเดียวในหน้า และหนึ่งแท็กจะใส่ ID ได้ตัวเดียว ส่วน Class ที่คุณตั้งขึ้นมาจะอนุญาตให้ใช้ได้หลายครั้งในหน้าเดียวกัน และหนึ่งแท็กจะใส่ Class ได้หลายตัว เช่น
<div id=”header”>
<h1>บริษัท มาตราฐานเว็บขั้นสูง จำกัด</h1>
<ul id=”main_menu”>
<li class=”menu”><a class=”menu_link link” href=”home.html” title=”Home”>Home</a></li>
<li class=”menu”><a class=”menu_link link” href=”products.html” title=”Products”>Products</a></li>
<li class=”menu”><a class=”menu_link link” href=”support.html” title=”Support”>Support</a></li>
<li class=”menu”><a class=”menu_link link” href=”contactus.html” title=”Contact Us”>Contact Us</a></li>
<li class=”menu”><a class=”menu_link link” href=”sitemap.html” title=”Site Map”>Site Map</a></li>
</ul>
</div>
จากในตัวอย่างโค๊ตจะเห็นได้ว่าแท็ก <div> และ <ul> ต่างมี ID ของตัวเองคือ header และ main_menu ตามลำดับ และจะถูกเรียกใช้เพียงแค่ครั้งเดียวในหน้า แต่สำหรับ Class ชื่อ menu ในแท็ก <li> จะได้เรียกใช้ซ้ำได้ไม่มีปัญหาอะไร ส่วนในแท็ก <a> จะเห็นตัวอย่างการใส่ชื่อ Class ได้มากกว่าหนึ่งในแท็กเดียวกัน โดยในแท็ก <a> นี้จะมีชื่อ Class อยู่ 2 ชื่อด้วยกันคือ menu_link และ link นอกจากนี้เรายังสามารถใส่ทั้ง ID และ Class ให้กับแท็กๆเดียวกันได้ด้วย เช่น
<li id=”menu_selected” class=”menu”><a class=”menu_link link active” href=”home.html” title=”Home”>Home</a></li>
3. ระดับ Specificity
ID มีความเฉพาะเจาะจงหรือ Specificity ที่สูงกว่า Class ในกรณีที่มีปัญหาคำสั่ง CSS ไปทับซ้อนกันในแท็กเดียวกัน ก็จะทำให้คำสั่งที่เขียนสั่งผ่าน ID และชนะคำสั่งที่เขียนผ่าน Class เช่น
.menu {
background: grey;
}
#menu_selected {
background: white;
}
<li id=”menu_selected” class=”menu”><a class=”menu_link link active” href=”home.html” title=”Home”>Home</a></li>
ในกรณีนี้มีปัญหาคำสั่งซ้ำซ้อนกันในแท็ก <li> แต่เนื่องจาก ID มีระดับ Specificity ที่สูงกว่า Class จึงทำให้เว็บบราวเซอร์เลือกที่จะแสดงสีพื้นหลังของแท็ก <li> เป็นสีขาวที่สั่งผ่าน #menu_selected แทนที่จะเป็นสีเทาที่สั่งผ่าน .menu สำหรับท่านใดที่งงๆว่า Specificity คืออะไร ให้ลองเข้าไปอ่านบทความเรื่องนี้ที่ผมเขียนไว้ก่อนหน้านี้ได้เลยครับ
เราควรเลือกใช้ ID หรือ Class ในกรณีใดบ้าง
เราควรเลือกใช้ ID เมื่อเราต้องการระบุถึงส่วนสำคัญของหน้าที่ในหน้าหนึ่งๆจะมีแค่หนึ่งเดียวเท่านั้น เช่น ส่วนหัวด้านบนของหน้า, ส่วนเมนูหลักของหน้า, ส่วนเนื้อหาของหน้า หรือส่วนท้ายสุดที่ประกอบในหน้า หรือเลือกใช้ ID ในส่วนที่เราต้องการใส่ JavaScript หรือ jQuery เพื่อเพิ่มลูกเล่นและความสวยงามให้กับหน้า
ID is for...
เราควรเลือกใช้ Class เมื่อเราต้องการใส่สไตล์การแสดงผลที่เป็นรายละเอียดปลีกย่อยที่เราอยากใช้ร่วมกันได้กับหลายๆแท็กในหน้าเดียวกัน เช่น สีตัวอักษรของพาดหัวหลักพาดหัวรอง, ลักษณะของลิ้งก์เพื่อไปอ่านต่อหน้าใน
Class is for...
ผมเชื่อว่าคงมีหลายๆท่านรวมทั้งตัวผมเองด้วยที่เคยเผลอใช้ ID กับหลายๆแท็กในหน้าเว็บเดียวกัน แต่กลับไม่รู้สึกอะไรเพราะบราวเซอร์ก็ยังแสดงผลบนหน้าจอได้ตามปกติ แต่หารู้ไม่ว่ามันเป็นการผิดหลักการเขียนแบบ Web Standards แบบเต็มๆ นอกจากนี้การใช้ ID หลายๆครั้งในหน้าเดียวกันอาจจะทำให้มีปัญหากับสคลิปพิเศษอย่าง JavaScript หรือ jQuery ที่สั่งงานโดยอ้างอิงถึง ID ที่เราตั้งอีกด้วย เพราะฉะนั้นเราจึงควรระวังเรื่องนี้ให้มากๆ
แถมให้อีกนิดนึงเกี่ยวกับการตั้งชื่อ ID และ Class ที่ดีและเหมาะสม ผมแนะนำให้ตั้งชื่อให้สื่อความหมายของ ID และ Class นั้นๆจริงๆและยืดหยุ่นพอที่จะให้คุณสามารถเปลี่ยนแปลงคำสั่งได้ในอนาคตได้ โดยพยายามหลีกเลี่ยงอย่างเด็ดขาดที่จะตั้งชื่อตามลักษณะการแสดงผลบนหน้าจอ เช่นตั้งชื่อตามสีอย่าง red, black, pink, white หรือตั้งชื่อตามตำแหน่งหรือลักษณะการวางอย่าง left, right, center, bottom ที่แนะนำอย่างนี้เพราะว่าคุณไม่มีทางรู้หรอกว่าในอนาคตคุณอาจจะต้องเปลี่ยนลักษณะการแสดงผลนั้นๆเป็นอย่างอื่นที่ตรงกันข้ามอย่างสิ้นเชิงเลยก็ได้
ตัวอย่างเช่น ถ้าคุณตั้งชื่อ class ว่า white เพราะตอนนี้ลูกค้าของคุณอยากให้ข้อความที่อยู่ใน Class นี้เป็นสีขาว แต่ในอีกหลายเดือนต่อมาลูกค้าคนเดิมของคุณอาจจะอยากเปลี่ยนสีข้อความใน Class นี้เป็นสีดำก็ได้ คราวนี้คุณจะมี Class ที่สื่อความหมายตรงข้ามกันไปเลย ซึ่งจะมีผลทำให้การดูแลโค๊ตต่อไปยากลำบากมากขึ้นเพราะชื่อที่คุณตั้งมันไม่สื่อความหมายอย่างที่ควรจะเป็นอีกต่อไป และจะยิ่งมีปัญหามากขึ้นไปอีกเมื่อคนอื่นต้องมาดูแลโค๊ตนี้แทนคุณ เพราะเขาจะงงว่าข้อความก็เป็นสีดำแท้ๆแต่ทำไม Class มันถึงชื่อว่า white ได้ไง(ว่ะ) เพราะฉะนั้นเราจึงควรตั้งชื่อ ID และ Class ที่สื่อความหมายจริงๆโดยไม่อิงกับลักษณะการแสดงผลใดๆเลย ดังนั้นแทนที่คุณจะตั้งชื่อ Class ว่า white ให้ตั้งว่า hilight แทน เพราะชื่อนี้นอกจากจะสื่อความหมายโดยตัวมันเองแล้วว่าทำหน้าที่อะไร มันยังยืดหยุ่นพอให้คุณปรับเปลื่ยนสีตัวอักษรเป็นสีอะไรก็ได้ที่คุณต้องการในอนาคต

มีการตอบกลับหนึ่งครั้ง »

  1. เขียนได้เข้าใจง่ายดีครับ
    ผมเองใช้ ID กับ Element ที่มีแค่ 1
    ถ้านอกจากนี้ใช้ Class หมด
    รอบทต่อไปนะครับ
  2. ความเห็นของผมจริงๆ แล้วมองว่า id และ class ใน HTML และ XHTML นั้นใช้เพื่อ “จัดกลุ่ม” element และเนื้อหาของตัวหน้าเว็บมากกว่าครับ ไม่ใช่ “เพื่อใช้เรียกคุณลักษณะพิเศษของ CSS เพื่อมาปรับแต่ง หรือควบคุม” ครับ จะเห็นได้ว่า Selector ของ CSS นั้นแบ่งประเภทออกอย่างหลากหลาย ขึ้นอยู่กับว่าเราจะเลือกมาใช้งานอย่างไรให้เหมาะสมครับ เพราะฉะนั้น CSS จะเข้าไป “ควบคุม” element ใดๆ ก็ได้ ไม่จำเป็นที่จะต้องเป็น id หรือ class แต่อย่างใด
    สำหรับผมแล้วการเขียน CSS นั้นให้มองที่งานออกแบบที่ UX/UI Designer ส่งมา หรือตนเองนั้นได้ออกแบบครับ ส่วนเขียน XHTML และ HTML นั้นให้เขียนตามการแบ่งสรรประเภทข้อมูล หรือหากเราเป็นคนออกแบบเอง เราจะเห็นโครงร่างการเขียนด้วยตัวเองเลยตั้งแต่แรก ยิ่ง clean และ clear เท่าไหร่นั่นก็เป็นเรื่องดีครับ
    id และ class ตั้งให้เหมาะสมกับการนำไปใช้งานครับ ซึ่งการนำไปใช้งานนั้นคือ “การจัดแบ่ง การจัดกลุ่ม การจำแนก ข้อมูลใน HTML/XHTML ครับ”
    • ขอบคุณสำหรับอีกมุมมองหนึ่งของการใช้ ID และ Class ครับ :-)
      ถ้าการใช้ ID หรือ Class เพื่อจัดกลุ่ม element และเนื้อหาของหน้าในแง่ของคุณ เป็นไปเพื่อให้ต่อไปสามารถดูแลโค๊ตได้ง่ายขึ้นเพียงอย่างเดียว ผมว่าเราก็ใช้แท็ก comment ระบุเพื่ออธิบายเป็นจุดๆไปจะดีกว่ามั้ยครับ? เราจะได้ไม่ต้องตั้งใช้ ID หรือ Class ให้เสียของแต่อย่างใด เพราะยังไงบรรดา Search Engine ทั้งหลายก็ไม่ได้สนใจอยู่แล้วว่าคุณจะตั้งชื่อ ID หรือ Class ว่าอะไร และผู้เข้าชมหน้าเว็บของคุณก็คงไม่สนใจเช่นเดียวกัน
      ส่วนที่ว่า CSS มี Selector หลากหลายพอที่จะเลือกใส่คำสั่ง CSS ให้กับแท็กไหนก็ได้ที่ต้องการโดยไม่ต้องใช้ ID หรือ Class ช่วยเลยนั้น ก็เป็นความจริงครับ แต่ยังใช้งานจริงได้ไม่ทั้งหมด เพราะไม่ใช่เว็บบราวเซอร์ที่คนส่วนใหญ่ใช้ๆกันอยู่จะรองรับ Selector ขั้นสูงที่สามารถระบุได้ถึงระดับนั้นได้ทั้งหมด เพราะฉะนั้นหนทางที่ปลอดภัยที่สุดและทำให้เข้าถึงผู้ใช้ส่วนใหญ่มากที่สุดก็คือ แค่หยอดชื่อ ID หรือ Class ที่สื่อความหมายเข้าไปในแท็กที่ต้องการ เพราะนอกจากจะให้เราใส่คำสั่ง CSS และ jQuery ที่แท็กที่ต้องการได้สะดวกแล้ว ยังช่วยในเรื่องการจัดกลุ่ม element และเนื้อหาในหน้าให้ดูแลง่ายขึ้นต่อไปในอนาคตด้วยครับ เรียกได้ว่ายิงปืนนัดเดียวได้นกสองตัว แบบนี้จะดีกว่ามั้ยครับ?
  3. ผมสงสัยนิดนึงอ่ะครับ พอดีผมใช้ ID ซ้อนกันหลายชั้น แล้วมันจะมีปัญหาเกี่ยวกับการแสดงผลหรือเปล่าครับ
    หรือว่าควรใช้ CLASS ครับ เพราะดูเหมือนมันจะไม่แสดงผลอย่างที่ระบุไว้
    ขอบคุณครับ
    • จริงๆแล้วการใช้ div ที่มี id หรือ class ซ้อนกันหลายๆชั้นไม่ทำให้เกิดปัญหาอะไรกับการแสดงผลหรอกครับ นอกเสียจากคุณมีการสั่งแท็กเดียวกันด้วย id มาก่อนหน้านี้ แล้วมาสั่งคำสั่งเดียวกันผ่าน class อีกที คำสั่งที่เขียนผ่าน class จะไม่แสดงผลตามหลัก Specificity ครับ
      แต่เพื่อให้การดูแลโค๊ตต่อไปสามารถจัดการได้ง่ายขึ้นก็ควรเลือกใช้ให้เหมาะสมครับ คือถ้า div ที่เราเขียนมีลักษณะการแสดงผลไม่เหมือน div อื่นในหน้าก็ให้ใช้ id ครับ แต่ถ้า div ที่ว่ามีลักษณะการแสดงผลเหมือนๆกับ div อื่นบนหน้าเพียงแต่วางอยู่กันคนละที่เท่านั้นเอง กรณ๊นี้ก็ควรใช้ class ครับ เพราะจะทำให้เราไม่ต้องเขียนคำสั่ง CSS ซ้ำๆกันไปมาในแต่ละ id ให้ยุ่งยาก แถมยังทำให้การปรับเปลี่ยนอะไรต่อไปง่ายขึ้นด้วย เพราะเราเพียงปรับที่ class เพียงจุดเดียว ทุกที่ที่ใช้ class เดียวกันนี้ก็จะเปลี่ยนแปลงไปด้วยทั้งหมดครับ
  4. ขอบคุณมากครับ นับถือในความพยายามในการสอนครับ ผมไปอ่านมาดูหลายเว็บล่ะเรืองidกับclass ก็ยังงงอยู่ว่าควรจะใช้อันไหนดี มาอ่านที่นี้ เข้าใจมากๆเลยครับ เป็นกำลังใจให้นะครับ
  5. ชอบคับผมเยี่ยมจริงๆ ผมก็งงอยู่เหมือนกันคับตอนแรก เพราะเมื่อมันใช้ได้เหมือนกัน ทำไมต้องมี ID และ CLASS ทีนี้ก็เข้าใจแล้วคับของคุณสำหรับบทความดีๆนะคับผม
  6. เป็นคำถามที่อยู่ในใจมานานมากแล้ว เพราะรู้สึกว่าเหมือนกันมาก เพิ่งได้คำตอบก็วันนี้ล่ะ –’
    ขอบคุณค่ะ
  7. ขอบคุณสำหรับความรู้ เข้าใจง่ายดีครับ
    ถ้าเปิดสอน พวก workshop เมลบอกด้วยละกัน

ใส่ความเห็น