Як заповнити 100% залишкової висоти?


78
+--------------------+
|                    |
|                    |
|                    |
|                    |
|         1          |
|                    |
|                    |
|                    |
|                    |
+--------------------+
|                    |
|                    |
|                    |
|                    |
|         2          |
|                    |
|                    |
|                    |
|                    |
+--------------------+

Зміст (1), як показано вище, невідомий, оскільки він може збільшуватись або зменшуватися на динамічно створюваних сторінках. Другий div (2), як показано вище, повинен заповнити решту місця.

ось приклад мого html

<div id="full">
<!--contents of 1 -->
<div id="someid">
<!--contents of 2 -->
</div>
</div>

css ...

#full{width: 300px; background-color: red;}
#someid{height: 100%;}

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


Ви хочете, щоб висота 1 + 2 була точною висотою області перегляду? Або 2 має такий самий розмір, як область перегляду, і він прокручується вниз, рівний висоті 1?
thgaskell

висота 1 я не знаю, а решта 1 тоді 2 буде повною висотою.
Bhojendra Rauniyar

@ C-Link Що ви маєте на увазі height:100%? Ви маєте на увазі, що div повинен займати решту висоти?
Mr_Green

@Mr_Green так! залишилася висота.
Бхохендра Рауніяр,

@ C-Link Залишилася висота сторінки або решта висоти прокрутки всередині сторінки?
Mr_Green

Відповіді:


62

Ви зможете це зробити, якщо додати в div ( #headerнижче), щоб обернути вміст 1.

  1. Якщо ви плаваєте #header, вміст із нього #someidбуде змушений обтікати його.

  2. Далі ви встановлюєте #headerширину 100%. Це дозволить розширити , щоб заповнити всю ширину контейнера DIV, #full. Це ефективно підштовхне весь #someidвміст нижче, #headerоскільки більше немає місця для обтікання боків.

  3. Нарешті, встановіть #someidвисоту 100%, це зробить її такою ж висотою, як #full.

JSFiddle

HTML

<div id="full">
    <div id="header">Contents of 1</div>
    <div id="someid">Contents of 2</div>
</div>

CSS

html, body, #full, #someid {
  height: 100%;
}

#header {
  float: left;
  width: 100%;
}

Оновлення

Думаю, варто зазначити, що flexbox сьогодні добре підтримується в сучасних браузерах. CSS може бути змінений, #fullстав флекс-контейнером, і #someidслід встановити, що його флекс зростає до значення більше ніж 0.

html, body, #full {
  height: 100%;
}

#full {
  display: flex;
  flex-direction: column;
}

#someid {
  flex-grow: 1;
}

будь ласка, перегляньте мою ** демонстрацію та виправте її там, де помилка.
Бхохендра Рауніяр,

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

Ваша відповідь працює чудово, але я трохи збентежений, чому вона працює: Якщо ви граєте з кольорами тла, ви бачите, що #someidЗАВЖДИ дорівнює висоті #full, незважаючи на висоту #header. Логічно, що вміст #someidповинен починатися з верхньої частини #full. Чому #headerнатискає вміст вниз?
Мисливець S

3
Проблема в цьому полягає в тому, що він робить #someidту саму висоту #full, що і #someidпереливається #fullна висоту #header. Він не встановлює #someid100% залишку місця. Якщо ви встановите overflow: scroll;на, #someidви побачите проблему.
Old Pro

3
Так, цю відповідь слід оновити. Це був хак, який зловживав тим фактом, що float штовхав вміст вниз, що на той час було "досить хорошим" при роботі з браузерами, які не підтримували подібні речі, calcа flexboxмакети не мали широкої підтримки. Подивіться, як далеко ми пройшли менш ніж за 3 роки!
thgaskell,

11

Щоб отримати divвисоту сторінки до 100%, вам також потрібно буде встановити 100% кожного об’єкту в ієрархії над div. наприклад:

html { height:100%; }
body { height:100%; }
#full { height: 100%; }
#someid { height: 100%; }

Хоча я не можу повністю зрозуміти ваше запитання, я припускаю, що це саме те, що ви маєте на увазі.

Це приклад, з якого я працюю:

