Kiến trúc CSS hiện đại

🔄 Ôn tập: Trong bài học trước, bạn đã học về Semantic HTML — nền tảng cho các trang web dễ truy cập và thân thiện với SEO. Bây giờ, hãy cùng tạo kiểu cho những trang đó bằng CSS hiện đại, đáp ứng, dễ bảo trì và thân thiện với AI.

CSS hiện đại mạnh mẽ hơn rất nhiều so với vài năm trước. Grid, Flexbox, Container Queries, thuộc tính tùy chỉnh và các lớp xếp tầng giải quyết những vấn đề trước đây cần JavaScript hoặc các thủ thuật phức tạp. AI tạo CSS tốt — nhưng thường mặc định sử dụng các mẫu cũ hơn khi có những giải pháp hiện đại.

Các token thiết kế: Nền tảng CSS của bạn

Định nghĩa một lần, sử dụng ở mọi nơi:

📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.

:root {
  /* Colors */
  --color-primary: #3b82f6;
  --color-text: #1f2937;
  --color-bg: #ffffff;
  --color-border: #e5e7eb;

  /* Spacing (8px base scale) */
  --space-1: 0.25rem;  /* 4px */
  --space-2: 0.5rem;   /* 8px */
  --space-4: 1rem;     /* 16px */
  --space-6: 1.5rem;   /* 24px */
  --space-8: 2rem;     /* 32px */

  /* Typography */
  --text-sm: 0.875rem;
  --text-base: 1rem;
  --text-lg: 1.125rem;
  --text-xl: 1.25rem;

  /* Other */
  --radius-md: 0.5rem;
  --shadow-sm: 0 1px 2px rgb(0 0 0 / 5%);
}

 

📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.

📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.

Prompt AI để trích xuất token:

Phân tích file CSS này và trích xuất tất cả các giá trị được hardcode thành những thuộc tính tùy chỉnh CSS. Nhóm thành: màu sắc, khoảng cách, kiểu chữ, đường viền, bóng. Đặt tên cho các token một cách mô tả (--color-primary, --space-4, --text-lg). Hiển thị định nghĩa token và CSS đã được chỉnh sửa lại.

CSS Grid: Bố cục hai chiều

Lưới thẻ (tự động điều chỉnh, không cần truy vấn media):

✏️ Cách điền thông tin chi tiết của bạn: Thay thế mỗi [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.

📌 Những việc cần làm với kết quả: Lưu phản hồi vào file Notes. Chọn gợi ý có tác động cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.

⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."

css
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--space-4);
}

Bố cục trang (thanh bên + chính):

.page-layout {
  display: grid;
  grid-template-columns: minmax(250px, 300px) 1fr;
  gap: var(--space-6);
}

@media (max-width: 768px) {
  .page-layout {
    grid-template-columns: 1fr;
  }
}

Flexbox: Căn chỉnh một chiều

Thanh điều hướng:

.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
}

Khi nào nên sử dụng Grid thay cho Flexbox:

Trường hợp sử dụng Công cụ tốt nhất Lý do
Lưới thẻ Grid Bố cục 2D với khoảng cách đều đặn
Thanh điều hướng Flexbox Sự sắp xếp 1D với phân bố không gian
Bố cục trang Grid Các khu vực được đặt tên, thanh bên + trang chính
Nhóm nút Flexbox Căn chỉnh nội tuyến
Dashboard Grid Các sắp xếp 2D phức tạp
Căn giữa Một trong hai Grid: place-items: center, Flex: justify-content: center; align-items: center

Container Queries

Các thành phần phản hồi theo container của chúng, chứ không phải viewport:

.card-container {
  container-type: inline-size;
}

.card {
  /* Default: compact layout */
  display: flex;
  flex-direction: column;
}

@container (min-width: 400px) {
  .card {
    /* Wide layout: horizontal */
    flex-direction: row;
  }
}

Prompt AI về Container Queries:

Tái cấu trúc các truy vấn media của thành phần này để sử dụng Container Queries. Thành phần nên thích ứng dựa trên chiều rộng container của nó, chứ không phải viewport. Hiển thị thiết lập container-type và các quy tắc @container thay thế @media.

Dark Mode với các thuộc tính tùy chỉnh

/* Light mode (default) */
:root {
  --color-text: #1f2937;
  --color-bg: #ffffff;
  --color-border: #e5e7eb;
}

/* Dark mode */
@media (prefers-color-scheme: dark) {
  :root {
    --color-text: #f3f4f6;
    --color-bg: #111827;
    --color-border: #374151;
  }
}

Vì tất cả CSS của bạn sử dụng var(--color-text) thay vì #1f2937, Dark Mode hoạt động bằng cách thay đổi giá trị token — không cần sao chép CSS.

