CSS Высота Полная страница: CSS хитрость: Как заполнить страницу с помощью div?
TL;DR
Если вы хотите иметь полностраничный контейнер div, убедитесь, что у вас есть:
/* переопределить браузер по умолчанию */ HTML, тело { маржа: 0; заполнение: 0; } /* используйте единицы измерения, относящиеся к области просмотра, чтобы полностью покрыть страницу */ тело { высота: 100вх; ширина: 100vw; } /* включить границы и отступы в ширину и высоту элемента */ * { box-sizing: граница-коробка; } /* полноразмерный контейнер, заполняющий страницу */ дел { высота: 100%; ширина: 100%; /* пример заполнения, размера шрифта, фона и т. д. */ отступ: 10 пикселей; размер шрифта: 20px; цвет фона: светло-голубой; }Войти в полноэкранный режимВыйти из полноэкранного режима
Допустим, вам нужен div, который заполняет всю страницу…
раздел { высота: 100%; ширина: 100%; размер шрифта: 20px; цвет фона: светло-голубой; }Войти в полноэкранный режимВыйти из полноэкранного режима
Что?! Это не работает! Высота по-прежнему занимает только содержимое, но не всю страницу.
Ширина хороша, так как div по умолчанию является блочным элементом , который в любом случае занимает максимально возможную ширину.
Можем ли мы просто использовать более «абсолютное» значение, например
px
?раздел { /* высота: 100% */ высота: 865 пикселей; /* текущая высота моего браузера */ /* ... */ }Войти в полноэкранный режимВыйти из полноэкранного режима
Работает… до изменения размера браузера
Не адаптируется при изменении размера браузера.
Для этого можно использовать JS, но это слишком много для того, что мы хотели.
Я упомянул, что
px
являются «абсолютными», но только в том смысле, что они не связаны ни с чем другим (например, rem и vh). Но реальный размер все равно зависит от устройства. Вот некоторые подробности:
Переполнение стека: действительно ли пиксель CSS является абсолютной единицей?
Родственные юниты на помощь!
Олдскул
высота: 100%
html, тело { высота: 100%; ширина: 100%; } дел { высота: 100%; /* . .. */ }Войти в полноэкранный режимВыйти из полноэкранного режима
Работает! (Полосы прокрутки мы исправим позже)
Установив для
и его дочернего элемента
высоту 100%, мы получим полный размер.
Обратите внимание, что только установка любого из них не будет работать, так как процент всегда относится к другому значению.
В данном случае:
-
div
составляет 100% высоты тела -
body
на 100% больше высотыhtml
-
html
составляет 100% высоты области просмотра
Область просмотра — это видимая область браузера, которая зависит от устройства.
Viewport >
html
>body
>div
Например, iPhone 6/7/8 имеет окно просмотра 375×667. Вы можете проверить это в настройках мобильных инструментов браузера.
На данный момент вы можете думать о области просмотра как о размере или разрешении устройства в пикселях. Но если вы хотите углубиться:
Media Genesis: размер экрана, разрешение и область просмотра: что все это значит?
более новое решение: единицы просмотра
vh
и vw
Длина области просмотра в процентах
или Единицы области просмотра существуют уже некоторое время и идеально подходят для реагирования на изменения размеров браузера.- 1 высота окна просмотра (
1vh
) = 1% высоты окна просмотра - 1 ширина окна просмотра (
1vw
) = 1% ширины окна просмотра
Другими словами, 100vh
= 100% высоты области просмотра
100vw
= 100% ширины области просмотра
Таким образом, они эффективно заполняют окно просмотра устройства.
html, тело { /* высота: 100%; */ /* ширина: 100% */ } дел { /* высота: 100%; ширина: 100%; */ высота: 100вх; ширина: 100vw; /* . .. */ }Войти в полноэкранный режимВыйти из полноэкранного режима
Тоже хорошо выглядит! (Полосы прокрутки исправим позже)
Как упоминалось в комментариях и , известно скачкообразное поведение во время прокрутки при использовании
100vh
в мобильных браузерах, что является проблемой, но webkit считает это преднамеренным. Подробнее см. по этим ссылкам: Высота области просмотра выше, чем видимая часть документа в некоторых мобильных браузерах и переполнение стека: CSS3 100vh не является постоянным в мобильном браузере
Как насчет
min-height: 100vh
? В то время как height
фиксирует длину 100vh
, min-height
начинается с 100vh
, но позволяет содержимому расширять div за пределы этой длины. Если содержимое меньше указанной длины, min-height
не действует.
Другими словами, min-height
гарантирует, что элемент по крайней мере
height
, если height
определен и меньше, чем min-height
.Для нашей цели иметь дочерний элемент div с полной высотой и шириной, это не имеет никакого значения, поскольку содержимое также имеет полный размер.
Хорошим примером использования
min-height
является липкий нижний колонтитул, который выдвигается, когда на странице появляется больше контента. Проверьте это здесь и другие полезные способы использования vh
Развлечение с модулями Viewport | CSS-трюки
Очень распространенной практикой является применение height: 100vh
и width: 100vw
к
напрямую… В этом случае мы даже можем оставить контейнер div
относительного размера, как в начале, на случай, если позже мы передумаем.
И при таком подходе мы гарантируем, что все наше тело DOM занимает полную высоту и ширину независимо от нашего контейнера div.
тело { высота: 100вх; ширина: 100vw; } дел { высота: 100%; ширина: 100%; /* высота: 100vh; ширина: 100vw; */ /* . .. */ }Войти в полноэкранный режимВыйти из полноэкранного режима
vh/vw
по сравнению с %
Хороший способ думать о vh, vw
против %
состоит в том, что они аналогичны em
и rem
%
и em 9002, в то время как оба размера относятся к родителю0024 vw/vh
и rem
относятся к «самой высокой ссылке», размеру корневого шрифта для rem и области просмотра устройства для vh/vw.
Но почему полоса прокрутки?
и
имеют поля и отступы по умолчанию!Браузеры имеют поля, отступы и границы по умолчанию для HTML-элементов. И хуже всего то, что для каждого браузера он разный!
Chrome по умолчанию для
имеет отступ : 8px
А 100vh + 8px
вызывает переполнение, так как это больше, чем область просмотра
К счастью, это довольно легко исправить: тело { маржа: 0; заполнение: 0; } тело {. .. Войти в полноэкранный режимВыйти из полноэкранного режима
Это «общее» решение, которое будет охватывать все варианты полей и отступов для любого браузера, который у вас может быть.
Прохладный! Теперь у нас есть div, заполняющий страницу без полос прокрутки!
Наконец, давайте добавим немного отступов, так как неудобно, что содержимое находится прямо по краям.
раздел { отступ: 10 пикселей; /* ... */ }Войти в полноэкранный режимВыйти из полноэкранного режима
Что?! Полоса прокрутки вернулась! Что произошло?
размер коробки
граница коробки box-sizing
позволяет определить, включены ли padding и border в высоту и ширину div.
По умолчанию content-box
из box-sizing
не включает отступы и границы в длину, поэтому div становится
-
height = 100% + 10px * 2
-
ширина = 100% + 10 пикселей * 2
который переполняет страницу!
border-box
включает отступы и бордюры, поэтому div остается в необходимых размерах:
-
height = 100%
-
ширина = 100%
Довольно часто устанавливается для всех элементов в border-box
для единообразного макета и размера на всех страницах, используя селектор *
:
* { box-sizing: граница-коробка; }Войти в полноэкранный режимВыйти из полноэкранного режима
Идеально!
До встречи в следующем!
Хитрости CSS: расширение за пределы родительского блока
Итак, вы записываете содержимое на страницу с определенной центральной колонкой и хотите добавить горизонтальный элемент, который идет по всей ширине экрана — как вы выходите за пределы div содержимого центрального столбца?
Я столкнулся с этой проблемой при создании страницы для этого сайта. Делая следующий логический шаг — я искал в Интернете сообщение в блоге, объясняющее, как обойти эту проблему, и ничего не нашел. После того, как я отказался от своих поисков, я начал проявлять творческий подход и придумал довольно хорошее решение, поэтому я решил записать его здесь в надежде помочь будущим поколениям сбитых с толку разработчиков.
Добро пожаловать 🙂
Необходимые участники:
— Настройка свойства переполнения для основной области содержимого (на всю ширину экрана) на скрытое, чтобы остановить горизонтальную прокрутку
– Установка свойства переполнения для внутреннего элемента div с содержимым (внутри содержащего div) на auto , чтобы контент отображал высоту внутри содержащего div. т.е. 500%) и левое поле на -50% от этой ширины минус 100% (т.е. -200%)
Инструкции:
— Сначала установите ширину блока div с расширенным содержимым на 500%. Это сделает div, который вы пытаетесь расширить, в 5 раз шире, чем центральный столбец, внутри которого он находится. Его можно увеличить или уменьшить в зависимости от размера центральной колонки, с которой вы работаете.
. Второй шаг — установить для левого поля того же контейнера div значение -200%. Это приведет к тому, что этот блок расширенного контента будет центрирован, и он будет выглядеть так, как будто он соответствует остальной части основного центрального столбца контента. Если вы настраиваете полную ширину, указанную выше, убедитесь, что вы установили это левое поле равным -((ширина — 100%)/2).
. Следующим шагом будет удаление горизонтальной прокрутки, которая возникает, потому что теперь у нас есть блок контента, выходящий на 200 % влево и вправо за пределы центрального столбца контента. Этого можно добиться, установив для свойства overflow контейнера div полной ширины страницы (полная ширина страницы) значение Hiden. Это скроет содержимое, которое выходит за пределы всей ширины страницы влево и вправо, и удалит нашу нежелательную горизонтальную прокрутку.
Код:
HTML:
Обычный контент
Расширенный контент
CSS:
.