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
divrỗng có ảnh nền thì cao 0px. Hãy cho nó nội dung, padding,heighthoặcaspect-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 |
cover | Co giãn đến khi hộp được lấp đầy hoàn toàn; phần thừa bị cắt |
contain | Co giãn đến khi toàn bộ ảnh vừa khít; còn dải xám ở hai cạnh |
200px | Rộng 200px, chiều cao theo tỷ lệ |
50% auto | Bằ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ính | Tác dụng |
|---|---|
background-attachment: fixed | Ảnh đứng yên khi trang cuộn (bị bỏ qua trên Safari iOS) |
background-origin | Vị trí bắt đầu tính từ mép đường viền, padding hay nội dung |
background-clip | Nền được vẽ đến đâu, kể cả text để tô màu vào chữ |
background-blend-mode | Trộ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-repeatkhi dùngcontainhoặc ảnh nhỏ: ảnh sẽ bị lát lặp. - Kéo giãn bằng
100% 100%trong khi bạn muốncover. - 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ếturl("...").
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.