8

CSS: Высота 100% с отступами/маргинами

4

Проблема с HTML/CSS: заполнение родительского элемента с учетом отступов

Как я могу создать элемент, который будет иметь ширину и/или высоту 100% от своего родительского элемента, но при этом сохранять правильные отступы или поля?

Под "правильными" я имею в виду следующее: если мой родительский элемент высотой 200px и я укажу height: 100% с padding: 5px, я ожидаю, что получу элемент высотой 190px с рамкой 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-пиксельным отступом со всех сторон, при этом страница не должна увеличиваться настолько, чтобы потребовать ползунки прокрутки.

5 ответ(ов)

0

Решение заключается в том, чтобы вообще не использовать высоту и ширину! Просто прикрепите внутренний блок с помощью свойств top, left, right и bottom, а затем добавьте отступы.

Вот пример кода:

.box {
  margin: 8px;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

И HTML разметка:

<div class="box" style="background:black">
  <div class="box" style="background:green">
    <div class="box" style="background:lightblue">
      Это создаст три вложенных блока. Попробуйте изменить размер окна браузера, чтобы увидеть, как они остаются правильно вложенными.
    </div>
  </div>
</div>

Таким образом, вложенные блоки будут корректно отображаться при изменении размера окна.

0

Лучший способ — использовать свойство calc(). Ваш случай будет выглядеть следующим образом:

#myDiv {
    width: calc(100% - 10px);
    height: calc(100% - 10px);
    padding: 5px;
}

Просто, понятно, без обходных решений. Не забудьте оставлять пробел между значениями и оператором (например, (100%-5px) нарушит синтаксис). Удачи!

0

Согласно спецификации W3C, свойство height относится к высоте видимой области. Например, на мониторе с разрешением 1280x1024 пикселей 100% высоты будет равняться 1024 пикселям.

Свойство min-height, в свою очередь, относится к общей высоте страницы, включая контент. Таким образом, на странице, где контент превышает 1024 пикселя, min-height: 100% будет растягиваться, чтобы вместить весь контент.

Следующая проблема заключается в том, что отступы (padding) и границы (border) добавляются к высоте и ширине в большинстве современных браузеров, кроме IE6 (который, хотя и достаточно логичен, не соответствует спецификации). Это называется моделью коробки (box model). Поэтому если вы укажете:

min-height: 100%;
padding: 5px; 

то фактически получите 100% + 5px + 5px по высоте. Чтобы обойти это, вам понадобится оберточный контейнер.

Пример кода:

<style>
    .FullHeight { 
       height: auto !important; /* IE 6 проигнорирует это */
       height: 100%;            /* IE 6 будет использовать это вместо min-height */
       min-height: 100%;        /* IE 6 проигнорирует это */
    }

    .Padded {
       padding: 5px;
    }
</style>

<div class="FullHeight">
   <div class="Padded">
      Привет, я в отступах.
   </div>
</div>

Такой подход позволит вам корректно задать высоту контейнера, учитывая отступы, и избежать нежелательного увеличения высоты из-за модели коробки.

0

Если вы хотите, чтобы элемент занимал полную высоту экрана с учетом различных свойств, таких как padding, margin и border, вот несколько решений:

1. Полная высота с использованием padding

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  padding: 50px;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>

В этом примере свойство box-sizing: border-box; позволяет учитывать padding в общей высоте контейнера, так что он по-прежнему будет занимать 100% высоты экрана.

2. Полная высота с использованием margin

body {
  margin: 0;
}
.container {
  min-height: calc(100vh - 100px);
  margin: 50px;
  background: silver;
}
<div class="container">Hello world.</div>

Здесь мы используем calc(), чтобы вычесть margin из общей высоты окна, что позволяет контейнеру оставаться в пределах видимой области.

3. Полная высота с использованием border

body {
  margin: 0;
}
.container {
  min-height: 100vh;
  border: 50px solid pink;
  box-sizing: border-box;
  background: silver;
}
<div class="container">Hello world.</div>

В этом случае, снова используя box-sizing: border-box;, мы гарантируем, что высота элемента будет считаться вместе с border, и он займет 100% высоты экрана.

Выбор метода зависит от ваших конкретных требований к дизайну и верстке.

0

Это одна из настоящих идиотий CSS — я до сих пор не понимаю, почему так устроено (если кто знает, поясните, пожалуйста).

100% означает 100% от высоты контейнера, к которому добавляются все отступы, границы и внутренние отступы (padding). Таким образом, фактически невозможно создать контейнер, который полностью заполнял бы родительский элемент, если у него есть отступ, граница или внутренние отступы.

Также стоит отметить, что установка высоты имеет репутацию непоследовательного поведения между браузерами.


Еще один момент, который я узнал с тех пор, как опубликовал это, заключается в том, что процентное значение измеряется относительно длины контейнера, то есть его ширины, что делает процентные значения еще менее полезными для высоты.

В настоящее время единицы измерения вьюпорта, такие как vh и vw, гораздо более полезны, но по-прежнему не особенно применимы для всего, кроме контейнеров верхнего уровня.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь