Розширення батьківського <div> на зріст своїх дітей


308

У мене структура сторінки схожа на цю:

<body>
  <div id="parent">
    <div id="childRightCol">
      /*Content*/
    </div>
    <div id="childLeftCol">
      /*Content*/
    </div>
  </div>
</body>

Я хотів би , щоб батько divрозширюватися в heightколи внутрішній div«S heightзбільшується.

Редагувати:
одна проблема полягає в тому, що якщо widthдочірній вміст розширюється за widthмежі вікна браузера, мій поточний CSS ставить горизонтальну смугу прокрутки на батьківську div. Я хотів би, щоб смуга прокрутки знаходилася на рівні сторінки. Наразі мій батьківський дів встановлений наoverflow: auto;

Чи можете ви мені допомогти з CSS для цього?


6
Ти пливеш внутрішніми дівами? Чи можете ви опублікувати поточний CSS?
Ерік

2
@Eric - це теж була моя проблема - мої дитячі діви (и) поплавали: ліворуч, коли я видалив його, «батьківський» автоматично розпізнавався і розтягувався на повний зріст!
Майкл Гольцман

Відповіді:


539

Спробуйте це для батьків, це працювало для мене.

overflow:auto; 

ОНОВЛЕННЯ:

Ще одне рішення, яке спрацювало:

Батько :

display: table;

Дитина :

display: table-row;

67
overflow:autoозначає, що браузер повинен вирішити, яке значення застосувати. Що насправді робить трюк overflow: overlay.
Альба Мендес

14
@jmendeth Значення переповнення під назвою "накладання" не існує. Що працює, якщо дитячі діви плавають, декларує overflow:hidden.
Крістоф

16
Waaaait Розслабтесь. Одна справа - стверджувати overlay, що не підтримується за межами Webkit. Ще зовсім інше - сказати, що його взагалі не існує. Будь ласка, спочатку RTFM . ;)
Альба Мендес

6
Якщо це лише на Webkit, то існує лише 20%: P Привіт за посилання, ніколи раніше не бачив цього веб-сайту. Чи добре підтримується та оновлюється? Ви присягаєте?
pilau

20
Альтернативна відповідь - stackoverflow.com/questions/450903/…, і вона пропонує встановити display:inline-block. Що для мене чудово працювало.
Єнс

26

додати а clear:both. припускаючи, що ваші стовпці плавають. Залежно від того, як вказано ваш зріст, вам може знадобитися переповнення: auto;

<body>
<div id="parent">
    <div id="childRightCol">
    <div>
    <div id="childLeftCol">
    <div>
    <div id="clear" style="clear:both;"></div>
</div>
</body>

Це дає мені горизонтальну смугу прокрутки на батьківському діві, коли вміст ширше вікна браузера. Я хотів би, щоб горизонтальна прокрутка була на всій сторінці.
Стів Горн

1
Навіщо потрібен перелив: auto ;? У моєму тесті ясно: і те, і інше; вистачало.
Паоло Бергантіно

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

Цей підхід відмінно працює у Firefox, але не працює в IE 6. Будь-які обходи?
Стів Горн


13

Спробуйте дати max-contentбатьківський зріст.

.parent{
   height: max-content;
}

https://jsfiddle.net/FreeS/so4L83wu/5/


Як ця властивість поводиться з іншими браузерами? У MDN: developer.mozilla.org/en-US/docs/Web/CSS/…
Роберт Моліна

Це здавалося єдиним, що
Бен Вілер

таке дивовижне значення css! не підтримується в Edge ¯_ (ツ) _ / ¯
Самер Мурад

4

Для тих, хто не може цього зрозуміти в інструкціях з цієї відповіді :

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

Наприклад, якщо у вас є

#childRightCol
{
    margin-top: 30px;
}
#childLeftCol
{
    margin-bottom: 20px;
}

краще замінити його на:

#parent
{
    padding: 30px 0px 20px 0px;
}

4

Використовуючи що - щось на зразок самоочищення divідеально підходить для такої ситуації , як це . Тоді ви просто будете використовувати клас на батьківській мові ...

<div id="parent" class="clearfix">

3

Додайте

clear:both; 

До css батьківського div або додайте div у нижній частині батьківського div, що робить зрозумілим: і те й інше;

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


2

Це робить те, що ти хочеш?

.childRightCol, .childLeftCol
{
    display: inline-block;
    width: 50%;
    margin: 0;
    padding: 0;
    vertical-align: top;
}


1

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

Приклад:

#wrap {width:400px;padding:10px 200px 10px 200px;position:relative;margin:0px auto;}
#maincolumn {width:400px;}

