แนวคิด CSS Specificity ไม่ได้เป็นเพียงการบิดลิ้นเล็กน้อย (พยายามพูดให้เร็ว 3 ครั้ง!) แต่อาจทำให้เสียสติได้เช่นกัน! เป็นหนึ่งในแนวคิดที่ยากกว่าใน CSS ที่จะเข้าใจ ในบทความนี้ เราจะพูดถึงความหมายของความเฉพาะเจาะจง วิธีคำนวณ และการจัดอันดับตัวเลือกเป็นตัวกำหนดรูปแบบที่แสดงบนหน้า ไม่ต้องกังวลใจ! คุณจะเป็นผู้เชี่ยวชาญด้านความจำเพาะในเวลาไม่นาน
'ความจำเพาะ' หมายถึงอะไร
ความจำเพาะของ CSS โดยทั่วไปหมายถึงความสำคัญของตัวเลือก ตัวเลือกแต่ละตัวถูกกำหนดให้มีความเฉพาะเจาะจงขึ้นอยู่กับว่ามันคืออะไร ยิ่งจำนวนตัวเลือกสูง ยิ่งเฉพาะเจาะจงมากขึ้นและมีแนวโน้มว่ากลุ่ม CSS นั้นจะชนะในสงครามการจัดสไตล์
ความเฉพาะเจาะจงแสดงด้วยตัวเลขสี่ตัว แต่ละตัวคั่นด้วยเครื่องหมายจุลภาค:
Selector specificity = 0, 0, 0, 0
เมื่อเราพิจารณาความจำเพาะเป็นสตริงของตัวเลขสี่ตัวโดยไม่มีเครื่องหมายจุลภาค (เช่น 0000, 0101, 1001 เป็นต้น) ค่าที่ สูงกว่า ตัวเลขคือ เจาะจงมากขึ้น มันคือ.
ความจำเพาะของผู้เลือกตามอันดับ (ต่ำ – สูง):
มาดูองค์ประกอบประเภทต่างๆ ตามอันดับกัน:
- *
ตัวเลือกสากล ความจำเพาะคือ 0, 0, 0, 0 โดยปกติคุณจะเห็นสิ่งเหล่านี้ที่ด้านบนของสไตล์ชีต เป็นอันดับที่ต่ำที่สุดในแง่ของความสำคัญ เกือบทุกอย่างจะแทนที่มันหรือเพิ่มในตัวเลือกสากล CSS
- >, ➕, ‘ ‘ , ∼
เครื่องผสมซึ่งมักจะเห็นเมื่อเลือกพี่น้องของตัวเลือกประเภทหรือตัวเลือกคลาส จะไม่มีผลต่อความจำเพาะและไม่นับรวมในจำนวนทั้งหมด คลาสหลอกเชิงลบ (:not) ก็เข้ากับหมวดหมู่ความจำเพาะนี้ได้เช่นกัน
- div, form, ul, li เป็นต้น
นี่คือ ประเภท ตัวเลือก ตัวเลือกเหล่านี้เกือบจะรวมทุกอย่างที่อาจถือเป็นแท็กใน HTML ของคุณ น้ำหนักความจำเพาะคือ 0, 0, 0, 1 หากคุณมีตัวเลือกประเภทหลายตัวแยกจากกันโดยตัวผสม คุณจะต้องเพิ่มตัวเลือกเข้าด้วยกัน:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
div li {} ⇐ the specificity is 0,0,0,2
div li p {} ⇐ the specificity is 0,0,0,3 - .main-container, .navbar, [type=”text”], :hover
ลำดับถัดไปสำหรับความเฉพาะเจาะจงคือคลาส แอตทริบิวต์ และตัวเลือกคลาสหลอก
ตัวเลือกชั้นเรียนจะระบุด้วยจุด (“”) ที่จุดเริ่มต้น ตัวเลือกแอตทริบิวต์มีแอตทริบิวต์ภายในวงเล็บเหลี่ยมถัดจากตัวเลือกประเภท ตัวเลือกคลาสหลอกสงวนไว้สำหรับองค์ประกอบพิเศษที่ต้องการสไตล์ที่เฉพาะเจาะจงมากขึ้น มีความเฉพาะเจาะจงเท่ากับ 0, 0, 1, 0
div.navlink a {} – ความจำเพาะคือ 0, 0, 1, 1 เพราะเรามีหนึ่งตัวเลือกคลาสและเรามีตัวเลือกหนึ่งประเภท
div.header li.list-item-disc button[type="submit"] {} – ความจำเพาะคือ 0, 0, 3, 3 เพราะเรามี 3 ตัวเลือกประเภทและ 2 ตัวเลือกคลาส + 1 ตัวเลือกแอตทริบิวต์ ถ้าเราถอดตัวเลือกแอตทริบิวต์ออก ความจำเพาะจะเป็น 0, 0, 2, 3 เนื่องจาก 23 น้อยกว่า 33 ตัวเลือก CSS ที่มีความจำเพาะ 0, 0, 3, 3 จะชนะเนื่องจากมีความจำเพาะสูงกว่า
- #สีน้ำเงิน #ซ่อนเร้น ฯลฯ
ตัวเลือก ID มีความเฉพาะเจาะจงสูงสุดในบรรดาตัวเลือก CSS:1, 0, 0, 0 เนื่องจากลักษณะเฉพาะของคำจำกัดความแอตทริบิวต์ ID เรามักจะกำหนดสไตล์องค์ประกอบที่เฉพาะเจาะจงจริงๆ เมื่อเราเรียก ID ใน CSS ของเรา
div#orange {} – ความจำเพาะคือ 1, 0, 0, 1 เพราะเรามีตัวเลือกประเภทและตัวเลือก ID สไตล์ใดชนะตามกฎความเฉพาะเจาะจงของเราจากสิ่งต่อไปนี้
div#orange {
background-color: orange;
}
div.square {
background-color: green;
width: 150px;
height: 150px;
} - div แรกมีตัวเลือกประเภทและตัวเลือก ID ทำให้เป็นความจำเพาะโดยรวม 1, 0, 0, 1
- Div ที่สองมีตัวเลือกประเภทและตัวเลือกคลาส ทำให้เป็นความจำเพาะโดยรวม 0, 0, 1, 1
เนื่องจาก 1001 มากกว่า 11 div แรกจะเป็นผู้ชนะ และสีพื้นหลังจะเป็นสีส้ม ตรงกันข้ามกับลักษณะการเรียงซ้อนของ CSS
- แบบอินไลน์
การจัดสไตล์อินไลน์เข้ากับสิ่งเหล่านี้ได้อย่างไร มันยิ่ง มากกว่า เฉพาะกว่าตัวเลือก ID รูปแบบอินไลน์จะมีผลเหนือกว่าทุกอย่างในไฟล์ CSS ของคุณ มีน้ำหนักสูงสุดในแง่ของความจำเพาะ
!importantกฎ
!important คีย์เวิร์ดสำคัญกว่าทุกสิ่ง เป็นกฎที่เจาะจงที่สุดและจะเขียนทับกฎก่อนหน้าใดๆ ที่กำหนดโดย CSS
แบบฝึกหัด
ในตัวแก้ไขโค้ดด้านล่าง ฉันสร้างหน้าคอนเทนเนอร์ตัวอย่างที่มีชื่อคลาสสุ่มและชื่อ ID ฉันต้องการให้คุณใช้เวลาสักครู่และฝึกฝนการใช้ทักษะ CSS ของคุณเพื่อเปลี่ยนองค์ประกอบเฉพาะเป็นสีอื่น ในขณะที่ div อื่น ๆ ทั้งหมดยังคงเป็นสีเดียวกัน คุณจะเขียนกฎเหล่านั้นใน CSS อย่างไร คุณจะใช้อะไรเพื่อให้ได้ความเฉพาะเจาะจงสูงสุดหากนั่นคือสิ่งที่คุณต้องการใช้เพื่อกำหนดเป้าหมายองค์ประกอบบางอย่าง
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS Specificity</title>
<style>
body {
width: 100%;
max-width: 800px;
margin: 0 auto;
}
main {
width: 100%;
height: 800px;
display: flex;
flex-wrap: wrap;
flex-direction: column;
}
div {
text-align: center;
}
*.square {
/* what does the star mean here? Does it add to the specificity number at all? How can you test your hypothesis? */
height: 150px;
width: 150px;
background-color: black;
color: white;
margin: 20px;
}
div.flex {
/* Does this compete with the other class at all? Or does it work in conjunction with the .square class? What would happen if we added a width and a height to this selector? Why does that happen?
Does this override the div selector? Why? How does its specificity compare to the div selector's specificity?
*/
display: flex;
justify-content: center;
align-items: center;
}
div#red {
/* why does this one win out? What is the specificity of this div? */
background-color: darkred;
}
#red {
/* What would happen if we took the 'div' out of the previous selector? Which one wins? */
background-color: red;
}
main > div {
font-size: 55px;
font-weight: bold;
}
div#self-align {
/* What happens here? */
align-self: center;
}
</style>
</head>
<body>
<main>
<div id="self-align" class="square flex">1</div>
<div class="square flex">2</div>
<div class="square flex">3</div>
<div class="square flex">4</div>
<div class="square flex">5</div>
<div id="red" class="square flex">6</div>
<div class="square flex">7</div>
<div class="square flex">8</div>
<div class="square flex">9</div>
<div class="square flex">10</div>
<div class="square flex">11</div>
<div class="square flex">12</div>
</main>
</body>
</html> บทสรุป
ในบทความนี้ เราได้พูดถึง CSS Specificity – โดยเฉพาะอย่างยิ่งตัวเลือกใดที่มีความเฉพาะเจาะจงมากกว่าตัวอื่นๆ และวิธีที่เราหาหมายเลขเฉพาะที่แท้จริง อย่าท้อแท้หากไม่มาถึงคุณทันทีที่อ่านครั้งแรก นี่เป็นข้อมูลจำนวนมากที่จะแยกแยะ เก็บไว้ที่มันและคุณจะได้รับมันเร็วพอ!