ลำดับความสำคัญของ CSS คืออะไร?


110

ฉันพยายามหาสาเหตุว่าทำไมคลาส css ของฉันถึงแทนที่อีกคลาส (ไม่ใช่วิธีอื่น)

ที่นี่ฉันมีคลาส css สองคลาส

.smallbox { 
    background-color: white;
    height: 75px;
    width: 150px;
    font-size:20px;
    box-shadow: 0 0 10px #ccc;
    font-family: inherit;
}

.smallbox-paysummary {
    @extend .smallbox; 
    font-size:10px;
}

และในมุมมองของฉันฉันเรียก

<pre class = "span12 pre-scrollable smallbox-paysummary smallbox "> 

แบบอักษร (องค์ประกอบที่ทับซ้อนกัน) แสดงเป็น 10px แทนที่จะเป็น 20 - มีใครอธิบายได้ไหมว่าทำไมจึงเป็นเช่นนั้น


2
คุณใช้ CSS pre-processor หรือไม่? ฉันเห็นคุณมีสิ่ง@extend .smallbox;นั้นซึ่งดูเหมือน cSS ที่ไม่ได้มาตรฐาน
Jared Farrish

คุณไม่ควรรวม@extend- ถ้ามันทำอย่างที่ฉันคิด - และใช้ตัวเลือกทั้งสองในองค์ประกอบเดียวกัน
มิลลิโมส

ดูเหมือนว่า SMACSS จะแนะนำให้รวมคุณสมบัติที่เปลี่ยนแปลงไว้ใน "คลาสย่อย" เท่านั้น (เช่น.smallbox-paysummary) และอาจทำให้การประกาศ CSS มีความเฉพาะเจาะจงชัดเจนยิ่งขึ้น (โดยไม่ต้องอาศัยลำดับการปรากฏในไฟล์ CSS) โดยใช้.smallbox.smallbox-paysummary { font-size: 10px; }
มิลลิโมส

1
และถ้าคุณไม่ต้องการ.smallbox-paysummaryให้ฟอนต์เล็กลงทำไมคุณถึงทำให้มันเล็กลงตั้งแต่แรกล่ะ?
มิลลิโมส

ตอนนี้ฉันสงสัยว่าทำไมกฎทั้งสองมีความเฉพาะเจาะจงเหมือนกันที่ประกาศไว้ในแอตทริบิวต์คลาสขององค์ประกอบในภายหลังจะไม่นำมาก่อนไม่ว่ากฎ CSS จะเรียงลำดับอย่างไร
Andy

คำตอบ:


187

มีกฎหลายข้อ (ใช้ตามลำดับนี้):

  1. inline css (แอตทริบิวต์สไตล์ html) แทนที่กฎ css ในแท็กสไตล์และไฟล์ css
  2. ตัวเลือกที่เฉพาะเจาะจงมากขึ้นจะมีความสำคัญเหนือกว่าตัวเลือกที่เจาะจงน้อยกว่า
  3. กฎที่ปรากฏในภายหลังในโค้ดจะแทนที่กฎก่อนหน้านี้หากทั้งสองมีความจำเพาะเหมือนกัน
  4. กฎ css ที่มี!importantความสำคัญเสมอ

ในกรณีของคุณกฎ 3 ที่บังคับใช้

ความจำเพาะสำหรับตัวเลือกเดียวจากสูงสุดไปต่ำสุด:

  • รหัส (ตัวอย่าง: #mainเลือก<div id="main">)
  • ชั้นเรียน (อดีต .: .myclass) แอตทริบิวต์เตอร์ (อดีต .: [href=^https:]) และหลอกเรียน (อดีต .: :hover)
  • องค์ประกอบ (อดีต .: div) และหลอกองค์ประกอบ (อดีต .: ::before)

หากต้องการเปรียบเทียบความจำเพาะของตัวเลือกสองตัวที่รวมกันให้เปรียบเทียบจำนวนครั้งที่เกิดขึ้นของตัวเลือกเดียวของแต่ละกลุ่มความเฉพาะเจาะจงข้างต้น

ตัวอย่าง: เปรียบเทียบ#nav ul li a:hoverกับ#nav ul li.active a::after

  • นับจำนวนตัวเลือกรหัส: มีหนึ่งรายการสำหรับแต่ละ ( #nav)
  • นับจำนวนตัวเลือกคลาส: มีหนึ่งตัวสำหรับแต่ละตัว ( :hoverและ.active)
  • นับจำนวนตัวเลือกองค์ประกอบ: มี 3 ( ul li a) สำหรับตัวแรกและ 4 สำหรับตัวที่สอง ( ul li a ::after) ดังนั้นตัวเลือกแบบรวมที่สองจึงมีความเฉพาะเจาะจงมากขึ้น

บทความที่ดีเกี่ยวกับ CSS เลือกจำเพาะ


ความเฉพาะเจาะจงแทนที่การประกาศรูปแบบอินไลน์อย่างไร
Jared Farrish

3
"... กฎ css ในแท็กสไตล์ ... ลบล้างกฎในไฟล์ css" ฉันเคยเห็นตำนานนี้สองสามครั้งเมื่อเร็ว ๆ นี้ ฉันไม่รู้ว่ามันมาจากไหน แต่มันเป็นเรื่องไร้สาระ
Alohci

@jared ฉันสลับสองจุดแรก นี่คือสิ่งที่คุณหมายถึง?
Lorenz Meyer

ใช่นั่นคือสิ่งที่ฉันหมายถึง
Jared Farrish

2
@PakiPat :hoverไม่ใช่ตัวเลือกคลาสแต่เป็นตัวเลือกคลาสหลอก
Lorenz Meyer

30

นี่คือการรวบรวมลำดับการจัดสไตล์ CSS ในไดอะแกรมซึ่งกฎ CSS มีลำดับความสำคัญสูงกว่าและมีความสำคัญเหนือส่วนที่เหลือ: ลำดับการจัดรูปแบบ CSS

คำเตือน : ทีมงานของฉันและฉันทำงานชิ้นนี้ร่วมกับโพสต์บล็อก ( https://vecta.io/blog/definitive-guide-to-css-styling-order ) ซึ่งฉันคิดว่าจะมีประโยชน์กับส่วนหน้าทั้งหมด นักพัฒนา


3
แผนภาพนั้นต้องการความคิดพิเศษ สำหรับฉันมันยากกว่าที่จะเข้าใจแผนภาพนั้นมากกว่าการถ่ายทอดลักษณะ
Lorenz Meyer

10

สิ่งที่เรากำลังดูอยู่นี้เรียกว่าความจำเพาะตามที่Mozillaระบุไว้:

ความจำเพาะคือวิธีที่เบราว์เซอร์ตัดสินใจว่าค่าคุณสมบัติ CSS ใดที่เกี่ยวข้องกับองค์ประกอบมากที่สุดดังนั้นจึงจะถูกนำไปใช้ ความจำเพาะขึ้นอยู่กับกฎการจับคู่ซึ่งประกอบด้วยตัวเลือก CSS ประเภทต่างๆ

ความจำเพาะคือน้ำหนักที่ใช้กับการประกาศ CSS ที่กำหนดซึ่งกำหนดโดยจำนวนของตัวเลือกแต่ละประเภทในตัวเลือกที่ตรงกัน เมื่อการประกาศหลายรายการมีความจำเพาะเท่ากันการประกาศสุดท้ายที่พบใน CSS จะถูกนำไปใช้กับองค์ประกอบ ความจำเพาะจะมีผลเฉพาะเมื่อองค์ประกอบเดียวกันถูกกำหนดเป้าหมายโดยการประกาศหลายรายการ ตามกฎ CSS องค์ประกอบที่กำหนดเป้าหมายโดยตรงจะมีความสำคัญเหนือกฎที่องค์ประกอบได้รับมาจากบรรพบุรุษเสมอ

ฉันชอบคำอธิบาย0-0-0ที่https://specifishity.com :

ใส่คำอธิบายภาพที่นี่

บรรยายภาพตรงประเด็น!important! แต่บางครั้งก็เป็นวิธีเดียวที่จะลบล้างstyleแอตทริบิวต์แบบอินไลน์ ดังนั้นจึงเป็นแนวทางปฏิบัติที่ดีที่สุดในการพยายามหลีกเลี่ยงทั้งสองอย่าง


1
ยอดเยี่ยม. สิ่งที่ฉันกำลังมองหา กราฟิกนี้ยอดเยี่ยมมากฮ่า ๆ
saran3h

7

ก่อนอื่นตาม@extendคำสั่งของคุณดูเหมือนว่าคุณไม่ได้ใช้ CSS บริสุทธิ์ แต่เป็นตัวประมวลผลล่วงหน้าเช่น SASS os Stylus

ตอนนี้เมื่อเราพูดถึง "ลำดับความสำคัญ" ใน CSS จะมีกฎทั่วไปที่เกี่ยวข้อง: กฎใดก็ตามที่ตั้งขึ้นหลังจากกฎอื่น ๆ (ในรูปแบบจากบนลงล่าง) จะถูกนำไปใช้ ในกรณีของคุณเพียงแค่ระบุ.smallboxหลังจากที่.smallbox-paysummaryคุณจะสามารถเปลี่ยนลำดับความสำคัญของกฎของคุณได้

แต่ถ้าคุณอยากจะไปต่ออีกนิดผมขอแนะนำให้อ่านนี้: ข้อกำหนด CSS น้ำตก W3C คุณจะพบว่าลำดับความสำคัญของกฎขึ้นอยู่กับ:

  1. ประเภทสื่อปัจจุบัน
  2. ความสำคัญ;
  3. แหล่งกำเนิด;
  4. ความจำเพาะของตัวเลือกและสุดท้ายกฎที่รู้จักกันดีของเรา:
  5. ระบุไว้หลังใด

5

AS อยู่ใน W3: W3 Cascade CSS

ลำดับที่ใช้สไตล์ชีตที่แตกต่างกันมีดังต่อไปนี้ (อ้างจากส่วนเรียงซ้อน W3):

  1. การประกาศตัวแทนผู้ใช้

  2. การประกาศปกติของผู้ใช้

  3. ผู้เขียนประกาศปกติ

  4. ผู้เขียนคำประกาศที่สำคัญ

  5. การประกาศที่สำคัญของผู้ใช้

ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในเอกสาร W3 ที่อ้างถึง


4

ลำดับที่คลาสปรากฏในองค์ประกอบ html ไม่สำคัญสิ่งที่นับคือลำดับที่บล็อกปรากฏในสไตล์ชีต

ในกรณีของคุณ.smallbox-paysummaryถูกกำหนดไว้หลังจากนั้น.smallboxความสำคัญ 10px


4
Element, Pseudo Element: d = 1  (0,0,0,1)
Class, Pseudo class, Attribute: c = 1  (0,0,1,0)
Id: b = 1  (0,1,0,0)
Inline Style: a = 1  (1,0,0,0)

Inline css (แอตทริบิวต์สไตล์ html) แทนที่กฎ css ในแท็กสไตล์และไฟล์ css

ตัวเลือกที่เฉพาะเจาะจงมากขึ้นจะมีความสำคัญเหนือกว่าตัวเลือกที่เจาะจงน้อยกว่า

กฎที่ปรากฏในภายหลังในโค้ดจะแทนที่กฎก่อนหน้านี้หากทั้งสองมีความจำเพาะเหมือนกัน


นี่เป็นคำอธิบายที่ดี: vanseodesign.com/css/css-specificity-inheritance-cascaade
akostadinov

1
@ มาฮิฉันโบกมือให้การแก้ไขที่คุณแนะนำตลอดเวลานี้ แต่ในอนาคตโปรดอย่าเพิ่มขยะในการแก้ไขเพื่อให้มันนานพอ การแก้ไขครั้งที่สองที่ "ยกเลิก" ความเสียหายของการแก้ไขครั้งแรกถือเป็นการปฏิบัติที่ไม่ดีอย่างยิ่งผู้ตรวจสอบไม่ได้ตั้งใจและสร้างผลงานเกินความจำเป็น ให้มองหาสิ่งอื่น ๆ ที่สามารถปรับปรุงได้ (เช่นการสะกดคำหรือไวยากรณ์)
Siguza

0

สิ่งสำคัญที่ควรทราบก็คือเมื่อคุณมีสองสไตล์ในองค์ประกอบ HTML ที่มีลำดับความสำคัญเท่ากันเบราว์เซอร์จะให้ความสำคัญกับสไตล์ที่เขียนลงใน DOM ล่าสุด ... ดังนั้นหากอยู่ใน DOM:

<html>
<head>
<style>.container-ext { width: 100%; }</style>
<style>.container { width: 50px; }</style>
</head>
<body>
<div class="container container-ext">Hello World</div>
</body>

... ความกว้างของ div จะเท่ากับ 50px


นี่ไม่ใช่ลำดับความสำคัญจริงๆนี่คือส่วน Cascading ของ Cascading Style Sheets
TylerH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.