С HTML / CSS, как я могу сделать элемент, который имеет ширину и / или высоту, которая составляет 100% его родительского элемента и все еще имеет надлежащие отступы или поля?
Под «правильным» я подразумеваю, что если мой родительский элемент 200px
высок и я указываю height = 100%
с, padding = 5px
я бы ожидал, что 190px
со border = 5px
всех сторон я должен получить высокий элемент , красиво отцентрированный в родительском элементе.
Теперь, я знаю, что это не то, как стандартная блочная модель указывает, что она должна работать (хотя я хотел бы знать, почему именно ...), поэтому очевидный ответ не работает:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Но мне кажется, что должен быть НЕКОТОРЫЙ способ надежного создания этого эффекта для родителя произвольного размера. Кто-нибудь знает способ выполнения этой (казалось бы простой) задачи?
Да, и для записи, я не очень заинтересован в совместимости IE, так что это (надеюсь) должно немного облегчить ситуацию.
РЕДАКТИРОВАТЬ: так как пример был запрошен, вот самый простой, который я могу придумать:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
Задача состоит в том, чтобы черный ящик отображался с отступом 25 пикселей по всем краям, при этом страница не становилась достаточно большой, чтобы требовать полосы прокрутки.
Ответы:
Я научился делать такие вещи, читая " PRO HTML и CSS Design Patterns ". Значение
display:block
по умолчанию для отображенияdiv
, но я хотел бы сделать его явным. Контейнер должен быть правильного типа;position
атрибутfixed
,relative
илиabsolute
.Скрипка от комментария Ноошу
источник
top:0
,bottom:0
По существу «растянуть» из элемента. Я могу только заставить его работать,position:absolute
хотяtop:20px;bottom:20px;left:20px;right:20px;
вместо того, чтобы использовать поля вообще?В CSS3 есть новое свойство, которое вы можете использовать для изменения способа, которым блочная модель рассчитывает ширину / высоту, оно называется box-sizing.
Устанавливая это свойство значением «border-box», оно делает любой элемент, к которому вы применяете, не растягивать при добавлении отступа или границы. Если вы определите что-то с шириной 100px и отступом 10px, оно все равно будет иметь ширину 100px.
Смотрите здесь для поддержки браузера . Это не работает для IE7 и ниже, однако, я считаю, что IE7.js Дина Эдварда добавляет поддержку для него. Наслаждаться :)
источник
border-box
все герои :)Решение - НЕ использовать высоту и ширину! Прикрепите внутреннюю коробку, используя верхнюю, левую, правую, нижнюю, а затем добавьте поля.
источник
Лучше всего использовать свойство calc (). Таким образом, ваш случай будет выглядеть так:
Просто, чисто, обходных путей нет. Просто убедитесь, что вы не забыли пробел между значениями и оператором (например
(100%-5px)
, это нарушит синтаксис. Наслаждайтесь!источник
Согласно спецификации w3c высота относится к высоте видимой области, например, на мониторе с разрешением 1280x1024 пикселей, высота 100% = 1024 пикселей.
min-height относится к общей высоте страницы, включая содержимое, поэтому на странице, где содержимое превышает 1024px min-height: 100% будет растягиваться, чтобы охватить весь контент.
Другая проблема заключается в том, что отступы и границы добавляются к высоте и ширине в большинстве современных браузеров, кроме ie6 (ie6 на самом деле вполне логично, но не соответствует спецификации). Это называется коробочной моделью. Так что если вы укажете
Это на самом деле даст вам 100% + 5px + 5px для высоты. Чтобы обойти это, вам нужен контейнер-обертка.
источник
1. Полная высота с
padding
2. Полная высота с
margin
3. Полная высота с
border
источник
Это одна из явных идиотий CSS - мне еще предстоит понять причину (если кто-то знает, пожалуйста, объясните).
100% означает 100% высоты контейнера, к которой добавляются любые поля, границы и отступы. Таким образом, фактически невозможно получить контейнер, который заполняет его родительский объект и имеет поле, границу или отступ.
Также обратите внимание, что установка высоты, как известно, несовместима и между браузерами.
Еще одна вещь, которую я узнал с момента публикации, это то, что процентное отношение относится к длине контейнера , то есть его ширине, делая процент еще более бесполезным для высоты.
В настоящее время блоки просмотра vh и vw более полезны, но все же не особенно полезны для чего-либо, кроме контейнеров верхнего уровня.
источник
Другое решение заключается в использовании display: table, который имеет другое поведение блочной модели.
Вы можете установить высоту и ширину родительского элемента и добавить отступы, не расширяя его. У ребенка 100% высота и ширина минус отступы.
JSBIN
Другим вариантом будет использование свойства размера ящика. Единственная проблема с обоими - они не работают в IE7.
источник
Другое решение: Вы можете использовать процентные единицы для полей и размеров. Например:
Основной проблемой здесь является то, что поля будут немного увеличиваться / уменьшаться с размером родительского элемента. Предположительно, функциональность, которую вы бы предпочли, состоит в том, чтобы поля оставались постоянными, а дочерний элемент увеличивался / уменьшался для заполнения изменений в интервале. Таким образом, в зависимости от того, насколько плотно вам нужен дисплей, это может быть проблематично. (Я бы также пошел на меньшую маржу, например, 0,3%).
источник
Решение с flexbox (работает на IE11): ( или посмотреть на jsfiddle )
( Сброс CSS не обязательно важен для реальной проблемы.)
Важная часть
flex: 1
(в сочетании сdisplay: flex
родителем). Как ни странно, самое правдоподобное объяснение того, как работает свойство Flex, я знаю из реактивной документации, поэтому я все равно на нее ссылаюсь :источник
Пример Фрэнка меня немного смутил - в моем случае это не сработало, потому что я еще недостаточно хорошо разбирался в позиционировании. Важно отметить, что родительский элемент контейнера должен иметь нестатическую позицию (он упоминал об этом, но я упустил это из виду, и это не было в его примере).
Вот пример, где дочерний элемент - заданный отступ и граница - использует абсолютное позиционирование, чтобы заполнить родительский элемент на 100%. Родитель использует относительное позиционирование, чтобы обеспечить точку отсчета для позиции дочернего элемента, оставаясь при этом в обычном потоке - на следующий элемент «more-content» это не влияет:
Полезная ссылка для быстрого изучения CSS позиционирования
источник
Граница вокруг div, а не поля страницы
Другое решение - я просто хотел простую рамку по краю моей страницы и 100% высоты, когда содержание было меньше этого.
Граница не работала, и фиксированное положение казалось неправильным для такой простой необходимости.
В итоге я добавил рамку в свой контейнер, вместо того, чтобы полагаться на поле тела страницы - это выглядит так:
источник
Это поведение по умолчанию.
display: block
Самый быстрый способ исправить это в 2020 году - установитьdisplay: 'flex'
родительский элемент и отступ, например, 20px, тогда все его дочерние элементы будут иметь высоту 100% относительно его высоты.источник
Добавить -webkit и -moz было бы более уместно
источник
источник