Hình nền CSS để phù hợp với chiều rộng, chiều cao nên tự động chia tỷ lệ


365

Tôi có

body {
    background: url(images/background.svg);
}

Hiệu ứng mong muốn là hình nền này sẽ có chiều rộng bằng với chiều rộng của trang, thay đổi chiều cao để duy trì tỷ lệ. ví dụ: nếu hình ảnh gốc xảy ra là 100 * 200 (bất kỳ đơn vị nào) và thân rộng 600px, hình nền sẽ có độ cao 1200px. Chiều cao sẽ tự động thay đổi nếu cửa sổ được thay đổi kích thước. Điều này có thể không?

Hiện tại, Firefox có vẻ như làm cho chiều cao vừa vặn và sau đó điều chỉnh độ rộng. Đây có lẽ là vì chiều cao là chiều dài nhất và nó đang cố gắng tránh cắt xén? Tôi muốn cắt theo chiều dọc, sau đó cuộn: không lặp lại theo chiều ngang.

Ngoài ra, Chrome đang đặt hình ảnh ở giữa, không lặp lại, ngay cả khi background-repeat:repeatđược đưa ra rõ ràng, dù sao đó cũng là mặc định.


2
html, body { height: 100%; }giúp được không? Ngoài ra, ho .
ba mươi

nó không hoạt động trên chrome google
simon

Câu trả lời:


810

Có một thuộc tính CSS3 cho việc này, cụ thể là background-size( kiểm tra tính tương thích ). Mặc dù người ta có thể đặt giá trị độ dài, nhưng nó thường được sử dụng với các giá trị đặc biệt containcover. Trong trường hợp cụ thể của bạn, bạn nên sử dụng cover:

body {
    background-image:    url(images/background.svg);
    background-size:     cover;                      /* <------ */
    background-repeat:   no-repeat;
    background-position: center center;              /* optional, center the image */
}

Eggsplanation cho containcover

Xin lỗi vì sự chơi chữ tồi, nhưng tôi sẽ sử dụng bức tranh trong ngày của Biswarup Ganguly để trình diễn. Hãy nói rằng đây là màn hình của bạn và vùng màu xám nằm ngoài màn hình hiển thị của bạn. Để trình diễn, tôi sẽ giả sử tỷ lệ 16x9.

màn

Chúng tôi muốn sử dụng hình ảnh nói trên trong ngày làm nền. Tuy nhiên, chúng tôi đã cắt hình ảnh thành 4x3 vì một số lý do. Chúng tôi có thể đặt thuộc background-sizetính theo một số độ dài cố định, nhưng chúng tôi sẽ tập trung vào containcover. Lưu ý rằng tôi cũng cho rằng chúng tôi đã không thu thập chiều rộng và / hoặc chiều cao của body.

contain

contain

Chia tỷ lệ hình ảnh, trong khi duy trì tỷ lệ khung hình bên trong của nó (nếu có), đến kích thước lớn nhất sao cho cả chiều rộng và chiều cao của nó có thể vừa với khu vực định vị nền.

Điều này đảm bảo rằng hình ảnh nền luôn được chứa hoàn toàn trong khu vực định vị nền, tuy nhiên, có thể có một số khoảng trống chứa đầy của bạn background-colortrong trường hợp này:

Lưu trữ

cover

cover

Chia tỷ lệ hình ảnh, trong khi duy trì tỷ lệ khung hình bên trong của nó (nếu có), đến kích thước nhỏ nhất sao cho cả chiều rộng và chiều cao của nó có thể bao phủ hoàn toàn khu vực định vị nền.

Điều này đảm bảo rằng hình ảnh nền được bao phủ mọi thứ. Sẽ không thể nhìn thấy background-color, tuy nhiên tùy thuộc vào tỷ lệ của màn hình, một phần lớn hình ảnh của bạn có thể bị cắt:

che

Trình diễn với mã thực tế

div > div {
  background-image: url(http://i.stack.imgur.com/r5CAq.jpg);
  background-repeat: no-repeat;
  background-position: center center;
  background-color: #ccc;
  border: 1px solid;
  width: 20em;
  height: 10em;
}
div.contain {
  background-size: contain;
}
div.cover {
  background-size: cover;
}
/********************************************
 Additional styles for the explanation boxes 
*********************************************/

div > div {
  margin: 0 1ex 1ex 0;
  float: left;
}
div + div {
  clear: both;
  border-top: 1px dashed silver;
  padding-top:1ex;
}
div > div::after {
  background-color: #000;
  color: #fefefe;
  margin: 1ex;
  padding: 1ex;
  opacity: 0.8;
  display: block;
  width: 10ex;
  font-size: 0.7em;
  content: attr(class);
}
<div>
  <div class="contain"></div>
  <p>Note the grey background. The image does not cover the whole region, but it's fully <em>contained</em>.
  </p>
</div>
<div>
  <div class="cover"></div>
  <p>Note the ducks/geese at the bottom of the image. Most of the water is cut, as well as a part of the sky. You don't see the complete image anymore, but neither do you see any background color; the image <em>covers</em> all of the <code>&lt;div&gt;</code>.</p>
</div>


Đây là chính xác những gì tôi muốn, cảm ơn. Nó dường như không hoạt động trong Chrome (hoặc ít nhất là Chromium) - có ý tưởng sáng giá nào không?
spraff

Theo quirksmode.org/css/contents.html#t44, nó sẽ hoạt động trong Chrome mà không cần bất kỳ tiền tố nào. Tuy nhiên, bạn đã thử -webkit-tiền tố chưa?
Zeta

4
Câu trả lời của Yauhen (ở dưới cùng của trang này) thực sự là những gì tôi đang tìm kiếm:background-size: contain
Danny Beckett

1
@DannyBeckett: Mặc dù điều này là có thể, nhưng đó không phải là điều mà OP đang tìm kiếm: "Tôi muốn cắt theo chiều dọc, sau đó cuộn: không lặp lại theo chiều ngang."
Zeta

3
containgiống như phóng to vừa vặn. covergiống như phóng to thu nhỏ. containđiều chỉnh kích thước hình ảnh để phù hợp với kích thước lớn hơn giữa chiều rộng và chiều cao. coverđiều chỉnh kích thước hình ảnh để phù hợp với kích thước nhỏ hơn giữa chiều rộng và chiều cao.
ahnbizcad

39

Dựa trên các mẹo từ https://developer.mozilla.org/en-US/docs/CSS/background-size Tôi kết thúc với công thức sau đây phù hợp với tôi

body {
        overflow-y: hidden ! important;
        overflow-x: hidden ! important;
        background-color: #f8f8f8;
        background-image: url('index.png');
        /*background-size: cover;*/
        background-size: contain;
        background-repeat: no-repeat;
        background-position: right;
}

3
Mặc dù tôi đã sử dụng background-position: center;, nhưng điều này đã làm việc tốt hơn cho tôi hơn backgound-size: cover;.
Nate

Tôi có thể biết tại sao chúng ta cần overflow-y: hiddenmột phần?
Nam G VU

11

Tôi không chắc chắn chính xác những gì bạn đang tìm kiếm, nhưng bạn thực sự nên xem những bài đăng blog tuyệt vời này được viết bởi Chris Coyier từ CSS-Tricks:

http://css-tricks.com/how-to-resizizable-background-image/

http://css-tricks.com/perinf-full-page-background-image/

Đọc các mô tả cho từng bài viết và xem nếu chúng là những gì bạn đang tìm kiếm.

Câu trả lời đầu tiên cho câu hỏi sau:

Có cách nào để làm cho một hình ảnh nền có thể thay đổi kích thước? Như trong, điền vào nền của cạnh trang web bằng một hình ảnh, bất kể kích thước của cửa sổ trình duyệt. Ngoài ra, hãy thay đổi kích thước lớn hơn hoặc nhỏ hơn khi cửa sổ trình duyệt thay đổi. Ngoài ra, hãy chắc chắn rằng nó giữ nguyên tỷ lệ của nó (không kéo dài kỳ lạ). Ngoài ra, không gây ra thanh cuộn, chỉ cần cắt theo chiều dọc nếu cần. Ngoài ra, đi vào trên trang như một thẻ nội tuyến.

Mục tiêu của bài đăng thứ hai là để có được những điều sau đây, một "hình nền trên một trang web bao phủ toàn bộ cửa sổ trình duyệt mọi lúc."

Hi vọng điêu nay co ich.


8

Ảnh nền không được đặt Hoàn hảo thì css của anh ta có vấn đề tạo nên tệp css của anh ta thay đổi thành mã bên dưới

html {  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-position: 0% 0%;
  background-size: 100% 100%;
}

%; kích thước nền: 100% 100%; "


7

Thử cái này,

element.style {
    background: rgba(0, 0, 0, 0) url("img/shopping_bgImg.jpg") no-repeat scroll center center / cover;
}


3
body{
    background-image: url(../url/imageName.jpg);
    background-attachment: fixed;
    background-size: auto 100%;
    background-position: center;
}

12
mô tả chính xác vấn đề là gì và cách bạn giải quyết nó, vui lòng không dán một loạt mã ở đây mà không giải thích.
Siavash

2

Tôi gặp vấn đề tương tự, không thể thay đổi kích thước hình ảnh khi điều chỉnh kích thước trình duyệt.

Mã xấu:

html {  
  background-color: white;  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-attachment: scroll;  
  background-position: 0% 0%;
}


Mã tốt:

html {  
  background-color: white;  
  background-image: url("example.png");  
  background-repeat: no-repeat;  
  background-attachment: scroll;  
  background-position: 0% 0%;
  background-size: contain;
}

Chìa khóa ở đây là sự bổ sung của yếu tố này -> kích thước nền: chứa;



-3

Đặt kích thước nền không giúp được gì, giải pháp sau đây có hiệu quả với tôi:

.class {
    background-image: url(blablabla.jpg);
    /* Add this */
    height: auto;
}

Về cơ bản, nó cắt hình ảnh và làm cho nó phù hợp, background-size: contain/covervẫn không làm cho nó phù hợp.

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.