Câu trả lời nhanh: text-align trên phần tử cha
Thẻ <img> là phần tử inline: nó nằm trong dòng chữ giống như một từ. Vì vậy bạn căn giữa nó theo đúng cách căn giữa chữ, với text-align: center trên phần tử cha:
Style đặt trên div, không đặt trên ảnh. Đặt text-align: center trên chính <img> không có tác dụng gì, vì bên trong ảnh không có chữ nào để căn.
Cách 2: display block và margin auto
Nếu bạn muốn đặt style cho chính ảnh, hãy biến nó thành khối và cho nó margin hai bên tự động. Khoảng trống ở hai bên được chia đều:
Ảnh màu xám có margin: 0 auto nhưng vẫn nằm ở đầu dòng: margin tự động không có tác dụng với phần tử inline. display: block chính là mảnh ghép còn thiếu. max-width: 100% cùng height: auto giữ cho ảnh không tràn ra ngoài màn hình hẹp mà vẫn giữ đúng tỉ lệ.
Cách 3: flexbox hoặc grid, kể cả căn giữa theo chiều dọc
Để căn giữa ảnh theo cả hai hướng bên trong một hộp, đặt chiều cao cho hộp và căn giữa nội dung của nó bằng grid hoặc flexbox:
Cách viết tương đương bằng flexbox là display: flex; justify-content: center; align-items: center;. Dù dùng cách nào, hộp cũng cần chiều cao lớn hơn ảnh, nếu không sẽ không có khoảng trống để căn giữa. Các cách này căn giữa được mọi phần tử; trang căn giữa div so sánh tất cả các cách đó.
Căn giữa ảnh có chú thích
Một bức ảnh có chú thích nên nằm trong <figure>. Căn giữa nội dung của figure, ảnh và chú thích sẽ thẳng hàng cùng nhau:
Nhiều ảnh trên một hàng ở giữa
Một hàng logo hoặc ảnh thu nhỏ là việc của flexbox. justify-content: center căn giữa cả nhóm, gap tạo khoảng cách, và flex-wrap cho phép xuống dòng trên màn hình nhỏ mà vẫn giữ ở giữa:
Nên dùng cách nào
| Tình huống | Dùng |
|---|---|
| Ảnh trong một đoạn văn hoặc một khối đơn giản | text-align: center trên phần tử cha |
| Bạn chỉ đặt style được cho ảnh | display: block; margin: 0 auto; |
| Căn giữa theo cả hai hướng bên trong một hộp | Grid place-items: center (hoặc flexbox) trên hộp |
| Một hàng ảnh | Flexbox với justify-content: center |
| Ảnh có chú thích | <figure> với text-align: center |
| Ảnh nền, không phải nội dung | background-position: center, xem background-image |
Những cách cũ, và vì sao không nên dùng
Bạn vẫn sẽ gặp những cách này trong các bài hướng dẫn cũ:
<!-- obsolete: do not use -->
<center><img src="logo.png" alt="Logo"></center>
<img src="logo.png" alt="Logo" align="center">
<center> và thuộc tính align đã bị loại khỏi HTML. Trình duyệt vẫn hiển thị <center> để tương thích ngược, còn align="center" trên ảnh thậm chí không căn giữa theo chiều ngang: trình duyệt coi nó là căn chỉnh theo chiều dọc trong dòng. Hãy dùng một trong các cách CSS ở trên.
Lỗi thường gặp
text-align: centertrên<img>. Hãy đặt nó trên phần tử cha.margin: 0 autotrên ảnh inline. Thêmdisplay: block.- Căn giữa theo chiều dọc khi phần tử cha không có chiều cao. Hộp co lại vừa ảnh, không còn khoảng trống để căn giữa.
float: center. Không có giá trị này. Float chỉ đẩy phần tử sang một bên.- Quên
alt. Ảnh đã căn giữa vẫn cần văn bản thay thế; chỉ dùngalt=""cho ảnh thuần trang trí. - Ảnh bị kéo giãn. Đặt cả
widthvàheighttrong CSS với tỉ lệ khác ảnh gốc sẽ làm méo ảnh. Chỉ đặt một giá trị và dùngheight: auto, hoặc thêmobject-fit: cover.
Câu hỏi thường gặp
Làm sao căn giữa ảnh trong HTML?
Đặt text-align: center cho phần tử chứa ảnh, ví dụ <p style="text-align: center;"><img src="logo.png" alt="Logo"></p>. Mặc định ảnh là phần tử inline, nên nó được căn giữa như một từ trong đoạn chữ.
Làm sao căn giữa ảnh bằng margin auto?
Trước hết biến ảnh thành khối: img { display: block; margin: 0 auto; }. Margin tự động không căn giữa phần tử inline, và ảnh vẫn là inline cho đến khi bạn đổi nó.
Làm sao căn giữa ảnh theo cả chiều dọc và chiều ngang?
Biến phần tử chứa ảnh thành grid (hoặc flexbox) có chiều cao: .box { display: grid; place-items: center; height: 300px; }. Khi đó ảnh nằm ngay giữa hộp.
Có thể dùng thẻ <center> hoặc align="center" để căn giữa ảnh không?
Không. <center> và thuộc tính align trên <img> đã lỗi thời trong HTML5. Trình duyệt vẫn hiển thị <center> cho các trang cũ, nhưng align="center" trên ảnh lại căn ảnh theo chiều dọc trong dòng, không phải chiều ngang. Hãy dùng CSS.
Vì sao có một khoảng trống nhỏ dưới ảnh đã căn giữa?
Ảnh inline nằm trên đường cơ sở của chữ, chừa chỗ bên dưới cho phần đuôi của các ký tự như g, p, y. Đặt display: block cho ảnh, hoặc vertical-align: middle, và khoảng trống sẽ biến mất.