Làm cách nào để có chiều cao div để tự động điều chỉnh kích thước nền?


270

Làm cách nào để có một div tự động điều chỉnh theo kích thước của nền mà tôi đặt cho nó mà không đặt chiều cao cụ thể (hoặc chiều cao tối thiểu) cho nó?

Câu trả lời:


254

Một giải pháp khác, có lẽ không hiệu quả, sẽ bao gồm hình ảnh dưới một imgyếu tố được đặt thành visibility: hidden;. Sau đó làm cho background-imagediv xung quanh giống như hình ảnh.

Điều này sẽ đặt div xung quanh thành kích thước của hình ảnh trong thành imgphần nhưng hiển thị nó dưới dạng nền.

<div style="background-image: url(http://your-image.jpg);">
 <img src="http://your-image.jpg" style="visibility: hidden;" />
</div>

16
không thực sự hữu ích vì hình ảnh sẽ sử dụng 'không gian' và nội dung sẽ trông giống như có một lề trên tuyệt vời.
Bart Calix đến

35
Có lẽ tôi đang thiếu một cái gì đó, nhưng dù sao bạn cũng sẽ đưa imgvào đánh dấu của mình, tại sao không đơn giản là không che giấu thực tế <img>và không bận tâm với một background-imagetrong hai? Có lợi thế gì để làm mọi thứ theo cách này?
Đánh dấu Amery

3
Câu trả lời hay, nhưng không phải trình duyệt phải tải hai lần rồi sao?
www139

7
@ www139 Khi bạn nói tải, chính xác ý bạn là gì? Khi hình ảnh đã được tải xuống, nó có lẽ được lưu trữ. Từ thời điểm đó, bất kỳ yêu cầu nào khác đều dựa trên một bản sao cục bộ. Vì vậy, không. Nó không được tải xuống hai lần. Nhưng, nó được tải hai lần.
Tmac

2
@MarkAmery Một trong những điều thú vị nhất background-imagelà nó có thể sử dụng các chế độ hòa trộn CSS , trong khi imgkhông thể.
Aaron Gray

539

Có một cách rất hay và thú vị để làm cho hình ảnh nền hoạt động giống như một imgyếu tố để nó heighttự động điều chỉnh . Bạn cần biết hình ảnh widthheighttỷ lệ. Đặt heighthộp chứa thành 0 và đặt padding-toptỷ lệ phần trăm dựa trên tỷ lệ hình ảnh.

Nó sẽ trông như sau:

div {
    background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
    background-size: contain;
    background-repeat: no-repeat;
    width: 100%;
    height: 0;
    padding-top: 66.64%; /* (img-height / img-width * container-width) */
                /* (853 / 1280 * 100) */
}

Bạn vừa có một hình ảnh nền với chiều cao tự động sẽ hoạt động giống như một phần tử img. Đây là một nguyên mẫu hoạt động (bạn có thể thay đổi kích thước và kiểm tra chiều cao div): http://jsfiddle.net/TPEFn/2/


23
Quả thực là tuyệt vời! Chỉ dành cho các thế hệ tương lai xem câu trả lời này, nếu bạn đang sử dụng la bàn (scss), tôi đã tạo một mixin từ đây bằng cách sử dụng các hàm trợ giúp của họ để thực hiện các phép tính cho bạn: @mixin div-same-size-as-background-img($url) { background-image: url($url); background-size: contain; background-repeat: no-repeat; width: 100%; height: 0; padding-top: percentage(image-height($url) / image-width($url)); }
Benjamin K.

20
FYI cho những người đang tự hỏi, padding-top không tạo ra một khoảng trắng bởi vì nó chỉ thêm chiều cao cho phần tử. Hình ảnh là một hình ảnh nền, vì vậy nó hiển thị với vị trí và khoảng cách thích hợp. Thật là ngu ngốc khi chúng ta phải đưa ra các thủ thuật như thế này cho CSS.
ahnbizcad

9
Thật không may, phần đệm trên không cho phép bạn đặt bất cứ thứ gì khác vào div, chẳng hạn như các phần tử biểu mẫu trên nền.
Gary Hayes

14
@GaryHayes bạn có thể đặt thành position:relativediv và đặt một div khác vào trong với position:absolute; top:0; bottom:0; left:0; right:0;bộ
từ

17
Mặc dù phương pháp này hoạt động để hiển thị hình ảnh nền, nhưng nó làm cho bản thân div ít hữu ích hơn bằng cách lấp đầy nó bằng phần đệm. Kryptik đề nghị thêm một div vị trí tuyệt đối bên trong container, nhưng tại sao lại bận tâm với một hình ảnh nền? Sau đó, bạn có thể chỉ sử dụng một hình ảnh thực tế trong div nội dung nếu bạn sẽ chỉ định vị tuyệt đối mọi thứ trên nó. Điều này đánh bại mục đích sử dụng hình ảnh nền ở vị trí đầu tiên.
paulmz

35

Không có cách nào để tự động điều chỉnh kích thước hình nền bằng CSS.

Bạn có thể hack xung quanh nó bằng cách đo hình nền trên máy chủ và sau đó áp dụng các thuộc tính đó cho div, như những người khác đã đề cập.

Bạn cũng có thể hack một số javascript để thay đổi kích thước div dựa trên kích thước hình ảnh (một khi hình ảnh đã được tải xuống) - về cơ bản là điều tương tự.

Nếu bạn cần div của mình để tự động điều chỉnh hình ảnh, tôi có thể hỏi tại sao bạn không đặt một <img>thẻ bên trong div của mình?


Cảm ơn - nhưng tôi cần nó làm nền nên thủ thuật hình ảnh sẽ không làm được. Tôi đoán tôi sẽ hack một số javascript khi bạn nói trường hợp xấu nhất nhưng có lẽ nó không đáng.
JohnIdol

3
^^ Đó có lẽ không phải là một ý tưởng tốt. Trình duyệt có thể mất vài giây trước khi hình ảnh của bạn được tải xuống và bạn không thể đo nó cho đến lúc đó, vì vậy div của bạn sẽ bị treo ở kích thước sai trong một thời gian khá lâu!
Orion Edwards

1
Anh ta chỉ có thể chạy JavaScript khi tài liệu đã sẵn sàng.
Scott Tesler

1
Bạn không thể thay đổi srcmột imgtrong các truy vấn phương tiện, nhưng bạn có thể thay đổi tệp được sử dụng làm hình nền với các truy vấn phương tiện.
Scott Marcus

21

Câu trả lời này tương tự với những người khác, nhưng nói chung là tốt nhất cho hầu hết các ứng dụng. Bạn cần phải biết kích thước hình ảnh trước khi bàn tay mà bạn thường làm. Điều này sẽ cho phép bạn thêm văn bản lớp phủ, tiêu đề, vv mà không có phần đệm âm hoặc định vị tuyệt đối của hình ảnh. Chìa khóa của chúng là đặt% đệm để phù hợp với tỷ lệ khung hình của hình ảnh như trong ví dụ bên dưới. Tôi đã sử dụng câu trả lời này và về cơ bản chỉ cần thêm một hình ảnh nền.

.wrapper {
  width: 100%;
  /* whatever width you want */
  display: inline-block;
  position: relative;
  background-size: contain;
  background: url('https://upload.wikimedia.org/wikipedia/en/thumb/6/67/Wiki-llama.jpg/1600px-Wiki-llama.jpg') top center no-repeat;
  margin: 0 auto;
}
.wrapper:after {
  padding-top: 75%;
  /* this llama image is 800x600 so set the padding top % to match 600/800 = .75 */
  display: block;
  content: '';
}
.main {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  color: black;
  text-align: center;
  margin-top: 5%;
}
<div class="wrapper">
  <div class="main">
    This is where your overlay content goes, titles, text, buttons, etc.
  </div>
</div>


2
-1 để sử dụng! Quan trọng - và liên kết với câu trả lời khác. Vui lòng xem xét việc sao chép trong mã có liên quan từ câu trả lời khác (có ghi công) i để mã này hoàn chỉnh hơn và bao gồm cả mục đích liên kết.
CompleteNotLizards

