Ý nghĩa của "cascading" trong CSS là gì?


90

Ý nghĩa chính xác của thuật ngữ "Cascading" trong CSS là gì? Tôi đang nhận được những quan điểm khác nhau, vì vậy tôi hỏi ở đây. Một ví dụ sẽ hữu ích.


15
Nếu bạn giống tôi, thì "Cascading" đề cập đến lượng thời gian xếp tầng mà bạn sẽ dành để điều chỉnh chiều rộng div của mình theo gia số hai pixel để mọi thứ trông "vừa phải", thay vì tập trung vào logic kinh doanh cơ bản của bạn. (Tôi có lẽ sẽ nhận được một vài tiêu cực cho câu trả lời đó, nhưng nó chỉ là quá đúng)
JohnMetta

Câu trả lời:


116

"Xếp tầng" trong ngữ cảnh này có nghĩa là vì có nhiều hơn một khai báo biểu định kiểu có thể áp dụng cho một đoạn HTML cụ thể, nên phải có một cách xác định để xác định quy tắc biểu định kiểu cụ thể nào áp dụng cho đoạn HTML.

Quy tắc được sử dụng được chọn bằng cách xếp tầng từ các khai báo chung hơn đến quy tắc cụ thể được yêu cầu. Khai báo cụ thể nhất được chọn.


khi nào thì lớp / ID và thứ tự có hiệu lực?
Daniel Springer

2
@AllDani ID cụ thể hơn các lớp. Vì vậy, tôi đoán bạn có thể nói quy tắc lớp giảm dần theo quy tắc id cụ thể hơn. Nếu 2 quy tắc có cùng mức độ ưu tiên (như 2 lớp có quy tắc xung đột trên một phần tử) thì quy tắc cuối cùng được chỉ định trong tệp css của bạn sẽ được ưu tiên.
metatron

Vì vậy, nếu ID nói "A" và lớp nói "B", thì ngay cả khi lớp ở sau đó trong trang tính, ID (A) sẽ thắng? IE Order chỉ phát huy tác dụng nếu hai kiểu có cùng tính chất cụ thể?
Daniel Springer

2
@DaniSpringer Vâng, đúng vậy. Bộ chọn id thậm chí còn là một trong những bộ chọn cụ thể nhất trong CSS. Để trình diễn, nó thậm chí sẽ "thắng" trước các bộ chọn như "div.blubb: hover". Chỉ các kiểu nội tuyến và quy tắc! Important có tính cụ thể hơn.
marvhock

54

Khi tôi dạy CSS, tôi luôn nói với các học viên rằng "các bảng kiểu xếp tầng" có nghĩa là " các bảng kiểu đánh nhau ".

Một quy tắc yêu cầu thẻ H3 của bạn có màu đỏ, quy tắc khác yêu cầu nó có màu xanh - các quy tắc này mâu thuẫn với nhau, ai sẽ thắng !? Bảng định kiểu deathmatch!

OK, có thể đó là một sự phóng đại nhẹ, nhưng nó phù hợp hơn nhiều với những người không viết mã, không lập trình, những người mới bắt đầu hơn bất kỳ khái niệm nào về dòng chảy hoặc kế thừa.

Tất nhiên, tôi đảm bảo nói với họ rằng việc các bảng định kiểu đánh nhau không thành vấn đề, đó là cách ngôn ngữ được thiết kế.


5
Không chắc tại sao điều này lại bị bỏ phiếu. Hình như một lời giải thích đơn giản cho những người mới học.
Purus

18
Có lẽ bởi vì nó không giải thích cái nào sẽ thắng, và tại sao.
Andreas

16
Bạn có vẻ bối rối về câu hỏi. Nó không phải là "tính cụ thể / kế thừa là gì", hoặc về quy tắc nào được áp dụng, v.v. mà là "phân tầng MEAN là gì?".
AmbroseChapel

