Thứ tự ưu tiên cho CSS là gì?


109

Tôi đang cố gắng tìm ra lý do tại sao một trong các lớp css của tôi dường như ghi đè lên lớp kia (chứ không phải ngược lại)

Ở đây tôi có hai lớp 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;
}

và theo quan điểm của tôi, tôi gọi

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

Phông chữ (Phần tử chồng chéo) hiển thị là 10px thay vì 20 - ai đó có thể giải thích tại sao lại như vậy không?


2
Bạn có đang sử dụng bộ xử lý trước CSS không? Tôi thấy bạn có cái đó @extend .smallbox;, trông giống như cSS không chuẩn.
Jared Farrish

Bạn thực sự không nên kết hợp @extend- nếu nó đúng như tôi nghĩ - và sử dụng cả hai bộ chọn trên cùng một phần tử.
millimoose

SMACSS dường như khuyên để chỉ bao gồm các thuộc tính thay đổi trong một "lớp" (ví dụ .smallbox-paysummary), và tùy chọn thực hiện việc kê khai CSS rõ hơn cụ thể (mà không dựa vào thứ tự xuất hiện trong file CSS) bằng cách sử dụng.smallbox.smallbox-paysummary { font-size: 10px; }
millimoose

1
Và nếu bạn KHÔNG muốn .smallbox-paysummarycó phông chữ nhỏ hơn, tại sao bạn lại làm cho nó nhỏ hơn ngay từ đầu?
millimoose

Bây giờ tôi đang tự hỏi tại sao nếu cả hai quy tắc có cùng tính cụ thể thì quy tắc được khai báo sau trên thuộc tính lớp của phần tử lại không được ưu tiên, bất kể thứ tự của các quy tắc CSS.
Andy

Câu trả lời:


186

Có một số quy tắc (áp dụng theo thứ tự này):

  1. css nội tuyến (thuộc tính kiểu html) ghi đè các quy tắc css trong thẻ kiểu và tệp css
  2. một bộ chọn cụ thể hơn được ưu tiên hơn một bộ chọn ít cụ thể hơn
  3. các quy tắc xuất hiện sau trong mã sẽ ghi đè các quy tắc trước đó nếu cả hai đều có cùng tính cụ thể.
  4. Quy tắc css với !importantluôn được ưu tiên.

Trong trường hợp của bạn, quy tắc 3 của nó được áp dụng.

