Ребенок внутри родителя с минимальной высотой: 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>