Kiểm tra nhanh: AI tạo bố cục đáp ứng bằng cách sử dụng width: 33.333% trên các phần tử con. Giải pháp thay thế hiện đại là gì?

Đáp án: display: grid; grid-template-columns: repeat(3, 1fr); — hoặc tốt hơn nữa, repeat(auto-fill, minmax(250px, 1fr)) để có hành vi tự động đáp ứng. Chiều rộng phần trăm không tính đến khoảng cách, yêu cầu các thủ thuật về lề và không thích ứng với những kích thước container khác nhau. Grid xử lý tất cả những điều này một cách tự nhiên.)

Những điểm chính cần ghi nhớ

  • Các thuộc tính tùy chỉnh CSS (code thiết kế) là nền tảng của CSS dễ bảo trì: Xác định màu sắc, khoảng cách và kiểu chữ một lần trong :root, sử dụng var(--token-name) ở mọi nơi và bật Dark Mode bằng cách xác định lại các token trong @media (prefers-color-scheme: dark) — những thay đổi một dòng được lan truyền toàn hệ thống
  • CSS Grid với auto-fillminmax() tạo bố cục thẻ đáp ứng chỉ trong một dòng mà trước đây cần hơn 20 dòng CSS dựa trên float, và hỗ trợ các thẻ có chiều cao bằng nhau, khoảng cách nhất quán và tự động xuống dòng mà không cần truy vấn media
  • Container Queries cho phép các thành phần phản hồi theo chiều rộng của container thay vì viewport — giúp những thành phần thực sự có thể tái sử dụng trong các ngữ cảnh bố cục khác nhau (trang toàn chiều rộng, thanh bên, cửa sổ pop-up) mà không cần ghi đè cụ thể theo breakpoint.
  • Câu 1:

    Bạn đang xây dựng bố cục gồm thanh bên và nội dung chính. Trên desktop: Thanh bên rộng 300px, nội dung chính chiếm phần không gian còn lại. Trên thiết bị di động: Thanh bên nằm phía trên nội dung chính. AI tạo ra các truy vấn phương tiện ở độ phân giải 768px. Nhà thiết kế của bạn nói rằng một số màn hình có độ phân giải từ 768-1024px trông không được đẹp mắt vì thanh bên quá hẹp. Làm thế nào để khắc phục điều này?

    GIẢI THÍCH:

    Truy vấn Container (được hỗ trợ trong tất cả mọi trình duyệt hiện đại từ năm 2023) cho phép các thành phần phản hồi theo kích thước của container chứ không phải viewport. Điều này linh hoạt hơn so với các truy vấn media viewport vì cùng một thành phần thích ứng chính xác cho dù nó nằm trong bố cục toàn chiều rộng, thanh bên hay cửa sổ modal. Riêng đối với thanh bên, CSS Grid với minmax() tạo ra các bố cục đáp ứng mà không bao giờ có những trạng thái trung gian khó coi.

  • Câu 2:

    Bạn có hơn 50 giá trị màu CSS rải rác trong các file stylesheet của mình: `#3b82f6` ở 23 vị trí, `#1f2937` ở 15 vị trí, v.v... Bạn muốn đổi màu từ xanh lam sang xanh lục. Cách tiếp cận hiện đại là gì?

    GIẢI THÍCH:

    Các thuộc tính tùy chỉnh CSS (biến) là nền tảng hiện đại cho việc tạo kiểu dễ bảo trì. Không giống như các biến Sass (sẽ bị biên dịch mất), những thuộc tính tùy chỉnh CSS tồn tại trong thời gian chạy — cho phép Dark Mode, theme và thay đổi động. Những token thiết kế (các biến được đặt tên như --color-primary, --space-4, --radius-md) tạo ra một hệ thống từ vựng thiết kế giúp CSS tự giải thích và dễ dàng chỉnh sửa trên phạm vi toàn cục.

  • Câu 3:

    AI tạo CSS cho lưới thẻ bằng cách sử dụng `float: left` và chiều rộng phần trăm với các truy vấn media cho mỗi breakpoint. Đồng nghiệp của bạn đề xuất sử dụng CSS Grid thay thế. Liệu việc này có đáng để chỉnh sửa lại không?

    GIẢI THÍCH:

    CSS Grid được thiết kế dành riêng cho bố cục hai chiều (thẻ, dashboard, các phần trang). Float là một thủ thuật từ trước khi Grid tồn tại. 1. Lưới với `auto-fill` và `minmax()` tạo bố cục thẻ đáp ứng chỉ trong một dòng, điều mà nếu dùng `float` và `media queries` sẽ cần hơn 20 dòng. AI đôi khi tạo ra các mẫu CSS cũ hơn — luôn kiểm tra xem CSS hiện đại có giải pháp tốt hơn không.

Thứ Hai, 08/06/2026 14:48
51 👨
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo