Tất tần tật về độ ưu tiên trong CSS

độ ưu tiên trong css

Có bao giờ các bạn code CSS cho một site nào đó của bạn bè hoặc dự án công ty. Nhưng code CSS xong rồi nó lại không nhận, mặc dù đã đúng đường dẫn, check thấy rõ ràng nhưng lại không được kết quả như mong muốn. Và bạn nhận ra rằng ah thì ra có 1 đoạn code CSS ai đã code trước đó sử dụng #id, inline style hoặc !important

Ai dè mình code hoài sửa hoài mà CSS của mình nó không có chạy. Lúc này bạn mới nhận ra rằng độ ưu tiên trong CSS nó rất là quan trọng. Vì thế hôm nay chúng ta sẽ cùng tìm hiểu tất tần tật về độ ưu tiên trong CSS nó như thế nào nhé

# Độ ưu tiên trong css

Giả sử bây giờ chúng ta có đoạn code HTML và CSS đơn giản như sau

<div id="header">
  <p class="text">Welcome everyone!!!</p>
</div>
p { font-size: 10px; }
p.text { font-size: 14px; }

Các bạn đoán thử xem. Kết quả ra 10px hay là 14px ? Mình nghĩ hầu hết các bạn  sẽ đoán đúng là 14px đúng không nào.

Thứ nhất là vì nó nằm dưới nên độ ưu tiên nó cao hơn, thứ hai là nó có thêm class .text kèm theo nữa. Chà dễ quá dễ, nếu như vậy thì cần gì phải học nhỉ. Đừng vội mừng. Tiếp tục xem ví dụ dưới đây nà.

div p.text {
  font-size: 14px;
}
#header p {
  font-size: 20px;
}

Ấy chà chà khó hơn rồi đây. Không code chạy thử nhé vì chúng ta cần hiểu và làm chớ code ra thì dễ rồi. Chỗ này người nào đã từng làm nhiều thì sẽ biết ngay thôi tuy nhiên người mới sẽ nghĩ là chắc là font-size: 14px rồi vì nó có 3 cái luôn như là thẻ div bọc ngoài rồi đến thẻ p kèm theo class .text chắc chắn là ưu tiên hơn ở dưới rồi.

Nhưng kết quả lại không nghiêng về người mới. Kết quả là người có kinh nghiệm đúng là font-size: 20px .Tại sao ? Tại vì #id nó ưu tiên hơn thẻ bình thường hơn class nên nó sẽ lấy CSS đoạn ở dưới thôi. Vì sao lại thế thì bạn nên hỏi người tạo ra CSS nha kaka

# Câu chuyện nhỏ nho

Để rõ ràng hơn về độ ưu tiên này trong CSS thì mình làm câu chuyện nho nhỏ như sau cho các bạn dễ hình dung. Giả sử các bạn đang xếp hàng có 4 người mua bánh. A (anh bạn) B (Bạn) C (Chú bạn) D (Dì bạn) thì bây giờ theo thứ tự ưu tiên sẽ là A B C D hen.

Đầu tiên là các elements(thẻ) trong CSS như là thẻ p, div, section , header … thì độ ưu tiên trong CSS của nó nằm cuối ta có (0A, 0B, 0C, 1D)

Tiếp theo là các class, pseudo class như .home , .content , :hover , :before , :after hoặc các attribute(thuộc tính) như a[target="_blank"], input[type="text"], a[href^="http"]… thì độ ưu tiên của nó nằm kế cuối ta có (0A, 0B, 1C, 0D)

Tiếp đến là các id như #header, #banner nó có độ ưu tiên thứ nhì ta được (0A, 1B, 0C, 0D)

Và cuối cùng là inline-style. Nghĩa là code trực tiếp bên trong thẻ HTML luôn như này và nó có độ ưu tiên cao nhất ta được (1A, 0B, 0C, 0D)

<div style="color: red;">Hello friends</div>

Giờ nhìn lại vào đoạn code khi nãy thì thấy đoạn code ở dưới có độ ưu tiên cao hơn cho nên nó sẽ chạy đoạn code đó #header p đó. Vì sao vì lúc này thèn 1B(bạn) đứng trước ưu tiên nhất và đoạn code trên có 0B cho nên độ ưu tiên thấp hơn và bạn đừng quan tâm con số 2D hay 1D vì nó đã nằm cuối là độ ưu tiên thấp nhất ko quan trọng là bao nhiêu số nhé.

div p.text { /*2 elements và 1 class ta có (0A,0B,1C,2D)*/
  font-size: 14px; 
}
#header p { /*1 id và 1 element ta có (0A,1B,0C,1D)*/
  font-size: 20px; 
}

