Trình tự Css của ứng dụng quy tắc. Ưu tiên kiểu dáng trong CSS

Chương này giải thích chi tiết tại sao bảng xếp tầng các kiểu (Cascading Style Sheets, CSS) được gọi là xếp tầng. Trước tiên, hãy nhớ cách bạn có thể thêm kiểu vào một trang web:

  • kết nối một bảng định kiểu bên ngoài;
  • thêm biểu định kiểu nội bộ vào tài liệu HTML thông qua thẻ. Kết quả là màu sắc của thẻ

    Nó sẽ có màu đỏ.

    Đây là một cách để kiểm soát tầm quan trọng của phong cách. Một cách khác để tăng mức độ ưu tiên là tăng trọng lượng của bộ chọn một cách cụ thể, chẳng hạn bằng cách thêm ID hoặc lớp vào nó.

    Thông báo!quan trọng

    Nếu bạn gặp phải khẩn cấp và bạn cần tăng tầm quan trọng của một thuộc tính, bạn có thể thêm một khai báo!important vào nó:

    P (màu: đỏ !quan trọng;) p (màu: xanh lá cây;)

    Ngoài ra!quan trọng sẽ ghi đè các kiểu nội tuyến. Nhiều nhà phát triển không khuyến khích việc sử dụng!important quá thường xuyên. Hầu hết, thông báo này Theo thông lệ, chỉ sử dụng nó khi xung đột về phong cách không thể khắc phục được bằng các biện pháp khác.

    Đặt lại kiểu bằng reset.css

    Trong chương trước, chúng tôi đã đề cập rằng mỗi trình duyệt đều có các kiểu tài liệu HTML tích hợp riêng được thiết kế để cải thiện khả năng đọc. Có thể bạn đã từng thấy một trang web trần trụi trông như thế nào trong trình duyệt: các liên kết được gạch chân màu xanh lam, phông chữ màu đen, tiêu đề in đậm, v.v.

    Mỗi trình duyệt có sự khác biệt riêng về kiểu dáng tích hợp: ví dụ: IE không có thụt lề từ cạnh trên của cửa sổ, nhưng Firefox thì có. Có rất nhiều sự khác biệt như vậy. Để chúng không ảnh hưởng đến khả năng tương thích giữa các trình duyệt khi viết phong cách riêng CSS, bạn có thể sử dụng phương pháp đặt lại kiểu nội tuyến.

    Công cụ đặt lại kiểu về cơ bản là cùng một bảng CSS mô tả các quy tắc đặt lại kiểu tích hợp của trình duyệt bằng cách đặt giá trị cơ bản của cải. Bảng này được gọi là reset.css và được sử dụng để bạn có thể bắt đầu tạo kiểu từ đầu. Đây là một ví dụ bảng tiêu chuẩn cài lại:

    Html, nội dung, div, span, applet, đối tượng, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, từ viết tắt, địa chỉ, lớn, trích dẫn, mã, del, dfn, em, img, ins, kbd, q, s, samp, nhỏ, đình công, mạnh mẽ, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, hình thức, nhãn, chú giải, bàn, Chú thích, tbody, tfoot, thead, tr, th, td, bài báo, sang một bên, Tranh sơn dầu, chi tiết, Nhúng, nhân vật, Figcaption, Chân trang, Tiêu đề, hgroup, menu, Nav, Đầu ra, Ruby, phần, tóm tắt, thời gian, dấu, âm thanh, video ( lề: 0; đệm: 0; viền: 0; cỡ chữ: 100%; phông chữ: kế thừa; căn chỉnh dọc: đường cơ sở; ) /* Đặt lại vai trò hiển thị HTML5 cho các trình duyệt cũ hơn */ bài viết, sang một bên, chi tiết, figcaption, hình, chân trang, tiêu đề, hgroup, menu, điều hướng, phần ( display: block; ) body ( line-height: 1; ) ol, ul ( list-style: none; ) blockquote, q ( dấu ngoặc kép: không có; ) blockquote:trước, blockquote:after, q:trước, q:after ( nội dung: ""; nội dung: không có; ) bảng ( border-collapse: thu gọn; khoảng cách đường viền: 0; )

    Bất kỳ chuyên gia nào trong lĩnh vực của mình đều phải thông thạo thuật ngữ. Nếu bạn đang tham gia vào việc bố cục, bạn có thể trả lời câu hỏi ở tiêu đề bài viết mà không ngần ngại không?

    Có lẽ bây giờ bạn sẽ khám phá được điều gì đó mới mẻ. Hãy thực hiện một bước quyết định hướng tới sự chuyên nghiệp :)

    Di sản

    Hãy bắt đầu với khái niệm dễ hiểu nhất, CSS. Bản chất của nó là các kiểu được gán cho một phần tử nhất định được kế thừa tất cả phần tử con (phần tử lồng nhau) trừ khi chúng được ghi đè rõ ràng. Ví dụ: kích thước phông chữ và màu sắc chỉ cần được áp dụng cho phần mô tả nội dung để tất cả các phần tử bên trong đều có thuộc tính giống nhau. Tuy nhiên, đối với các tiêu đề h1-h6, kích thước phông chữ sẽ không được chỉ định vì trình duyệt có biểu định kiểu mặc định riêng cho chúng và các kiểu kế thừa có mức ưu tiên thấp nhất. Tình trạng tương tự với màu sắc của các liên kết.

    Vì vậy, sự kế thừa cho phép bạn giảm bớt bảng CSS. Nhưng đồng thời, nếu có nhiều kiểu thì theo dõi xem kiểu nào phần tử cha thiết lập một số thuộc tính, nó trở nên khá phức tạp.

    Xếp tầng

    Quy tắc xếp tầng cho phép bạn giải quyết các tình huống khi một số kiểu được chỉ định cho một phần tử. Xếp tầng dựa trên việc chỉ định mức độ ưu tiên nhất định cho từng quy tắc. Các biểu định kiểu của tác giả có mức độ ưu tiên cao nhất, các biểu định kiểu tùy chỉnh có mức ưu tiên thấp nhất và các biểu định kiểu mặc định của trình duyệt có mức ưu tiên thấp nhất. Người dùng có khả năng ghi đè quy tắc của tác giả bằng cách thêm cờ!important vào quy tắc của mình.

    Các quy tắc xếp tầng xác định các mức độ ưu tiên sau:

    1. phong cách tùy chỉnh được đánh dấu! quan trọng
    2. phong cách của tác giả được đánh dấu!quan trọng
    3. phong cách của tác giả
    4. phong cách tùy chỉnh
    5. kiểu mặc định

    Sau khi xếp tầng, các quy tắc được sắp xếp dựa trên tính đặc hiệu của bộ chọn.

    Tính đặc hiệu

    Tính đặc hiệu là một con số trong hệ thống có cơ số cao vô hạn, phản ánh mức độ ưu tiên của một quy tắc. Nó được tính toán dựa trên tính đặc hiệu mỗi bộ chọn có trong quy tắc CSS.

    Độ đặc hiệu của selector được chia thành 4 nhóm - a b c d:

    • nếu kiểu là nội tuyến, tức là được định nghĩa là style="", thì a=1
    • giá trị của b bằng số lượng bộ chọn id
    • giá trị của c bằng số lượng lớp, lớp giả và bộ chọn thuộc tính
    • giá trị của d bằng với số lượng bộ chọn loại

    Ví dụ để tính độ đặc hiệu:

    Bộ chọn Tính đặc hiệu Tính đặc thù trong hệ thống
    với cơ sở 10
    Phong cách="" 1,0,0,0 1000
    #wrapper #content() 0,2,0,0 200
    #content.datePosted() 0,1,1,0 110
    div#nội dung() 0,1,0,1 101
    #nội dung() 0,1,0,0 100
    p.comment.datePosted() 0,0,2,1 21
    p.bình luận() 0,0,1,1 11
    div p() 0,0,0,2 2
    P() 0,0,0,1 1

    Cơ số cao vô hạn của hệ thống số là hệ quả của việc người ta không biết trước các số a, b, c, d sẽ lớn đến mức nào. Nếu chúng nhỏ hơn 10 thì sử dụng SS thập phân sẽ thuận tiện hơn.

    Gần hai giờ sáng, không ít câu hỏi muôn thuở ập đến với những suy nghĩ về cái vĩnh hằng - “ý nghĩa của cuộc sống là gì?”, “Tại sao một người lại ngủ?” hoặc "Tại sao #%^$ này không hoạt động?" và càng gần sáng, câu hỏi cuối cùng này càng bắt đầu khiến tôi lo lắng.

    Dưới đây tôi sẽ nói về lý do tại sao các bộ chọn css chết tiệt đôi khi không hoạt động theo cách chúng ta cho là đúng và về cách chúng thực sự nên hoạt động.

    Chương một - đi thẳng nhé!

    Bộ chọn được tính trọng số để xác định kiểu nào sẽ được áp dụng khi nhiều bộ chọn bằng cách nào đó trỏ đến cùng một phần tử và cố gắng thay đổi cùng một kiểu. Ai nặng hơn thì có phong cách, và quy luật cân đơn giản hơn hàng nghìn lần so với những quy luật có vẻ thuần túy thực nghiệm.

    Vì vậy, hãy cân nó - trước tiên hãy tưởng tượng một cặp hàng 8 số:

    0,1,0,0,0,0,0,0
    1,0,0,0,0,0,0,0

    Làm quen - đây là cách một số hai bộ chọn nhìn vào các con số, để không ai đoán được gì, tôi sẽ gọi chúng theo cách thông thường là “trên” và “dưới”

    Để biết cái nào nặng hơn, bạn cần làm những hành động sau và đừng nhầm lẫn bất cứ điều gì:

    1. Chúng tôi nhìn vào những con số ngoài cùng bên trái
    2. Hãy chọn hầu hết trong số họ. - bộ chọn này sẽ nặng nhất
    3. Nếu các số giống nhau, hãy di chuyển một số sang phải và lặp lại hướng dẫn từ bước 2.
    4. Nếu tất cả các số đều giống nhau thì các kiểu từ bộ chọn được khai báo lần cuối sẽ được áp dụng

    Bí mật tồi tệ nhất

    Nếu bạn đọc được điều này, sự bình yên trong tâm hồn sẽ mãi mãi rời xa bạn, nhưng ít nhất bạn sẽ có thể ngủ vào ban đêm.

    Tiết lộ bí mật tồi tệ nhất, tôi sẽ cho bạn biết làm thế nào để thực sự biến một bộ chọn thông thường thành những con số rõ ràng và đẹp mắt như vậy? Mọi thứ luôn rất đơn giản:

    1. ThẻĐối với mỗi thẻ trong bộ chọn, bạn có thể thêm một thẻ vào số ngoài cùng bên phải:

      A là 0,0,0,0,0,0,0,1 div a là 0,0,0,0,0,0,0,2

    2. Các lớp học, đối với mỗi lớp hoặc lớp giả trong bộ chọn, bạn có thể thêm một vào số thứ hai từ bên phải

      Head .logo là 0,0,0,0,0,0,2,0 .logo.big là 0,0,0,0,0,0,2,0 div:con đầu lòng là 0,0, 0 ,0,0,0,1,1 .logog > .big – và đây cũng là 0,0,0,0,0,0,2,0
      Vâng, bạn đã hiểu mọi thứ một cách chính xác. Bộ chọn CSS không quan tâm đến tất cả những thứ ưa thích của bạn như dấu cách hoặc “>”.

    3. Cho mọi NHẬN DẠNG trong bộ chọn, thêm một vào số thứ ba từ bên phải.

      #đầu là 0,0,0,0,0,1,0,0 #đầu #logo cũng là 0,0,0,0,0,2,0,0

    Tôi nghĩ bạn đã hiểu rồi, bây giờ bạn có thể làm một bài kiểm tra nhỏ để kiểm tra:

    Đố


    Câu hỏi: Nền của đoạn văn sẽ có màu gì?
    Trả lời:Đúng vậy, màu đỏ, bởi vì bộ chọn không quan tâm đến những gì bạn nghĩ ở đó và nó không quan tâm đến khoảng cách giữa các thẻ. Và vì trọng lượng của các thẻ bằng nhau nên thẻ cuối cùng sẽ được áp dụng.

    ?

    Câu hỏi: Nền của div của chúng ta sẽ có màu gì?
    Trả lời:Đúng rồi, màu đỏ, vì khi đo sâu trọng lượng, bạn vẫn đặt khoảng cách giữa các lớp, dấu lớn hơn hoặc viết sát nhau. Trọng số của tất cả các bộ chọn này là như nhau, có nghĩa là bộ chọn cuối cùng sẽ được sử dụng.

    ?

    Câu hỏi: Tất cả đều giống nhau.
    Trả lời: Và câu trả lời cho một sự thay đổi là khác: diva của chúng ta sẽ có màu xám. Bởi vì, như tôi đã đề cập ở trên, bộ chọn hoàn toàn không quan tâm đến ý của bạn ở đó. Bộ chọn đầu tiên có trọng số cao hơn và không ai quan tâm rằng đây có thể không phải là hành vi mà bạn mong đợi.

    Chúng tôi tiếp tục tiết lộ bí mật

    Chúng tôi vẫn còn rất nhiều con số và có lẽ chúng tôi thực sự muốn tìm hiểu ý nghĩa của chúng - chúng tôi tiếp tục tiết lộ bí mật.
    1. Bộ chọn * hoàn toàn không trọng lượng, nghĩa là hoàn toàn.
    2. Bộ chọn thuộc tínhđây là lớp giả phổ biến nhất và nó có trọng lượng tương đương với các lớp thông thường
    3. Bất kỳ kiểu nội tuyến nàođược viết bằng thuộc tính style=”” của một phần tử sẽ tự động được ưu tiên 0,0,0,0,1,0,0,0 , điều này ngay lập tức khiến anh ấy trở nên rất ngầu.
    4. Và bốn chữ số tiếp theo đều là bạn cũ của chúng ta chỉ với thuộc tính !quan trọng

      Div ( Background-color: grey !important; ) Có trọng số khi xác định thuộc tính Background-color - 0,0,0,1,0,0,0,0 .header ( Background-color: grey !important; ) 0, 0 ,1,0,0,0,0,0

    Tất cả chúng ta đều yêu thích các câu đố

    ?

