Ребенок внутри родителя с минимальной высотой: 100% не наследует рост - PullRequest
127 голосов
/ 12 декабря 2011

Я нашел способ заставить контейнер div занимать хотя бы полную высоту страницы, установив min-height: 100%;. Однако, когда я добавляю вложенный div и устанавливаю height: 100%;, он не растягивается до высоты контейнера. Есть ли способ это исправить?

html, body {
  height: 100%;
  margin: 0;
}

#containment {
  min-height: 100%;
  background: pink;
}

#containment-shadow-left {
  height: 100%;
  background: aqua;
}
<div id="containment">
  <div id="containment-shadow-left">
    Hello World!
  </div>
</div>

Ответы [ 14 ]

148 голосов
/ 17 февраля 2014

Добавить height: 1px в родительский контейнер. Работает в Chrome, FF, Safari.

123 голосов
/ 12 декабря 2011

Сообщается об ошибке webkit (chrome / safari), дети родителей с минимальной высотой не могут наследовать свойство высоты: https://bugs.webkit.org/show_bug.cgi?id=26559

Очевидно, что Firefox тоже затронут (в данный момент не может тестировать в IE)

Возможное решение:

  • добавить позицию: относительно # сдерживания
  • добавить позицию: абсолютная к # сдерживающая тень-влево

Ошибка не отображается, когда внутренний элемент имеет абсолютное позиционирование.

См. http://jsfiddle.net/xrebB/

Редактировать 10 апреля 2014 г.

Поскольку в настоящее время я работаю над проектом, для которого мне действительно нужны родительские контейнеры с min-height и дочерние элементы, наследующие высоту контейнера, я провел еще несколько исследований.

Первое: Я больше не уверен, действительно ли текущее поведение браузера является ошибкой. Спецификации CSS2.1 говорят:

Процент рассчитывается относительно высоты сгенерированный блок, содержащий блок. Если высота содержащая блок не указан явно (т.е. зависит от содержимого высота), и этот элемент не является абсолютно позиционированным, значение вычисляет до 'auto'.

Если я добавлю минимальную высоту к своему контейнеру, я не буду явно указывать его высоту - поэтому мой элемент должен получить auto высоту. И это именно то, что делает Webkit - и все другие браузеры -

Во-вторых, я нашел обходной путь:

Если я установлю свой элемент контейнера на display:table с height:inherit, он будет действовать точно так же, как если бы я дал ему min-height 100%. И - что более важно - если я установлю дочерний элемент на display:table-cell, он будет отлично наследовать высоту элемента контейнера - будь то 100% или более.

Полный CSS:

html, body {
  height: 100%;
  margin: 0;
}

#container {
  background: green;
  display: table;
  height: inherit;
  width: 100%;
}

#content {
  background: red;
  display: table-cell;
}

Разметка:

<div id="container">
  <div id="content">
      <p>content</p>
  </div>
</div>

См. http://jsfiddle.net/xrebB/54/.

78 голосов
/ 28 апреля 2017

подумал, что поделюсь этим, поскольку я нигде этого не видел, и это то, что я использовал для исправления своего решения.

РЕШЕНИЕ : min-height: inherit;

Iу меня был родитель с указанной минимальной высотой, и мне нужно было, чтобы ребенок был такой же высоты.

.parent {
  min-height: 300px;
  background-color: rgba(255,255,0,0.5); //yellow
}

.child {
  min-height: inherit;
  background-color: rgba(0,255,0,0.5); //blue
}

p {
  padding: 20px;
  color: red;
  font-family: sans-serif;
  font-weight: bold;
  text-align: center;
}
<div class="parent">
  <div class="child">
    <p>Yellow + Blue = Green :)</p>
  </div>
</div>

Таким образом, ребенок теперь действует как высота 100% от минимальной высоты.

Я надеюсь, что некоторые люди находят это полезным:)

8 голосов
/ 30 июня 2014

Решение Kushagra Gour работает (по крайней мере, в Chrome и IE) и решает исходную проблему без использования display: table; и display: table-cell;. Смотреть плункер: http://plnkr.co/edit/ULEgY1FDCsk8yiRTfOWU

Установка min-height: 100%; height: 1px; на внешнем элементе приводит к тому, что его фактическая высота должна быть не менее 100%, как требуется. Это также позволяет внутреннему div правильно наследовать высоту.

7 голосов
/ 31 октября 2018

Это было добавлено в комментарии @jackocnr, но я пропустил это.Для современных браузеров я думаю, что это лучший подход.

Он заставляет внутренний элемент заполнять весь контейнер, если он слишком мал, но увеличивает высоту контейнера, если он слишком большой.

#containment {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

#containment-shadow-left {
  flex: 1;
}
3 голосов
/ 11 февраля 2018

В дополнение к существующим ответам есть также единицы просмотра vh. Простой фрагмент ниже. Конечно, его можно использовать вместе с calc(), например, min-height: calc(100vh - 200px); когда верхний и нижний колонтитулы страницы имеют высоту 200px.

