Nội dung bài viết
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 CSS và External 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
.
cám ơn tác giả rất nhiều , tiếp tục phát huy :))
Cám ơn nà keke
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é !
Cám ơn bạn nha. Chúc bạn học tập tốt
hay lắm a ơi 😀 viết nhiều bài hơn a nhé
<3 Thanks em nhiều nà
Bài viết quá đỉnh, đúng kiến thức mình đang cần.
Em cám ơn anh nà <3
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
Haha thì a cũng đọc từ nước ngoài mà. Chắc do a làm nhiều nên hiểu. Phải viết lại cho newbie hiểu mới hay.
nai xừ nai xừ :3
Cám ơn em
không biết bạn có thể cho mình xin template của trang này không bạn
Mình dùng Theme tên là Type nhé bạn. Bạn có thể xem tại đây
bài viết bổ ích cho người mới học lắm ạ. Em cảm ơn
Anh cám ơn em đã đọc nè <3
17/07/2019 Đọc là biết chủ tus đẹp zai rồi. Ủng hộ, viết hay quá.
Cám ơn bạn nhé
Thanks a nhiều
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 ạ?
nếu đoạn code như của bạn nó sẽ ra màu xanh chứ sao ra màu pink được. Bạn có thể xem demo ở đây: https://codepen.io/blackzero/pen/ZEzezoO
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 ạ?
Con trực tiếp cao hơn con bình thường nà bạn, rồi áp dụng tương tự
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
Oke cám ơn bạn nhé. Để mình update thêm. <3
Á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 đỏ
Bạn chưa hiểu rồi, div#header nghĩa là thẻ div có id là header, còn ở dưới bạn áp dụng cho thẻ con nha bạn. Nếu so sánh đúng thì code của bạn phải là div#header p{} div p{}
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.
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 đỏ
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.
Đâ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
Bài viết hay mỗi tội văn trình bày hơi khó đọc chút hí
Cảm ơn bạn đã chia sẽ