Я работаю над веб-приложением, в котором я хочу, чтобы контент занимал всю высоту экрана.
Страница имеет заголовок, который содержит логотип и информацию об учетной записи. Это может быть произвольная высота. Я хочу, чтобы div содержимого заполнил оставшуюся часть страницы до конца.
У меня есть заголовок div
и содержание div
. На данный момент я использую таблицу для макета следующим образом:
CSS и HTML
#page {
height: 100%; width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* or overflow: hidden; */
}
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
Вся высота страницы заполнена, и прокрутка не требуется.
Для чего-либо внутри содержимого div, установка top: 0;
поместит его прямо под заголовком. Иногда содержимое будет реальной таблицей с высотой, установленной на 100%. Помещение header
внутрь content
не позволит этому работать.
Есть ли способ добиться того же эффекта без использования table
?
Обновить:
Элементы внутри контента также div
будут иметь высоту, установленную в процентах. Так что что-то на 100% внутри div
заполнит его до дна. Как будет два элемента на 50%.
Обновление 2:
Например, если заголовок занимает 20% высоты экрана, таблица, указанная в 50%, #content
будет занимать 40% пространства экрана. Пока единственное, что работает, - это завернуть все в таблицу.
источник
display:table
и связанные свойства, см. Этот ответ на очень похожий вопрос.Ответы:
Обновление 2015: подход flexbox
Есть два других ответа, кратко упоминающих flexbox ; однако это было более двух лет назад, и они не дают никаких примеров. Спецификация для flexbox определенно исчерпана.
Все основные браузеры и IE11 + поддерживают Flexbox. Для IE 10 или старше вы можете использовать шайбу FlexieJS.
Чтобы проверить текущую поддержку вы также можете посмотреть здесь: http://caniuse.com/#feat=flexbox
Рабочий пример
С помощью flexbox вы можете легко переключаться между строками или столбцами с фиксированными размерами, размерами содержимого или размерами оставшегося пространства. В моем примере я установил привязку заголовка к его содержимому (согласно вопросу OP), я добавил нижний колонтитул, чтобы показать, как добавить область фиксированной высоты, а затем установил область содержимого, чтобы заполнить оставшееся пространство.
В CSS , выше, гибкий Shorthands недвижимости прогибается вырастал , изгибать-усадочный и прогибаются базисные свойства , чтобы установить гибкость гибких элементов. Mozilla хорошо знакомит с моделью гибких коробок .
источник
flex: 0 1 30px;
атрибут вbox .row
качестве override в каждом div?overflow-y: auto
к ,.row.content
чтобы достичь того, что вам нужно , однако.На самом деле не существует надежного кросс-браузерного способа сделать это в CSS. Предполагая, что у вашего макета есть сложности, вам нужно использовать JavaScript, чтобы установить высоту элемента. Суть того, что вам нужно сделать, это:
Как только вы сможете получить это значение и установить высоту элемента, вам нужно прикрепить обработчики событий как к окнам onload, так и к onresize, чтобы вы могли запустить свою функцию изменения размера.
Кроме того, предполагая, что ваш контент может быть больше, чем область просмотра, вам нужно установить overflow-y для прокрутки.
источник
Оригинальный пост более 3 лет назад. Я предполагаю, что многие люди, которые приходят к этому посту, как я, ищут решение для макета, похожее на приложение, скажем, с каким-то фиксированным заголовком, нижним колонтитулом и полноразмерным контентом, занимающим весь экран. Если это так, этот пост может помочь, он работает на IE7 + и т. Д.
http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
И вот некоторые фрагменты из этого поста:
источник
display: table
телом, это, кажется, переполняет тело. Этоheight: 100%
не дает правильной высоты..col
не используется, не так ли?Вместо использования таблиц в разметке вы можете использовать таблицы CSS.
наценка
(Соответствующий) CSS
FIDDLE1 и FIDDLE2
Некоторые преимущества этого метода:
1) Меньше разметки
2) Разметка более семантическая, чем таблицы, потому что это не табличные данные.
3) Поддержка браузеров очень хорошая : IE8 +, все современные браузеры и мобильные устройства ( caniuse )
Просто для полноты, вот эквивалентные элементы HTML для свойств CSS для модели таблицы CSS
источник
html, body { height: 100%, width: 100% }
показалось критическим в моих тестах.relative
позиционированиеtable-row
элемента, он принимает высоту первого позиционного асцендента, который не является элементом таблицы.Подход только CSS (если высота известна / фиксирована)
Если вы хотите, чтобы средний элемент охватывал всю страницу по вертикали, вы можете использовать его,
calc()
который представлен в CSS3.Предполагая, что у нас есть фиксированная высота
header
иfooter
элементы, и мы хотим, чтобыsection
тег занимал всю доступную вертикальную высоту ...демонстрация
Предполагается разметка и ваш CSS должен быть
Итак, вот что я делаю, складываю высоту элементов, а затем вычитаю из
100%
использованияcalc()
функцию.Просто убедитесь, что вы используете
height: 100%;
для родительских элементов.источник
Используемый:
height: calc(100vh - 110px);
код:
источник
Простое решение с использованием flexbox:
Образец кода
Альтернативное решение, с div в центре содержимого div
источник
Как насчет того, чтобы просто использовать то,
vh
что обозначаетview height
в CSS ...Посмотрите на фрагмент кода, который я создал для вас ниже, и запустите его:
Также посмотрите на изображение, которое я создал для вас ниже:
источник
CSS3 простой способ
все основные браузеры в наши дни поддерживают его, так что продолжайте, если у вас нет необходимости поддерживать старинные браузеры.
источник
Это может быть сделано просто с
CSS
помощьюvh
:и
HTML
Я проверил, он работает во всех основных браузерах:
Chrome
,IE
иFireFox
источник
vh
и оvw
единицах раньше. Больше информации: snook.ca/archives/html_and_css/vm-vh-unitsheight: 100%
on#content
заставил его высоту соответствовать высоте#page
, игнорируя#tdcontent
высоту вообще. С большим количеством контента полоса прокрутки выходит за пределы нижней части страницы.Ни одно из опубликованных решений не работает, если вам нужен нижний блок для прокрутки, когда содержимое слишком высокое. Вот решение, которое работает в этом случае:
Оригинальный источник: заполнение оставшейся высоты контейнера при обработке переполнения в CSS
JSFiddle предварительный просмотр
источник
body-content-wrapper
, и кажется, что все работает без двойной оболочки (без всякихtable-cell
s). Есть ли проблема с этим?.body
высота в конечном итоге будет такой же, как и на.container
. Вертикальная полоса прокрутки все еще находится в нужном месте, но в.container
итоге она растягивается больше, чем мы хотим. Когда это полноэкранный режим, нижняя часть экрана.body
находится за нижним краем экрана.Я тоже искал ответ на этот вопрос. Если вам достаточно повезло, что вы можете использовать IE8 и выше, вы можете использовать
display:table
и связанные значения, чтобы получить правила рендеринга таблиц с элементами уровня блока, включая div.Если вам даже повезло, и ваши пользователи используют браузеры верхнего уровня (например, если это приложение для внутренней сети на компьютерах, которыми вы управляете, как, например, мой последний проект), вы можете использовать новый Гибкий макет коробки в CSS3!
источник
Что сработало для меня (с div внутри другого div, и я предполагаю, что во всех других обстоятельствах), это установить нижний отступ на 100%. То есть добавьте это в свою таблицу CSS / стилей:
источник
HTML 5
CSS
Решение выше использует единицы просмотра и flexbox , поэтому используется IE10 +, при условии, что вы используете старый синтаксис для IE10.
Codepen, чтобы играть с: ссылка на codepen
Или этот, для тех, кому нужен прокручиваемый основной контейнер в случае переполнения контента: ссылка на codepen
источник
Сейчас есть тонна ответов, но я нашел, как использовать
height: 100vh;
элемент div, который должен заполнить все доступное вертикальное пространство.Таким образом, мне не нужно играть с отображением или позиционированием. Это пригодилось при использовании Bootstrap для создания приборной панели, где у меня были боковая панель и основная. Я хотел, чтобы основное растягивалось и заполняло все вертикальное пространство, чтобы я мог применить цвет фона.
Поддерживает IE9 и выше: нажмите, чтобы увидеть ссылку
источник
Во всех здравомыслящих браузерах вы можете поместить div "header" перед содержимым, как один брат, и тот же CSS будет работать. Однако IE7- неправильно интерпретирует высоту, если в этом случае значение float составляет 100%, поэтому заголовок должен быть в содержимом, как указано выше. Переполнение: авто вызовет двойные полосы прокрутки в IE (у которого всегда есть видимая, но отключенная полоса прокрутки в окне просмотра, но без нее содержимое будет обрезаться, если оно переполнится.
источник
div
... то естьtop: 0;
поместит что-то прямо под заголовком. Я снова изменю свой вопрос, потому что вы ответили на него отлично, и все же не то, что я хочу! Я просто спрячу переполнение, так как содержимое должно соответствовать.Некоторое время я боролся с этим и в итоге получил следующее:
Поскольку содержимое DIV контента легко сделать такой же высоты, что и родительский, но, по-видимому, сложно сделать его родительской высотой минус высота заголовка, я решил сделать содержимое div полной высоты, но расположить его абсолютно в верхнем левом углу, а затем определить отступы. для вершины, которая имеет высоту заголовка. Таким образом, содержимое отображается аккуратно под заголовком и заполняет все оставшееся пространство:
источник
Если вы можете справиться с тем, что не поддерживает старые браузеры (то есть MSIE 9 или более ранние версии), вы можете сделать это с модулем Flexible Box Layout Module. который уже является W3C CR. Этот модуль позволяет использовать и другие полезные приемы, такие как изменение порядка содержимого.
К сожалению, MSIE 9 или ниже не поддерживает это, и вы должны использовать префикс поставщика для свойства CSS для каждого браузера, кроме Firefox. Надеюсь, другие поставщики тоже скоро прекратят использование префикса.
Другим вариантом может быть CSS Grid Layout, но он еще меньше поддерживается стабильными версиями браузеров. На практике только MSIE 10 поддерживает это.
Обновление до 2020 года : все современные браузеры поддерживают как
display: flex
иdisplay: grid
. Единственное, чего не хватает, так это поддержки,subgrid
поддерживаемой только Firefox. Обратите внимание, что MSIE не поддерживает ни спецификацию, но, если вы хотите добавить специфичные для MSIE хаки CSS, это можно сделать так, чтобы они себя вели. Я бы предложил просто игнорировать MSIE, потому что даже Microsoft говорит, что его больше нельзя использовать.источник
CSS Grid Solution
Просто определяя с
body
помощьюdisplay:grid
и сgrid-template-rows
использованиемauto
иfr
значением свойства.Полное руководство по сеткам @ CSS-Tricks.com
источник
Почему не просто так?
Давать вам html и body (в таком порядке) высоту, а затем просто дать вашим элементам высоту?
Работает для меня
источник
Вы можете фактически использовать
display: table
разделение области на два элемента (заголовок и содержимое), где заголовок может изменяться по высоте, а содержимое заполняет оставшееся пространство. Это работает со всей страницей, а также когда область представляет собой просто содержимое другого элемента, для которогоposition
установлено значениеrelative
,absolute
илиfixed
. Это будет работать до тех пор, пока родительский элемент имеет ненулевую высоту.Смотрите эту скрипку а также код ниже:
CSS:
HTML:
источник
решил проблему для меня. В моем случае я применил это к необходимому div
источник
Винсент, я отвечу снова, используя твои новые требования. Поскольку вам не нужно скрывать содержимое, если оно слишком длинное, вам не нужно перемещать заголовок. Просто оставьте переполнение скрытым в тегах html и body и установите
#content
высоту на 100%. Контент всегда будет длиннее, чем область просмотра по высоте заголовка, но он будет скрыт и не вызовет полос прокрутки.источник
table
потому что это работает. Спасибо за обновление, хотя.Попробуй это
источник
Я нашел довольно простое решение, потому что для меня это была просто проблема дизайна. Я хотел, чтобы остальная часть страницы не была белой под красным колонтитулом. Поэтому я установил красный цвет фона страниц. И содержимое backgroundcolor к белому. При высоте содержимого, например, 20em или 50% почти пустая страница не оставит всю страницу красной.
источник
У меня была та же проблема, но я не мог заставить работать решение с флексбоксами выше. Поэтому я создал свой собственный шаблон, который включает в себя:
Я использовал flexbox, но более простым способом, используя только свойства display: flex и flex-direction: row | column :
Я использую угловой и хочу, чтобы размеры моих компонентов составляли 100% от их родительского элемента.
Ключ должен установить размер (в процентах) для всех родителей, чтобы ограничить их размер. В следующем примере высота myapp имеет 100% области просмотра.
Основной компонент имеет 90% области просмотра, потому что верхний и нижний колонтитулы имеют 5%.
Я разместил свой шаблон здесь: https://jsfiddle.net/abreneliere/mrjh6y2e/3
Html:
источник
Для мобильного приложения я использую только VH и VW
Демо-версия - https://jsfiddle.net/u763ck92/
источник
Отвергая идею мистера Чужого ...
Это кажется более чистым решением, чем популярный flex box для браузеров с поддержкой CSS3.
Просто используйте min-height (вместо height) с calc () для блока содержимого.
Calc () начинается со 100% и вычитает высоту верхних и нижних колонтитулов (необходимо включить значения отступов)
Использование «min-height» вместо «height» особенно полезно, так как оно может работать с визуализированным содержимым javascript и средами JS, такими как Angular2. В противном случае вычисление не будет сдвигать нижний колонтитул в конец страницы, когда визуализированный контент javascript станет видимым.
Вот простой пример заголовка и нижнего колонтитула, использующих 50px height и 20px padding для обоих.
Html:
Css:
Конечно, математику можно упростить, но вы поняли ...
источник
В Bootstrap:
Стили CSS:
1) Просто заполните высоту оставшегося места на экране:
2) Заполните высоту оставшегося экранного пространства и выровняйте содержимое по центру родительского элемента:
источник
Это моя собственная минимальная версия решения Pebbl. Потребовалось навсегда, чтобы найти способ заставить его работать в IE11. (Также протестировано в Chrome, Firefox, Edge и Safari.)
источник