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áo | Trên | Phải | Dưới | Trái |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
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ài | 16px, 1.5rem | Phổ biến nhất |
| Phần trăm | 5% | Tính theo chiều rộng của khối chứa, cho cả bốn cạnh |
auto | margin: 0 auto | Trình duyệt tự lấp phần khoảng trống còn dư |
| Âm | margin-top: -10px | Ké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-roottrên phần tử cha (khác vớioverflow: 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 autotrê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 đặtwidthhoặcmax-width.margin: autotrên phần tử inline. Margin auto trênspan,ahayimgđể inline đều bằng 0. Hãy chuyển nó thànhdisplay: 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
gaptrong 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-rootcho 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.