Câu hỏi: Dấu chấm hỏi trong liên kết sẽ có màu gì?
Trả lời: Màu đỏ, bất kể bộ chọn đang bật kết hợp chuẩn xác thuộc tính trông cụ thể hơn một bộ chọn chọn mọi thứ “bắt đầu bằng”. Chúng có cùng trọng lượng.

?

Câu hỏi: Câu hỏi được cấp bằng sáng chế ban đầu của tôi.
Trả lời:!quan trọng là điều thú vị nhất, thậm chí còn thú vị hơn cả kiểu nội tuyến - vì vậy bam-bam-bam - màu xám!

Nguồn của tất cả các bài kiểm tra được đặt

Ở những dự án lớn khi phát triển CSS tập tin, tình hình không được vui cho lắm. Bởi vì số lượng lớn quy tắc, việc xác định kiểu nào sẽ được áp dụng cho một phần tử cụ thể sẽ trở nên khó khăn. Một số kiểu được kế thừa, một số kiểu khác được xác định thông qua toàn bộ chuỗi các bộ chọn khác nhau và được sử dụng ở đâu đó .lớp học, một vài nơi #nhận dạng, và ở đâu đó nói chung kiểu nội tuyến.

Để thay đổi kiểu cho một phần tử, chúng ta phải thử nghiệm với các trọng số của bộ chọn. Để làm cho công việc của chúng tôi dễ dàng hơn, chúng tôi có thể làm theo một số nguyên tắc:

  1. Không bao giờ sử dụng NHẬN DẠNG bộ chọn trong CSS. Họ không có lợi thế hơn lớp học.
    • Mọi thứ bạn có thể làm với NHẬN DẠNG, có thể được thực hiện với lớp học.
    • NHẬN DẠNG không thể tái sử dụng được.
    • Cân nặng NHẬN DẠNG rất lớn. Ngắt NHẬN DẠNG thậm chí không có một trăm dây chuyền các lớp học.
  2. Đừng tạo các bộ chọn không cần thiết. Nếu như .header-nav() hoạt động tốt, sau đó không sử dụng định nghĩa .header .header-nav(). Trong trường hợp này, sẽ không có gì thay đổi và sẽ không có lợi ích gì từ nó.
  3. Đừng tạo các bộ chọn cụ thể cho đến khi bạn thực sự cần. Nếu như .nav() có tác dụng thì đừng dùng ul.nav(). Ký hiệu như vậy sẽ chỉ làm giảm các trường hợp sử dụng của lớp này .nav và cũng sẽ làm tăng trọng lượng của bộ chọn mà không mang lại lợi ích rõ ràng.
  4. Buộc bản thân phải sử dụng .lớp học, bởi vì đây là những bộ chọn lý tưởng.

