Bài 5. Đơn vị và giá trị: px, em, rem, %, vw, calc, clamp

Chọn đúng đơn vị quyết định giao diện có co giãn tốt hay không. Bài này phân biệt đơn vị tuyệt đối, tương đối, đơn vị theo khung nhìn và các hàm toán học calc(), min(), max(), clamp().

40 phútCơ bản
Bạn sẽ học được
  • Phân biệt px, em, rem, %
  • Dùng vw, vh, dvh, ch cho bố cục co giãn
  • Tính toán với calc()
  • Làm cỡ chữ và khoảng cách co giãn với clamp()

Một số khái niệm

Đơn vịTính theoDùng cho
pxĐiểm ảnh CSS (cố định)Viền, bóng, chi tiết nhỏ
remCỡ chữ của phần tử gốc html (mặc định 16px)Cỡ chữ, khoảng cách: khuyên dùng
emCỡ chữ của chính phần tử (hoặc cha)Padding của nút theo cỡ chữ nút
%Kích thước của phần tử chaChiều rộng cột
vw / vh1% chiều rộng / cao khung nhìnKhối toàn màn hình
dvhChiều cao khung nhìn động (trừ thanh địa chỉ điện thoại)Màn hình đầu trên điện thoại
chĐộ rộng ký tự 0Giới hạn độ dài dòng chữ: max-width: 70ch
frPhần không gian còn lại (Grid)Cột lưới

Khuyến nghị: dùng rem cho cỡ chữ và khoảng cách để tôn trọng cài đặt cỡ chữ của người dùng (người cao tuổi thường phóng to chữ trong trình duyệt); px cho viền mảnh; %, fr cho bố cục.

em và rem khác nhau thế nào

<style>
  html { font-size: 16px; }
  .hop { font-size: 20px; border: 1px solid #ccc; padding: 6px; margin: 6px 0; }
  .em { font-size: 1.5em; }   /* 1.5 x 20px = 30px (theo cha) */
  .rem { font-size: 1.5rem; } /* 1.5 x 16px = 24px (theo html) */
</style>
<div class="hop">Cha 20px
  <div class="em">1.5em = 30px</div>
  <div class="rem">1.5rem = 24px</div>
</div>
Kết quả hiển thị

calc(), min(), max(), clamp()

<style>
  .khung { width: calc(100% - 40px); margin: 0 20px; background: #e3f2fd; padding: 8px; box-sizing: border-box; }
  .tieu-de { font-size: clamp(1.25rem, 4vw, 2.5rem); color: #1565c0; margin: 8px 0; }
  .the { width: min(100%, 360px); background: #e8f5e9; padding: 10px; border-radius: 8px; }
  .doan { max-width: 60ch; }
</style>
<div class="khung">calc(100% - 40px)</div>
<h2 class="tieu-de">Cỡ chữ clamp: thu nhỏ cửa sổ để thấy co giãn</h2>
<div class="the">min(100%, 360px): không quá 360px</div>
<p class="doan">Giới hạn dòng khoảng 60 ký tự giúp đọc dễ hơn trên màn hình rộng.</p>
Kết quả hiển thị

clamp(min, ưu-tiên, max): giá trị ưu tiên (thường theo vw) nhưng không nhỏ hơn min, không lớn hơn max. Đây là cách làm cỡ chữ co giãn không cần media query.

Các kiểu giá trị khác

  • Từ khóa: auto, none, inherit, transparent, currentColor (màu chữ hiện tại).
  • Thời gian: s, ms; góc: deg, turn.
  • Viết tắt (shorthand): margin: 10px 20px (trên-dưới, trái-phải); margin: 1px 2px 3px 4px (theo chiều kim đồng hồ: trên, phải, dưới, trái).
  • Số 0 không cần đơn vị: margin: 0.
Mẹo hay

Đặt html { font-size: 100%; } (không đặt px cố định) để tôn trọng cỡ chữ người dùng chọn; mọi rem sẽ co giãn theo.

Lưu ý

em bị cộng dồn khi lồng nhau: danh sách lồng 3 cấp với font-size: 0.8em sẽ nhỏ dần thành 0.8³. Dùng rem để tránh.

Thực hành
  1. Chuyển một trang dùng toàn px sang rem.
  2. Làm tiêu đề trang có cỡ chữ clamp từ 24px đến 48px.
  3. Tạo khối màn hình đầu cao 100dvh có chữ căn giữa.
  4. Giới hạn chiều rộng đoạn văn bài viết bằng 65ch.
Tóm tắt bài học
  • rem cho chữ và khoảng cách; px cho chi tiết; %/fr cho bố cục.
  • em theo cha nên dễ cộng dồn.
  • vw, vh, dvh, ch cho thiết kế co giãn.
  • calc, min, max, clamp tính toán linh hoạt.