Frontend Hub/CSS Course
Bài học: CSS Cơ Bản - Hướng Dẫn Toàn Diện
CSS - Cascading Style Sheets

CSS Cơ Bản - Hướng Dẫn Toàn Diện

Khám phá CSS từ cơ bản đến nâng cao: cú pháp, selectors đa dạng, pseudo-classes, pseudo-elements, combinators, specificity và inheritance. Tất cả những gì bạn cần để thành thạo CSS!

1. CSS Là Gì Và Tại Sao Quan Trọng?

CSS (Cascading Style Sheets)

CSS là ngôn ngữ tạo kiểu dùng để mô tả cách hiển thị của tài liệu HTML. CSS là cầu nối giữa nội dung (HTML) và giao diện người dùng.

HTML

Cấu trúc và nội dung

CSS

Giao diện và cách trình bày

JavaScript

Tương tác và hành vi

Lợi ích chính

  • Tái sử dụng: Một file CSS cho nhiều trang web
  • Dễ bảo trì: Thay đổi thiết kế một cách tập trung
  • Hiệu suất tốt: Giảm kích thước file HTML
  • Khả năng tiếp cận: Tách biệt nội dung và cách trình bày

Cấu trúc cơ bản

bộ-chọn {
    thuộc-tính: giá-trị;
    thuộc-tính: giá-trị;
}

2. Ba Cách Áp Dụng CSS

Inline CSS

Cao nhất
<p style="color: red; font-size: 16px;">
  Text với inline style
</p>
Ưu tiên tuyệt đối
Ghi đè nhanh
Khó bảo trì
Không tái sử dụng

Internal CSS

Trung bình
<style>
  p { color: blue; }
  .highlight { background: yellow; }
</style>
Áp dụng cho toàn trang
Không cần file riêng
Không tái sử dụng cho trang khác

External CSS

Khuyến nghị
<link rel="stylesheet" href="style.css">

/* style.css */
p { color: blue; }
Tái sử dụng nhiều trang
Lưu cache tốt
Tách biệt content & style

3. Hệ Thống Bộ Chọn (Selector)

Cấp độ 1 - Bộ chọn cơ bản

/* Phần tử */
p { color: black; }
div { margin: 10px; }

/* Lớp (Class) */
.highlight { background: yellow; }
.container { width: 100%; }

/* ID */
#header { background: navy; }
#footer { text-align: center; }

/* Toàn bộ */
* { box-sizing: border-box; }

Cấp độ 2 - Bộ chọn thuộc tính

/* Khớp chính xác */
[type="text"] { border: 1px solid blue; }

/* Bắt đầu bằng */
[href^="https"] { color: green; }

/* Kết thúc bằng */
[href$=".pdf"] { color: red; }

/* Chứa */
[href*="google"] { font-weight: bold; }

/* Chứa từ */
[class~="active"] { background: yellow; }

Cấp độ 3 - Lớp giả (Pseudo-classes)

/* Trạng thái tương tác */
a:hover { color: red; }
button:focus { outline: 2px solid blue; }
input:disabled { opacity: 0.5; }

/* Cấu trúc */
li:first-child { font-weight: bold; }
p:nth-child(2n) { background: #f0f0f0; }
div:empty { display: none; }

Phần tử giả (Pseudo-elements)

/* Tạo nội dung */
.quote::before { content: """; }
.quote::after { content: """; }

/* Chữ đầu tiên */
p::first-letter { font-size: 3em; }
p::first-line { font-weight: bold; }

/* Selection */
::selection { background: yellow; }

Cấp độ 4 - Bộ Kết Hợp (Combinators)

Descendant & Child

/* Con cháu (dấu cách) */
.parent p { color: red; }
/* TẤT CẢ p ở BẤT KỲ cấp độ nào */

/* Con trực tiếp (>) */
.parent > p { color: blue; }
/* CHỈ p con TRỰC TIẾP */

Siblings

/* Anh em liền kề (+) */
h2 + p { margin-top: 0; }
/* p NGAY SAU h2 */

/* Anh em chung (~) */
h2 ~ p { color: gray; }
/* TẤT CẢ p sau h2 cùng cấp */

4. Độ Cụ Thể (Specificity)

Cách tính Specificity (định dạng: a-b-c-d):

1000
Inline styles
style="..."
100
IDs
#header
10
Classes, attributes
.nav, [type]
1
Elements
div, p

Ví dụ tính Specificity

/* 0-0-0-1 = 1 điểm */
p { color: black; }

/* 0-0-1-0 = 10 điểm */
.highlight { color: yellow; }

/* 0-1-0-0 = 100 điểm */
#header { color: blue; }

/* 0-0-1-1 = 11 điểm */
p.highlight { color: red; }

/* 0-1-1-1 = 111 điểm */
#main .sidebar p { color: green; }

/* 0-1-2-1 = 121 điểm - THẮNG */
#main .sidebar p.highlight { color: purple; }

/* !important ghi đè MỌI THỨ */
p { color: orange !important; }

❌ Tránh

/* Specificity quá cao */
#header .nav ul.menu li.item a.link { }

/* Lạm dụng !important */
.text { color: red !important; }

✅ Khuyến nghị

/* Giữ specificity thấp */
.nav-link { }
.nav-link--active { }

/* Tăng tự nhiên */
.header .nav-link { }

5. Kế Thừa & CSS Cascade

CSS Cascade - Thứ tự ưu tiên

Thứ tự ưu tiên Cascade (từ thấp đến cao):

  1. Browser default styles - Kiểu mặc định trình duyệt
  2. User styles - CSS tùy chỉnh của người dùng
  3. Author styles - CSS của developer
  4. Inline styles - Thuộc tính style=""
  5. !important declarations - Khai báo !important

Thuộc tính được kế thừa

  • • font-family, font-size, font-weight
  • • color, line-height
  • • text-align, text-decoration
  • • list-style-type, list-style-image
  • • cursor, visibility
  • • letter-spacing, word-spacing

Không được kế thừa

  • • margin, padding, border
  • • background, background-color
  • • width, height, min-width, max-width
  • • position, top, left, right, bottom
  • • display, float, clear
  • • z-index, overflow

Kiểm soát Inheritance

/* Kiểm soát inheritance */
.child {
    color: inherit;    /* Kế thừa từ parent */
    margin: initial;   /* Giá trị mặc định của browser */
    padding: unset;    /* Kế thừa nếu có, không thì initial */
    border: revert;    /* Quay về browser default stylesheet */
}

/* Ví dụ thực tế */
body {
    font-family: 'Helvetica', Arial, sans-serif;  /* Tất cả con sẽ kế thừa */
    color: #333;                                   /* Tất cả con sẽ kế thừa */
    line-height: 1.6;                             /* Tất cả con sẽ kế thừa */
}

.special-text {
    font-family: inherit;  /* Giữ font từ body */
    color: red;           /* Override color */
}

6. Mô Hình Hộp (Box Model)

Cấu trúc Box Model:

CSS Box Model Diagram

Mô hình hộp CSS với Content, Padding, Border và Margin

Content-box (mặc định)

.content-box {
    box-sizing: content-box;
    width: 200px;
    padding: 20px;
    border: 5px solid;
    /* Tổng = 200 + 40 + 10 = 250px */
}

Border-box (khuyến nghị)

.border-box {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 5px solid;
    /* Tổng = 200px (đã bao gồm all) */
}

7. Hệ Thống Bố Cục (Layout)

Sự phát triển của CSS Layout:

1
Table Layout (1990s)
Hack để tạo bố cục
2
Float Layout (2000s)
Tạo cột và wrapper
3
Flexbox (2010s)
Bố cục 1 chiều (hàng hoặc cột)
4
Grid (2017+)
Bố cục 2 chiều (hàng và cột)

Khi nào dùng gì?

Flexbox
Thanh điều hướng, bố cục thẻ, căn giữa
1 chiều, căn chỉnh, kích thước linh hoạt
Grid
Bố cục trang, bố cục phức tạp
2 chiều, kiểm soát chính xác, chồng lấp
Position
Overlay, tooltip, header cố định
Định vị chính xác

8. Thiết Kế Responsive

Phương pháp Mobile-First:

/* Cơ sở: Mobile */
.container { width: 100%; }

/* Tablet */
@media (min-width: 768px) {
    .container { width: 750px; }
}

/* Desktop */
@media (min-width: 1024px) {
    .container { width: 1000px; }
}

Đơn vị linh hoạt

%Chiều rộng bố cục
emKhoảng cách component
remTypography, khoảng cách nhất quán
vw/vhPhần tử toàn viewport
frCột Grid

Best Practices

  • Thiết kế Mobile-First
  • Sử dụng đơn vị tương đối
  • Test trên nhiều thiết bị
  • Tối ưu hình ảnh

9. Kiến Trúc CSS

Quy tắc CSS có thể bảo trì:

  • Dự đoán được: Tên class và hành vi nhất quán
  • Tái sử dụng: Component có thể dùng lại
  • Dễ bảo trì: Dễ sửa đổi và mở rộng
  • Có thể mở rộng: Hoạt động tốt khi dự án lớn

Quy ước đặt tên:

/* BEM (Block Element Modifier) */
.card { }                    /* Block */
.card__title { }             /* Element */
.card__title--large { }      /* Modifier */

/* SMACSS */
.layout-header { }           /* Layout */
.module-card { }             /* Module */
.state-is-active { }         /* State */
.theme-dark { }              /* Theme */

Cân nhắc về Hiệu suất

/* ❌ Chậm - lồng sâu */
.nav ul li a:hover { }

/* ✅ Nhanh - nhắm trực tiếp */
.nav-link:hover { }

/* ❌ Chậm - bộ chọn toàn bộ */
* { box-sizing: border-box; }

/* ✅ Tốt hơn - reset có mục tiêu */
html, body, div, span, h1, h2, h3, p {
    box-sizing: border-box;
}

🎯 Tóm Tắt CSS Cơ Bản

Kiến thức Core:

  • ✅ Hiểu CSS Cascade và Specificity
  • ✅ Thành thạo hệ thống Selector
  • ✅ Nắm vững Box Model và Layout
  • ✅ Áp dụng Inheritance hiệu quả

Concepts Nâng cao:

  • ✅ Thiết kế Responsive
  • ✅ Kiến trúc CSS bền vững
  • ✅ Performance optimization
  • ✅ Debugging và troubleshooting

💡 Best Practices Tổng Hợp:

  • Sử dụng external CSS để dễ bảo trì
  • Giữ specificity thấp, tránh !important
  • Thiết kế Mobile-First
  • Tận dụng inheritance để giảm code
  • Đặt tên class có ý nghĩa và nhất quán
  • Sử dụng comments để document code

🚀 Tiếp theo: Học về Flexbox và Grid để xây dựng layout chuyên nghiệp!