Không bao giờ sử dụng bộ chọn nặng hơn mức cần thiết.

Tất cả đều rất quy tắc đơn giản và theo dõi họ không quá khó khăn.

giảm trọng lượng ID

Giả sử bạn có một tiện ích trên trang của mình và bạn muốn tạo kiểu cho nó:

...

Và, ví dụ, chúng ta không thể thay đổi HTML mã widget để loại bỏ NHẬN DẠNG. Vì vậy, chúng tôi làm điều này:

#tiện ích ( ... )

Kết quả là chúng ta có định nghĩa cho NHẬN DẠNG V. CSS tập tin, điều này không tốt chút nào. Thay vào đó chúng ta có thể làm như sau:

{ ... }

Đây là một bộ chọn thuộc tính. TRONG trong trường hợp nàyđây không còn là một định nghĩa cho NHẬN DẠNG, và cho phần tử. Nói chính xác hơn, bộ chọn đang nói: “Này, hãy tìm cho tôi một phần tử có thuộc tính nhận dạng có ý nghĩa tiện ích».

Cái hay của phương pháp này là chúng ta đã giảm được trọng lượng NHẬN DẠNG lên đến trọng lượng lớp. Nhưng đây là một hack.

Tăng cân an toàn

Chúng ta có thể tăng trọng số của bộ chọn như thế này:

