The CSS Podcast - 002: Selectors
หากมีข้อความที่ต้องการให้มีขนาดใหญ่ขึ้นและเป็นสีแดงเฉพาะในกรณีที่เป็นย่อหน้าแรกของบทความ คุณจะทำอย่างไร
<article>
<p>I want to be red and larger than the other text.</p>
<p>I want to be normal sized and the default color.</p>
</article>
คุณใช้ตัวเลือก CSS เพื่อค้นหาองค์ประกอบที่เฉพาะเจาะจงนั้นและใช้กฎ CSS ดังตัวอย่างนี้
article p:first-of-type {
color: red;
font-size: 1.5em;
}
CSS มีตัวเลือกมากมายในการเลือกองค์ประกอบและใช้กฎกับองค์ประกอบเหล่านั้น ซึ่งมีทั้งแบบง่ายและแบบซับซ้อนมาก เพื่อช่วยแก้ปัญหาเช่นนี้
ส่วนต่างๆ ของกฎ CSS
หากต้องการทำความเข้าใจวิธีการทํางานของตัวเลือกและบทบาทของตัวเลือกใน CSS คุณควรทราบส่วนต่างๆ ของกฎ CSS กฎ CSS คือบล็อกโค้ดที่มีเครื่องมือเลือกอย่างน้อย 1 รายการและการประกาศอย่างน้อย 1 รายการ
ในกฎ CSS นี้ ตัวเลือกคือ .my-css-rule
ซึ่งจะค้นหาองค์ประกอบทั้งหมดที่มีคลาส my-css-rule
ในหน้า
มีการประกาศ 3 รายการภายในวงเล็บปีกกา
การประกาศคือคู่พร็อพเพอร์ตี้และค่าที่ใช้รูปแบบกับองค์ประกอบที่ตรงกับตัวเลือก
กฎ CSS อาจมีประกาศและตัวเลือกได้มากเท่าที่ต้องการ
ตัวเลือกแบบง่าย
กลุ่มตัวเลือกที่ตรงไปตรงมาที่สุดจะกําหนดเป้าหมายองค์ประกอบ HTML รวมถึงคลาส รหัส และแอตทริบิวต์อื่นๆ ที่อาจเพิ่มลงในแท็ก HTML
ตัวเลือกส่วนกลาง
ตัวเลือกส่วนกลางหรือที่เรียกว่าไวลด์การ์ดจะจับคู่กับองค์ประกอบใดก็ได้
* {
color: hotpink;
}
กฎนี้ทําให้องค์ประกอบ HTML ทั้งหมดในหน้ามีข้อความสีชมพูร้อน
ตัวเลือกประเภท
ตัวเลือกประเภทจะจับคู่กับองค์ประกอบ HTML โดยตรง
section {
padding: 2em;
}
กฎนี้ทําให้องค์ประกอบ <section>
ทั้งหมดมี 2em
ของ padding
ในทุกด้าน
ตัวเลือกคลาส
องค์ประกอบ HTML อาจมีรายการที่กําหนดไว้ในแอตทริบิวต์ class
อย่างน้อย 1 รายการ
ตัวเลือกคลาสจะจับคู่กับองค์ประกอบใดก็ตามที่มีการใช้คลาสนั้น
<div class="my-class"></div>
<button class="my-class"></button>
<p class="my-class"></p>
องค์ประกอบที่มีการใช้คลาสจะเปลี่ยนเป็นสีแดง
.my-class {
color: red;
}
โปรดสังเกตว่า .
อยู่ใน CSS เท่านั้นและไม่ได้อยู่ใน HTML
เนื่องจากอักขระ .
บอกภาษา CSS ให้จับคู่สมาชิกแอตทริบิวต์คลาส
รูปแบบนี้เป็นรูปแบบทั่วไปใน CSS ซึ่งจะใช้อักขระพิเศษหรือชุดอักขระเพื่อกำหนดประเภทตัวเลือก
องค์ประกอบ HTML ที่มีคลาส .my-class
จะยังคงจับคู่กับกฎ CSS ข้างต้นแม้ว่าจะมีคลาสอื่นๆ อีกหลายคลาส ดังนี้
<div class="my-class another-class some-other-class"></div>
เนื่องจาก CSS จะมองหาแอตทริบิวต์ class
ที่มีคลาสที่กําหนดไว้ แทนที่จะจับคู่คลาสนั้นทุกประการ
ตัวเลือกรหัส
เอลิเมนต์ HTML ที่มีแอตทริบิวต์ id
ควรเป็นองค์ประกอบเดียวในหน้าเว็บที่มีค่ารหัสนั้น
คุณเลือกองค์ประกอบด้วยตัวเลือกรหัสดังนี้
#rad {
border: 1px solid blue;
}
CSS นี้จะใส่เส้นขอบสีน้ำเงินให้กับองค์ประกอบ HTML ที่มี id
ของ rad
ดังนี้
<div id="rad"></div>
ในทำนองเดียวกับตัวเลือกคลาส .
ให้ใช้อักขระ #
เพื่อสั่งให้ CSS ค้นหาองค์ประกอบที่ตรงกับ id
ที่ตามหลัง
ตัวเลือกแอตทริบิวต์
คุณค้นหาองค์ประกอบที่มีแอตทริบิวต์ HTML บางรายการ หรือมีค่าบางอย่างสำหรับแอตทริบิวต์ HTML ได้โดยใช้ตัวเลือกแอตทริบิวต์
สั่งให้ CSS ค้นหาแอตทริบิวต์โดยใส่ตัวเลือกไว้ในวงเล็บเหลี่ยม ([ ]
)
[data-type='primary'] {
color: red;
}
CSS นี้จะค้นหาองค์ประกอบทั้งหมดที่มีแอตทริบิวต์ data-type
ที่มีค่าเป็น primary
ดังนี้
<div data-type="primary"></div>
แทนที่จะมองหาค่าที่เฉพาะเจาะจงของ data-type
คุณยังค้นหาองค์ประกอบที่มีแอตทริบิวต์นั้นอยู่ได้ โดยไม่คำนึงถึงค่าของแอตทริบิวต์
[data-type] {
color: red;
}
<div data-type="primary"></div>
<div data-type="secondary"></div>
องค์ประกอบ <div>
ทั้ง 2 รายการจะมีข้อความสีแดง
คุณสามารถใช้ตัวเลือกแอตทริบิวต์ที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ได้โดยการใส่โอเปอเรเตอร์ s
ลงในตัวเลือกแอตทริบิวต์
[data-type='primary' s] {
color: red;
}
ซึ่งหมายความว่าหากองค์ประกอบ HTML มี data-type
ของ Primary
แทนที่จะเป็น primary
องค์ประกอบนั้นจะไม่แสดงข้อความสีแดง
คุณทําตรงข้ามได้ นั่นคือไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ โดยใช้โอเปอเรเตอร์ i
นอกจากโอเปอเรเตอร์ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แล้ว คุณยังมีสิทธิ์เข้าถึงโอเปอเรเตอร์ที่จับคู่บางส่วนของสตริงภายในค่าแอตทริบิวต์
/* A href that contains "example.com" */
[href*='example.com'] {
color: red;
}
/* A href that starts with https */
[href^='https'] {
color: green;
}
/* A href that ends with .com */
[href$='.com'] {
color: blue;
}
ตัวเลือกการจัดกลุ่ม
ตัวเลือกไม่จำเป็นต้องตรงกับองค์ประกอบเพียงรายการเดียว คุณจัดกลุ่มตัวเลือกหลายรายการได้โดยคั่นด้วยเครื่องหมายคอมมา ดังนี้
strong,
em,
.my-class,
[lang] {
color: red;
}
ตัวอย่างนี้ขยายการเปลี่ยนสีไปยังทั้งองค์ประกอบ <strong>
และองค์ประกอบ <em>
และยังขยายไปยังคลาสชื่อ .my-class
และองค์ประกอบที่มีแอตทริบิวต์ lang
ด้วย
ทดสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับตัวเลือกแบบง่าย
* {}
มีการใช้ตัวเลือกแบบง่ายประเภทใดในสนิปเพลตด้านบน
[]
ใช้สำหรับตัวเลือกแอตทริบิวต์แบบง่าย#
ใช้สำหรับเครื่องมือเลือกแบบง่ายของ ID*
คือตัวเลือกแบบง่ายสากล.
ใช้สำหรับเครื่องมือเลือกแบบง่ายของ classdiv {}
มีการใช้ตัวเลือกแบบง่ายประเภทใดในสนิปเพลตด้านบน
.
ใช้สำหรับเครื่องมือเลือกแบบง่ายของ classelement
ใช้สำหรับเครื่องมือเลือกแบบง่ายประเภท[]
ใช้สำหรับเครื่องมือเลือกแบบง่ายของแอตทริบิวต์#
สำหรับเครื่องมือเลือกแบบง่ายของ IDคลาสจำลองและองค์ประกอบจำลอง
CSS มีประเภทตัวเลือกที่มีประโยชน์ซึ่งมุ่งเน้นที่สถานะแพลตฟอร์มที่เฉพาะเจาะจง เช่น เมื่อวางเมาส์เหนือองค์ประกอบ โครงสร้างภายในองค์ประกอบ หรือส่วนต่างๆ ขององค์ประกอบ
คลาสจำลอง
องค์ประกอบ HTML อยู่ในรูปแบบต่างๆ ไม่ว่าจะมีการโต้ตอบกับองค์ประกอบนั้น หรือองค์ประกอบย่อยขององค์ประกอบนั้นอยู่ในสถานะหนึ่งๆ
เช่น ผู้ใช้อาจวางเมาส์เหนือองค์ประกอบ HTMLหรือองค์ประกอบย่อยก็ได้
ในกรณีดังกล่าว ให้ใช้คลาสจำลอง :hover
/* Our link is hovered */
a:hover {
outline: 1px dotted green;
}
/* Sets all even paragraphs to have a different background */
p:nth-child(even) {
background: floralwhite;
}
ดูข้อมูลเพิ่มเติมในโมดูลคลาสจำลอง
องค์ประกอบจำลอง
องค์ประกอบจำลองแตกต่างจากคลาสจำลองตรงที่องค์ประกอบจำลองจะทํางานราวกับว่ากําลังแทรกองค์ประกอบใหม่ด้วย CSS แทนที่จะตอบสนองต่อสถานะของแพลตฟอร์ม
องค์ประกอบจำลองยังมีไวยากรณ์แตกต่างจากคลาสจำลองด้วย เนื่องจากเราใช้โคลอนคู่ (::
) แทนการใช้โคลอนเดี่ยว (:
)
.my-element::before {
content: 'Prefix - ';
}
ดังในตัวอย่างด้านบนที่คุณใส่คำนำหน้าประเภทไฟล์ไว้หน้าป้ายกำกับของลิงก์ คุณสามารถใช้องค์ประกอบจำลอง ::before
เพื่อแทรกเนื้อหาที่จุดเริ่มต้นขององค์ประกอบ หรือใช้องค์ประกอบจำลอง ::after
เพื่อแทรกเนื้อหาที่จุดสิ้นสุดขององค์ประกอบ
แต่องค์ประกอบจำลองไม่ได้จำกัดอยู่แค่การแทรกเนื้อหา
นอกจากนี้ คุณยังใช้เพื่อกําหนดเป้าหมายส่วนต่างๆ ขององค์ประกอบได้ด้วย
ตัวอย่างเช่น สมมติว่าคุณมีรายการ
ใช้ ::marker
เพื่อจัดรูปแบบสัญลักษณ์หัวข้อย่อย (หรือตัวเลข) แต่ละรายการในรายการ
/* Your list will now either have red dots, or red numbers */
li::marker {
color: red;
}
นอกจากนี้ คุณยังใช้ ::selection
เพื่อจัดรูปแบบเนื้อหาที่ผู้ใช้ไฮไลต์ไว้ได้ด้วย
::selection {
background: black;
color: white;
}
ดูข้อมูลเพิ่มเติมในโมดูลเกี่ยวกับองค์ประกอบจำลอง
ทดสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับตัวเลือกเสมือน
ตัวเลือกองค์ประกอบจำลองใช้เครื่องหมายโคลอนกี่ตัว
:
1 ตัวใช้เพื่อกำหนดเป้าหมายคลาสจำลอง::
2 ตัวใช้เพื่อกำหนดเป้าหมายองค์ประกอบจำลองp:hover { background: white; color: black; }
มีการใช้ตัวเลือกจำลองประเภทใดในสนิปเพลตด้านบน
:
1 ตัวใช้เพื่อกำหนดเป้าหมายคลาสจำลอง::
2 ตัวใช้เพื่อกำหนดเป้าหมายองค์ประกอบจำลองตัวเลือกที่ซับซ้อน
คุณได้ดูตัวเลือกต่างๆ มากมายแล้ว แต่บางครั้งคุณจะต้องควบคุมแบบละเอียดมากขึ้นด้วย CSS ในกรณีนี้ ตัวเลือกที่ซับซ้อนจะเข้ามาช่วย
โปรดทราบว่าแม้ว่าตัวเลือกต่อไปนี้จะให้ความสามารถมากขึ้น แต่เราจะเลือกตามลำดับชั้นจากบนลงล่างได้เท่านั้น โดยเลือกองค์ประกอบย่อย เราไม่สามารถกําหนดเป้าหมายขึ้นและเลือกองค์ประกอบหลักได้ เราจะอธิบายความหมายและวิธีการทํางานของการแสดงโฆษณาตามลำดับขั้นในบทเรียนต่อๆ ไป
ตัวรวม
ตัวคอมบิเนเตอร์คือสิ่งที่อยู่ตรงกลางระหว่างตัวเลือก 2 รายการ
เช่น หากตัวเลือกคือ p > strong
ตัวคอมบิเนเตอร์คืออักขระ >
ตัวเลือกที่ใช้คอมบิเนเตอร์เหล่านี้จะช่วยคุณเลือกรายการตามตําแหน่งในเอกสาร
ตัวคอมบิเนเตอร์ขององค์ประกอบสืบทอด
หากต้องการทําความเข้าใจตัวรวมองค์ประกอบที่สืบทอด คุณต้องเข้าใจองค์ประกอบหลักและองค์ประกอบย่อยก่อน
<p>A paragraph of text with some <strong>bold text for emphasis</strong>.</p>
องค์ประกอบหลักคือ <p>
ที่มีข้อความ
ภายในองค์ประกอบ <p>
มีองค์ประกอบ <strong>
ซึ่งทำให้เนื้อหาเป็นตัวหนา
เนื่องจากอยู่ภายใน <p>
จึงถือเป็นองค์ประกอบย่อย
ตัวรวมองค์ประกอบที่สืบทอดมาช่วยให้เรากําหนดเป้าหมายองค์ประกอบย่อยได้
ตัวอย่างนี้ใช้เว้นวรรค () เพื่อสั่งให้เบราว์เซอร์ค้นหาองค์ประกอบย่อย
p strong {
color: blue;
}
ข้อมูลโค้ดนี้เลือกองค์ประกอบ <strong>
ทั้งหมดซึ่งเป็นองค์ประกอบย่อยขององค์ประกอบ <p>
เท่านั้น แล้วเปลี่ยนเป็นสีน้ำเงินแบบซ้ำ
คุณจะเห็นภาพเอฟเฟกต์นี้ได้ดีขึ้นในตัวอย่างข้างต้น ซึ่งใช้ตัวเลือกคอมบิเนเตอร์ .top div
กฎ CSS ดังกล่าวจะเพิ่มระยะขอบด้านซ้ายให้กับองค์ประกอบ <div>
เหล่านั้น
เนื่องจากคอมบิเนเตอร์เป็นแบบเรียกซ้ำ องค์ประกอบ <div>
ทั้งหมดที่อยู่ใน .top
จึงจะมีระยะห่างจากขอบเดียวกัน
ดูที่แผง HTML ในการแสดงตัวอย่างนี้เพื่อดูว่าองค์ประกอบ .top
มีองค์ประกอบย่อย <div>
หลายรายการ ซึ่งองค์ประกอบย่อยเหล่านั้นก็มีองค์ประกอบย่อย <div>
เช่นกัน
ตัวคอมบิเนเตอร์ของรายการถัดไป
คุณสามารถค้นหาองค์ประกอบที่อยู่ถัดจากองค์ประกอบอื่นโดยทันทีได้โดยใช้อักขระ +
ในตัวเลือก
หากต้องการเพิ่มเว้นวรรคระหว่างองค์ประกอบที่ซ้อนกัน ให้ใช้คอมบิเนเตอร์องค์ประกอบพี่น้องถัดไปเพื่อเพิ่มเว้นวรรคเฉพาะในกรณีที่องค์ประกอบเป็นองค์ประกอบพี่น้องถัดไปขององค์ประกอบย่อยของ .top
คุณสามารถเพิ่มระยะขอบให้กับองค์ประกอบย่อยทั้งหมดของ .top
ได้โดยใช้ตัวเลือกต่อไปนี้
.top * {
margin-top: 1em;
}
ปัญหาของวิธีนี้คือ เนื่องจากคุณเลือกองค์ประกอบย่อยทุกรายการของ .top
กฎนี้จึงอาจสร้างพื้นที่ว่างที่ไม่จำเป็นเพิ่มเติม
คอมบิเนเตอร์องค์ประกอบพี่น้องถัดไปเมื่อใช้ร่วมกับตัวเลือกสากลจะช่วยให้คุณไม่เพียงควบคุมได้ว่าองค์ประกอบใดจะได้รับการจัดระยะห่าง แต่ยังใช้การจัดระยะห่างกับองค์ประกอบใดก็ได้
วิธีนี้ช่วยให้คุณมีความยืดหยุ่นในระยะยาว ไม่ว่าเอลิเมนต์ HTML ใดจะปรากฏใน .top
ก็ตาม
ตัวคอมบิเนเตอร์ระดับถัดไป
ตัวคอมบิเนเตอร์ที่ตามมาจะคล้ายกับตัวเลือกพี่น้องถัดไปอย่างมาก
แต่ให้ใช้อักขระ ~
แทนอักขระ +
ความแตกต่างคือองค์ประกอบต้องอยู่หลังองค์ประกอบอื่นที่มีองค์ประกอบหลักเดียวกัน แทนที่จะเป็นองค์ประกอบถัดไปที่มีองค์ประกอบหลักเดียวกัน
ตัวคอมบิเนเตอร์ลำดับถัดไปนี้มีความยืดหยุ่นน้อยลงเล็กน้อย ซึ่งมีประโยชน์ในบริบทต่างๆ เช่น ตัวอย่างข้างต้น ซึ่งเราเปลี่ยนสีของสวิตช์ที่กำหนดเองเมื่อช่องทําเครื่องหมายที่เชื่อมโยงมีสถานะ :checked
ตัวคอมบิเนเตอร์ย่อย
ตัวประกอบย่อย (หรือที่เรียกว่ารายการสืบทอดโดยตรง) ช่วยให้คุณควบคุมการเกิดซ้ำที่มาพร้อมกับตัวเลือกตัวประกอบได้มากขึ้น
การใช้อักขระ >
จะจํากัดตัวเลือกคอมบิเนเตอร์ให้ใช้กับรายการย่อยโดยตรงเท่านั้น
พิจารณาตัวอย่างตัวเลือกพี่น้องก่อนหน้าและถัดไปก่อนหน้านี้ ระบบจะเพิ่มเว้นวรรคให้กับองค์ประกอบพี่น้องถัดไปแต่ละรายการ แต่หากองค์ประกอบใดองค์ประกอบหนึ่งมีองค์ประกอบพี่น้องถัดไปเป็นองค์ประกอบย่อยด้วย ก็อาจส่งผลให้มีเว้นวรรคเพิ่มเติมที่ไม่ต้องการ
หากต้องการแก้ไขปัญหานี้ ให้เปลี่ยนตัวเลือกพี่น้องถัดไปเพื่อรวมคอมบิเนเตอร์ย่อย > * + *
ต่อไปนี้ กฎจะมีผลกับแท็กย่อยโดยตรงของ .top
เท่านั้น
ตัวเลือกแบบผสม
คุณสามารถรวมตัวเลือกเข้าด้วยกันเพื่อเพิ่มความเฉพาะเจาะจงและความสามารถในการอ่านได้
เช่น หากต้องการกําหนดเป้าหมายองค์ประกอบ <a>
ที่มีคลาส .my-class
ด้วย ให้เขียนดังนี้
a.my-class {
color: red;
}
การดำเนินการนี้จะไม่เปลี่ยนสีลิงก์ทั้งหมดเป็นสีแดง และจะใช้สีแดงกับ .my-class
ifอยู่ในองค์ประกอบ <a>
ดูข้อมูลเพิ่มเติมได้ที่โมดูลความเฉพาะเจาะจง
ทดสอบความเข้าใจ
ทดสอบความรู้เกี่ยวกับตัวเลือกที่ซับซ้อน
สัญลักษณ์ใดต่อไปนี้ไม่ใช่ตัวรวมตัวเลือก
section.awesome { border: 1px solid hotpink; }
ตัวเลือกด้านบนคือตัวอย่างของ...