Виходячи з того, що розділ maincolumn є найглибшим дочірнім розділом #wrap, це визначає глибину #wrap div, а накладка 200px з обох боків створює два великі порожні стовпчики, щоб ви могли розмістити абсолютно розташовані знаки у вашому бажанні. Ви навіть можете змінити верхню та нижню частину прокладки, щоб розмістити заголовки та дивні колонтитули, використовуючи позицію: абсолютна.


0

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


0

Якщо ваш вміст у #childRightCol та #childRightCol плаває ліворуч або праворуч, просто додайте це до css:

#childRightCol:before { display: table; content: " "; }
#childRightCol:after { display: table; content: " "; clear: both; }
#childLeftCol:before { display: table; content: " "; }
#childLeftCol:after { display: table; content: " "; clear: both; }

0

Це функціонує так, як описано у специфікації - кілька відповідей тут є дійсними та відповідають наступному:

Якщо у нього є діти на рівні блоку, висота - це відстань між верхньою межею краю верхнього доменного вікна на рівні блоку, яка не має згортання поля, і нижньою межею крайнього нижнього доменного поля рівня що не має крайового поля через нього. Однак якщо елемент має ненульову верхню частину прокладки та / або верхню межу, або є кореневим елементом, то вміст починається з верхнього краю краю верхнього дочірнього доріжка. (У першому випадку виражається той факт, що верхній і нижній полі елемента стикаються з найвищими та найнижчими дітьми, тоді як у другому випадку наявність прокладки / межі запобігає руйнуванню верхнього поля.) Аналогічно, якщо елемент має ненульову нижню частину прокладки та / або нижню межу, тоді вміст закінчується на нижньому краю крайньої нижньої дочірньої області.

звідси: https://www.w3.org/TR/css3-box/#blockwidth


0

Нижче код працював для мене.

css

.parent{
    overflow: auto;
} 

html

<div class="parent">
    <div class="child1">
    </div>
    <div class="child2">
    </div>
    <div id="clear" style="clear:both;"></div>
</div>


0

Звідки ми починаємо

Ось деякі HTMLplate та CSS на платформі. У нашому прикладі ми маємо батьківський елемент з двома плаваючими дочірніми елементами.

/* The CSS you're starting with may look similar to this.
 * This doesn't solve our problem yet, but we'll get there shortly.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}
<!-- The HTML you're starting with might look similar to this -->
<div class="containing-div">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
</div>

Рішення №1: переповнення: авто

Рішення, яке працює у всіх сучасних браузерах та в Internet Explorer назад до IE8, - це додати overflow: autoдо батьківського елемента. Це також працює в IE7, додані смуги прокрутки.

/* Our Modified CSS.
 * This is one way we can solve our problem.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
  overflow: auto;
  /*This is what we added!*/
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}

Рішення №2: Поплавковий батьківський контейнер

Іншим рішенням, яке працює у всіх сучасних браузерах і назад до IE7, є плавання батьківського контейнера.

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

/* Modified CSS #2.
 * Floating parent div.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  float: left;
  /*Added*/
  height: auto;
  width: 100%;
  /*Added*/
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}

Спосіб №3: Додайте очищення Div під плаваючими елементами

/* 
 * CSS to Solution #3.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}


/*Added*/

.clear {
  clear: both;
}
<!-- Solution 3, Add a clearing div to bottom of parent element -->
<div class="containing-div">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
  <div class="clear"></div>
</div>

Метод №4: Додавання очищення Div до батьківського елемента Це рішення є досить бронезахищеним для старих браузерів та нових браузерів.

/* 
 * CSS to Solution #4.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}


/*Added*/

.clearfix {
  clear: both;
}

.clearfix:after {
  clear: both;
  content: "";
  display: table;
}
<!-- Solution 4, make parent element self-clearing -->
<div class="containing-div clearfix">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
</div>

з https://www.lockedownseo.com/parent-div-100-height-child-floated-elements/


-1

Я використовую цей CSS для батьків, і він працює:

min-height:350px;
background:url(../images/inner/details_middle.gif) repeat-y 0 0 ;
padding:5px 10px;   
text-align:right;
overflow: hidden;
position: relative;
width: 100%;

2
Ви використовуєте міні-висоту, так що не рахується;)
pilau

-1

#parent{
  background-color:green;
  height:auto;
  width:300px;
  overflow:hidden;
}

#childRightCol{
  color:gray;
  background-color:yellow;
  margin:10px;
  padding:10px;
}
<div id="parent">
    <div id="childRightCol">
        <p>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate sit amet neque ac consequat.
        </p>
    </div>
  </div>

ви керуєте, використовуючи overflow:hidden;властивість у css

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