Cách kéo giãn hình nền để lấp đầy một div


102

Tôi muốn đặt hình nền thành các div khác nhau, nhưng vấn đề của tôi là:

  1. Kích thước của hình ảnh là cố định (60px).
  2. Thay đổi kích thước của div

Làm cách nào để kéo giãn hình nền để lấp đầy toàn bộ nền của div?

#div2{
  background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
  height:180px;
  width:200px;
  border: 1px solid red;
}

Kiểm tra mã ở đây.

Câu trả lời:


154

Thêm vào

background-size:100% 100%;

vào css của bạn bên dưới hình nền.

Bạn cũng có thể chỉ định kích thước chính xác, tức là:

background-size: 30px 40px;

Đây: JSFiddle


5
IE không hỗ trợ điều này. Muốn làm gì?
KarSho

9
nó không hoạt động, hãy xem bên dưới để có câu trả lời tốt hơn: background-size: 100% 100%;
chriscatfr

Tại sao nó nhân thay vì kéo dài hình ảnh để phù hợp với container: jsfiddle.net/qdzaw/424
SearchForKnowledge

Bạn cần phải thêmbackground-repeat: no-repeat;
Rorrik

1
hendo, JSFiddle của bạn không còn hoạt động nữa (liên kết chết đến hootsuite), bạn có thể cập nhật nó được không?
TylerH

71

Bạn có thể dùng:

background-size: cover;

Hoặc chỉ sử dụng hình nền lớn với:

background: url('../images/teaser.jpg') no-repeat center #eee;

3
bìa không giãn, nó có thể cắt ảnh
drdrej

Tôi không biết những gì bạn đang cố gắng để làm với img nền của bạn nhưng background-size: cover; background-position: centersẽ điền vào nền của divmà không kéo dài hình ảnh
Ouadie

1
Hoạt động tuyệt vời cho những bức ảnh mà việc kéo giãn sẽ làm biến dạng hình ảnh!
Stijn Van Bael

45

CSS3 hiện đại (được khuyến nghị cho tương lai và có lẽ là giải pháp tốt nhất)

.selector{
   background-size: cover;
   /* stretches background WITHOUT deformation so it would fill the background space,
      it may crop the image if the image's dimensions are in different ratio,
      than the element dimensions. */
}

Tối đa căng mà không cắt cũng không biến dạng (có thể không lấp đầy nền) : background-size: contain;
Buộc kéo căng tuyệt đối (có thể gây biến dạng, nhưng không cắt) : background-size: 100% 100%;

Cách CSS "cũ" "luôn hoạt động"

Hình ảnh định vị tuyệt đối khi là hình ảnh con đầu tiên của cha mẹ (định vị tương đối) và kéo dài nó đến kích thước gốc.

HTML

<div class="selector">
   <img src="path.extension" alt="alt text">
   <!-- some other content -->
</div>

Tương đương với CSS3 background-size: cover;:

Để đạt được điều này động, bạn sẽ phải sử dụng phương thức thay thế đối lập với phương thức chứa (xem bên dưới) và nếu bạn cần căn giữa hình ảnh đã cắt, bạn sẽ cần JavaScript để thực hiện điều đó động - ví dụ: sử dụng jQuery:

$('.selector img').each(function(){ 
   $(this).css({ 
      "left": "50%", 
      "margin-left": "-"+( $(this).width()/2 )+"px", 
      "top": "50%", 
      "margin-top": "-"+( $(this).height()/2 )+"px" 
   }); 
});

Ví dụ thực tế:
css crop như ví dụ

Tương đương với CSS3 background-size: contain;:

Điều này có thể hơi phức tạp - thứ nguyên của nền của bạn sẽ làm tràn phần gốc sẽ có CSS ​​được đặt thành 100% còn lại là tự động. Ví dụ thực tế: css kéo dài nền như hình ảnh

.selector img{
   position: absolute; top:0; left: 0;
   width: 100%;
   height: auto;
   /* -- OR -- */
   /* width: auto; 
      height: 100%; */
}

Tương đương với CSS3 background-size: 100% 100%;:

.selector img{
   position: absolute; top:0; left: 0;
   width: 100%;
   height: 100%;
}

Tái bút: Để thực hiện các thao tác tương đương của bìa / chứa theo cách "cũ" hoàn toàn động (vì vậy bạn sẽ không phải quan tâm đến tràn / tỷ lệ), bạn sẽ phải sử dụng javascript để phát hiện tỷ lệ cho bạn và đặt kích thước như được mô tả. ..


2
Cách trả lời đầy đủ hơn câu trả lời "Bìa" khác. Thật không may, nó là cách mắc kẹt xuống đây gần phía dưới ...
BillyNair

24

Đối với điều này, bạn có thể sử dụng thuộc tính CSS3 background-size. Viết như thế này:

#div2{
    background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
    -moz-background-size:100% 100%;
    -webkit-background-size:100% 100%;
    background-size:100% 100%;
    height:180px;
    width:200px;
    border: 1px solid red;
}

Kiểm tra cái này: http://jsfiddle.net/qdzaw/1/


1
IE không hỗ trợ điều này. Muốn làm gì?
KarSho

4
Đối với IE sử dụng thẻ IMG cho vị trí tuyệt đối với chiều cao và chiều rộng 100%.
sandeep

20

Bạn có thể thêm:

#div2{
    background-image:url(http://s7.static.hootsuite.com/3-0-48/images/themes/classic/streams/message-gradient.png);
    background-size: 100% 100%;
    height:180px;
    width:200px;
    border: 1px solid red;
}

Bạn có thể đọc thêm về nó ở đây: css3 background-size


3
Tốt hơn nhiều so với câu trả lời được chấp nhận, điều này cho bạn thấy rằng kích thước nền chấp nhận 2 giá trị cho chiều rộng và chiều cao.
krb686

background-size kích thước là một css3 và không được hỗ trợ trong tất cả các trình duyệt
Mahdi Jazini

2
body{
  margin:0;
  background:url('image.png') no-repeat 50% 50% fixed;
  background-size: cover;
}

1

bằng cách sử dụng thuộc tính css:

background-size: cover;

background-size kích thước là một css3 và không được hỗ trợ trong tất cả các trình duyệt
Mahdi Jazini

1

Sử dụng: background-size: 100% 100%; Để tạo hình nền cho phù hợp với kích thước div.


Đây là những gì tôi đang tìm kiếm - kéo dài cho vừa vặn mà không cần quan tâm đến tỷ lệ khung hình của bản gốc. Cảm ơn.
dgig 19/09/18

0

Để giữ nguyên tỷ lệ khung hình, hãy sử dụng background-size: 100% auto;

div {
    background-image: url('image.jpg');
    background-size: 100% auto;
    width: 150px;
    height: 300px;
}

0

Hãy thử một cái gì đó như sau:

div {
    background-image: url(../img/picture1.jpg);
    height: 30em;
    background-repeat: no-repeat;
    width: 100%;
    background-position: center;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.