CSS: установка ширины/высоты в процентах минус пиксели
Я пытаюсь создать несколько CSS-классов многократного использования для большей согласованности и меньшего количества помех на моем сайте, и я застрял при попытке стандартизировать одну вещь, которую я часто использую.
У меня есть контейнер <div>
, для которого я не хочу устанавливать высоту (потому что он будет варьироваться в зависимости от того, где на сайте он находится), и внутри него есть заголовок <div>
, а затем неупорядоченный список элементов все с CSS для них.
Это выглядит примерно так:
![Widget]()
Я хочу, чтобы неупорядоченный список занимал оставшуюся комнату в контейнере <div>
, зная, что заголовок <div>
имеет высоту 18px
. Я просто не знаю, как указать высоту списка как "результат 100%
минус 18px
".
Я видел этот вопрос, заданный в паре других контекстов на SO, но я подумал, что стоит спросить еще раз для моего конкретного случая. Кто-нибудь есть какие-либо советы в этой ситуации?
Ответы
Ответ 1
Я понимаю, что это старый пост, но учитывая, что не было предложено, стоит упомянуть, что если вы пишете для CSS3-совместимых браузеров, вы можете использовать calc
:
height: calc(100% - 18px);
Стоит отметить, что не все браузеры в настоящее время поддерживают стандартную функцию CSS3 calc(), поэтому может потребоваться реализация определенных функций браузера, таких как:
/* Firefox */
height: -moz-calc(100% - 18px);
/* WebKit */
height: -webkit-calc(100% - 18px);
/* Opera */
height: -o-calc(100% - 18px);
/* Standard */
height: calc(100% - 18px);
Ответ 2
Для немного другого подхода вы можете использовать что-то вроде этого в списке:
position: absolute;
top: 18px;
bottom: 0px;
width: 100%;
Это работает до тех пор, пока родительский контейнер имеет position: relative;
Ответ 3
Я использую Jquery для этого
function setSizes() {
var containerHeight = $("#listContainer").height();
$("#myList").height(containerHeight - 18);
}
затем я привязываю размер окна, чтобы его пересчитать, когда изменяется размер окна браузера (если размер контейнера изменен с изменением размера окна)
$(window).resize(function() { setSizes(); });
Ответ 4
Не определяйте высоту как процент, просто установите top=0
и bottom=0
, например:
#div {
top: 0; bottom: 0;
position: absolute;
width: 100%;
}
Ответ 5
Предполагая высоту заголовка 17px
Список css:
height: 100%;
padding-top: 17px;
Заголовок css:
height: 17px;
float: left;
width: 100%;
Ответ 6
- Используйте отрицательные поля для элемента, который вы хотите отключить. (желаемый элемент)
- Сделайте
overflow:hidden;
на содержащем элементе
- Переключитесь на
overflow:auto;
на нужный элемент.
Это сработало для меня!
Ответ 7
Попробуйте размер окна. Для списка:
height: 100%;
/* Presuming 10px header height */
padding-top: 10px;
/* Firefox */
-moz-box-sizing: border-box;
/* WebKit */
-webkit-box-sizing: border-box;
/* Standard */
box-sizing: border-box;
Для заголовка:
position: absolute;
left: 0;
top: 0;
height: 10px;
Конечно, родительский контейнер должен иметь что-то вроде:
position: relative;
Ответ 8
Я попробовал некоторые другие ответы, и никто из них не работал так, как я хотел. Наша ситуация была очень похожа, когда у нас был заголовок окна, и окно было изменено с изображениями в корпусе окна. Мы хотели заблокировать соотношение сторон для изменения размера без необходимости добавления в вычисления для учета фиксированного размера заголовка и по-прежнему иметь изображение, заполняющее тело окна.
Ниже я создал очень простой фрагмент, который показывает, что мы закончили, что, похоже, хорошо работает для нашей ситуации и должно быть совместимо с большинством браузеров.
В нашем элементе окна мы добавили маркер 20px, который способствует позиционированию относительно других элементов на экране, но не способствует "размеру" окна. Окно-заголовок затем позиционируется абсолютно (что удаляет его из потока других элементов, поэтому он не приведет к смещению других элементов, таких как неупорядоченный список), а верхняя часть - -20px, которая помещает заголовок внутри поля окна. Наконец, наш элемент ul добавляется в окно, а высота может быть установлена на 100%, что приведет к заполнению тела окна (за исключением поля).
*,*:before,*:after
{
box-sizing: border-box;
}
.window
{
position: relative;
top: 20px;
left: 50px;
margin-top: 20px;
width: 150px;
height: 150px;
}
.window-header
{
position: absolute;
top: -20px;
height: 20px;
border: 2px solid black;
width: 100%;
}
ul
{
border: 5px dashed gray;
height: 100%;
}
<div class="window">
<div class="window-header">Hey this is a header</div>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ul>
</div>
Ответ 9
Спасибо, я решил с вашей помощью, немного подстроил его, так как я хочу ширину 100% ширины на 100% (меньше высоты нижней панели) и без прокрутки по телу (без зависания/скрытия полос прокрутки).
Для CSS:
html{
width:100%;height:100%;margin:0px;border:0px;padding:0px;
}
body{
position:relative;width:100%;height:100%;margin:0px;border:0px;padding:0px;
}
div.adjusted{
position:absolute;width:auto;height:auto;left:0px;right:0px;top:0px;bottom:36px;margin:0px;border:0px;padding:0px;
}
div.the_bottom_bar{
width:100%;height:31px;margin:0px;border:0px;padding:0px;
}
Для HTML:
<body>
<div class="adjusted">
// My elements that go on dynamic size area
<div class="the_bottom_bar">
// My elements that goes on bottom bar (fixed heigh of 31 pixels)
</div>
</div>
Это сделал трюк, о да, я положил значение немного больше на div.adjusted для нижней, чем для нижней высоты бара, иначе появится вертикальная полоса прокрутки, я настроен на ближайшее значение.
Это отличие состоит в том, что один из элементов динамической области добавляет дополнительное нижнее отверстие, которое я не знаю, как избавиться от... это видео-тег (HTML5), обратите внимание, что я помещаю этот тег видео с помощью это css (поэтому нет причин для его создания нижнего отверстия, но это так):
video{
width:100%;height:100%;margin:0px;border:0px;padding:0px;
}
Цель: иметь видео, которое берет 100% от броузера (и динамически изменяет размеры при изменении размера браузера, но без изменения соотношения сторон), меньше нижнего пространства, которое я использую для div с некоторыми текстами, кнопками и т.д. (и валидаторы w3c и css, конечно).
EDIT: я нашел причину, видеотег похож на текст, а не элемент блока, поэтому я исправил его с помощью этого css:
video{
display:block;width:100%;height:100%;margin:0px;border:0px;padding:0px;
}
Обратите внимание на display:block;
на теге видео.
Ответ 10
Еще один способ достижения той же цели: гибкие коробки. Сделайте контейнер гибким блоком столбца, и тогда вы будете иметь полную свободу, позволяя некоторым элементам иметь фиксированный размер (поведение по умолчанию) или заполнять/уменьшать пространство контейнера (с помощью flex-grow: 1 и flex- термоусадочные: 1).
#wrap {
display:flex;
flex-direction:column;
}
.extendOrShrink {
flex-shrink:1;
flex-grow:1;
overflow:auto;
}
Смотрите https://jsfiddle.net/2Lmodwxk/ (попробуйте расширить или уменьшить окно, чтобы заметить эффект)
Примечание: вы также можете использовать сокращенное свойство:
flex:1 1 auto;
Ответ 11
Я не уверен, что это работает в вашей конкретной ситуации, но я обнаружил, что заполнение внутри div будет выталкивать содержимое внутри div, если содержащий div является фиксированным размером. Вам придется либо плавать, либо абсолютно позиционировать свой элемент заголовка, но в противном случае я не пробовал это для div с переменными размерами.