Як домогтися висоти div для автоматичного налаштування під розмір фону?


270

Як я можу отримати div, щоб він автоматично підлаштовувався під розмір фону, який я встановив для нього, не встановлюючи для нього певної висоти (або мінімальної висоти)?

Відповіді:


254

Іншим, можливо, неефективним рішенням буде включення зображення під imgелемент, встановлений на visibility: hidden;. Потім зробіть background-imageнавколишній дів таким же, як і зображення.

Це встановить навколишній діва розмір зображення в imgелементі, але відобразить його як фон.

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

16
не зовсім корисно, оскільки зображення використовуватиме «простір», а вміст буде мати вигляд із великим запасом.
Барт Калікто

35
Можливо, мені чогось не вистачає, але якщо ви все imgодно хочете поставити свою розмітку, то чому б просто не приховати фактичне <img>і не потрудитися ні з background-imageодним? Яка перевага є робити так?
Марк Амерді

3
Хороша відповідь, але чи не повинен браузер завантажувати його двічі?
www139

7
@ www139 Коли ви говорите навантаження, що саме ви маєте на увазі? Після завантаження зображення воно, ймовірно, кешоване. З цього моменту будь-які інші запити базуються на локальній копії. Отже, ні. Вона не завантажується двічі. Але, він завантажується двічі.
Tmac

2
@MarkAmery Однією з найкрутіших речей background-imageє те, що він може використовувати суміші режимів CSS , тоді як imgне може.
Аарон Грей

539

Існує дуже приємний і класний спосіб зробити так, щоб фонове зображення працювало як imgелемент, щоб воно heightавтоматично регулювало його . Потрібно знати зображення widthта heightспіввідношення. Встановіть heightконтейнер на 0 і встановіть padding-topвідсоток на основі співвідношення зображень.

Це буде виглядати наступним чином:

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) */
}

Ви щойно отримали фонове зображення з автоматичною висотою, яке буде працювати так само, як елемент img. Ось робочий прототип (ви можете змінити розмір і перевірити висоту Div): http://jsfiddle.net/TPEFn/2/


23
Справді дивовижно! Просто для майбутніх поколінь, які спостерігають за цією відповіддю, якщо ви використовуєте компас (scss), я створив міксин із цього, використовуючи їхні допоміжні функції, щоб зробити обчислення для вас: @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)); }
Бенджамін К.

20
FYI для тих, хто цікавиться, підкладка не створює білого простору, оскільки вона просто додає елементу висоту. Зображення є фоновим зображенням, тому воно відображається при правильному розташуванні та відстані. Дуже дурно, що нам потрібно придумати такі фокуси для CSS.
ahnbizcad

9
На жаль, padding-top не дозволяє вводити щось інше в div, наприклад елементи форми на задньому плані.
Гері Хейс

14
@GaryHayes ви можете встановити position:relativeна div і помістити ще один div всередину з position:absolute; top:0; bottom:0; left:0; right:0;набором
lexith

17
Хоча цей метод працює для показу фонового зображення, він робить сам діл менш корисним, наповнюючи його набиванням. Криптик запропонував додати абсолютно розміщений div всередині контейнера, але навіщо тоді турбуватися із фоновим зображенням? Тоді ви можете просто використовувати фактичне зображення у розділі вмісту, якщо ви збираєтесь просто абсолютизувати все над ним. Це перемагає мету використання фонового зображення в першу чергу.
paulmz

35

Немає можливості автоматично налаштувати розмір фонового зображення за допомогою CSS.

Ви можете зламати навколо нього, вимірявши фонове зображення на сервері, а потім застосувавши ці атрибути до div, як уже згадували інші.

Ви також можете зламати трохи javascript, щоб змінити розмір div залежно від розміру зображення (після завантаження зображення) - це в основному те саме.

Якщо вам потрібен ваш div для автоматичного встановлення зображення, я можу запитати, чому ви просто не помістите <img>тег у свій div?


Дякую - але мені це потрібно як тло, щоб трюк із зображенням цього не зробив. я думаю, я збираюся зламати трохи javascript, як ви говорите, найгірший сценарій, але це, мабуть, не варто.
JohnIdol

3
^^ Це, мабуть, не дуже гарна ідея. Перед завантаженням вашого веб-переглядача може знадобитися кілька секунд, і ви не зможете його виміряти до цього часу, тож ваш дів буде тривалий час невірно розміщений!
Оріон Едвардс

1
Він міг просто запустити JavaScript, коли документ тоді буде готовий.
Скотт Теслер

1
Ви не можете змінити srcв imgс запитами засобів масової інформації, але ви можете змінити файл , який використовується в якості фонового зображення з запитами засобів масової інформації.
Скотт Маркус

21

Ця відповідь схожа на інші, але в цілому найкраща для більшості програм. Ви повинні знати розмір зображення перед рукою, що зазвичай робите. Це дозволить вам додавати накладений текст, заголовки тощо без негативного прокладки або абсолютного розміщення зображення. Ключовим моментом є встановлення% підкладки відповідно до співвідношення сторін зображення, як показано в прикладі нижче. Я використовував цю відповідь і фактично просто додав фон зображення.

.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 для використання! Важливо - і посилання на іншу відповідь. Будь ласка, розгляньте можливість копіювання відповідного коду з іншої відповіді (з атрибуцією) i, щоб ця була повнішою, і випадок гниття посилання.
totalNotLizards

@jammypeach це краще?
верховий хокей

1
@horsejockey, якщо я щось не пропускаю, це не збільшує зображення. Це просто маскує його.
dwkns

@dwkns Як не дивно, всі фонові дзвінки повинні бути в одному елементі. Я виявив, що це обрізання, коли я вказав "background: url ()" на певний ідентифікатор та "background-size: содержа" в загальному класі.
Натан Вільямс

Оновлення @dwkns: мені вдалося виправити цю проблему, використовуючи "background-image: url ()" замість "background: url ()".
Натан Вільямс

15

Можливо, це може допомогти, це не зовсім передумови, але ви розумієте:

<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>

поясніть, будь ласка, чому ви зберегли позицію img як відносну?
Дівяншу Джиммі

1
Можливо, тому, що float: left;зламав його позиціонування
Ісаак

12

Досить впевнений, що це ніколи не було побачено аж тут. Але якщо ваша проблема була такою ж, як і моя, це було моїм рішенням:

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

Мені хотілося, щоб у центрі зображення було діва, і це дозволить мені це.


9

Є чисте рішення CSS, яке інші відповіді пропустили.

Властивість "content:" здебільшого використовується для вставки текстового вмісту в елемент, але також може використовуватися для вставки вмісту зображення.

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

Це призведе до того, щоб div змінив свою висоту до фактичного розміру пікселя зображення. Щоб змінити розмір ширини, додайте:

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

1
Мені подобається це рішення, але коли браузер зменшився, під зображенням заголовка залишилося багато білого простору, яке налаштовано на чуйність.
MG1

6

Ви можете це зробити на сервері: вимірявши зображення, а потім встановивши розмір div, АБО завантаживши зображення JS, прочитайте його атрибути та встановіть розмір DIV.

І ось ідея, помістіть все те саме зображення у div, що й тег IMG, але надайте йому видимість: приховано + грайте з відносною позиції + надайте цьому діві зображення як фон.


хаха, чому потрібна сторона сервера? Він повинен мати можливість реалізовуватися за допомогою CSS.
GTHell

1
@GTHell hahaha - перевірити рік, на який я відповів
Itay Moav -Malimovka

@ ItayMoav-Malimovka hehe, цього не помічав.
GTHell

5

У мене виникло це питання, і я знайшов відповідь Хасанаві, але у мене з’явилася невелика помилка, коли відображалося фонове зображення на широкому екрані - фонове зображення не поширювалося на всю ширину екрана.

Тож ось моє рішення - засноване на коді Хасанаві, але краще ... і це повинно працювати як на позашироких, так і на мобільних екранах.

/*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) */
    }
}

Як ви могли помітити, background-size: contain;властивість не добре вписується в надзвичайно широкі екрани, а background-size: cover;властивість не добре вписується на екрани мобільних пристроїв, тому я використовував цей @mediaатрибут, щоб пограти з розмірами екрана та виправити цю проблему.


3

Як щодо цього :)

.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>

Демо: http://jsfiddle.net/josephmcasey/KhPaF/


3

Якщо це одне заздалегідь визначене фонове зображення, і ви хочете, щоб div не відповідав, не спотворюючи співвідношення сторін фонового зображення, ви можете спочатку обчислити співвідношення сторін зображення, а потім створити div, який зберігає його співвідношення сторін, виконавши наступне :

Скажімо, ви хочете, щоб співвідношення сторін було 4/1, а ширина даного ключа - 32%:

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

Це випливає з того, що оббивка обчислюється виходячи з ширини елемента, що містить.


1

Можливо, це може допомогти, це не зовсім тло, але ви отримуєте просту думку

    <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

Можна зробити щось подібне

<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

Якщо ви знаєте співвідношення зображення під час збирання, хочете, щоб висота виходила з висоти вікна, і ви добре орієнтуєтесь на сучасні браузери (IE9 +) , тоді ви можете використовувати для цього одиниці перегляду:

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

Не зовсім те, що задавали ОП, але, мабуть, добре підходить для багатьох тих, хто переглядає це питання, тому хотів дати тут ще один варіант.

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


1

Я переглянув деякі рішення, і вони чудові, але, думаю, знайшов напрочуд простий спосіб.

Спочатку нам потрібно отримати співвідношення з фонового зображення. Ми просто ділимо один вимір через інший. Тоді ми отримуємо щось на зразок 66,4%

Коли у нас є співвідношення зображень, ми можемо просто обчислити висоту діла, помноживши відношення на ширину огляду:

height: calc(0.664 * 100vw);

Для мене це працює, правильно встановлює висоту Div і змінює її, коли розмір вікна буде змінено.


1

Припустимо, у вас є щось таке:

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

і ви хочете додати до нього тло, але ви не знаєте розмір зображення.

У мене була подібна проблема, і я вирішив її за допомогою сітки:

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-indexце лише для розміщення зображення фактично на задньому плані, звичайно, ви можете розмістити його img.backgroundвище div.content.

ПРИМІТКА : це може спричинити div.contentоднакову висоту малюнка, тому якщо div.contentу дітей є діти, розміщені відповідно до його висоти, ви можете встановити число, а не щось на зразок "авто".


0

Якщо виникла проблема з CMS Umbraco, і в цьому сценарії ви можете додати зображення до div, використовуючи щось подібне для атрибута 'style' div:

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

0

Я певний час займався цією проблемою і вирішив написати плагін jquery, щоб вирішити цю проблему. Цей плагін знайде всі елементи класу "show-bg" (або ви можете передати його власним селектором) та обчислить їх розміри фонового зображення. все, що вам потрібно зробити, це включити цей код, позначити потрібні елементи класом = "показати

Насолоджуйтесь!

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


0

Найкраще рішення, про яке я можу придумати, - вказавши свою ширину та висоту у відсотках. Це дозволить вам змінити розмір екрана залежно від розміру монітора. його більш чуйний макет ..

Наприклад. ти маєш

<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>

Це найкращий варіант, якщо ви хочете чуйний макет, я б не рекомендував плавати, в деяких випадках флоат добре використовувати. але в більшості випадків ми уникаємо використання float, оскільки це вплине на велику кількість речей, коли ви робите крос-браузерне тестування.

Сподіваюся, це допомагає :)


-1

насправді це досить просто, коли ти знаєш, як це зробити:

<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>

хитрість полягає лише в тому, щоб встановити вкладений div як звичайний div з розмірними значеннями, такими ж, як фонові розмірні значення (у цьому прикладі 100% та 40vw).


Ви встановлюєте висоту, яка дорівнює ширині вікна. Це не спрацює у всіх випадках - і частина вашого вмісту, наприклад швидкість передачі даних, не має нічого спільного з вашою відповіддю.
Полідуки

Хіба не більшість речей "досить легкі, коли ти вмієш це робити"?
Скотт Маркус

-2

Я вирішив це за допомогою jQuery. До тих пір, поки нові правила CSS не дозволяють мати подібний тип поведінки, я вважаю, що це найкращий спосіб зробити це.

Налаштуйте свої діви

Нижче у вас є ваш div, який ви хочете, щоб фон відображався на ("герой"), а потім внутрішній вміст / текст, який ви хочете накласти поверх вашого фонового зображення ("внутрішнього"). Ви можете (і повинні) переміщувати стилі вбудованого рівня до свого класу героїв. Я залишив їх тут, тому швидко і легко зрозуміти, які стилі до нього застосовані.

<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>

Розрахуйте співвідношення сторін зображення

Далі обчисліть співвідношення сторін для зображення, розділивши висоту зображення на ширину. Наприклад, якщо висота зображення - 660, а ширина - 1280, співвідношення сторін - 0,5156.

Настройте подію зміни розміру вікна jQuery для регулювання висоти

Нарешті, додайте слухача подій jQuery для зміни розміру вікна, а потім обчисліть висоту героя Div на основі вибору співвідношення сторін та оновіть його. Зазвичай це рішення залишає зайвий піксель внизу через недосконалі обчислення, використовуючи співвідношення сторін, тому ми додаємо -1 до отриманого розміру.

$(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);
}

Переконайтеся, що він працює при завантаженні сторінки

Ви повинні здійснити виклик зміни розміру вище, коли сторінка завантажується, щоб розміри зображення були обчислені на самому початку. Якщо ви цього не зробите, то герой-div не налаштується, поки ви не зміните вікно. Я налаштовую окрему функцію, щоб здійснити коригування розміру. Ось повний код, який я використовую.

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

Якщо ви можете створити зображення на Photoshop, де основний шар має непрозорість 1 або близько того і є в основному прозорим, помістіть цей img у діву, а потім зробіть реальну картинку фоновим зображенням. ТОГО встановіть непрозорість img на 1 та додайте потрібні розміри розмірів.

Ця картина зроблена саме так, і ви навіть не можете перетягнути невидиме зображення зі спокійної сторінки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.