Hình nền chiều rộng 100% với chiều cao 'tự động'


89

Tôi hiện đang làm việc trên trang đích di động cho một công ty. Đó là một bố cục thực sự cơ bản nhưng bên dưới tiêu đề có hình ảnh của một sản phẩm sẽ luôn có chiều rộng 100% (thiết kế cho thấy nó luôn đi từ cạnh này sang cạnh khác). Tùy thuộc vào chiều rộng của màn hình mà chiều cao của hình ảnh rõ ràng sẽ điều chỉnh cho phù hợp. Ban đầu tôi đã làm điều này với một img (với chiều rộng CSS là 100%) và nó hoạt động tốt nhưng tôi nhận ra rằng tôi muốn sử dụng các truy vấn phương tiện để cung cấp các hình ảnh khác nhau dựa trên các độ phân giải khác nhau - giả sử nhỏ, vừa và một phiên bản lớn của cùng một hình ảnh, chẳng hạn. Tôi biết bạn không thể thay đổi img src bằng CSS vì vậy tôi nghĩ rằng tôi nên sử dụng nền CSS cho hình ảnh thay vì thẻ img trong HTML.

Tôi dường như không thể làm cho điều này hoạt động bình thường vì div có hình nền cần cả chiều rộng và chiều cao để hiển thị nền. Tôi rõ ràng có thể sử dụng 'width: 100%' nhưng tôi sử dụng gì cho chiều cao? Tôi có thể đặt một chiều cao cố định ngẫu nhiên như 150px và sau đó tôi có thể thấy 150px trên cùng của hình ảnh nhưng đây không phải là giải pháp vì không có chiều cao cố định. Tôi đã chơi thử và thấy rằng khi có chiều cao (được thử nghiệm với 150px), tôi có thể sử dụng 'background-size: 100%' để khớp hình ảnh trong div một cách chính xác. Tôi có thể sử dụng CSS3 mới hơn cho dự án này vì nó chỉ nhắm đến thiết bị di động.

Tôi đã thêm một ví dụ sơ bộ bên dưới. Xin thứ lỗi cho các kiểu nội tuyến nhưng tôi muốn đưa ra một ví dụ cơ bản để thử và làm cho câu hỏi của tôi rõ ràng hơn một chút.

<div id="image-container">
    <div id="image" style="background: url(image.jpg) no-repeat; width: 100%; height: 150px; background-size: 100%;"></div>
</div>

Tôi có thể phải cung cấp cho phần trăm chiều cao div của vùng chứa dựa trên toàn bộ trang hay tôi đang nhìn điều này hoàn toàn sai?

Ngoài ra, bạn có nghĩ rằng nền CSS là cách tốt nhất để làm điều này? Có thể có một kỹ thuật phân phát các thẻ img khác nhau dựa trên thiết bị / chiều rộng màn hình. Ý tưởng chung là mẫu trang đích sẽ được sử dụng nhiều lần với các hình ảnh sản phẩm khác nhau, vì vậy tôi cần đảm bảo rằng mình phát triển mẫu này theo cách tốt nhất có thể.

Tôi xin lỗi vì điều này hơi dài dòng nhưng tôi đang quay lại từ dự án này sang dự án tiếp theo nên tôi muốn hoàn thành việc nhỏ này. Cảm ơn trước cho thời gian của bạn, nó rất được đánh giá cao. Trân trọng


Một trình duyệt có thể lựa chọn không tải một nguồn tài nguyên hình ảnh nếu nó có display: none, vì vậy bạn luôn có thể hiển thị hình ảnh khác nhau với các truy vấn phương tiện truyền thông mà không cần JS
Bến Taliadoros

Câu trả lời:


16