@jammypeach cái này tốt hơn?
cưỡi ngựa

1
@horsej Racer trừ khi tôi thiếu thứ gì đó không làm tăng tỷ lệ hình ảnh. Nó chỉ mặt nạ nó.
lùn 9/12/2016 lúc

@dwkns Thật kỳ lạ, tất cả các cuộc gọi nền cần phải nằm trong một yếu tố. Tôi thấy nó bị cắt xén khi tôi chỉ định "nền: url ()" trên một id cụ thể và "kích thước nền: chứa" trong một lớp chung.
Nathan Williams

@dwkns Cập nhật: Tôi đã có thể khắc phục sự cố đó bằng cách sử dụng "nền-hình ảnh: url ()" thay vì "nền: url ()".
Nathan Williams

15

Có lẽ điều này có thể giúp ích, nó không chính xác là một nền tảng, nhưng bạn có ý tưởng:

<style>
div {
    float: left;
    position: relative;
}
div img {
    position: relative;
}

div div {
    position: absolute;
    top:0;
    left:0;
}
</style>

<div>
    <img src="http://antwrp.gsfc.nasa.gov/apod/image/0903/omegacen_davis.jpg" />
    <div>Hi there</div>
</div>

hãy giải thích lý do tại sao bạn giữ vị trí của img là tương đối?
Divyanshu Jimmy

1
Có lẽ bởi vì sự float: left;phá vỡ vị trí của anh ấy
Isaac

12

Khá chắc chắn rằng điều này sẽ không bao giờ được nhìn thấy tất cả các cách xuống đây. Nhưng nếu vấn đề của bạn giống như của tôi, thì đây là giải pháp của tôi:

.imaged-container{
  background-image:url('<%= asset_path("landing-page.png") %> ');
  background-repeat: no-repeat;
  background-size: 100%;
  height: 65vw;
}

Tôi muốn có một div ở trung tâm của hình ảnh, và điều này sẽ cho phép tôi về điều đó.


9

Có một giải pháp CSS thuần túy mà các câu trả lời khác đã bỏ lỡ.

Thuộc tính "content:" chủ yếu được sử dụng để chèn nội dung văn bản vào một phần tử, nhưng cũng có thể được sử dụng để chèn nội dung hình ảnh.

.my-div:before {
    content: url("image.png");
}

Điều này sẽ khiến div thay đổi kích thước chiều cao của nó thành kích thước pixel thực của hình ảnh. Để thay đổi kích thước chiều rộng quá, thêm:

.my-div {
    display: inline-block;
}

1
Tôi thích giải pháp này, nhưng khi trình duyệt được làm nhỏ hơn, có rất nhiều khoảng trắng còn lại bên dưới hình ảnh tiêu đề được đặt là phản hồi.
MG1

6

Bạn có thể thực hiện phía máy chủ: bằng cách đo hình ảnh và sau đó đặt kích thước div, HOẶC tải hình ảnh bằng JS, đọc thuộc tính của nó và sau đó đặt kích thước DIV.

Và đây là một ý tưởng, đặt cùng một hình ảnh bên trong div như một thẻ IMG, nhưng cung cấp cho nó khả năng hiển thị: hidden + play với vị trí tương đối + cung cấp cho div hình ảnh này làm nền.


lol tại sao yêu cầu phía máy chủ? Nó sẽ có thể được thực hiện với CSS.
GTHell

1
@GTHell hahaha - kiểm tra năm tôi đã trả lời
Itay Moav -Malimovka

@ ItayMoav-Malimovka hehe, đã không nhận thấy điều đó.
GTHell

5

Tôi gặp vấn đề này và tìm thấy câu trả lời của Hasanavi nhưng tôi gặp một lỗi nhỏ khi hiển thị hình nền trên màn hình rộng - Hình nền không lan ra toàn bộ chiều rộng của màn hình.

Vì vậy, đây là giải pháp của tôi - dựa trên mã của Hasanavi nhưng tốt hơn ... và điều này sẽ hoạt động trên cả màn hình cực rộng và di động.

/*WIDE SCREEN SUPPORT*/
@media screen and (min-width: 769px) { 
    div {
        background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
        background-size: cover;
        background-repeat: no-repeat;
        width: 100%;
        height: 0;
        padding-top: 66.64%; /* (img-height / img-width * container-width) */
                    /* (853 / 1280 * 100) */
    }
}

/*MOBILE SUPPORT*/
@media screen and (max-width: 768px) {
    div {
        background-image: url('http://www.pets4homes.co.uk/images/articles/1111/large/feline-influenza-all-about-cat-flu-5239fffd61ddf.jpg');
        background-size: contain;
        background-repeat: no-repeat;
        width: 100%;
        height: 0;
        padding-top: 66.64%; /* (img-height / img-width * container-width) */
                    /* (853 / 1280 * 100) */
    }
}

Như bạn có thể nhận thấy, background-size: contain;doas thuộc tính không phù hợp với màn hình rộng hơn và thuộc background-size: cover;tính không phù hợp với màn hình di động nên tôi đã sử dụng @mediathuộc tính này để xử lý các kích thước màn hình và khắc phục vấn đề này.


3

Còn cái này thì sao :)

.fixed-centered-covers-entire-page{
    margin:auto;
    background-image: url('https://i.imgur.com/Ljd0YBi.jpg');
    background-repeat: no-repeat;background-size:cover;
    background-position: 50%;
    background-color: #fff;
    left:0;
    right:0;
    top:0;
    bottom:0;
    z-index:-1;
    position:fixed;
}
<div class="fixed-centered-covers-entire-page"></div>

Bản trình diễn: http://jsfiddle.net/josephmcasey/KhPaF/


3

Nếu đó là một hình nền được xác định trước duy nhất và bạn muốn div phản ứng nhanh mà không làm biến dạng tỷ lệ khung hình của hình nền, trước tiên bạn có thể tính tỷ lệ khung hình của hình ảnh và sau đó tạo một div giữ tỷ lệ khung hình bằng cách làm như sau :

Giả sử bạn muốn tỷ lệ khung hình là 4/1 và chiều rộng của div là 32%:

div {
  width: 32%; 
  padding-bottom: 8%; 
}

Kết quả này xuất phát từ thực tế là phần đệm được tính dựa trên chiều rộng của phần tử chứa.


1

Điều này có thể giúp ích, nó không chính xác là một nền tảng, nhưng bạn có được ý tưởng đơn giản

    <style>
div {
    float: left;
    position: relative;
}
div img {
    position: relative;
}

div div {
    position: absolute;
    top:0;
    left:0;
}
</style>

<div>
    <img src="http://www.planwallpaper.com/static/images/recycled_texture_background_by_sandeep_m-d6aeau9_PZ9chud.jpg" />
    <div>Hello</div>
</div>

1

Bạn có thể làm một cái gì đó như thế

<div style="background-image: url(http://your-image.jpg); position:relative;">
 <img src="http://your-image.jpg" style="opacity: 0;" />
<div style="position: absolute;top: 0;width: 100%;height: 100%;">my content goes here</div>
</div>

1

Nếu bạn biết tỷ lệ của hình ảnh tại thời điểm xây dựng, muốn chiều cao dựa trên chiều cao cửa sổ và bạn đang nhắm mục tiêu các trình duyệt hiện đại (IE9 +) , thì bạn có thể sử dụng các đơn vị chế độ xem cho việc này:

.width-ratio-of-height {
  overflow-x: scroll;
  height: 100vh;
  width: 500vh; /* width here is 5x height */
  background-image: url("http://placehold.it/5000x1000");
  background-size: cover;
}

Không hoàn toàn những gì OP đang hỏi, nhưng có lẽ phù hợp với nhiều người đang xem câu hỏi này, vì vậy muốn đưa ra một lựa chọn khác ở đây.

Fiddle: https://jsfiddle.net/6Lkzdnge/


1

Giả sử bạn có một số thứ như thế này:

<div class="content">
    ... // inner HTML
</div>

và bạn muốn thêm một nền cho nó, nhưng bạn không biết kích thước của hình ảnh.

Tôi đã có một vấn đề tương tự, và tôi đã giải quyết nó bằng cách sử dụng lưới:

HTML

<div class="outer">
    <div class="content">
        ... // inner HTML
    </div>
    <img class="background" />
</div>

CSS

.outer{
    display: grid;
    grid-template: auto / auto;
    // or you can assign a name for this block
}
.content{
    grid-area: 1 / 1 / 2 / 2;
    z-index: 2;
}
.background{
    grid-area: 1 / 1 / 2 / 2;
    z-index: 1;
}

z-indexchỉ để đặt hình ảnh thực sự ở nền, tất nhiên bạn có thể đặt img.backgroundphía trên div.content.

LƯU Ý : nó có thể khiến div.contentchiều cao của hình ảnh có cùng chiều cao, vì vậy nếu div.contentcó bất kỳ con nào được đặt theo chiều cao của nó, bạn có thể muốn đặt một số không phải là 'tự động'.


0

Có vấn đề này với Umbraco CMS và trong kịch bản này, bạn có thể thêm hình ảnh vào div bằng cách sử dụng cái gì đó như thế này cho thuộc tính 'style' của div:

style="background: url('@(image.mediaItem.Image.umbracoFile)') no-repeat scroll 0 0 transparent; height: @(image.mediaItem.Image.umbracoHeight)px"

0

Tôi đã xử lý vấn đề này được một thời gian và quyết định viết một plugin jquery để giải quyết vấn đề này. Plugin này sẽ tìm thấy tất cả các yếu tố với lớp "show-bg" (hoặc bạn có thể vượt qua nó bộ chọn của riêng bạn) và tính toán kích thước hình nền của chúng. tất cả những gì bạn phải làm là bao gồm mã này, đánh dấu các phần tử mong muốn bằng class = "show

Thưởng thức!

https://bitbucket.org/tomeralmog/jquery.heightfrombg


0

Giải pháp tốt nhất tôi có thể nghĩ đến là bằng cách chỉ định chiều rộng và chiều cao của bạn theo phần trăm. Điều này sẽ cho phép bạn đánh giá lại màn hình dựa trên kích thước màn hình của bạn. bố trí đáp ứng nhiều hơn ..

Cho một ví dụ. bạn có

<br/>
<div> . //This you set the width percent to %100
    <div> //This you set the width percent to any amount . if you put it by 50% , it will be half
    </div>
 </div>

Đây là tùy chọn tốt nhất nếu bạn muốn bố trí đáp ứng, tôi không khuyên bạn nên sử dụng float, trong một số trường hợp nhất định, float là ổn để sử dụng. nhưng trong hầu hết các trường hợp, chúng tôi tránh sử dụng float vì nó sẽ ảnh hưởng đến khá nhiều thứ khi bạn đang thực hiện kiểm tra trình duyệt chéo.

Hi vọng điêu nay co ich :)


0

Tôi đã xem xét một số giải pháp và chúng rất tuyệt nhưng tôi nghĩ rằng tôi đã tìm thấy một cách dễ dàng đáng ngạc nhiên.

Đầu tiên, chúng ta cần lấy tỷ lệ từ hình nền. Chúng tôi chỉ đơn giản là phân chia một chiều thông qua một chiều khác. Sau đó, chúng tôi nhận được một cái gì đó như ví dụ 66,4%

Khi chúng ta có tỷ lệ hình ảnh, chúng ta có thể chỉ cần tính chiều cao của div bằng cách nhân tỷ lệ với chiều rộng khung nhìn:

height: calc(0.664 * 100vw);

Đối với tôi, nó hoạt động, đặt đúng chiều cao div và thay đổi nó khi cửa sổ được thay đổi kích thước.


-1

Thật ra nó khá dễ khi bạn biết cách làm:

<section data-speed='.618' data-type='background' style='background: url(someUrl) 
top center no-repeat fixed;  width: 100%; height: 40vw;'>
<div style='width: 100%; height: 40vw;'>
</div>
</section>

Thủ thuật chỉ là đặt div kèm theo giống như một div bình thường với các giá trị thứ nguyên giống như các giá trị thứ nguyên nền (trong ví dụ này là 100% và 40vw).


Bạn đang đặt chiều cao thành tỷ lệ của chiều rộng cửa sổ. Điều này sẽ không hoạt động trong mọi trường hợp - và một số nội dung của bạn, như tốc độ dữ liệu không liên quan gì đến câu trả lời của bạn.
Polyducks 4/11/2016

Không phải hầu hết mọi thứ "khá dễ dàng khi bạn biết cách làm"?
Scott Marcus

-2

Tôi đã giải quyết điều này bằng cách sử dụng jQuery. Cho đến khi các quy tắc CSS mới cho phép loại hành vi này tự nhiên, tôi thấy đó là cách tốt nhất để thực hiện.

Thiết lập div của bạn

Bên dưới bạn có div của bạn mà bạn muốn nền xuất hiện trên ("anh hùng") và sau đó nội dung / văn bản bên trong bạn muốn phủ lên trên hình ảnh nền của bạn ("bên trong"). Bạn có thể (và nên) di chuyển các kiểu nội tuyến sang lớp anh hùng của mình. Tôi đã để chúng ở đây để nhanh chóng và dễ dàng xem phong cách nào được áp dụng cho nó.

<div class="hero" style="background-image: url('your-image.png'); background-size: 100%; background-repeat: no-repeat; width: 100%;">
    <div class="inner">overlay content</div>
</div>

Tính tỷ lệ khung hình ảnh

Tiếp theo tính tỷ lệ khung hình cho hình ảnh của bạn bằng cách chia chiều cao của hình ảnh cho chiều rộng. Ví dụ: nếu chiều cao hình ảnh của bạn là 660 và chiều rộng của bạn là 1280 thì tỷ lệ khung hình của bạn là 0,5156.

Thiết lập một sự kiện thay đổi kích thước cửa sổ jQuery để điều chỉnh chiều cao

Cuối cùng, thêm một trình lắng nghe sự kiện jQuery để thay đổi kích thước cửa sổ và sau đó tính chiều cao của div anh hùng của bạn dựa trên tỷ lệ khung hình và cập nhật nó. Giải pháp này thường để lại một pixel phụ ở phía dưới do tính toán không hoàn hảo sử dụng tỷ lệ khung hình để chúng tôi thêm -1 vào kích thước kết quả.

$(window).on("resize", function ()
{
    var aspect_ratio = .5156; /* or whatever yours is */
    var new_hero_height = ($(window).width()*aspect_ratio) - 1;
    $(".hero").height(new_hero_height);
}

Đảm bảo nó hoạt động khi tải trang

Bạn nên thực hiện cuộc gọi thay đổi kích thước ở trên khi tải trang để có kích thước hình ảnh được tính ngay từ đầu. Nếu bạn không, thì div div sẽ không điều chỉnh cho đến khi bạn thay đổi kích thước cửa sổ. Tôi thiết lập một chức năng riêng để thực hiện điều chỉnh thay đổi kích thước. Đây là mã đầy đủ tôi sử dụng.

function updateHeroDiv()
{
    var aspect_ratio = .5156; /* or whatever yours is */
    var new_hero_height = ($(window).width()*aspect_ratio) - 1;
    $(".hero").height(new_hero_height);
}

$(document).ready(function() 
{       
    // calls the function on page load
    updateHeroDiv(); 

    // calls the function on window resize
    $(window).on("resize", function ()
    {
        updateHeroDiv();        
    }
});

-2

Nếu bạn có thể tạo một hình ảnh trên Photoshop trong đó lớp chính có độ mờ bằng 1 hoặc hơn và về cơ bản là trong suốt, hãy đặt img đó vào div và sau đó làm cho ảnh thật thành ảnh nền. THEN đặt độ mờ của img thành 1 và thêm kích thước kích thước bạn muốn.

Hình ảnh đó được thực hiện theo cách đó và thậm chí bạn không thể kéo hình ảnh vô hình ra khỏi trang tuyệt vời.


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.