Дитина всередині батька з мінімальним зростом: 100% не успадковує зріст


167

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


27
Сучасний день рішення: дати контейнер display:flexі flex-direction:columnі дати дитині flex:1.
jackocnr

3
@jackocnr Це не працює в жодному IE через помилку , він був виправлений в Edge.
Наклейки

Відповіді:


146

Це повідомлення про помилку webkit (chrome / safari); діти батьків із мінімальним зростом не можуть успадкувати властивість висоти: https://bugs.webkit.org/show_bug.cgi?id=26559

Мабуть, також впливає Firefox (наразі не можна перевірити IE)

Можливе вирішення:

  • Додати позицію: відносно #containment
  • додати позицію: абсолютна до # містити-тінь-зліва

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

Дивіться 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/ .


26
Людина, це все ще не виправлено: S
Mārtiņš Briedis

Так, це не так - я бачу, є кілька патчів, але щодо Chrome 29 він все ще не відображає очікуваної поведінки. Однак він також не працює в Firefox 23, IE 10, Safari 5 або Opera 12. Принаймні всі браузери згодні ...
Пол д'Ауст

3
Дивно читати специфікацію, щоб зробити висновок, що мінімальна / максимальна висота не є явною ... і дивно я маю на увазі неправильну. Читаючи весь параграф, в контексті, це тлумачення є неправильним. Щоб уточнити, чому "висота блоку, що містить", в контексті семантично відрізняється від властивості висоти. Якщо б замість цього фразування було " властивістю висоти блоку, що містить", то Ваша інтерпретація мала б сенс (і була б помилкою в специфікації).
WraithKenny

1
Настає 2019. Ми пропустили 10 років з цього клопа. Рішення flex працювало для мене stackoverflow.com/questions/8468066/…
Ілля Чернов

6
Я з епохи блокування
Девід Калланан

174

Додати height: 1pxв батьківський контейнер. Працює в Chrome, FF, Safari.


8
Це не вирішує проблему, фактично ви переосмислюєте мінімальну висоту: 100% налаштування, що не дозволяє досягти нічого, чого не вдасться досягти з висотою: 100%, що не те, що хоче ОП
стайлер

16
Додавання @styler height: 1px;не змінить мінімальну висоту. Зовсім навпаки. Це найкраще рішення тут ... демо: jsbin.com/mosaboyo/1/edit
jjenzz

2
Ознайомтеся з тим, чому height: 1px;працює stackoverflow.com/questions/2341821/height100-vs-min-height100
Ben Alavi

31
@jjenzz Проблема з цим, на який я думаю, що стилер намагався досягти, полягає в тому, що це не зберігає риси розширення min-height. Наприклад, якщо є достатньо тексту, він переповниться. Дивіться jsbin.com/vuyapitizo/1
binaryfunt

3
Цитуючи коментар Павла нижче: "Але це не дозволяє контейнеру рости, що перемагає мету використання мінімальної висоти". stackoverflow.com/questions/8468066/…
Лео Лей

103

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

РІШЕННЯ :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>

Таким чином, дитина зараз виконує роль 100% мінімального зросту.

Я сподіваюся, що деякі люди вважають це корисним :)


9
Частково працює, але дитина лише успадковує min-height. Коли зріст батьків більший, дитина не розшириться.
OguzGelal

1
Ти врятував мені життя
casamia

6
Він працює лише тоді, коли мінімальна висота абсолютна, а не відсоткова, AFAICS.
Бенджамін

4
Також добре працює, якщо у батьків є vh значення! ДЯКУЮ!
user1658080

1
Не підходить для кожної ситуації, але дуже корисний іноді. Дякую!
Blackbam

15

Це було додано у коментарі @jackocnr, але я пропустив це. Для сучасних браузерів я вважаю, що це найкращий підхід.

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

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

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

1
це найкраще, оскільки flexbox широко сумісний.
Хосе Карлос Рамірес Васкес

8

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

Якщо встановити min-height: 100%; height: 1px;зовнішній дзвінок, то його фактична висота повинна бути не менше 100%, як потрібно. Це також дозволяє внутрішньому діву правильно успадкувати висоту.


23
Але це не дозволяє контейнеру рости, що перемагає мету використання мінімальної висоти.
Сал

Мені була потрібна обгортка, щоб також заповнити мінімальну висоту та зріст батьків. Що працювало для мене, це встановлення мінімальної висоти для успадкування та висоти до 100%.
Містер

6

Окрім існуючих відповідей, є також оглядові одиниці 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

Я не вірю, що це помилка з браузерами. Усі поводяться однаково - тобто, коли ви припините вказувати явні висоти, мінімальна висота - це в основному "останній крок".

Здається, саме так пропонує специфікація CSS 2.1: http://www.w3.org/TR/CSS2/visudet.html#the-height-property

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

Тому, оскільки у min-heightбатьків немає явного heightнабору властивостей, він за замовчуванням встановлює автоматичне.

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


3

Хоча 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;
}


2

Для googlers:

Цей jquery-вирішення змушує #containment автоматично отримувати висоту (за, висотою: авто), а потім отримує фактичну висоту, призначену як значення пікселя.

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

Хороший спосіб вирішення, ви можете просто встановити мінімальну висоту елемента, не встановлюючи висоту на "авто". Це працювало для мене.
Сальваторе Запалаà

2

Найкращий спосіб цього досягти - це використовувати 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

Ще одне рішення 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>

Дякую за директивне рішення. Це те, що я в кінцевому підсумку використовував, але не хотів, щоб висота вікна була мінімальною; скоріше я хотів успадкувати мінімальну висоту батьків, тому я змінив код на такий: var height = elm.parent () [0] .offsetHeight;
Сал

1

Зазвичай це працює для мене:


.parent {
  min-height: 100px;
  background-color: green;
  display: flex;
}
.child {
  height: inherit;
  width: 100%;
  background-color: red;
}
<!DOCTYPE html>
<html>
  <body>
    <div class="parent">
      <div class="child">
      </div>
    </div>
  </body>
</html>

0

Просто тримати цю тему повно, я знайшов рішення не досліджував тут використовуючи Фіксовану позицію.

Ніякого переливу

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>

З Переповненням

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-150 {
  height: 150%;
  width: 5em;
  margin: 10px auto;
  background: cyan;
}
<div class="wrapper">
  <div class="parent">
    <div class="child">
      
      <div class="height-150"></div>
      
    </div>
  </div>
</div>


-2

Це те, що для мене працює з ростом у відсотках, а батьки все ще зростають відповідно до зросту дітей. Відмінно працює у Firefox, Chrome та Safari.

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

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


-3

після спроб для наших! chrome розуміє, що я хочу, щоб дочірній елемент був на 100% висотою, коли я встановлював значення відображення на вбудований блок. btw налаштування поплавця призведе до цього.

display:inline-block

оновлення

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

<script>
    SomedivElement = document.getElementById('mydiv');
    SomedivElement.style.height = String(nvleft.parentNode.offsetHeight) + 'px';    
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.