Btn.btn.btn.btn ( ... )

Nhưng tôi hy vọng rằng tôi sẽ không bao giờ phải sử dụng cách ghi âm như vậy trong các dự án.

Ở đây chúng ta thấy rằng màu được chỉ định trong .box a(), ghi đè màu của văn bản nút. Kết quả là văn bản sẽ hợp nhất với nền của nút.

Tất nhiên chúng ta có thể khắc phục điều này nếu chúng ta đặt !quan trọng(jsfiddle.net/csswizardry/3N53n/1) nhưng không, cảm ơn, hãy loại bỏ điều đó!

Chúng ta có thể thêm một bộ chọn bổ sung vào phần .btn()(dòng 23) jsfiddle.net/csswizardry/3N53n/2 , nhưng đây không phải là nhiều nhất Quyết định tốt nhất. Điều gì sẽ xảy ra nếu vấn đề với nút không chỉ .hộp, và bất cứ nơi nào khác? Thêm một bộ chọn mới mỗi lần là một lựa chọn tồi.

Vì vậy chúng tôi sẽ nhân đôi .btn.btn: http://jsfiddle.net/csswizardry/3N53n/3

Đây cũng không phải là giải pháp tốt nhất, nhưng chúng tôi vẫn tăng trọng lượng của bộ chọn và màu sắc trên nút bây giờ vẫn như cũ.