5
Tôi biết đây là một bài viết cũ, nhưng vẫn còn: Tôi nghĩ ví dụ về các biểu định kiểu và / hoặc quy tắc CSS "chiến đấu" là một ví dụ tồi. Hướng dẫn nhiều hơn cho những người mới học (theo kinh nghiệm giảng dạy của riêng tôi) là giải thích thứ bậc của một quy tắc ghi đè quy tắc trước đó. Giả sử, một nhân viên sơn thẻ H3 màu đỏ (quy tắc thứ nhất), sau đó giao thẻ này cho người quản lý QA của anh ta, người đã đánh giá cao anh ta và quyết định sơn nó màu xanh lá cây (quy tắc thứ hai). Không có trận đấu tử thần, chỉ là hệ thống phân cấp của công ty. Các quy tắc CSS không "chống lại nó", chúng chạy (phân tầng) thông qua một hệ thống phân cấp được xác định nghiêm ngặt về các quyết định tiếp theo thay thế các quyết định trước đó.
Frank van Wensveen

đây là một câu trả lời thực sự tốt xin vui lòng giải thích thêm! Ai sẽ thắng bằng cách đưa ra ví dụ đơn giản! @AmbroseChapel
eirenaios

23

Håkon Wium Lie (người đồng sáng tạo CSS) định nghĩa "thác" trong luận án PHD của mình về CSS là "Quá trình kết hợp một số biểu định kiểu và giải quyết xung đột giữa chúng" https://www.wiumlie.no/2006/phd/


1
Tốt nhất cho đến nay.
Wael Assaf

Tôi đoán là vậy, bạn đã tóm tắt tất cả.
Safwat Fathi


4

Bạn phải nghĩ về nó từ bên ngoài vào trong. Nếu bạn có quy tắc nằm trên thẻ body, nó sẽ "phân tầng" qua mọi thẻ con. Nếu bạn đặt quy tắc trên bất kỳ thẻ nào bên trong nội dung, quy tắc đó sẽ áp dụng quy tắc đó, v.v. Vì vậy, quy tắc xếp tầng qua tất cả nội dung trừ khi bị gián đoạn bởi quy tắc từ thẻ được nhúng.


Điều này không ngụ ý điều gì được ưu tiên. Mơ hồ?
Daniel Springer

2

Bạn có thể coi quá trình xử lý CSS như một thác nước chứa nhiều tầng. Dưới đây là các tầng từ trên xuống dưới theo thứ tự: (Cái thấp hơn có thể ghi đè cùng một thuộc tính ở cái cao hơn.)

  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

Xem thêm trong thông số kỹ thuật

Các tầng là để chọn giá trị đúng từ nhiều nguồn gốc. Nhưng nó khác với sắp xếp . Chỉ có điều gì đó không theo thứ tự cần chúng ta sắp xếp. Nhưng trong CSS, những nguồn gốc này có quyền ưu tiên cố định. Và do đó mã giả có thể trông giống như sau:

  1. khởi tạo mảng giá trị;
  2. áp dụng các giá trị từ điểm gốc thứ nhất;
  3. áp dụng các giá trị từ điểm gốc thứ 2, ghi đè nếu giá trị tồn tại;
  4. ...
  5. áp dụng các giá trị từ điểm gốc thứ N, ghi đè nếu các giá trị tồn tại;

Từ mã giả, bạn có thể thấy nó trông giống như một thác nước gồm nhiều tầng.


2

Một sự làm rõ có thể hữu ích. Nếu bạn bao gồm hai bảng định kiểu và có một quy tắc có cùng tính cụ thể trong mỗi bảng, thì bảng đó bao gồm chiến thắng cuối cùng. IE cuối cùng trong thác có ảnh hưởng nhất.

(Đây chỉ là một biến thể của việc có hai quy tắc trong cùng một trang tính - quy tắc cuối cùng sẽ thắng nếu tất cả các quy tắc khác bằng nhau.)

Ví dụ: đã cho

body {
    background:blue;
}

body {
    background:green;
}

thì nền sẽ có màu xanh lục.


1

Câu trả lời này dành cho người mới bắt đầu tuyệt đối. Nếu bạn muốn có một cái nhìn tổng quan về câu trả lời này, vui lòng đọc câu trả lời thứ hai của tôi.

Xếp tầng là quá trình kết hợp các bảng định kiểu khác nhau và giải quyết xung đột giữa các quy tắc và khai báo CSS khác nhau khi có nhiều hơn một quy tắc áp dụng cho một phần tử nhất định . Bởi vì như bạn có thể đã biết một khai báo cho một thuộc tính kiểu nhất định như kích thước phông chữ có thể xuất hiện trong một số biểu định kiểu và cũng có thể xuất hiện nhiều lần trong một biểu định kiểu duy nhất.

Để hiểu phân tầng, bạn phải bắt đầu với giai đoạn phân tích cú pháp CSS vì trong giai đoạn phân tích cú pháp, bước đầu tiên là giải quyết các khai báo CSS xung đột và bước thứ hai là xử lý các giá trị CSS cuối cùng.

Bây giờ CSS cũng có thể đến từ các nguồn khác nhau. Cái phổ biến nhất là CSS mà các nhà phát triển chúng tôi viết. Các khai báo mà chúng tôi đặt trong các bảng định kiểu của mình được gọi là khai báo tác giả. Một nguồn khác có thể là khai báo của người dùng, là CSS đến từ người dùng. Ví dụ: khi người dùng thay đổi kích thước phông chữ mặc định trong trình duyệt thì đó là CSS của người dùng và cuối cùng nhưng không kém phần quan trọng là các khai báo trình duyệt mặc định.

Ví dụ: nếu chúng tôi đặt một thẻ liên kết trong HTML của mình cho một liên kết và sau đó không tạo kiểu cho nó, nó thường sẽ được hiển thị bằng văn bản màu xanh lam và được gạch chân, đúng không. Đó được gọi là CSS tác nhân người dùng vì nó được đặt bởi trình duyệt. Vì vậy, tầng kết hợp các khai báo CSS đến từ tất cả các nguồn khác nhau này, nhưng làm thế nào để tầng thực sự giải quyết xung đột khi nhiều hơn một quy tắc áp dụng?

Vâng, những gì nó làm là xem xét tầm quan trọng, ở tính cụ thể của bộ chọn và thứ tự nguồn của thứ tự khai báo xung đột để xác định cái nào được ưu tiên hơn và đây là cách hoạt động. Trước hết, dòng thác bắt đầu bằng cách đưa ra các khai báo xung đột có tầm quan trọng khác nhau dựa trên nơi chúng được khai báo trên nguồn của chúng. Các khai báo quan trọng nhất là các khai báo của người dùng được đánh dấu bằng từ khóa quan trọng.

Tuyên bố quan trọng thứ hai là tuyên bố tác giả được đánh dấu quan trọng. Thứ ba, khai báo tác giả bình thường, sau đó là khai báo người dùng bình thường, và cuối cùng là khai báo ít quan trọng nhất là khai báo trình duyệt mặc định, điều này thực sự có ý nghĩa rằng chúng ta có thể dễ dàng ghi đè các khai báo này theo mặc định từ trình duyệt.

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

Bây giờ, rất nhiều lần chúng ta sẽ chỉ có một loạt các quy tắc mâu thuẫn trong bảng định kiểu tác giả của chúng tôi mà không có bất kỳ từ khóa quan trọng nào. Đó thực sự là tình huống phổ biến nhất và trong trường hợp này, tất cả các khai báo đều có tầm quan trọng chính xác như nhau. Bây giờ, điều gì xảy ra trong trường hợp này? Việc phân tầng làm trong trường hợp này là tính toán và so sánh các đặc điểm cụ thể của các bộ chọn khai báo và đây là cách nó hoạt động.

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

Kiểu nội tuyến có độ đặc hiệu cao nhất, tiếp theo là ID, sau đó là lớp, lớp giả và bộ chọn thuộc tính và cuối cùng là bộ chọn phần tử và phần tử giả ít cụ thể nhất. Vì vậy, khi chúng ta có các khai báo mâu thuẫn với cùng tầm quan trọng như chúng ta đã thấy trong trang trình bày cuối cùng, chúng ta sẽ tính toán độ cụ thể của bộ chọn của chúng dựa trên các mức độ ưu tiên mà tôi vừa chỉ cho bạn, nhưng hãy xem cách chúng ta thực sự tính toán các thông số cụ thể với một ví dụ nhỏ, điều đó luôn tốt nhất, đúng không.

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

Từ ví dụ trên, tất cả các khai báo này đều có tầm quan trọng như nhau, vì chúng đều là khai báo của tác giả. Vì vậy, hãy tính toán các đặc điểm cụ thể của bộ chọn của chúng để tìm hiểu xem màu nền sẽ là xanh lam, xanh lá cây, tím hoặc vàng và đây là cách chúng tôi thực hiện. Tính cụ thể thực sự không chỉ là một con số, mà là một con số cho mỗi loại trong số bốn loại mà tôi đã cho bạn thấy trước đây. Kiểu nội tuyến, ID, lớp, phần tử giả và thuộc tính, cuối cùng là phần tử và đối với mỗi phần tử này, chúng tôi đếm số lần xuất hiện trong bộ chọn.

Vì vậy, ở đây trong bộ chọn một, tất nhiên chúng ta không có bất kỳ kiểu nội dòng nào, bởi vì một kiểu nội tuyến phải được viết trong HTML, điều này không đúng ở đây, vì vậy nó là số không. Chúng tôi cũng không có ID ở đây, vì vậy nó một lần nữa là số 0, nhưng chúng tôi có một lớp, lớp nút. Vì vậy, đối với danh mục lớp, chúng ta có một cái, và cuối cùng, không có bộ chọn phần tử nào ở đây nên không cho cái đó nữa, và thế là xong. Độ đặc hiệu của bộ chọn là không, không, một, không.

Bây giờ, bây giờ chúng ta hãy so sánh nó với những người khác. Kiểu tiếp theo cũng không phải là kiểu nội tuyến, vì vậy không cho kiểu đầu tiên. Bây giờ ở đây chúng ta thực sự có một bộ chọn ID cho ID điều hướng, phải không, vì vậy nó là một cho ID. Chúng tôi cũng có hai lớp kéo sang phải và nút, vì vậy nó là hai cho danh mục lớp và cuối cùng, cũng có hai bộ chọn phần tử ở đây. Phần tử nav và phần tử div, có nghĩa là nó cũng là hai cho danh mục phần tử. Vì vậy, cuối cùng độ đặc hiệu của bộ chọn là 0, một, hai, hai, đây thực sự là một bộ chọn rất cụ thể.

Bộ chọn số ba rất đơn giản. Nó chỉ là một bộ chọn phần tử và do đó độ đặc hiệu là không, không, không, một.

Bây giờ là cái cuối cùng, bộ chọn số bốn. Trước tiên, chúng ta có ID điều hướng, vì vậy nó là một cho ID. Tiếp theo, chúng ta có một lớp, lớp nút và cũng là một lớp giả, là lớp di chuột, làm cho nó có hai cho danh mục lớp tổng cộng. Vì cũng có một bộ chọn phần tử nên độ đặc hiệu cuối cùng là 0, một, hai, một.

Bây giờ chúng ta hãy biết cách chúng ta thực sự sử dụng những con số này để tìm ra bộ chọn nào áp dụng. Chúng tôi bắt đầu xem xét các con số từ trái sang phải bắt đầu với danh mục cụ thể nhất, các kiểu nội tuyến. Nếu có một bộ chọn với một cho các kiểu nội tuyến sẽ thắng tất cả các bộ chọn khác, vì đây là danh mục cụ thể nhất. Chà, đây không phải là trường hợp ở đây, vì vậy hãy chuyển sang ID. Chúng tôi thấy rằng các bộ chọn hai và bốn có một ở đây trong khi các bộ khác có số 0, vì vậy các bộ chọn có số 0 bị loại khỏi trò chơi vì chúng ít cụ thể hơn sau đó các bộ chọn hai và bốn là những người có ID.

Bây giờ vì cả hai bộ chọn đều có một trong danh mục ID nên chúng ta phải tiếp tục và kiểm tra các lớp. Cả hai đều có một hai trong danh mục này vẫn là một sự ràng buộc giữa chúng và cuối cùng, trong danh mục phần tử, bộ chọn hai có một hai trong khi bộ chọn bốn chỉ có một và vì vậy chúng ta có một người chiến thắng ở đây. Bộ chọn số hai là bộ chọn cụ thể nhất và vì vậy nó sẽ cung cấp cho nút của chúng ta nền màu xanh lục.

Vì vậy, chúng ta bắt đầu với một loạt các giá trị được khai báo trong trường hợp này là xanh lam, xanh lục, tím và vàng, một trong số chúng sẽ thắng và trở thành giá trị xếp tầng, trong ví dụ của chúng ta là màu xanh lá cây.

Bây giờ hãy tưởng tượng khu vực bốn cũng có hai phần tử thì cả hai bộ chọn hai và bốn sẽ có cùng độ đặc hiệu chính xác, đúng không. Vì vậy, những gì sẽ xảy ra trong trường hợp này và tôi hứa với bạn rằng nó gần như kết thúc rồi. Chà nếu vẫn còn ràng buộc tại thời điểm này thì khai báo CSS cuối cùng được viết trong mã là khai báo sẽ áp dụng. Vì vậy, một lần nữa nếu mọi thứ đều bằng nhau, nếu tất cả các bộ chọn khai báo có cùng tính cụ thể thì đó chỉ đơn giản là khai báo cuối cùng sẽ được sử dụng để tạo kiểu cho phần tử đã chọn.


0

Nó là một quá trình được sử dụng để giải quyết các xung đột trong đặc tả biểu định kiểu.

Đó là quá trình giải quyết xung đột được thực hiện theo mức độ ưu tiên được đề cập trong CSS.


0

CSS là viết tắt của Cascading Style Sheet. Theo các kiểu rất tự nhiên của chúng, một biểu định kiểu xếp tầng sẽ ghi đè các kiểu tương đương lên cao hơn (trừ khi các kiểu lên cao hơn cụ thể hơn). Do đó, chúng tôi có thể đặt các kiểu cơ sở ở đầu biểu định kiểu, áp dụng cho tất cả các phiên bản thiết kế của chúng tôi, sau đó ghi đè các phần có liên quan bằng các truy vấn phương tiện được thêm vào trong tài liệu.


0

Cascading có nghĩa là đổ xuống theo từng bước hoặc thêm vào các bước. Biểu định kiểu chứa các mã để tạo kiểu một phần tử html. Và cách thức mà các mã được viết trong bảng định kiểu là theo kiểu xếp tầng. Hoặc đơn giản hơn, quay lại các mã trong các lớp cho mỗi phần tử html của một trang html trong bảng định kiểu tạo ra biểu định kiểu xếp tầng.


0

Cascading là một thuật toán chỉ định trọng số cho mỗi quy tắc kiểu. Khi áp dụng một số quy tắc, quy tắc nào có trọng số lớn nhất sẽ được ưu tiên.


0

Khi một hoặc nhiều kiểu được áp dụng cho cùng một phần tử .CSS thực hiện một tập hợp các quy tắc được gọi là xếp tầng để đánh giá độ mạnh của Tính cụ thể của hai kiểu được áp dụng và xác định người chiến thắng, tức là quy tắc kiểu có nhiều trọng số hơn sẽ thắng. Nếu hai quy tắc có cùng trọng lượng thì quy tắc được áp dụng cuối cùng sẽ thắng.


0

Phân tầng và tính cụ thể những gì bạn cần biết:

  1. Khai báo CSS được đánh dấu bằng! Important có mức ưu tiên cao nhất.

  2. Nhưng chỉ sử dụng! Quan trọng như một nguồn lực cuối cùng. Tốt hơn là sử dụng các thông số kỹ thuật chính xác- mã dễ bảo trì hơn!

  3. Các kiểu nội tuyến sẽ luôn được ưu tiên hơn các kiểu trong bảng định kiểu bên ngoài.

  4. Một bộ chọn chứa 1 ID cụ thể hơn một bộ chọn có 1000 lớp.

  5. Bộ chọn chứa 1 lớp cụ thể hơn là bộ chọn có 1000 phần tử.

  6. Bộ chọn phổ quát * không có giá trị cụ thể (0,0,0)

  7. Dựa nhiều hơn vào tính cụ thể hơn là thứ tự của các bộ chọn.

  8. Nhưng hãy dựa vào thứ tự khi sử dụng bảng định kiểu của bên thứ ba-luôn đặt bảng định kiểu tác giả của bạn sau cùng.


0

Khi chọn kiểu CSS nào để áp dụng cho một phần tử HTML, tính cụ thể sẽ ghi đè tính tổng quát theo một bộ quy tắc xếp tầng giải quyết xung đột giữa các kiểu:

  1. Nếu không có CSS, HTML sẽ được hiển thị theo các kiểu mặc định của trình duyệt.
  2. Công cụ chọn thẻ CSS (khớp với thẻ HTML) ghi đè các giá trị mặc định của trình duyệt.
  3. Bộ chọn lớp CSS (với.) Ghi đè các tham chiếu thẻ.
  4. Bộ chọn CSS ID (có #) ghi đè các tham chiếu lớp.
  5. CSS nội tuyến được mã hóa thành thẻ HTML ghi đè ID, lớp và thẻ CSS.
  6. Việc thêm giá trị ! Important vào kiểu CSS sẽ ghi đè mọi thứ khác.
  7. Nếu các bộ chọn CSS giống hệt nhau, trình duyệt sẽ kết hợp các thuộc tính của chúng. Nếu các thuộc tính CSS dẫn đến xung đột, trình duyệt sẽ chọn giá trị thuộc tính xuất hiện sau hoặc gần đây nhất trong mã.

Bộ chọn CSS phù hợp với tổ hợp thẻ, lớp và / hoặc ID cụ thể hơn sẽ được ưu tiên. Trong số các ví dụ sau, ví dụ đầu tiên sẽ được ưu tiên hơn ví dụ thứ hai, bất kể thứ tự xuất hiện của chúng trong CSS:

ol#identity li.firstname { color: red; }
#identity .firstname { color: blue; }

-2
CSS doc    
p{font-size: 12pt;}
p{font-size: 14pt;}

<p>My Headline<p>

sẽ hiển thị phông chữ p ở 14pt vì nó "gần" hơn với phần tử thực tế (các biểu định kiểu bên ngoài tải từ đầu tệp xuống cuối tệp). Nếu bạn sử dụng biểu định kiểu được liên kết và sau đó đưa một số CSS vào phần đầu của tài liệu sau khi liên kết với tài liệu CSS bên ngoài, thì khai báo "in head" sẽ thắng vì nó thậm chí còn gần với phần tử được xác định hơn. Điều này chỉ đúng với các bộ chọn có trọng số bằng nhau. Xem http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html để biết mô tả tốt về trọng lượng của một bộ chọn nhất định.

Tất cả những gì đã nói, bạn cũng có thể coi 'thừa kế' là một phần của dòng thác - cho tất cả các mục đích thực tế. Mọi thứ "đổ" xuống từ các phần tử chứa.


Điều này ngụ ý rằng các kiểu đặt giữa vật chất, ngay cả khi không hướng đến phần tử đã cho. Điều đó không chính xác, nếu tôi làm theo.
Daniel Springer

Có vẻ như điều này đã được chỉnh sửa. Trong mọi trường hợp, tôi không hiểu điều này trả lời câu hỏi như thế nào.
Daniel Springer
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.