Thay vì sử dụng, background-imagebạn có thể sử dụng imgtrực tiếp và để hình ảnh trải rộng toàn bộ chiều rộng của khung nhìn, hãy thử sử dụng max-width:100%;và hãy nhớ không áp dụng bất kỳ phần đệm hoặc lề nào cho div vùng chứa chính của bạn vì chúng sẽ làm tăng tổng chiều rộng của vùng chứa. Sử dụng quy tắc này, bạn có thể có chiều rộng hình ảnh bằng chiều rộng của trình duyệt và chiều cao cũng sẽ thay đổi theo tỷ lệ khung hình. Cảm ơn.

Chỉnh sửa: Thay đổi hình ảnh trên các kích thước khác nhau của cửa sổ

$(window).resize(function(){
  var windowWidth = $(window).width();
  var imgSrc = $('#image');
  if(windowWidth <= 400){			
    imgSrc.attr('src','http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a');
  }
  else if(windowWidth > 400){
    imgSrc.attr('src','http://i.stack.imgur.com/oURrw.png');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="image-container">
  <img id="image" src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a" alt=""/>
</div>

Bằng cách này, bạn thay đổi hình ảnh của mình ở kích thước khác nhau của trình duyệt.


Cảm ơn bạn đã dành thời gian để làm điều này cho tôi, nó rất được đánh giá cao. Tôi chỉ làm nhanh và có vẻ như nó đang hoạt động.
Darryl Young

2
Câu trả lời cũ này trông hấp dẫn ... nhưng có phải trình duyệt di động sẽ vẫn tải xuống (chỉ là không hiển thị) hình ảnh ban đầu được đặt trong HTML dưới dạng src? Nếu vậy, đó là cách không bắt đầu, vì mục đích là tiết kiệm tài nguyên của thiết bị di động.
Tim Gallant

1
Tôi tin rằng Tim Gallant đã đúng về vấn đề này - trong trường hợp này, trình duyệt sẽ tải cả hai hình ảnh dưới dạng tài nguyên và sau đó chỉ hiển thị hình ảnh có độ phân giải thấp hơn. Vì vậy, mặc dù điều này có vẻ hấp dẫn, nhưng trên thiết bị di động, nó thực sự chậm hơn so với chỉ tải ảnh có độ phân giải cao và với sự hy sinh đó, bạn sẽ chỉ thấy hình ảnh có độ phân giải thấp hơn ... tệ nhất trong cả hai thế giới.
người đàn ông tí hon nhỏ bé

1
Câu trả lời kém. Bị phản đối. Chỉ đơn giản là mã cồng kềnh và cũ.
TheBlackBenzKid

Chèn câu truy vấn phương tiện truyền thông mà add display: none đến những hình ảnh bạn không muốn hiển thị - hầu hết các trình duyệt sẽ không tải chúng
Bến Taliadoros

213

Tim S. đã tiến gần đến câu trả lời "đúng" hơn câu trả lời hiện được chấp nhận. Nếu bạn muốn có hình nền 100% chiều rộng, chiều cao thay đổi được thực hiện bằng CSS, thay vì sử dụng cover(điều này sẽ cho phép hình ảnh mở rộng ra từ các bên) hoặc contain(không cho phép hình ảnh mở rộng ra), chỉ cần đặt CSS như vậy:

body {
    background-image: url(img.jpg);
    background-position: center top;
    background-size: 100% auto;
}

Điều này sẽ đặt hình nền của bạn thành 100% chiều rộng và cho phép chiều cao tràn ra. Giờ đây, bạn có thể sử dụng các truy vấn phương tiện để hoán đổi hình ảnh đó thay vì dựa vào JavaScript.

CHỈNH SỬA: Tôi vừa nhận ra (3 tháng sau) rằng bạn có thể không muốn hình ảnh tràn; bạn dường như muốn phần tử vùng chứa thay đổi kích thước dựa trên hình nền của nó (để bảo toàn tỷ lệ co), điều này không thể thực hiện được với CSS theo như tôi biết.

Hy vọng rằng bạn sẽ sớm có thể sử dụng thuộc tính srcset mới trên imgphần tử. Nếu bạn muốn sử dụng imgcác phần tử ngay bây giờ, câu trả lời hiện được chấp nhận có lẽ là tốt nhất.

Tuy nhiên, bạn có thể tạo phần tử hình nền đáp ứng với tỷ lệ khung hình không đổi bằng cách sử dụng CSS thuần túy. Để làm điều này, bạn đặt thành height0 và đặt thành padding-bottomphần trăm chiều rộng của phần tử, như sau:

.foo {
    height: 0;
    padding: 0; /* remove any pre-existing padding, just in case */
    padding-bottom: 75%; /* for a 4:3 aspect ratio */
    background-image: url(foo.png);
    background-position: center center;
    background-size: 100%;
    background-repeat: no-repeat;
}

Để sử dụng các tỷ lệ khung hình khác nhau, hãy chia chiều cao của hình ảnh gốc cho chiều rộng của chính nó và nhân với 100 để có giá trị phần trăm. Điều này hoạt động vì phần trăm đệm luôn được tính dựa trên chiều rộng, ngay cả khi đó là phần đệm dọc.


4
hoàn hảo, tìm kiếm google nhanh chóng đã đưa tôi đến đây, vấn đề đã được giải quyết!
J King

6
Những câu trả lời như thế này phải là những câu được chấp nhận, họ trả lời câu hỏi. Chắc chắn đưa ra một "giải pháp tốt nhất" nhưng cũng trả lời câu hỏi sau đó khi mọi người tìm thấy nó, họ sẽ nhận được câu trả lời họ muốn!
tim.baker

Điều này không hiệu quả với tôi, tôi đang sử dụng Google Chrome 47.0. Có thể là do câu trả lời đã lỗi thời?
MeV

Bạn có thể nói rõ hơn về phần nào không hoạt động? Tôi đã đưa ra một số câu trả lời khả thi, vì vậy nếu một phần không hoạt động, tôi có thể giải thích thêm để đưa ra câu trả lời tốt hơn và cập nhật hơn.
cr0ybot

vì một số lý do không rõ ràng, cài đặt đã background-size: autogiải quyết vấn đề của tôi trên tất cả các hướng thiết bị.
n__o

17

Thử đi

html { 
  background: url(image.jpg) no-repeat center center fixed; 
  -webkit-background-size: cover;
     -moz-background-size: cover;
       -o-background-size: cover;
          background-size: cover;
}

Phiên bản đơn giản hóa

html {
  background: url(image.jpg) center center / cover no-repeat fixed;
}

16

Bạn có thể sử dụng thuộc tính CSS background-sizevà đặt nó thành coverhoặc contain, tùy thuộc vào sở thích của bạn. Cover sẽ che toàn bộ cửa sổ, trong khi hàm chứa sẽ làm cho một mặt vừa với cửa sổ, do đó không che toàn bộ trang (trừ khi tỷ lệ khung hình của màn hình bằng với hình ảnh).

Xin lưu ý rằng đây là thuộc tính CSS3. Trong các trình duyệt cũ hơn, thuộc tính này bị bỏ qua. Ngoài ra, bạn có thể sử dụng javascript để thay đổi cài đặt CSS tùy thuộc vào kích thước cửa sổ, nhưng điều này không được ưu tiên.

body {
    background-image: url(image.jpg); /* image */
    background-position: center;      /* center the image */
    background-size: cover;           /* cover the entire window */
}

4

Chỉ cần sử dụng hình nền hai màu:

<div style="width:100%; background:url('images/bkgmid.png');
       background-size: cover;">
content
</div>


2

Đó là năm 2017 và bây giờ bạn có thể sử dụng object-fithỗ trợ tốt . Nó hoạt động theo cách tương tự như div background-sizenhưng trên chính phần tử và trên bất kỳ phần tử nào bao gồm cả hình ảnh.

.your-img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

1
html{
    height:100%;
    }
.bg-img {
    background: url(image.jpg) no-repeat center top; 
    background-size: cover; 
    height:100vh;     
}
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.