CSS Pseudo-classes ที่อยู่ในจำพวก Structural pseudo-classes นั้นมีหลายตัวด้วยกัน แต่วันนี้ ผมขอพูดถึงตัวพื้นๆ ใช้ง่ายๆ และน่าจะได้นำมาใช้บ่อยๆ กันก่อนนะครับ
Structural pseudo-classes มีไว้ใช้ในกรณีที่ Simple Selectors และ Combinators Selectors นั้นไม่สามารถนำมาใช้งานได้ เพราะฉะนั้น ในการเลือกใช้งานอย่างเหมาะสมตามความสามารถของภาษาก่อนเป็นอันดับแรก เช่น ถ้าหากเราจะสั่งงาน HTML บางชุดการใช้งาน ให้เริ่มคำนึงถึง Simple Selectors อื่นๆ ก่อน
ปัญหาจะตามมาตรงนี้ เพราะ คนทำงานมันยังไม่รู้ว่า Simple Selectors มันคืออะไรกันวะ หน้าตาเป็นยังไง ถ้าอย่างนั้น เอาอย่างนี้ ผมจะขอไกด์ไลน์ ให้พอเป็นอีโนให้ เช่น สมมุติว่าเรามีกลุ่ม HTML กลุ่มหนึ่ง เราจะเขียน CSS จัดการ ให้เริ่มลำดับการเลือกที่
- Type Selector
- Universal Selector
- Attribute Selectors
- Class selectors (อันนี้ได้ข่าวว่า ชาวไทยผู้คลั่งชาติ ชอบใช้กันมาก)
- ID Selectors (อันนี้ หลายคนก็ยังไม่รู้ว่ามันต่างจาก อันด้านบนยังไง และเลือกใช้งานยังไงอีก)
- พอมาถึงตรงนี้ ถ้ายังเลือกหา Selectors ที่เหมาะสมเพื่อจะจัดการกับ HTML ของเรายังไม่ได้ ให้ข้ามไปที่ Combinators Selectors โดยเริ่มที่การเลือก Descendant Combinator ก่อน ถ้ายังไม่ได้ ให้ไป
- Child combinators
- Sibling combinators โดยในนี้ มี 2 อันให้เลือกใช้คือ Adjacent sibling และ General sibling
- ถ้าลูกค้าเร่งงานมาด่วนมาก คิดไม่พบ ว่าอะไร เป็นยังไง ให้ทำงานหาเงินก่อน อย่าเพิ่งคำนึงถึง 8 ข้อด้านบนมาก เดี๋ยวจะไม่มีเงินกินข้าว
จบด้วยการไม่อธิบายต่อ เพราะหัวข้อที่ผมว่าไว้ข้างบน เราจะมาลองเล่น :nth-child() และ :not() นั่นเอง
จากบทความก่อนหน้านี้ เรื่อง CSS3 Attribute Selectors กับแนวคิดการทำ Floating Layouts ผมขอยกตัวอย่างต่อกันมาเลยนะครับ
สมมุติว่า เราจะแบ่งสวนหนึ่งส่วนใดของเว็บออกเป็น 3 สดมภ์ แล้วใส่ข้อมูล ซึ่งเรามีชุด CSS กลางที่ช่วยในการแบ่งอยู่แล้ว
ขั้นต่อมา ก่อนอื่นใด ที่เราจะใส่ข้อมูลเข้าไปในแต่ละช่องนั้น ควรจะต้องมี Nest element สักอันมา ทำการครอบเอาไว้ก่อน เพราะเมื่อใดก็ตามถ้าเราทำการสั่ง <li> โดยตรงตามตัวอย่าง เช่น เพิ่ม padding: 10px; จะทำให้ layout ที่เราเขียนไว้นั้น เสียทันที เพราะค่าความกว้างที่รับมาจาก 33% ของแต่ละ <li> นั้น จะกลายเป็น 33%+20 เป็นเหตุให้ อะไรก็ตามที่อยู่ท้ายสุดนั้น ร่วงลงมากองเอ๊าะเย๊าะศิลป์ ที่ด้านล่าง
ในรูปตัวอย่างผมเอา <article> ใส่เข้าไปก่อน
ที่เราจำเป็นต้องทำอย่างนี้เพราะ ในงานส่วนหนึ่ง การแบ่งเนื้อหาออกเป็นสดมภ์ง่ายๆ การออกแบบอาจจะมี รูปแบบที่แตกต่างกัน
หรือแต่ละสดมภ์นั้น มาเส้นขั้นเอาไว้เพื่อเป็นการแบ่งเนื้อหาออกจากกันให้ชัดเจน แต่เส้นนั้น มักจะไม่โผล่ตรง สดมภ์แรกสุด หรือ หลังสุด ประมาณภาพตัวอย่างครับ
ถ้าเป็นเมื่อสมัยพระเจ้า สามหำ วิธีการแก้ง่ายๆ คือ สร้าง class ของ css ขึ้นมา 1 class แล้วให้มี border-left: dotted 1px #xxx; แล้วเอาไปใส่ใน elements ที่ไม่ใช่ตัวแรกแทน
ปัญหามันจะตามมาคือ การเขียน HTML ที่ไม่ถูกระบบ ระเบียบ เพราะเว็บสมัยใหม่เขาบอกว่า attributes ใดๆ ที่เกิดขึ้นใน HTML นั้น ควรจะเกิดขึ้นเพื่อการสื่อสารด้านข้อมูล ไม่ใช่นำมาอ้างอิงเพื่อจัดหน้าเอกสาร ซึ่งถ้าเรายังเคารพกฎข้อนี้ เราก็ควร เรียนรู้เพื่อที่จะได้ปฏิบัติตามอย่างถูกวิธี เพราะฉะนั้น การเขียน คลาสของ CSS ที่ให้มีเส้นขอบด้านซ้าย แล้วเอามาใส่จึงไม่ใช่วิธีการที่ถูกต้องนัก
เขียนง่ายๆ บรรทัดเดียวครับ
ul[class*="แบ่งหน้า-แบบ-สามสดมภ์"]>li:not(:nth-child(1))>article {
Border-left: dotted 1px rgb(159,34,20);
}
ul[class*=”แบ่งหน้า-แบบ-สามสดมภ์”]>Li:not(:nth-child(1))>article อ่านว่า article ที่เป็นลูกของ li ที่ไม่ได้เป็นลูกลำดับที่ 1 ของ ul ซึ่งมี attribute
class ส่วนใด ส่วนหนึ่งตรงกับคำว่า แบ่งหน้า-แบบ-สามสดมภ์
จบข่าว
มีความสุขกับการใช้ชีวิตครับ
5 Responses to nth-child() และ not() ใน CSS Selectors