Menu

Ảnh nền CSS: background-size, position, repeat và cover

background-image đặt một ảnh hoặc gradient phía sau nội dung của phần tử. Tìm hiểu url() và gradient, background-size (cover và contain), background-position, background-repeat, xếp chồng nhiều lớp nền và cách viết rút gọn background.

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ách thêm ảnh nền

background-image vẽ một ảnh phía sau nội dung, padding và đường viền của phần tử. Theo mặc định, ảnh bắt đầu ở góc trên bên trái của vùng padding, giữ kích thước gốc và lặp lại để lấp đầy hộp:

Trong dự án thực tế, url() trỏ tới một tệp: url("images/hero.jpg"). Đường dẫn tính tương đối theo stylesheet chứa nó (hoặc theo trang, với phần tử <style>). Các ví dụ trên trang này dùng ảnh SVG nhỏ viết thẳng dưới dạng URL data: để chạy được ở bất kỳ đâu.

Hai điều cần biết ngay từ đầu:

  • Nền không tạo kích thước cho phần tử. Một div rỗng có ảnh nền thì cao 0px. Hãy cho nó nội dung, padding, height hoặc aspect-ratio.
  • Ảnh nền chỉ để trang trí. Trình đọc màn hình bỏ qua nó và nó không có văn bản alt. Ảnh mang ý nghĩa nội dung nên nằm trong phần tử <img>.

background-size: cover, contain và độ dài

background-size co giãn ảnh. Hai từ khóa đều giữ nguyên tỷ lệ của ảnh:

Ảnh có chiều rộng gấp đôi chiều cao, còn mỗi hộp là hình vuông.

Giá trịKết quả
auto (mặc định)Kích thước gốc của ảnh
coverCo giãn đến khi hộp được lấp đầy hoàn toàn; phần thừa bị cắt
containCo giãn đến khi toàn bộ ảnh vừa khít; còn dải xám ở hai cạnh
200pxRộng 200px, chiều cao theo tỷ lệ
50% autoBằng nửa chiều rộng hộp, chiều cao theo tỷ lệ
100% 100%Đúng bằng kích thước hộp; ảnh bị méo nếu tỷ lệ khác nhau

cover là lựa chọn quen thuộc cho banner lớn và thẻ. contain dành cho logo và hình minh họa không bao giờ được bị cắt.

background-position và background-repeat

background-position đặt vị trí ảnh trong hộp, bằng từ khóa (top, center, bottom, left, right), phần trăm hoặc độ dài. background-repeat điều khiển việc lát lặp. Thử vài giá trị:

Thử các vị trí top right, bottom 10px right 20px và 25% 75%, cùng các giá trị lặp repeat-x, repeat-y, space (lát có khoảng cách để không ô nào bị cắt) và round (đổi kích thước ô để vừa một số nguyên ô).

Xếp lớp: nhiều nền và lớp phủ chữ

background-image nhận một danh sách phân cách bằng dấu phẩy. Lớp đầu tiên được vẽ trên cùng. Cách dùng phổ biến là đặt một gradient bán trong suốt lên trên ảnh chụp để chữ trắng vẫn dễ đọc:

aspect-ratio cho hộp rỗng một chiều cao, và background-size: cover áp dụng cho cả hai lớp. Xem thêm công thức gradient ở gradient trong CSS.

Cách viết rút gọn background

background đặt mọi thuộc tính nền trên một dòng. Kích thước phải đứng ngay sau vị trí, ngăn cách bằng dấu gạch chéo, và màu nằm ở lớp cuối cùng:

.hero {
  background: url("hero.jpg") center / cover no-repeat, #1f2937;
}
/* the same as */
.hero {
  background-image: url("hero.jpg");
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  background-color: #1f2937;
}

Màu dự phòng hiện ra trong lúc ảnh đang tải và khi ảnh tải lỗi. Thuộc tính nào bạn bỏ ra khỏi cách viết rút gọn sẽ bị đặt lại về mặc định, nên hãy viết dạng rút gọn trước và các thuộc tính riêng lẻ sau.

Các thuộc tính nền khác

Thuộc tínhTác dụng
background-attachment: fixedẢnh đứng yên khi trang cuộn (bị bỏ qua trên Safari iOS)
background-originVị trí bắt đầu tính từ mép đường viền, padding hay nội dung
background-clipNền được vẽ đến đâu, kể cả text để tô màu vào chữ
background-blend-modeTrộn các lớp với nhau, như multiply

Lỗi thường gặp

  • Sai đường dẫn. url() trong stylesheet tính tương đối theo tệp CSS, không phải theo trang HTML.
  • Phần tử rỗng. Nó không có chiều cao, nên ảnh không có chỗ để hiện.
  • Quên no-repeat khi dùng contain hoặc ảnh nhỏ: ảnh sẽ bị lát lặp.
  • Kéo giãn bằng 100% 100% trong khi bạn muốn cover.
  • Dùng ảnh quan trọng làm nền. Hãy dùng <img> kèm văn bản alt cho nội dung; trình đọc màn hình không thấy ảnh nền.
  • Thiếu dấu nháy quanh URL data: có chứa khoảng trắng hoặc dấu nháy. Luôn viết url("...").

Câu hỏi thường gặp

Làm sao thêm ảnh nền trong CSS?

Dùng background-image: url("photo.jpg"); cho phần tử. Đường dẫn tính tương đối theo tệp CSS (hoặc theo trang, với thuộc tính style hay phần tử <style>). Hãy cho phần tử một kích thước, vì nền không bao giờ làm phần tử rỗng lớn lên.

Làm sao cho ảnh nền phủ kín cả phần tử?

Dùng background-size: cover; cùng background-position: center;. Ảnh được co giãn để lấp đầy hộp, giữ nguyên tỷ lệ, và phần thừa bị cắt đi.

cover và contain khác nhau thế nào?

cover lấp đầy cả hộp và cắt phần không vừa. contain hiển thị toàn bộ ảnh và để lại khoảng trống ở hai cạnh khi tỷ lệ khác nhau.

Làm sao để ảnh nền không lặp lại?

Thêm background-repeat: no-repeat;. Theo mặc định, ảnh nền được lát lặp lại theo cả hai chiều để lấp đầy phần tử.

Vì sao ảnh nền của tôi không hiện?

Nguyên nhân thường gặp là sai đường dẫn trong url() (đường dẫn tính theo tệp CSS), phần tử không có chiều cao vì không có nội dung, hoặc một khai báo background rút gọn phía sau đã đặt lại ảnh.

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