Cho dù bạn code như thế này thì cái số 5 đó không có nghĩa lý gì khi nó vẫn đứng cuối. Còn thằng đứng cao hơn nó là đoạn code ở dưới có #id đó vẫn ưu tiên hơn. Giống như lúc xếp hàng, bạn đã được xếp đứng đầu thì cho dù thằng đứng cuối cao hơn bạn 5m thì nó vẫn đứng chót và độ ưu tiên vẫn thua bạn mà thôi.

<div id="header">
  <div>
    <div>
      <div>
        <p class="text">Welcome my friends</p>
      </div>
    </div>
  </div>
</div>
div div div div p.text { /*5 elements và 1 class ta có (0A,0B,1C,5D)*/
  font-size: 14px; 
}
#header p { /*1 id và 1 element ta có (0A,1B,0C,1D)*/
  font-size: 20px; 
}

À còn 1 điểm nữa nếu như mình muốn đoạn code div p.text đè được đoạn code ở dưới mà không muốn thêm elements hay id thì sao. Tức là Dì bạn muốn mua trước bạn đó. Tất nhiên là có cách và đó chính là !important. Kiểu như Dì bạn có ngôi sao hi vọng hay quyền ưu tiên vì lớn tuổi nên dì bạn sử dụng chúng để mua hàng trước bạn.

Cho nên khi sử dụng thêm !important(quan trọng) lúc này nó sẽ có độ ưu tiên cao nhất luôn cao hơn cả cái inline style

Cho nên lúc này đoạn code trên sửa lại như này và nó sẽ chạy đoạn code div p.text và dì bạn sẽ mua được bánh trước bạn. Nhưng bạn đứng trước mà bạn muốn mua trước nên vì thế bạn cũng có thể sử dụng !important

div p.text { 
  font-size: 14px !important; 
}
#header p {
  font-size: 20px !important; 
}

Thì lúc này nó ngang hàng về mặt !important coi như ta bỏ nó ra rồi so sánh như ở trên ban đầu thôi. Và tất nhiên là đoạn code ở dưới có thêm #header p (là bạn đó) sẽ đè đoạn ở trên rồi. Haha mua được bánh rồi nhóe.

# Lưu ý

Trước khi kết thì còn vài điểm nữa là nếu trường hợp cả 2 đoạn code đều có thẻ #id ưu tiên như nhau thì lúc này nó sẽ xét số lượng các thẻ còn lại như vầy. Đoạn code này nó sẽ ưu tiên đoạn ở trên nha. Lúc này độ ưu tiên về #id như nhau nên nó sẽ xem xét các số lượng thẻ còn lại(4D > 2D) nên nó ưu tiên hơn nà.

#header div div div p { /*4 elements và 1 id ta có (0A,1B,0C,4D)*/
  font-size: 14px; 
}

#header div p { /*1 id và 2 element ta có (0A,1B,0C,2D)*/
  font-size: 25px; 
}

Trường hợp tất cả đều bằng nhau thì nó sẽ ưu tiên đoạn code ở dưới nhé. Vì độ ưu tiên trong CSS chạy từ dưới lên

#header div div div p { /*4 elements và 1 id ta có (0A,1B,0C,4D)*/
  font-size: 14px; 
}

#header div div div p { /*1 id và 4 element ta có (0A,1B,0C,4D)*/
  font-size: 25px; 
}

Thế trường hợp như này các bạn nghĩ là cái nào nà. Rõ ràng là đoạn code trên ưu tiên hơn vì so sánh như sau: 0A = 0A, 1B = 1B, 1C > 0C, 4D = 4D. Làm lâu riết các bạn sẽ dễ dàng nhận ra luôn mà không cần phải tính toán nhiều.

#header div div div p.text { /*4 elements 1class và 1 id ta có (0A,1B,1C,4D)*/
  font-size: 14px; 
}

#header div div div p { /*1 id và 4 element ta có (0A,1B,0C,4D)*/
  font-size: 25px; 
}

Đặc biệt là khi các bạn custom CSS cho WordPress. Code nó bao dài luôn. Đòi hỏi các bạn phải hiểu để dùng cho đúng chứ không nên lạm dụng !important nhé. Nó chỉ dùng trong trường hợp bắt buộc, không thể tìm được độ ưu tiên nào khác cao hơn cái gốc nữa mới dùng nha.

Đây là một đoạn code dài khủng hoảng bên WordPress cho các bạn xem ví dụ để hiểu được rằng độ ưu tiên trong CSS nó quan trọng như thế nào. Bạn muốn đè đoạn code này ư ? Hãy phân tích nó từ các thẻ HTML và Class trong trang web nhé.

.thrv_wrapper:not(.tve_image_caption):not(.thrv_icon):not(.thrv-button):not(.thrv-content-box) {
    min-width: 20px;
}