Bây giờ chúng ta đã biết 2 cách để thay đổi trọng số của bộ chọn, nhưng hãy nhớ rằng đây vẫn là những cách hack và bạn không nên quá lo lắng về chúng.

Một phần tử HTML có thể là mục tiêu một số quy tắc CSS. Hãy sử dụng một đoạn văn đơn giản làm ví dụ:

Chúng ta có thể thay đổi đoạn này đơn giản bằng cách sử dụng tên thẻ:

P (màu: xanh; )

Hoặc chúng ta có thể sử dụng tên lớp:

Tin nhắn (màu: xanh; )

Hoặc chúng ta có thể sử dụng định danh:

#giới thiệu (màu: đỏ; )

Vì trình duyệt chỉ có thể chọn một màu và áp dụng nó cho đoạn văn đó, sau đó nó sẽ quyết định quy tắc CSS nào có một ưu tiên hơn người khác. Điều này được gọi là mức độ ưu tiên trong CSS (hoặc tính đặc hiệu).

Trong ví dụ của chúng tôi, đoạn văn sẽ là màu đỏ, bởi vì định danh hơn cụ thể và do đó nhiều hơn nữa quan trọng hơn các bộ chọn khác.

Thứ tự các quy tắc CSS

Nếu bạn có các bộ chọn giống hệt nhau trong CSS thì bộ chọn cuối cùng sẽ được ưu tiên.

P ( color: green; ) p ( color: red; ) /* Đoạn văn sẽ có màu đỏ */

Phép tính 100

Chỉ có một đường tắt tìm hiểu mức độ "mạnh" của quy tắc CSS bằng cách tính toán độ đặc hiệu bộ chọn:

  • số nhận dạng giá 100;
  • các lớp học giá 10;
  • bộ chọn nhãn chi phí 1.

Người chọn có "điểm" cao nhất sẽ thắng thế, bất kể thứ tự xuất hiện của các quy tắc CSS.

#introduction ( color: red; ) .message ( color: green; ) p ( color: blue; )

MarkSheet là hướng dẫn miễn phí về HTML và CSS.

Quy tắc #introduction ( color: red; ) cao hơn cụ thể hơn những người khác vì số nhận dạng phải độc nhất xuyên suốt toàn bộ trang web, vì vậy chỉ có thể có một phần tử mục tiêu.

Thông báo ( color: green; ) sẽ nhắm mục tiêu bất kì Một phần tử HTML có thuộc tính class="message" và do đó ít cụ thể hơn. Điều tương tự cũng áp dụng cho p ( color: blue; ), có thể dành cho bất kìđoạn văn.

Làm thế nào để tránh xung đột

Trong khi viết CSS, vấn đề có thể dễ dàng phát sinh. quy tắc mâu thuẫn, trong đó cùng một thuộc tính được áp dụng nhiều lần.

Để tránh điều này:

  • chỉ sử dụng các lớp học: Sử dụng .introduction thay vì #introduction ngay cả khi phần tử này chỉ xuất hiện một lần trên trang web của bạn;
  • tránh sử dụng một số lớp học vào một phần tử HTML: viết không

    MỘT

    Cái nào mang tính mô tả nhiều hơn về mặt ngữ nghĩa;

  • không được dùng kiểu nội tuyến, chẳng hạn như
    .