Menu

Margin trong CSS: viết tắt, margin auto và margin gộp

Margin là khoảng trống trong suốt bên ngoài viền của phần tử, đẩy các phần tử khác ra xa. Tìm hiểu cách viết tắt margin, căn giữa với margin: 0 auto, margin âm, margin auto trong flexbox và vì sao các margin dọc bị gộp.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Margin là gì

Margin là khoảng trống bên ngoài viền của phần tử. Nó luôn trong suốt, và nhiệm vụ của nó là đẩy các phần tử khác ra xa. Trong ví dụ, phần tử chứa màu xám lộ ra qua margin quanh hộp xanh:

Dải xám không thuộc về hộp: nền của chính hộp dừng ở viền. Với khoảng trống cần mang nền của phần tử, hãy dùng padding.

Cách viết tắt margin

margin nhận từ một đến bốn giá trị, theo cùng thứ tự chiều kim đồng hồ như padding:

Khai báoTrênPhảiDướiTrái
margin: 10px;10101010
margin: 10px 20px;10201020
margin: 10px 20px 30px;10203020
margin: 10px 20px 30px 40px;10203040

Mỗi cạnh cũng có thuộc tính riêng (margin-top, margin-right, margin-bottom, margin-left) và các phiên bản logic đi theo hướng chữ (margin-inline-start, margin-inline-end, margin-block, margin-inline).

Khác với padding, margin nhận auto và giá trị âm:

Giá trịVí dụGhi chú
Độ dài16px, 1.5remPhổ biến nhất
Phần trăm5%Tính theo chiều rộng của khối chứa, cho cả bốn cạnh
automargin: 0 autoTrình duyệt tự lấp phần khoảng trống còn dư
Âmmargin-top: -10pxKéo phần tử hoặc phần tử bên cạnh lại gần, có thể chồng lên nhau

Căn giữa với margin: 0 auto

margin: 0 auto là cách kinh điển để căn giữa một khối theo chiều ngang. auto ở hai bên bảo trình duyệt chia đều khoảng trống còn dư. Phần tử cần có chiều rộng nhỏ hơn phần tử chứa, nếu không sẽ chẳng còn gì để chia:

Margin auto không căn giữa theo chiều dọc trong luồng thông thường (margin auto theo chiều dọc thành 0) và không có tác dụng với phần tử inline. Để xem toàn cảnh các cách căn giữa, hãy đọc cách căn giữa một div.

Margin gộp

Khi hai margin dọc chạm nhau, chúng không cộng lại. Trình duyệt chỉ giữ margin lớn hơn. Ở đây hộp đầu có margin-bottom: 30px và hộp thứ hai có margin-top: 20px, nhưng khoảng cách giữa chúng là 30px chứ không phải 50px:

Việc gộp là có chủ đích: nó cho phép đoạn văn và tiêu đề tự mang khoảng cách của mình mà không bị nhân đôi ở chỗ chúng gặp nhau. Nhiều người bị bất ngờ ở trường hợp thứ hai, khi margin trên của phần tử con thoát ra khỏi phần tử cha:

Ở phần tử cha đầu tiên, margin 30px của phần tử con đã gộp xuyên qua cạnh trên của cha, nên nó đẩy cả phần tử cha xuống thay vì tạo khoảng xám bên trong. Bất kỳ cách nào sau đây cũng ngăn được:

  • display: flow-root trên phần tử cha (khác với overflow: hidden, nó không cắt mất gì).
  • Padding hoặc viền ở cạnh trên của phần tử cha.
  • Phần tử cha là flex hoặc grid: margin của các mục flex và grid không bao giờ bị gộp.

Margin ngang không bao giờ bị gộp, margin của phần tử float hay được định vị tuyệt đối cũng vậy.

Margin âm

Margin âm kéo theo hướng ngược lại. Ở cạnh trên hoặc cạnh đầu, nó dịch chính phần tử; ở cạnh dưới hoặc cạnh cuối, nó kéo phần tử kế tiếp lại gần. Các hộp có thể chồng lên nhau:

margin auto trong flexbox

Trong một flex container, margin auto chiếm toàn bộ khoảng trống còn dư ở phía của nó. Đây là cách đơn giản nhất để đẩy một mục ra tận cuối hàng, và trong flexbox thì auto cũng hoạt động theo chiều dọc:

margin-inline-start: auto đặt khoảng trống dư trước "Log in", nên mục này nằm ở cuối hàng cả trên trang trái sang phải lẫn trang phải sang trái.

Lỗi thường gặp

  • margin: 0 auto trên phần tử không có chiều rộng. Khối vốn đã lấp đầy phần tử chứa; hãy đặt width hoặc max-width.
  • margin: auto trên phần tử inline. Margin auto trên span, a hay img để inline đều bằng 0. Hãy chuyển nó thành display: block.
  • Cộng hai margin dọc và mong ra tổng. Chúng gộp lại thành margin lớn hơn; hãy dùng gap trong flex hoặc grid, hoặc chỉ dùng margin theo một hướng một cách nhất quán.
  • Margin của phần tử con đẩy cả phần tử cha. Đó là gộp giữa cha và con; hãy thêm display: flow-root cho phần tử cha.
  • Dùng margin cho khoảng trống cần có nền. Margin trong suốt; hãy dùng padding.

Câu hỏi thường gặp

Margin trong CSS là gì?

Margin là khoảng trống bên ngoài viền của phần tử. Nó trong suốt và đẩy các phần tử bên cạnh ra xa. Bạn đặt nó bằng margin hoặc các thuộc tính cho từng cạnh margin-top, margin-right, margin-bottom và margin-left.

margin: 0 auto có tác dụng gì?

Nó đặt margin trên và dưới bằng 0, rồi chia đều khoảng trống ngang còn dư cho margin trái và phải, nhờ đó căn giữa một phần tử khối theo chiều ngang. Phần tử cần có chiều rộng nhỏ hơn phần tử chứa, ví dụ max-width: 600px.

Vì sao margin auto không căn giữa được phần tử?

Thường là do phần tử không có chiều rộng (một khối tự lấp đầy phần tử chứa, nên không còn gì để chia), hoặc do nó là phần tử inline (span, a, img theo mặc định), mà ở đó margin auto bằng 0. Hãy đặt chiều rộng và display: block, hoặc căn giữa từ phần tử cha bằng flexbox hay grid.

Margin gộp (margin collapsing) là gì?

Khi hai margin dọc gặp nhau, ví dụ margin dưới của một đoạn văn và margin trên của đoạn kế tiếp, trình duyệt chỉ dùng margin lớn hơn thay vì cộng hai margin lại. Hiện tượng này chỉ xảy ra với margin dọc của các hộp khối trong luồng thông thường, không xảy ra trong bố cục flex hay grid.

Margin có thể âm không?

Có. Margin âm kéo phần tử về phía cạnh đó, hoặc kéo phần tử kế tiếp đè lên nó, nên các hộp có thể chồng lên nhau. Nó hữu ích để chỉnh căn lề nhỏ và để cho một phần tử vượt ra ngoài padding của phần tử chứa.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu