Як зробити плаваючий діва на 100% висоту свого батька?


256

Ось HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

І ось CSS:

#inner {
  float: left;
  height: 100%;
}

Після огляду інструментами для розробників Chrome внутрішній діви отримує висоту 0px.

Як я можу змусити його бути 100% висоти батьківського діва?


1
Отже, ви хочете, щоб текст у зовнішньому діві (не у внутрішньому діві), а плаваючий внутрішній дів був висотою зовнішнього діла?
edl

Якого кінцевого результату ви намагаєтеся досягти? Я думаю, що моя плутанина полягає в тому, що якщо внутрішній дів такий же високий, як зовнішній, а зовнішній - такий же високий, як текст, чи не те саме, що текст у внутрішньому діві?
edl

2
@edl: Так, це :) Причина, яку я хочу цього зробити, полягає в тому, що внутрішній div має зображення як основну основу. Текст повинен бути поруч. Обидва повинні бути всередині зовнішнього діва, оскільки він також має фонове зображення.
Натан Осман

3
Також дивіться stackoverflow.com/questions/1122381
Чадвік

2
Побачити і спробувати відповіді на це питання було просто пригнічуючим.
Вічна година

Відповіді:


125

Щоб #outerвисота ґрунтувалася на її вмісті, і на її #innerоснові було встановлено висоту, зробіть обидва елементи абсолютно розміщеними.

Більш детальну інформацію можна знайти в специфікації для властивості висоти css , але по суті, вона #innerповинна ігнорувати #outerвисоту, якщо #outerвисота є auto, якщо #outer вона не розташована абсолютно. Тоді #innerвисота буде 0, якщо тільки #inner вона не розміщена абсолютно.

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

Однак ... Позиціонуючи #innerабсолютно, floatналаштування буде проігноровано, тому вам потрібно буде #innerчітко вибрати ширину та додати набивання, #outerщоб підробити обгортання тексту, я підозрюю, що ви хочете. Наприклад, внизу обшивка #outerшириною #inner+3. Зручно (оскільки вся справа полягала в тому, щоб досягти #innerвисоти до 100%), немає необхідності загортати текст внизу #inner, тому це буде виглядати так, як #innerплаває.

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

Я видалив попередню відповідь, оскільки вона ґрунтувалася на занадто багато неправильних припущень щодо вашої мети.


118
Хм .. питання стосувалося плаваючих дівів. Ви відповіли про абсолютно позиційні диви
Mihkel L.

57
Я ніколи не перестаю дивуватись, наскільки складним є досягнення шалено простих речей у HTML/CSS:)
Юрій Наконечний

15
Будь-який спосіб це зробити без жорсткого кодування ширини? Не відмінно підходить для чуйних контейнерів.
Джейк Вілсон

23
Я не знаю, чому це було прийнято та наголосили настільки багато. Питання стосується плаваючих divs, саме це і привело мене сюди від мого пошуку, і натомість це відповідає абсолютно розміщеним divs.
Matt K

2
Як зробити плаваючий контейнер вертикально поміщеним, що це контейнер? Не змушуючи його більше плавати! Ха-ха. Приємна спроба, і досить близька, щоб насправді вважати корисною.
Рольф

124

Для батьків:

display: flex;

Вам слід додати деякі префікси http://css-tricks.com/using-flexbox/

Редагувати: Єдиним недоліком є ​​IE, як зазвичай, IE9 не підтримує flex. http://caniuse.com/flexbox

Редагувати 2: Як зазначав @toddsby, вирівнювання елементів призначене для батьків, а його значення за замовчуванням насправді - розтягнення . Якщо ви хочете інше значення для дитини, існує властивість align-self.

Редагувати 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/


3
Слід зазначити, що це працює лише в сучасних браузерах, і навіть тоді потрібні префікси постачальника.
kontur

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

Це відповідь прямо тут. IE9 вийде досить скоро, може також допомогти йому, даючи йому хороший, міцний удар. Це рішення настільки приємне, просте та легке ... Мене зловживають альтернативні рішення. ;)
jrista

2
Відповідно до останньої специфікації для Flexbox: див. W3.org/TR/css-flexbox-1/#align-items-property . align-items: stretch;не потрібно, оскільки це значення за замовчуванням. Також це слід визначити на батьків, а не на дитину.
toddsby

1
У відповідь додано скрипку. @Tigran
Ейфі

77

Насправді, поки розташований батьківський елемент, ви можете встановити висоту дитини на 100%. А саме, якщо ви не хочете, щоб батьки були абсолютно розміщені. Дозвольте пояснити далі:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
Класно, це менш обмежує вимоги Чадвіка position:absolute(що може заважати стилям сайту)
Генрі

3
Це міг бути лише я, але у мене є проблеми, якщо бічна панель більша за вміст. Колір фону зупиниться на батьківському контейнері, але вміст бічної панелі буде переповнений поза батьківським.
Howdy_McGee

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

Дякую дуже багато. Я опублікував своє конкретне рішення як відповідь на інше питання на SO: stackoverflow.com/a/31749164/84661 .
Брайан Хаак

24

Поки вам не потрібно підтримувати версії Internet Explorer раніше, ніж IE8, ви можете скористатися display: table-cellцим:

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

Це змусить кожен елемент з .innerкласом зайняти всю висоту свого батьківського елемента.


Хоча це буде працювати, він не відображатиме маржі, навіть якщо ви вказали його. Тому це рішення не вдасться, якщо ви хочете призначити маржу. Ви можете призначити прокладку як обхід, але як би ви вирішили це, якщо вам потрібна була націнка (& не накладка)?
Девнер

13
Я щось тут пропускаю? У вашому запитанні плаваючий елемент має висоту 100%. Коли плаваючий display: table-cell;елемент більше не заповнює висоту свого контейнера? Мені, мабуть, чогось не вистачає, бо це ваше власне питання ...?
користувач56reinstatemonica8

16

Я зробив приклад вирішення вашої проблеми.

Ви повинні зробити обгортку, плисти нею, а потім розташувати абсолютну свою діву і надати їй 100% висоти.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

Пояснення: .right div розміщений абсолютно. Це означає, що його ширина і висота, а також верхній і лівий позиції будуть обчислюватися на основі першого батьківського діла абсолютно або відносно, розміщеного ТІЛЬКИ, якщо властивості ширини або висоти явно оголошені в CSS; якщо вони не задекларовані експлікацією, ці властивості будуть обчислюватися на основі батьківського контейнера (.right-wrapper).

Отже, 100% -на висота DIV буде обчислюватися виходячи з кінцевої висоти .container, а кінцеве положення .right позиції буде обчислюватися виходячи з батьківського контейнера.


1
Це надійне рішення для ситуацій, коли ви можете гарантувати, що .rightвміст стовпця коротший, ніж .leftвміст стовпця. Наприклад, якщо ви використовуєте це для компонента, в якому .leftстовпець має зміст за зміною розміру, а правий стовпець просто відображає стрілку на сторінці деталей, тоді це рішення працює добре. +1 для цього
Захарій Кнібель

15

Ось простіший спосіб досягти цього:

  1. Встановіть дисплей контейнера з трьома елементами (#outer): таблиця
  2. І встановіть самі елементи (#inner) дисплей: table-cell
  3. Видаліть плаваючу.
  4. Успіх.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Завдяки @Itay у Floated div, висота 100%


8

Якщо ви готові використовувати трохи jQuery, відповідь проста!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

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

Сподіваюсь, це допомагає колегам шанувальників jQuery.


18
Здається, надмірно кинути javascript на цю проблему з компонуванням.
kontur

1
Як хтось, хто має розвиватися в IE: ДЯКУЙТЕ!
Грак

1
Можливо, трохи зайвого, але це прекрасна відповідь, дякую!
Мартін

1
Я погоджуюся, що всі проблеми з позиціонуванням повинні вирішуватися без СП.
michaeluskov


3

Це зразок коду для сітчастої системи з однаковою висотою.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

Вгорі розміщено CSS для зовнішнього діла

#inner{
width: 20%;
float: left;
border: 1px solid;
}

Зверху внутрішній дів

Сподіваюся, це допоможе тобі


1

Це мені допомогло.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

Змініть праворуч: і ліворуч: встановіть бажану ширину #inner.


1

Подібний випадок, коли вам потрібно кілька дочірніх елементів, що мають однакову висоту, можна вирішити за допомогою flexbox:

https://css-tricks.com/using-flexbox/

Встановити display: flex;для батьків і flex: 1;для дочірніх елементів, всі вони матимуть однаковий зріст.


-1

спробуйте

#outer{overflow: auto;}

показати більше варіантів у: Як уберегти батьків плаваючих елементів від руйнування?


варіант "переповнення: приховано", здається, працює краще, оскільки немає шансів прокататись ...
Родріго Баррейро

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