🔄 Tóm tắt bài học: Trong bài học trước, bạn đã xây dựng các thành phần UI — thẻ, cửa sổ pop-up và menu drop-down với hỗ trợ bàn phím và khả năng truy cập. Bây giờ, hãy làm cho mọi thứ hoạt động đẹp mắt trên mọi kích thước màn hình.
Thiết kế đáp ứng đảm bảo giao diện của bạn hoạt động từ điện thoại 320px đến màn hình 4K. Với lưu lượng truy cập di động vượt qua desktop trên toàn hệ thống, thiết kế ưu tiên di động không phải là tùy chọn — mà là điểm khởi đầu mặc định.
CSS ưu tiên di động
Viết các kiểu cơ bản cho thiết bị di động, sau đó thêm độ phức tạp cho màn hình lớn hơn:
📍 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.
👀 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 đây là bản nháp, không phải là câu trả lời cuối cùng.
Các breakpoint phổ biến (chiều rộng tối thiểu, ưu tiên thiết bị di động):
Breakpoint
Mục tiêu
Sử dụng
640px
Điện thoại lớn / máy tính bảng nhỏ
Bố cục 2 cột
768px
Máy tính bảng
Thanh bên xuất hiện
1024px
Desktop nhỏ
Bố cục desktop đầy đủ
1280px
Desktop lớn
Khu vực nội dung rộng hơn
Chỉnh sửa kiểu chữ linh hoạt với hàm clamp()
Thay thế kích thước phông chữ cố định bằng khả năng điều chỉnh kích thước linh hoạt:
✏️ Cách điền thông tin chi tiết: Thay thế mỗi dấu ngoặc vuông [] 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.
📌 Cách xử lý kết quả: Lưu phản hồi vào file Notes. Chọn gợi ý có hiệu quả 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 nó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."
Tạo tỷ lệ kiểu chữ linh hoạt bằng cách sử dụng clamp(). Yêu cầu: (1) Văn bản chính: tối thiểu 16px trên màn hình 320px, tối đa 18px trên màn hình 1400px, (2) Tiêu đề h1-h4: được zoom theo tỷ lệ, (3) Văn bản nhỏ (chú thích): tối thiểu 12px, tối đa 14px. Sử dụng đơn vị rem. Hãy cung cấp các giá trị của hàm clamp() và giải thích cách tính toán.
Hình ảnh đáp ứng
Phần tử <picture> với tối ưu hóa định dạng và kích thước:
Ẩn liên kết, hiển thị nút menu trên thiết bị di động
Bảng → thẻ
Bảng dữ liệu
Định dạng lại các hàng thành thẻ trên thiết bị di động
Tràn toàn trang → được bao gồm
Các phần hero
max-width có phần đệm trên màn hình nhỏ
✅ Kiểm tra nhanh: Bạn đặt thuộc tính width: 100vw cho một container để làm cho nó có chiều rộng đầy đủ. Trên thiết bị di động, có thanh cuộn ngang. Tại sao?
Câu trả lời: 100vw bao gồm chiều rộng của thanh cuộn, trong khi 100% của phần thân trang thì không. Trên các trang có thanh cuộn dọc, 100vw rộng hơn vùng hiển thị, gây ra hiện tượng tràn ngang. Cách khắc phục: sử dụng width: 100% thay vì 100vw, hoặc thêm overflow-x: hidden vào phần thân trang. CSS do AI tạo ra thường sử dụng 100vw — luôn kiểm tra vấn đề này.
Kiểm tra thiết kế đáp ứng
Prompt AI để gỡ lỗi đáp ứng:
Tôi đang kiểm tra trang của mình ở các kích thước màn hình khác nhau. Ở chiều rộng 768px, thanh bên chồng lên nội dung chính và các liên kết điều hướng bị xuống dòng thành hai dòng. Đây là CSS của tôi: [DÁN]. Hãy gỡ lỗi hành vi đáp ứng và đề xuất cách khắc phục cho cả hai vấn đề.
Danh sách kiểm tra:
Chiều rộng
Thiết bị
Kiểm tra
320px
Điện thoại nhỏ (iPhone SE)
Không bị tràn nội dung, văn bản vẫn đọc được
375px
Điện thoại tiêu chuẩn (iPhone)
Bố cục không chật chội
768px
Máy tính bảng
Hành vi của thanh bên chính xác
1024px
Desktop nhỏ
Kết xuất bố cục đầy đủ
1920px
Desktop tiêu chuẩn
Nội dung không quá rộng
Những điểm chính cần ghi nhớ
CSS ưu tiên thiết bị di động (truy vấn media min-width) tạo ra code sạch hơn, hiệu quả hơn: kiểu dáng dành cho thiết bị di động là mặc định mà không cần truy vấn media, và bạn tăng dần độ phức tạp bố cục cho màn hình lớn hơn — người dùng di động có kết nối chậm sẽ tải xuống lượng CSS tối thiểu cần thiết
Kiểu chữ linh hoạt với clamp() loại bỏ các truy vấn media kích thước phông chữ dựa trên breakpoint: clamp(min, preferred, max) tạo ra khả năng mở rộng mượt mà giữa kích thước tối thiểu và tối đa, thích ứng với mọi viewport mà không bị gián đoạn hoặc ngắt thủ công
Hình ảnh đáp ứng với srcset, sizes và định dạng WebP có thể giảm 90% lượng tải xuống hình ảnh trên thiết bị di động: điện thoại tải xuống file WebP 50KB thay vì file JPEG 2MB trên desktop — luôn đặt thuộc tính chiều rộng và chiều cao rõ ràng để ngăn chặn sự thay đổi bố cục (CLS)
Câu 1:
Trang của bạn có hero image dung lượng 2MB. Ảnh load mượt mà trên desktop với WiFi nhanh. Trên thiết bị di động với 3G, trang mất đến 12 giây để load. Làm thế nào để khắc phục điều này?
GIẢI THÍCH:
Hình ảnh đáp ứng rất quan trọng đối với hiệu suất trên thiết bị di động. Một hình ảnh 2MB dành cho desktop là không cần thiết trên điện thoại có màn hình 400px. `srcset` cho phép trình duyệt chọn kích thước phù hợp. Các định dạng hiện đại như WebP giảm kích thước file từ 25-35%. Nhờ đó, người dùng di động có thể tải xuống một file WebP 50KB thay vì một file JPEG 2MB — từ 12 giây xuống dưới 1 giây. `max-width: 100%` chỉ ảnh hưởng đến kích thước hiển thị, không ảnh hưởng đến kích thước tải xuống.
Câu 2:
Kích thước phông chữ tiêu đề của bạn được đặt thành `font-size: 48px`. Nó trông tuyệt vời trên desktop nhưng quá lớn trên điện thoại và quá nhỏ trên màn hình 4K. Bạn thêm các truy vấn media để thay đổi kích thước phông chữ ở 3 breakpoint. Có cách tiếp cận nào tốt hơn không?
GIẢI THÍCH:
Hàm `clamp()` tạo ra kiểu chữ linh hoạt, tự động điều chỉnh kích thước mượt mà giữa kích thước tối thiểu và tối đa dựa trên chiều rộng viewport — không cần truy vấn media. Đơn vị `vw` thuần túy rất nguy hiểm vì chúng không có kích thước tối thiểu (văn bản trở nên khó đọc trên màn hình nhỏ) và không có kích thước tối đa (văn bản trở nên quá lớn trên màn hình lớn). Hàm `clamp()` giải quyết vấn đề này bằng các giới hạn rõ ràng: `clamp(min, preferred, max)`. Nó được hỗ trợ trong tất cả các trình duyệt hiện đại.
Câu 3:
AI tạo CSS với các truy vấn media này: `@media (max-width: 1200px)`, `@media (max-width: 992px)`, `@media (max-width: 768px)`, `@media (max-width: 576px)`. Đồng nghiệp của bạn nói rằng đây là 'ưu tiên desktop' và bạn nên sử dụng 'ưu tiên thiết bị di động' thay thế. Sự khác biệt thực tế là gì?
GIẢI THÍCH:
CSS ưu tiên thiết kế cho thiết bị di động là tiêu chuẩn ngành vì nó tạo ra code sạch hơn, hiệu quả hơn. Bạn viết các kiểu cơ bản cho thiết bị di động (bố cục đơn giản nhất), sau đó dần dần thêm độ phức tạp bằng những truy vấn `min-width`. Điều này có nghĩa là người dùng di động — thường có kết nối chậm hơn — tải xuống ít CSS nhất. Code cũng logic hơn: Bạn xây dựng TỪ đơn giản đến phức tạp thay vì TỪ phức tạp đến đơn giả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: