CSS - Розгорніть висоту DIV з поплавком на висоту батька


451

У мене структура сторінки така:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

Тепер у child-leftDIV буде більше вмісту, тому parentзріст DIV збільшується відповідно до дитини DIV.

Але проблема в тому, що child-rightвисота не збільшується. Як я можу зробити його зріст рівним батьківському?


Відповіді:


459

Для parentелемента додайте такі властивості:

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

то для .child-rightцих:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

Знайдіть більш детальні результати з прикладами CSS тут та більше інформації про стовпчики рівних висот тут .


14
Ваш CSS призводить до невизначеної поведінки - зріст батька залежить від висоти дитини, але діти мають відсотковий зріст, визначений у відношенні батьківського: це недійсне значення і, ймовірно, не працюватиме в крос-браузерному режимі.
Еймон Нербонна

1
Я бачу, що ти все не плаваєш - так це визначено ціною не масштабування, якщо коли-небудь правий стовпчик зростатиме довше, ніж лівий (що справді не стосується питання щодо ОП).
Еймон Нербонна

4
Так, вам потрібно додати це: padding-bottom: 32768px; margin-bottom: -32768px; дітям.
Майкл

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

3
@MatthewBlackford: це "хак" в тому, що він запобігає руйнуванню поля. Ви можете запобігти згортанню поля іншими способами, наприклад, використанням прозорої рамки 1px, але по суті, але тут важливо, що ви уникаєте краху поля. Я б не використовував це рішення хіба що в крайньому випадку, оскільки воно спричиняє дивні помилки у макеті та несподіване обрізання (або накладений вміст), коли ваші припущення виявляються помилковими. Коротше кажучи , ви не хочете , щоб це зробити , якщо ви дійсно не потрібно.
Еймон Нербонна

206

Поширене рішення цієї проблеми використовує абсолютне позиціонування або обрізані поплавці, але вони складні в тому, що вони вимагають широкої настройки, якщо ваші стовпці змінюються за кількістю + розміром, і вам потрібно переконатися, що ваш "головний" стовпчик завжди довший. Натомість я б запропонував вам скористатися одним із трьох більш надійних рішень:

  1. display: flex: на сьогоднішній день найпростіше та найкраще рішення та дуже гнучка - але не підтримується IE9 та старішими.
  2. tableабо display: table: дуже проста, дуже сумісна (майже кожен браузер коли-небудь), досить гнучка.
  3. display: inline-block; width:50% з відхиленням від’ємного поля: досить простий, але межі стовпців із нижньою стовпкою трохи складні.

1. display:flex

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

Приклад: http://output.jsbin.com/hetunujuma/1

Відповідний html:

<div class="parent"><div>column 1</div><div>column 2</div></div>

Відповідне css:

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }

Flexbox підтримує набагато більше варіантів, але просто мати будь-яку кількість стовпців, зазначених вище, достатньо!

2. <table>абоdisplay: table

Простий і надзвичайно сумісний спосіб зробити це - використовувати table- я рекомендую спробувати це спершу, якщо вам потрібна підтримка старого IE . Ви маєте справу зі стовпцями; divs + floats просто не найкращий спосіб зробити це (не кажучи вже про те, що кілька рівнів вкладених div просто для злому обмежень css навряд чи є більш "семантичним", ніж просто використання простої таблиці). Якщо ви не бажаєте використовувати tableелемент, врахуйте cssdisplay: table (не підтримується IE7 та старішими версіями).

Приклад: http://jsfiddle.net/emn13/7FFp3/

Відповідний HTML: (але<table>замість цьогоскористайтеся простою)

<div class="parent"><div>column 1</div><div>column 2</div></div>

Відповідне css:

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/

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

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

До речі, якщо вам потрібно, щоб ваш макет був чуйним (наприклад, немає колонок на невеликих мобільних телефонах), ви можете використовувати @mediaзапит, щоб повернутися до звичайного блоку малого розміру для невеликої ширини екрана - це працює незалежно від того, використовується ви <table>чи будь-який інший display: tableелемент.

3. display:inline blockз відхиленням від’ємної маржі.

Ще одна альтернатива - використання display:inline block.

Приклад: http://jsbin.com/ovuqes/2/edit

Відповідний html: (відсутність пробілів міжdivтегами є істотною!)

<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>

Відповідне css:

.parent { 
    position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
}

.parent>div { 
    display:inline-block; width:50%; white-space:normal; vertical-align:top; 
}

.parent>div>div {
    padding-bottom: 32768px; margin-bottom: -32768px; 
}

Це трохи хитро, і від'ємний запас означає, що "справжнє" дно стовпців затьмарене. Це в свою чергу означає, що ви не можете розмістити нічого відносно нижньої частини цих стовпців, тому що це відрізано overflow: hidden. Зауважте, що крім вбудованих блоків, ви можете досягти подібного ефекту і з поплавцями.


TL; DR : використовуйте flexbox, якщо не можете ігнорувати IE9 та старіші версії ; інакше спробуйте таблицю (css). Якщо жоден із цих варіантів не працює для вас, є негативні маржі хакі, але це може спричинити дивні проблеми з відображенням, які легко пропустити під час розробки, і є обмеження у компонуванні, про які потрібно знати.


1
Хороший, але варто зазначити, що ви не можете використовувати поля між цими клітинками (і набивання не допоможе, якщо ви хочете їх стилізувати).
Wordpressor

3
border-spacing:10px;на елементі таблиці буде введено відмінність між полями. Крім того, ви можете додати додаткові (порожні) стовпці, де потрібно додаткове місце. І ви також можете додати прокладки всередині комірок таблиці; проте набивання буде включено у фоновий режим, так що це може бути не те, що вам потрібно. Але ви праві, що це не так гнучко, як звичайний запас. І ви не можете розмістити нічого відносно стовпців, що може бути проблемою.
Еймон Нербонна

1
Тож краще макет без таблиць чи ні?
динамічний

3
Треба сказати: я погоджуюсь з вами, що в цьому випадку простої таблиці більш ніж достатньо. Проблема полягає в тому, що існує загальний погляд на ігнорування кожного макета з таблицею
динамічний

3
Проблема таблиці полягає в тому, що при зміні розміру екрана на меншу ширину (чуйний дизайн) комірки таблиці вичавлюються замість того, щоб перекривати одну поверх верхньої частини наступної. Другий метод з накладкою-дном: 32768px; margin-bottom: -32768px; є досить дивовижним і робить майже саме те, що мені потрібно ... спасибі за те, що ... прикордонне дно є проблемою, хоча ...
Серж Саган

23

Для батьків:

display: flex;

Для дітей:

align-items: stretch;

Ви повинні додати кілька префіксів, встановити прапорець.


2
Не рекомендував би. IE9 - це все-таки річ.

Спасибі за вашу відповідь; це працює добре! Msgstr "Вам слід додати деякі префікси, встановити прапорець." що ти маєш на увазі під цим рядком? Чи можете ви додати трохи більше інформації для початківців?
Md Sifatul Іслам

@MdSifatulIslam Перейдіть сюди: caniuse.com/#feat=flexbox Ви можете побачити, чи потрібен вам якийсь браузер для підтримки потрібного префікса.
Ейфі

18

Я знайшов багато відповідей, але, напевно, найкраще рішення для мене

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

Ви можете перевірити інші рішення тут http://css-tricks.com/fluid-width-equal-height-columns/


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

Працює і для мене. Хоча це не чистий шлях. Дякую!
Марк Ентоні Уй

18
хакі, як пекло. Я не рекомендую це для виробничих додатків
FedericoCapaldo

це дивовижно ха-ха. Я не думав, що це насправді спрацює
Том МакДонаф,

11

Будь ласка, встановіть батьківський div, overflow: hidden
а потім у дочірніх divs ви можете встановити велику кількість для нижньої частини. наприклад,
padding-bottom: 5000px
тоді margin-bottom: -5000px
і тоді всі дочірні діви будуть висотою батьків.
Звичайно, це не буде спрацьовувати, якщо ви намагаєтесь розмістити вміст у батьківському діві (за межами інших дівок)

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

Приклад: http://jsfiddle.net/Tareqdhk/DAFEC/


здається трохи брудним, але працював для мене - єдине рішення цього питання. Я спробував це за допомогою twitter bootstrap.
cukabeka

8

Чи має батько зріст? Якщо ви встановите батькам висоту так.

div.parent { height: 300px };

Тоді ви можете змусити дитину розтягнутись на повний зріст так.

div.child-right { height: 100% };

EDIT

Ось як це можна зробити за допомогою JavaScript.


батько не має фіксованої висоти. Він розширюється відповідно до зросту, який залишився дитиною.
Вера

Ах, я подумав стільки, то вам знадобиться якийсь JavaScript, я додам його за секунду.
Оличний

@Olical JSFiddle посилання розірвано. Або видаліть його, або оновіть відповідь. Дякую!
itsmysterybox

1
Посилання на js тепер дає 404
Chanoch

5

Дисплей таблиці CSS ідеально підходить для цього:

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Оригінальна відповідь (передбачається, що будь-який стовпець може бути вище):

Ви намагаєтесь зробити зріст батьків залежним від зросту дитини та зросту дітей залежно від росту батьків. Не буде обчислюватися. CSS Faux стовпці - найкраще рішення. Існує більше ніж один спосіб зробити це. Я б краще не використовував JavaScript.


Гарна думка. Як щодо того, якщо висота дітей залежить від висоти найвищого побратима (чи визначається це зріст батька чи ні), а не батька? Я думаю, що це неможливо зробити в CSS.
mikato

Ні, брати і сестри не можуть впливати на висоту один одного. Однак display: table+ display: table-cellмакет дасть бажаний результат.
Салман А

Чудове оновлення! Однак я в кінцевому підсумку намагався це зробити, і мені хотілося розділити пробіл між divs / клітинками, і в кінцевому підсумку довелося зробити внутрішні діви в межах div-комірок таблиці, щоб досягти цього, а потім, звичайно, втратив здатність змусити їх використовувати повну висоту тому що внутрішні диви не були дівами настільних комірок - точно така ж проблема. Якісь ідеї для цього? Зараз немає інтервалу між клітинками.
mikato

А-а, у CSS є пробіли кордону! stackoverflow.com/questions/339923/… Мені вдалося змусити свої подібні до таблиць діви добре працювати з розділенням пробілів, використовуючи інтервал між межами. Тепер у мене є можливість змусити клітинки таблиці (кольорові блоки фону) використовувати повний зріст батьківського або не розумним використанням дівок таблиці комірок.
mikato

Просто дітка, на яку я зіткнувся: ви не можете використовувати це з float: stackoverflow.com/questions/20110217/…
Джошуа Пінтер

4

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

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

Я не вірю, що height:100%це спрацює, тому, якщо ви чітко не знаєте діви висот, я не думаю, що існує чисте рішення CSS.


1
Ви повинні спровокувати це принаймні після готовності, зміни розміру, зміни орієнтації, розміру шрифту.
netAction

4

Я використав це для розділу коментарів:

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Ви можете плавати дитиною вправо, але в цьому випадку я точно підрахував ширину кожного діва.


1
Перше, що мені прийшло в голову - це зріст: успадкувати не впевнений, чому ніхто не звертався з проханням
Андреас

3

Якщо вам відомо про завантажувальний інструмент, ви можете це легко зробити, використовуючи властивість 'flex'. Все, що вам потрібно зробити, це передати нижче css властивості до батьківського div

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

де .homepageSectionмій батьківський дів. Тепер додайте дочірній div у свій HTML як

<div class="abc col-md-6">
<div class="abc col-md-6">

де abc - моя дитина, дивіться. Ви можете перевірити рівність висоти в обох дочірніх дивізіонах незалежно від кордону, лише надавши межу дитині-діві


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

Я використовував стиль inline просто для того, щоб дати ідею.


-2

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

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.