Menu

Cách căn giữa ảnh trong HTML và CSS

Thẻ <img> là phần tử inline, nên nó được căn giữa như chữ: text-align: center trên phần tử cha. Hoặc biến nó thành khối với margin: 0 auto, hay căn giữa bằng flexbox hoặc grid, kể cả theo chiều dọc. Mỗi cách đều chạy trực tiếp và đo kết quả.

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.

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ốngDùng
Ảnh trong một đoạn văn hoặc một khối đơn giảntext-align: center trên phần tử cha
Bạn chỉ đặt style được cho ảnhdisplay: block; margin: 0 auto;
Căn giữa theo cả hai hướng bên trong một hộpGrid place-items: center (hoặc flexbox) trên hộp
Một hàng ảnhFlexbox 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 dungbackground-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: center trên <img>. Hãy đặt nó trên phần tử cha.
  • margin: 0 auto trên ảnh inline. Thêm display: 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ùng alt="" cho ảnh thuần trang trí.
  • Ảnh bị kéo giãn. Đặt cả width và height trong CSS với tỉ lệ khác ảnh gốc sẽ làm méo ảnh. Chỉ đặt một giá trị và dùng height: auto, hoặc thêm object-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.

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