<html style="height:100%">
    <body style="height:100%">
        <div style="height:100%; width: 300px;">
            <div style="height:100%; background:blue;">

            </div>
        </div>
    </body>
</html>

Style це просто заміна CSS, який я не екстерналізував.


яким елементом ви хочете бути на 100% висотою? а стосовно чого?
Сердаліс

(2) має бути на 100% у висоту. Ваш метод може працювати без обгортки, але я використовую обгортку.
Бхохендра Рауніяр,

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

Я вже говорив, що це може не працювати, тому що я використовую обгортку, а потім встановив її на 100% також не працює.
Бхохендра Рауніяр,

Спробуйте приклад, який я опублікував. Можливо, вам просто не вистачає якоїсь речі в ієрархії, яка все це псує.
Сердаліс

5

Це можна зробити за допомогою таблиць:

<table cellpadding="0" cellspacing="0" width="100%" height="100%">
    <tr height="0%"><td>
        <div id="full">
            <!--contents of 1 -->
        </div>
    </td></tr>
    <tr><td>
        <div id="someid">
            <!--contents of 2 -->
        </div>
    </td></tr>
</table>

Потім застосуйте css, щоб дещо заповнило решту місця:

#someid {
    height: 100%;
}

Тепер я просто чую гнівні крики натовпу: "О ні, він користується столами! Нагодуй його левам!" Будь ласка, вислухай мене.

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

Але не соромтеся довести, що я помиляюся, звичайно! CSS завжди кращий.


4

    html,
    body {
        height: 100%;
    }

    .parent {
        display: flex;
        flex-flow:column;
        height: 100%;
        background: white;
    }

    .child-top {
        flex: 0 1 auto;
        background: pink;
    }

    .child-bottom {
        flex: 1 1 auto;
        background: green;
    }
    <div class="parent">
        <div class="child-top">
          This child has just a bit of content
        </div>
        <div class="child-bottom">
          And this one fills the rest
        </div>
    </div>


Не могли б ви трохи детальніше описати цю відповідь лише для коду? Дякую!
arkascha

Привіт @arkascha, я щойно оновив свій пост прикладом робочого коду. Дякую за пропозицію. Ура.
Ернесто Хегі,

1

Я знаю, що це пізній вихід, але навіть у 2016 році я здивований повною відсутністю підтримки IE для flex (в даний час 11 єдина, хто підтримує його та його головний баггі на цьому http://caniuse.com/#feat= flexbox ), що з точки зору бізнесу не є чудовим! Тож я думаю, поки IE не буде вимкнено, найкращим рішенням, і найзручнішим для перегляду веб-переглядачів, безумовно, має бути JS / Jquery?

Більшість сайтів вже використовують Jquery, і дуже простий приклад (для мого коду):

$('#auto_height_item').height($(window).height() - $('#header').height());

Ви, очевидно, можете замінити вікно та заголовок і дозволити базовій математиці виконати роботу. Особисто я ще не впевнений у гнучкості ...


0

Я додав це для занадто коротких сторінок.

html:

<section id="secondary-foot"></section>

css:

section#secondary-foot {
    height: 100%;
    background-color: #000000;
    position: fixed;
    width: 100%;
}

Я спробував це в @ BhojendraNepal в JSFiddle, але не зміг змусити його працювати. Не могли б ви показати у власному JSFiddle або описати, куди ви додали свій елемент?
Dag Høidahl

0

Створіть div, який містить обидва div (full і someid) і встановіть висоту цього div наступним чином:

висота: 100vh;

Висоту вміщуваних div (full та someid) слід встановити на "auto". Це все.


0

Я знаю, що це давнє запитання, але на сьогоднішній день існує надзвичайно проста форма для цього, це CCS Grid, тому дозвольте мені навести divs як приклад:

<div id="full">
  <div id="header">Contents of 1</div>
  <div id="someid">Contents of 2</div>
</div>

тоді код CSS:

.full{
  width:/*the width you need*/;
  height:/*the height you need*/;
  display:grid;
  grid-template-rows: minmax(100px,auto) 1fr;
 }

І все, другий рядок, scilicet, someide, займе решту висоти через властивість 1fr, а перший div матиме мінімум 100px і максимум що завгодно.

Треба сказати, CSS значно просунувся, щоб полегшити життя програмістам.

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