2012-06-19 33 views
67

Tôi hiện đang làm việc trên một trang đích di động cho một công ty. Đó là một bố trí thực sự cơ bản nhưng bên dưới tiêu đề có một hình ảnh của một sản phẩm mà sẽ luôn luôn là 100% chiều rộng (thiết kế cho thấy nó luô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, 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 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 để phân phát các hình ảnh khác nhau dựa trên các độ phân giải khác nhau. ví dụ: một phiên bản lớn của cùng một hình ảnh. Tôi biết bạn không thể thay đổi img src bằng CSS vì vậy tôi cho rằng tôi nên sử dụng nền CSS cho hình ảnh thay vì thẻ img trong HTML.Hình nền có chiều rộng 100% có chiều cao 'tự động'

Tôi dường như không thể làm việc này đúng cách 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 'chiều rộng: 100%' nhưng tôi sử dụng cái gì cho chiều cao? Tôi có thể đặ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 đã có một vở kịch và thấy rằng một khi có chiều cao (thử nghiệm với 150px) tôi có thể sử dụng 'background-size: 100%' để phù hợp với hình ảnh trong div một cách chính xác. Tôi có thể sử dụng CSS3 gần đây hơn cho dự án này vì nó chỉ nhắm vào thiết bị di động.

Tôi đã thêm một ví dụ thô bên dưới. Xin vui lòng tha thứ cho phong cách 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 vùng chứa div chiều cao phần trăm dựa trên toàn bộ trang hoặc tôi đang xem đ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 không? Có thể có một kỹ thuật phục vụ các thẻ img khác nhau dựa trên chiều rộng thiết bị/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 tôi phát triển theo cách tốt nhất có thể.

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

Trả lời

12

Thay vì sử dụng background-image bạn có thể sử dụng img trực tiếp và để có được những hình ảnh để truyền bá tất cả các chiều rộng của khung nhìn thử sử dụng max-width:100%; và hãy nhớ không áp dụng bất kỳ đệm hoặc lề để div container chính của bạn khi họ sẽ tăng tổng chiều rộng của container. Sử dụng quy tắc này, bạn có thể có chiều rộng hình ảnh bằng với 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 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){ \t \t \t 
 
    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 bạn có kích thước khác nhau của trình duyệt.

+0

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

+2

Câu trả lời cũ này trông hấp dẫn ...nhưng không phải là sự thật rằng trình duyệt di động sẽ vẫn tải xuống (chỉ không hiển thị) hình ảnh ban đầu được đặt trong HTML là src? Nếu vậy, đó là một không khởi động, vì vấn đề là để bảo tồn tài nguyên của thiết bị di động. –

+1

Tôi tin rằng Tim Gallant là đúng về điều 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, trong khi điều này có vẻ hấp dẫn, trên điện thoại di động nó thực sự chậm hơn so với tải chỉ có một res cao và với hy sinh đó bạn sẽ chỉ nhìn thấy hình ảnh độ phân giải thấp hơn ... tồi tệ nhất của cả hai thế giới. –

15

Bạn có thể sử dụng thuộc tính CSS background-size và đặt thành cover hoặc contain, tùy thuộc vào tùy chọn của bạn. Bìa sẽ bao gồm toàn bộ cửa sổ, trong khi chứa sẽ làm cho một bên phù hợp với cửa sổ do đó không bao gồm 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 */ 
} 
175

Tim S. gần hơn với câu trả lời "chính xác", sau đó câu trả lời hiện được chấp nhận. Nếu bạn muốn có hình nền chiều rộng, chiều cao thay đổi 100% đượ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ừ hai 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 chiều rộng 100% và cho phép chiều cao tràn. Bây giờ 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 mới nhận ra (3 tháng sau) rằng bạn có thể không muốn hình ảnh bị tràn; dường như bạn 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ó (để giữ nguyên tỷ lệ khung hình), điều này là không thể 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 phần tử img. Nếu bạn muốn sử dụng img yếu 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 ảnh nền đáp ứng với tỷ lệ khung hình không đổi bằng cách sử dụng thuần CSS. Để làm điều này, bạn đặt height 0 và thiết lập các padding-bottom đến một tỷ lệ phần trăm của chiều rộng riêng của phần tử, như vậy:

.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 tỉ lệ màn hình khác nhau, chia chiều cao của hình ảnh ban đầu của nó có chiều rộng riêng và nhân với 100 để nhận giá trị phần trăm. Điều này làm việc bởi vì tỷ lệ phần trăm đệm luôn luôn được tính toán dựa trên chiều rộng, ngay cả khi nó là đệm dọc.

+4

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

+4

+1 Đây là giải pháp tốt nhất mà tôi đã tìm thấy! – mrudult

+5

Các câu trả lời như thế này phải là những câu trả lời được chấp nhận, họ trả lời câu hỏi. Chắc chắn cung cấp cho 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 mà họ muốn! –

16

thử này

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; 
} 
3

Chỉ cần sử dụng một 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à giờ bạn có thể sử dụng object-fitdecent support. Nó hoạt động theo cách tương tự như background-size của div nhưng trên chính phần tử đó và trên bất kỳ phần tử nào kể cả hình ảnh.

.your-img { 
    max-width: 100%; 
    max-height: 100%; 
    object-fit: contain; 
} 
Các vấn đề liên quan