Menu

Margin và padding trong CSS: khác nhau thế nào?

Padding là khoảng trống bên trong viền của phần tử; margin là khoảng trống bên ngoài viền. Xem cả hai trên cùng một hộp, đặt cạnh nhau và chạy trực tiếp, rồi tìm hiểu nên dùng cái nào cho nền, vùng bấm, khoảng cách giữa các phần tử và căn giữa.

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.

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

PaddingMargin
Vị tríBên trong viềnBên ngoài viền
NềnHiện nền của phần tửLuôn trong suốt
Thuộc vùng bấmCóKhông
Cộng vào kích thước phần tửCó, với content-boxKhông
Nhận autoKhôngCó (margin: 0 auto để căn giữa)
Nhận giá trị âmKhôngCó
Giá trị theo chiều dọc bị gộpKhông bao giờCó, các margin dọc liền kề bị gộp
Phần trăm tính theoChiều rộng của khối chứaChiều rộng của khối chứa
Dùng điển hìnhKhoảng trống trong nút, thẻ, ô nhậpKhoả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 gap khi 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ận auto.
  • Quên rằng padding làm hộp to ra. Thêm box-sizing: border-box để width tí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.

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