Một điểm lưu ý cuối cùng đó là Internal CSSExternal CSS cụ thể là CSS nằm trong cặp thẻ <style>.code{}</style> bên trong HTML so với <link href=”css/style.css”> đường dẫn tới file CSS trong thư mục nào đó nếu thẻ nào nằm sau thì thẻ đó có độ ưu tiên cao hơn nhé.

# Lời kết

Hi vọng với câu chuyện vui nhộn kèm theo giải thích chi tiết sẽ giúp bạn hiểu được rõ ràng hơn về thứ tự độ ưu tiên trong CSS. Nó rất là quan trọng nên các bạn chú ý học chứ đừng bỏ qua nhé. Nếu có gì thắc mắc góp ý hoặc cám ơn thì cứ comment mình sẽ trả lời. Chúc các bạn một ngày tốt lành nà

Bài viết có tham khảo từ trang vanseodesigndotcom

.

Subscribe
Notify of
guest

33 Comments
Inline Feedbacks
View all comments
Thiện Đẹp Trai
Thiện Đẹp Trai

cám ơn tác giả rất nhiều , tiếp tục phát huy :))

thoại
thoại

Hay quá bạn ơi, đang tìm hiểu về vấn đề này và gặp đúng ngay chủ blog có tâm huyết, mong bạn sớm ra bài mới nhé !

Sâm
Sâm

hay lắm a ơi 😀 viết nhiều bài hơn a nhé

Thế Khương
Thế Khương

Bài viết quá đỉnh, đúng kiến thức mình đang cần.

thông cindep
thông cindep

Wow cái câu chuyện mua bánh hơi bị dễ hiểu luôn, ví dụ kiểu này thì clear hết mọi thứ luôn bọn blogger nước ngoài đưa công thức tính toán, trang caculate priority tùm lum rối não gần chết đọc xong không nhớ được may là có anh

Bảo Nguyễn
Bảo Nguyễn

nai xừ nai xừ :3

son
son

không biết bạn có thể cho mình xin template của trang này không bạn

Tâm Hệnnn
Tâm Hệnnn

bài viết bổ ích cho người mới học lắm ạ. Em cảm ơn

NGuyễn Duy Hiếu
NGuyễn Duy Hiếu

17/07/2019 Đọc là biết chủ tus đẹp zai rồi. Ủng hộ, viết hay quá.

duc.lux
duc.lux

Thanks a nhiều

Linh
Linh

This is a color!

#sec .para {
color: pink;
}

#sec .wrap .para {
color: blue;
}

Cho mình hỏi tại sao với đoạn code như vậy nó lại ưu tiên color pink hơn ạ?

thanh đăng
thanh đăng

trường hợp con trực tiếp (ví dụ ul>li) cũng áp dụng tương tự hay có sự khác biệt ạ?

Nguyễn Văn Bình
Nguyễn Văn Bình

Sai nhe tác giả “Một điểm lưu ý cuối cùng đó là Internal CSS và External CSS cụ thể là CSS nằm trong cặp thẻ .code{} bên trong HTML so với đường dẫn tới file CSS trong thư mục nào đó nếu so sánh ngang bằng thì lúc này code ở Internal() có độ ưu tiên cao hơn nhé.”
Nếu để thẻ phía trước thẻ thì External ưu tiên hơn

Nguyễn Văn Bình
Nguyễn Văn Bình

Áp dụng quy tắc của bác sao đoạn code này chạy ko đúng.

div#header {
color: red;
}

div p {
color: blue;
}

Welcome everyone!!!

Kết quả cho ra màu xanh dương ko phải màu đỏ

Phan Hưng
Phan Hưng

Cái color ở trên pác set color red cho cái div có id là header.
Cái color ở dưới pác set color blue cho cái p nằm trong cái div hồi nãy.
2 cái ko cùng trỏ tới 1 selector.

Gai
Gai

cái trên style cho id header, cái dưới style cho thẻ p, 2 element khác nhau.

HTML của bạn chắc là:

ĐỔI MÀU Ở ĐÂY

text
ĐỔI MÀU Ở ĐÂY : màu chắc chắn xanh
text: chắc chắn đỏ

Nhật
Nhật

Bởi vì thẻ <p> là thẻ được chỉ định trực tiếp, còn <div> là cha của nó. Bạn chỉ định color ở thẻ cha <div> nhưng thẻ con đã được chỉ định 1 color riêng rồi.
Với thuộc tính color thì nếu thẻ con không được chỉ định thì nó mới lấy thuộc tính của thẻ cha.

Nguyễn Văn Nhiệm
Nguyễn Văn Nhiệm

Đây là 2 selector select vào 2 đối tượng khác nhau mà bạn
<div id=”header”>
    <p>Some text</p>
  </div>
Nếu là div#header p thì mọi chuyện sẽ khác

Dugsheij
Dugsheij

Bài viết hay mỗi tội văn trình bày hơi khó đọc chút hí

Taiker
Taiker

Cảm ơn bạn đã chia sẽ