Tính cụ thể cho các bộ chọn đơn từ cao nhất đến thấp nhất:

  • id (ví dụ: #mainselect <div id="main">)
  • lớp (ví dụ .myclass:), bộ chọn thuộc tính (ví dụ [href=^https:]:) và lớp giả (ví dụ :hover:)
  • phần tử (ví dụ div:) và phần tử giả (ví dụ ::before:)

Để so sánh tính đặc hiệu của hai bộ chọn kết hợp, hãy so sánh số lần xuất hiện của các bộ chọn đơn của mỗi nhóm tính cụ thể ở trên.

Ví dụ: so sánh #nav ul li a:hovervới#nav ul li.active a::after

  • đếm số bộ chọn id: có một bộ chọn cho mỗi ( #nav)
  • đếm số bộ chọn lớp: có một bộ cho mỗi ( :hover.active)
  • đếm số bộ chọn phần tử: có 3 ( ul li a) cho bộ đầu tiên và 4 cho bộ chọn thứ hai ( ul li a ::after), do đó bộ chọn kết hợp thứ hai cụ thể hơn.

Một bài báo hay về tính cụ thể của bộ chọn css .


Làm thế nào để tính cụ thể ghi đè các khai báo kiểu nội tuyến?
Jared Farrish

3
"... quy tắc css trong thẻ kiểu ... ghi đè quy tắc trong tệp css". Tôi đã thấy huyền thoại này một vài lần gần đây. Tôi không biết nó đến từ đâu, nhưng nó vô nghĩa.
Alohci

@jared Tôi đã hoán đổi hai điểm đầu tiên. Có phải đây là ý bạn?
Lorenz Meyer

Vâng, đó là những gì tôi muốn nói.
Jared Farrish

2
@PakiPat :hoverkhông phải là một bộ chọn lớp , mà là một bộ chọn lớp giả .
Lorenz Meyer

30

Dưới đây là tổng hợp thứ tự tạo kiểu CSS trong một sơ đồ, trên đó các quy tắc CSS có mức độ ưu tiên cao hơn và được ưu tiên hơn phần còn lại: Thứ tự tạo kiểu CSS

Tuyên bố từ chối trách nhiệm : Nhóm của tôi và tôi đã cùng nhau thực hiện phần này bằng một bài đăng trên blog ( https://vecta.io/blog/definitive-guide-to-css-styling-order ) mà tôi nghĩ sẽ hữu ích cho tất cả front-end các nhà phát triển.


3
Sơ đồ đó cần một tư duy đặc biệt. Đối với tôi, khó hiểu được sơ đồ đó hơn là kế thừa phong cách.
Lorenz Meyer

10

Những gì chúng ta đang xem ở đây được gọi là tính cụ thể như Mozilla đã nêu :

Tính cụ thể là phương tiện mà trình duyệt quyết định giá trị thuộc tính CSS nào phù hợp nhất với một phần tử và do đó, sẽ được áp dụng. Tính cụ thể dựa trên các quy tắc đối sánh bao gồm các loại bộ chọn CSS khác nhau.

Tính cụ thể là trọng số được áp dụng cho một khai báo CSS nhất định, được xác định bởi số lượng của từng loại bộ chọn trong bộ chọn phù hợp. Khi nhiều khai báo có tính cụ thể như nhau, khai báo cuối cùng được tìm thấy trong CSS sẽ được áp dụng cho phần tử. Tính cụ thể chỉ áp dụng khi cùng một phần tử được nhắm mục tiêu bởi nhiều khai báo. Theo quy tắc CSS, các phần tử được nhắm mục tiêu trực tiếp sẽ luôn được ưu tiên hơn các quy tắc mà một phần tử kế thừa từ tổ tiên của nó.

Tôi thích lời giải thích 0-0-0 tại https://specifishity.com :

nhập mô tả hình ảnh ở đây

Khá mô tả bức tranh của !importantchỉ thị! Nhưng đôi khi đó là cách duy nhất để ghi đè stylethuộc tính nội tuyến . Vì vậy, cách tốt nhất là cố gắng tránh cả hai.


1
thông minh. Chỉ cần những gì tôi đang tìm kiếm. Đồ họa này là tuyệt vời lol.
saran3h

7

Trước hết, dựa trên @extendchỉ thị của bạn , có vẻ như bạn không sử dụng CSS thuần túy, mà là một bộ xử lý trước như SASS os Stylus.

Bây giờ, khi chúng ta nói về "thứ tự ưu tiên" trong CSS, có một quy tắc chung liên quan: bất kỳ quy tắc nào được đặt sau các quy tắc khác (theo kiểu từ trên xuống) đều được áp dụng. Trong trường hợp của bạn, chỉ cần chỉ định .smallboxsau.smallbox-paysummary bạn sẽ có thể thay đổi mức độ ưu tiên của các quy tắc của mình.

Tuy nhiên, nếu bạn muốn đi xa hơn một chút, tôi đề xuất bài đọc này: Đặc tả W3C xếp tầng CSS . Bạn sẽ thấy rằng mức độ ưu tiên của một quy tắc dựa trên:

  1. Loại phương tiện hiện tại;
  2. Tầm quan trọng;
  3. Gốc;
  4. Tính cụ thể của bộ chọn và cuối cùng là quy tắc nổi tiếng của chúng tôi:
  5. Cái nào sau này được chỉ định.

5

AS là trạng thái trong W3: W3 Cascade CSS

orden mà bảng kiểu khác nhau được áp dụng như sau (trích dẫn từ phần xếp tầng W3):

  1. khai báo tác nhân người dùng

  2. khai báo bình thường của người dùng

  3. tác giả tuyên bố bình thường

  4. tác giả những tuyên bố quan trọng

  5. khai báo quan trọng của người dùng

Thông tin thêm về điều này trong tài liệu W3 được giới thiệu


4

Thứ tự mà các lớp xuất hiện trong phần tử html không quan trọng, số lượng là thứ tự mà các khối xuất hiện trong biểu định kiểu.

Trong trường hợp của bạn .smallbox-paysummaryđược xác định sau .smallboxdo đó ưu tiên 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)

Css nội tuyến (thuộc tính kiểu html) ghi đè các quy tắc css trong thẻ kiểu và tệp css

Bộ chọn cụ thể hơn được ưu tiên hơn bộ chọn ít cụ thể hơn.

Các quy tắc xuất hiện sau trong mã sẽ ghi đè các quy tắc trước đó nếu cả hai đều có cùng tính cụ thể.



1
@Mahi Tôi đã tán thành bản chỉnh sửa được đề xuất của bạn trong thời gian này, nhưng trong tương lai, vui lòng không thêm rác vào bản chỉnh sửa chỉ để làm cho nó đủ dài. Việc có bản chỉnh sửa thứ hai "hoàn tác" thiệt hại của lần chỉnh sửa đầu tiên là một thực tiễn rất tồi, rất không nhạy cảm đối với người đánh giá và tạo ra nhiều công việc hơn mức cần thiết. Thay vào đó, chỉ cần tìm kiếm những thứ khác có thể được cải thiện (chẳng hạn như chính tả hoặc ngữ pháp).
Siguza

0

Cũng cần lưu ý rằng khi bạn có hai kiểu trên một phần tử HTML với mức độ ưu tiên ngang nhau, trình duyệt sẽ ưu tiên những kiểu được ghi vào DOM sau cùng ... vì vậy nếu trong 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>

... chiều rộng của div sẽ là 50px


Đây không thực sự là ưu tiên, đây là phần Xếp tầng của Trang tính kiểu xếp tầng.
TylerH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.