Khác biệt trong một hình
Padding nằm bên trong viền. Margin nằm bên ngoài viền. Hai hộp dưới đây có cùng nội dung và cùng giá trị 24px; chỉ khác thuộc tính. Màu xám là phần tử chứa phía sau.
Với padding, 24px có màu xanh: nó là một phần của hộp, nằm trong viền, và hộp to ra. Với margin, 24px có màu xám: hộp vẫn ôm sát chữ, còn khoảng trống bên ngoài đẩy các cạnh của phần tử chứa ra xa.
Thử cả hai trên một hộp
Kéo hai thanh trượt. Padding làm hộp xanh to ra; margin đẩy hộp ra xa các cạnh xám mà không làm hộp thay đổi.
Để ý dòng kích thước: nó thay đổi khi bạn kéo thanh padding và giữ nguyên khi bạn kéo thanh margin.
So sánh nhanh margin và padding
| Padding | Margin | |
|---|---|---|
| Vị trí | Bên trong viền | Bên ngoài viền |
| Nền | Hiện nền của phần tử | Luôn trong suốt |
| Thuộc vùng bấm | Có | Không |
| Cộng vào kích thước phần tử | Có, với content-box | Không |
Nhận auto | Không | Có (margin: 0 auto để căn giữa) |
| Nhận giá trị âm | Không | Có |
| Giá trị theo chiều dọc bị gộp | Không bao giờ | Có, các margin dọc liền kề bị gộp |
| Phần trăm tính theo | Chiều rộng của khối chứa | Chiều rộng của khối chứa |
| Dùng điển hình | Khoảng trống trong nút, thẻ, ô nhập | Khoảng cách giữa các phần tử, căn giữa |
Mỗi thuộc tính có trang riêng với đầy đủ chi tiết: padding trong CSS và margin trong CSS.
Nên dùng cái nào
Chỉ cần tự hỏi một câu: khoảng trống này thuộc về phần tử, hay nằm giữa các phần tử?
- Chỗ trống quanh nhãn của nút, phần bên trong thẻ, khoảng cách giữa chữ trong ô nhập và viền của nó: padding. Nó mang nền và làm vùng bấm lớn hơn.
- Khoảng cách giữa hai đoạn văn, giữa các thẻ, quanh một phần trang: margin, hoặc
gapkhi phần tử cha là flex hay grid container.
Vùng bấm là nơi lựa chọn này quan trọng nhất. Hai liên kết dưới đây chiếm cùng một khoảng trên trang, nhưng khoảng trống của liên kết đầu là padding, còn của liên kết thứ hai là margin. Chỉ liên kết đầu là dễ bấm trúng:
Đường viền nét đứt màu hổ phách là mép của phần tử, cũng là vùng phản hồi khi bấm chuột hay chạm. Margin quanh liên kết thứ hai chỉ là khoảng trống không làm gì cả.
Khoảng cách giữa các mục: margin hay gap
Với một hàng hoặc lưới các mục, gap trên phần tử cha flex hay grid thường gọn hơn margin trên từng phần tử con: nó chỉ nằm giữa các mục, không bao giờ ở trước mục đầu hay sau mục cuối, nên không có gì phải gỡ lại.
Ở đây phần tử chứa màu xám dùng padding (khoảng trống bên trong nó, màu xám), các mục dùng padding (khoảng trống bên trong từng mục, màu xanh lá), còn gap lo khoảng cách giữa chúng.
Lỗi thường gặp
- Dùng margin cho khoảng trống cần có màu. Margin trong suốt. Nếu khoảng trống cần hiện nền thì đó là padding.
- Dùng margin để làm liên kết to hơn. Vùng bấm dừng ở viền; hãy dùng padding.
- Mong hai margin dọc 20px cộng lại thành 40px. Các margin dọc liền kề gộp lại còn 20px. Padding không bao giờ bị gộp.
- Thử
padding: autođể căn giữa. Chỉ margin mới nhậnauto. - Quên rằng padding làm hộp to ra. Thêm
box-sizing: border-boxđểwidthtính cả padding.
Câu hỏi thường gặp
Margin và padding khác nhau thế nào?
Padding là khoảng trống giữa nội dung và viền của phần tử, nằm bên trong phần tử. Margin là khoảng trống bên ngoài viền, giữa phần tử và các phần tử bên cạnh. Padding hiện nền của phần tử; margin thì luôn trong suốt.
Khi nào nên dùng padding thay cho margin?
Dùng padding cho khoảng trống thuộc về chính phần tử: chỗ trống quanh chữ trên nút, phần bên trong thẻ, bất cứ thứ gì cần chung nền hoặc cần bấm được. Dùng margin (hoặc gap trong flex và grid) cho khoảng cách giữa các phần tử riêng biệt.
Padding hay margin làm phần tử to ra?
Padding thì có, với mặc định box-sizing: content-box: nó được cộng vào chiều rộng và chiều cao. Margin không bao giờ được cộng vào kích thước phần tử; nó thêm khoảng trống xung quanh (một khối có width: auto thậm chí còn hẹp lại, vì margin chiếm một phần chiều rộng sẵn có). Với box-sizing: border-box, padding được lấy từ bên trong chiều rộng.
Padding có thể âm như margin không?
Không. Padding âm là không hợp lệ và bị bỏ qua, còn margin âm thì được phép và có thể làm các phần tử chồng lên nhau. Padding cũng không nhận auto, vì vậy căn giữa phải dùng margin: 0 auto.