body {
  margin: 0;
}

.child {
  min-height: 100vh;
  background: pink;
}
<div class="parent">
  <div class="child"></div>
</div>
3 голосов
/ 21 ноября 2014

Я не верю, что это ошибка в браузерах. Все ведут себя одинаково - то есть, как только вы перестанете указывать явную высоту, минимальная высота - это, по сути, «последний шаг».

Похоже, что спецификация CSS 2.1 предполагает: http://www.w3.org/TR/CSS2/visudet.html#the-height-property

Процент рассчитывается относительно высоты содержащего блока сгенерированного блока. Если высота содержащего блока не указана явно (то есть зависит от высоты содержимого), и этот элемент не является абсолютно позиционированным, значение вычисляется как 'auto'.

Поэтому, поскольку у родительского элемента min-height нет явного набора свойств height, по умолчанию используется значение auto.

Есть несколько способов обойти это, возможно, используя display: table-cell или более новые стили, такие как flexbox, если это возможно для браузеров вашей целевой аудитории. Вы также можете изменить это в определенных ситуациях, используя свойства top и bottom для абсолютно позиционированного внутреннего элемента, что дает вам 100% высоты без указания этого.

2 голосов
/ 16 декабря 2011

Для Google:

Этот обходной путь jquery заставляет #containment автоматически получать высоту (by, height: auto), а затем получает фактическую высоту, назначенную в виде значения в пикселях.

<script type="text/javascript">
<!--
    $(function () {

        // workaround for webkit-bug http://stackoverflow.com/a/8468131/348841

        var rz = function () {
            $('#containment')
            .css('height', 'auto')
            .css('height', $('#containment').height() + 'px');
        };

        $(window).resize(function () {
            rz();
        });

        rz();

    })
-->
</script>
1 голос
/ 15 июня 2019

Лучший способ достичь этого в настоящее время - использовать display: flex;.Однако вы можете столкнуться с проблемой при попытке поддержки IE11.В соответствии с https://caniuse.com при использовании flexbox:

IE 11 неправильно выравнивает элементы по вертикали при использовании минимальной высоты

Internet Explorer-совместимое решение

Решение состоит в том, чтобы использовать display: table; для родителя и display: table-row; для ребенка, а height: 100%; в качестве замены min-height: 100%;.

В большинстве решений, перечисленных здесь, используется display:table, table-row и / или table-cell, но они не воспроизводят то же поведение, что и min-height: 100%;, а именно:

  • Наследуют вычисленную высоту родителя (в отличие отнаследовать его height свойство);
  • Разрешить родительскому росту превышать его min-height;

При использовании этого решения поведение такое же, и свойство min-height не требуется, что позволяет обойти ошибку.

Объяснение

Причина, по которой он работает, заключается в том, что, в отличие от большинства элементов, элементы, использующие display: table и table-row, будутвсегда быть таким же высоким, как их содержание.Это заставляет их свойство height вести себя подобно min-height.

Решение в действии

html, body {
  height: 100px;
  margin: 0;
}

#containment {
  display: table;
  height: 100%;
  background: pink;
  width: 100%;
}

#containment-shadow-left {
  display: table-row;
  height: 100%;
  background: aqua;
}

#content {
  padding: 15px;
}

#demo {
  display: none;
  background-color: red;
  height: 200px;
}

#demo-checkbox:checked ~ #demo {
  display: block;
}
<div id="containment">
  <div id="containment-shadow-left">
    <div id="content">
      <input id="demo-checkbox" type="checkbox">
      <label for="demo-checkbox">Click here for overflow demo</label>
      <div id="demo">This is taller than #containment</div>
    </div>
  </div>
</div>
1 голос
/ 24 января 2015

Другое решение JS, которое легко и может использоваться, чтобы избежать непростого решения только для CSS или дополнительной разметки / хакерства.

function minHeight(elm, percent) {
  var windowHeight = isNaN(window.innerHeight) ? 
                     window.clientHeight : window.innerHeight;
  var height = windowHeight * percent / 100;
  elm.style.minHeight = height + 'px';
}

W / jQuery:

function minHeight($elm, percent) {
  var windowHeight = $(window).height();
  var height = windowHeight * percent / 100;
  $elm.css('min-height', height + 'px');
}

Угловая директива:

myModule.directive('minHeight', ['$window', function($window) {
  return {
    restrict: 'A',
    link: function(scope, elm, attrs) {
      var windowHeight = isNaN($window.innerHeight) ? 
               $window.clientHeight : $window.innerHeight;
      var height = windowHeight * attrs.minHeight / 100;
      elm.css('min-height', height + 'px');
    }
  };
}]);

Для использования следующим образом:

<div>
  <!-- height auto here -->
  <div min-height="100">
    <!-- This guy is at least 100% of window height but grows if needed -->
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...