Em, Rem và %: Ba "Ông Vua" Kích Thước Trong CSS – Chọn Ai, Dùng Khi Nào?

Em, Rem và %: Ba "Ông Vua" Kích Thước Trong CSS – Chọn Ai, Dùng Khi Nào?

Trong thế giới lập trình web, việc căn chỉnh kích thước các thành phần trên giao diện luôn là một thử thách thú vị. Bạn đã bao giờ "đau đầu" khi phải lựa chọn giữa em, rem% để định nghĩa kích thước trong CSS chưa? Đừng lo, bạn không đơn độc! Ba đơn vị này, tuy đều dùng để thiết lập kích thước tương đối, lại có những "tính cách" và trường hợp sử dụng rất khác biệt.

Hôm nay, chúng ta sẽ cùng "mổ xẻ" từng anh tài này, hiểu rõ bản chất và bí kíp sử dụng chúng hiệu quả nhất để làm chủ layout của mình nhé!

1. em: Kẻ "Biến Hóa" Theo Cha

Đơn vị em được định nghĩa tương đối so với kích thước font-size của phần tử cha (parent element). Nếu phần tử cha không có font-size được định nghĩa rõ ràng, nó sẽ kế thừa từ phần tử cha của nó, và cứ thế lên đến gốc.

  • Cách hoạt động: 1em bằng với font-size hiện tại của phần tử cha. Ví dụ, nếu phần tử cha có font-size: 16px, thì 1em sẽ tương đương 16px. Nếu bạn set font-size: 1.5em cho một phần tử con, nó sẽ có kích thước 1.5 * 16px = 24px.
  • Ưu điểm: Rất linh hoạt khi bạn muốn các thành phần (như padding, margin) thay đổi tỷ lệ theo kích thước văn bản bên trong chúng, hoặc khi bạn muốn một khối nội dung có sự nhất quán về tỷ lệ.
  • Nhược điểm: Dễ dẫn đến "hiệu ứng tầng cascading" (compounding issue). Khi các phần tử lồng nhau, giá trị em có thể trở nên khó đoán và dễ bị phóng đại hoặc thu nhỏ ngoài ý muốn.

Ví dụ minh họa:

.parent {  font-size: 16px; /* 1em = 16px */} .child {  font-size: 1.5em; /* 1.5 * 16px = 24px */  padding: 1em; /* 1 * 24px = 24px (tương đối với font-size của chính nó) */} .grandchild {  font-size: 1.2em; /* 1.2 * 24px = 28.8px */}

2. rem: Người "Trung Thành" Với Gốc Gác

rem là viết tắt của "root em" (em gốc). Khác với em, đơn vị rem luôn được định nghĩa tương đối so với kích thước font-size của phần tử gốc của tài liệu (root element), tức là thẻ <html>.

  • Cách hoạt động: 1rem luôn bằng với font-size của thẻ <html>. Điều này loại bỏ hoàn toàn vấn đề "cascading" của em.
  • Ưu điểm: Dễ quản lý và dự đoán hơn rất nhiều, đặc biệt hữu ích cho việc tạo ra hệ thống font-size và spacing nhất quán trên toàn bộ website. Bạn chỉ cần thay đổi font-size trên thẻ <html> là mọi thứ dùng rem sẽ tự động co giãn theo tỷ lệ. Tuyệt vời cho responsive design và khả năng tiếp cận (accessibility).
  • Nhược điểm: Không có nhược điểm đáng kể khi bạn đã quen với cách hoạt động của nó.

Ví dụ minh họa:

html {  font-size: 16px; /* 1rem = 16px */} .header {  font-size: 2rem; /* 2 * 16px = 32px */  padding: 1rem; /* 1 * 16px = 16px */} .paragraph {  font-size: 1rem; /* 1 * 16px = 16px */  margin-bottom: 0.5rem; /* 0.5 * 16px = 8px */}

3. %: Tắc Kè Hoa Đa Nhiệm

Đơn vị % (phần trăm) là một "tắc kè hoa" thực sự trong CSS vì hành vi của nó phụ thuộc rất nhiều vào thuộc tính mà nó được áp dụng và phần tử cha của nó.

  • Cách hoạt động:
    • Đối với font-size: Tương đối so với font-size của phần tử cha. (Giống em ở khía cạnh này)
    • Đối với width, height: Tương đối so với width hoặc height của phần tử cha.
    • Đối với padding, margin (top/bottom/left/right): Tương đối so với chiều rộng (width) của phần tử cha. Đây là một điểm cực kỳ quan trọng và hay bị nhầm lẫn!
    • Đối với line-height: Tương đối so với font-size của chính phần tử đó.
  • Ưu điểm: Cực kỳ linh hoạt cho việc tạo các layout responsive, nơi bạn muốn các thành phần chiếm một tỷ lệ nhất định trong không gian có sẵn.
  • Nhược điểm: Do hành vi tham chiếu khác nhau cho từng thuộc tính, có thể gây khó hiểu và khó kiểm soát nếu không nắm vững. Đặc biệt là với paddingmargin theo chiều dọc, việc tham chiếu đến chiều rộng của phần tử cha có thể tạo ra những kết quả không mong muốn.

Ví dụ minh họa:

.container {  width: 500px;  height: 300px;  font-size: 16px;} .box {  width: 50%; /* 50% của 500px = 250px */  height: 30%; /* 30% của 300px = 90px */  font-size: 120%; /* 120% của 16px = 19.2px */  padding: 5%; /* 5% của 500px (chiều rộng của .container) = 25px (tất cả các cạnh) */}

4. Khi nào dùng cái nào? Lời khuyên "thực chiến"

Mỗi đơn vị có thế mạnh riêng. Dưới đây là cách bạn có thể kết hợp chúng:

  • Dùng rem làm gốc cho mọi thứ: Đây là khuyến nghị phổ biến nhất. Đặt font-size cho <html> (ví dụ 16px hoặc 100% để tương thích với cài đặt trình duyệt) và sử dụng rem cho hầu hết các font-size, margin, padding, và các khoảng cách khác. Điều này giúp bạn dễ dàng scale toàn bộ giao diện bằng cách thay đổi một giá trị duy nhất trên <html>.
  • Dùng em cho các thành phần "tự chứa" (self-contained components): Khi bạn có một component mà bạn muốn các phần tử bên trong nó co giãn theo font-size của chính component đó, em là lựa chọn tuyệt vời. Ví dụ, một nút bấm (button) có paddingline-height dùng em sẽ tự động điều chỉnh khi font-size của nút thay đổi.
  • Dùng % cho kích thước chiều rộng/cao của layout: Khi bạn muốn một phần tử chiếm một tỷ lệ nhất định trong không gian của phần tử cha (ví dụ: một cột chiếm 33.33% chiều rộng), % là lựa chọn tối ưu. Hãy cẩn thận với paddingmargin dùng % theo chiều dọc, nhớ rằng chúng tham chiếu đến chiều rộng của cha!
  • Dùng px khi cần độ chính xác tuyệt đối: Mặc dù chúng ta đang nói về đơn vị tương đối, px vẫn có chỗ đứng khi bạn cần kiểm soát pixel-perfect cho các đường viền (borders), đổ bóng (box-shadow) hoặc các chi tiết nhỏ không nên co giãn.

Kết luận

Việc nắm vững em, rem% không chỉ giúp bạn viết CSS hiệu quả hơn mà còn là chìa khóa để xây dựng giao diện responsive và dễ bảo trì. Hãy thử nghiệm, thực hành và chọn ra sự kết hợp phù hợp nhất cho dự án của mình. Chúc bạn thành công trong việc làm chủ kích thước trên web!