Ребенок внутри родителя с минимальной высотой: 100% не наследует рост

Я нашел способ заставить контейнер 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>

Ответ 1

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

По-видимому, Firefox также подвержен влиянию (в настоящий момент он не может быть протестирован в IE)

Возможное обходное решение:

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

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

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

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

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

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

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

Если я поставлю минимальную высоту на свой контейнер, я не буду явно указывать его высоту, поэтому мой элемент должен получить высоту 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/.

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

#containment-shadow-left {
  flex: 1;
}

Ответ 6

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

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

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

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

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

Ответ 7

В дополнение к существующим ответам есть также единицы просмотра 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>

Ответ 8

Для гуглеров:

Это jquery-workaround позволяет #созданию автоматически получать высоту (по высоте, авто), а затем получает фактическую высоту, назначенную как значение пикселя.

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

Ответ 9

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

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');
}

Angular:

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>

Ответ 10

Хотя display: flex; здесь было предложено рассмотреть использование display: grid; теперь, когда это широко поддержано. По умолчанию единственный дочерний элемент сетки будет полностью заполнять своего родителя.

html, body {
  height: 100%;
  margin: 0;
  padding: 0; /* Don't forget Safari */
}

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

#containment-shadow-left {
  background: aqua;
}

Ответ 11

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

Без переполнения

html, body, .wrapper, .parent, .child {
  position: fixed;
  top: 0; 
  bottom: 0;
  left: 0;
  right: 0;
  margin: 0;
  padding: 0;
  height: 100%;
}

.child {
  overflow: auto;
  background: gray;
}

.height-50 {
  height: 50%;
  width: 5em;
  margin: 10px auto;
  background: cyan;
}
<div class="wrapper">
  <div class="parent">
    <div class="child">
      
      <div class="height-50"></div>
      
    </div>
  </div>
</div>

Ответ 12

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

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

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>

Ответ 13

Это то, что работает для меня с ростом в процентах и ростом родителей в зависимости от роста детей. Прекрасно работает в Firefox, Chrome и Safari.

.parent {
  position: relative;
  min-height: 100%;
}

.child {
  min-height: 100vh;
}
<div class="parent">
    <div class="child"></div>
  </div>

Ответ 14

после того, как мы попробуем наш! хром понимает, что я хочу, чтобы дочерний элемент был на 100% выше, когда я устанавливал отображаемое значение в встроенный блок. btw установка float вызовет его.

display:inline-block

Обновление

это не работает. решение состоит в том, чтобы получить смещение parentnode offsetheight и использовать его на странице и с javascript.

<script>
    SomedivElement = document.getElementById('mydiv');
    SomedivElement.style.height = String(nvleft.parentNode.offsetHeight) + 'px';    
</script>