Как установить поле или отступ в процентах от высоты родительского контейнера? - PullRequest
211 голосов
/ 13 февраля 2011

Я ломал голову над созданием вертикального выравнивания в css с использованием следующего

.base{
    background-color:green;
    width:200px;
    height:200px;
    overflow:auto;
    position:relative;
}

.vert-align{
    padding-top:50%;
    height:50%;
}

и использовал следующую структуру div.

<div class="base">
   <div class="vert-align">
       Content Here
   </div>
</div>

Хотя это, казалось, работало дляВ этом случае я был удивлен, что, когда я увеличивал или уменьшал ширину моего базового элемента div, вертикальное выравнивание зависало.Я ожидал, что когда я установлю свойство padding-top, он будет принимать отступ в процентах от высоты родительского контейнера, который в нашем случае является базовым, но указанное выше значение в 50 процентов рассчитывается как процент отширина.: (

Есть ли способ установить отступы и / или поля в процентах от высоты, не прибегая к использованию JavaScript?

Ответы [ 8 ]

207 голосов
/ 05 апреля 2012

Исправлено то, что да, вертикальное заполнение и отступ относятся к ширине, но top и bottom - это не так.поместите div внутри другого, а во внутреннем div используйте что-то вроде top:50% (помните position важно, если это все еще не работает)

32 голосов
/ 02 февраля 2014

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

<div id="outer">
    <div id="inner">
        content
    </div>
</div>

Первый вариант: использовать псевдоэлементы, здесь вертикальный и горизонтальный интервалы относительно внешнего. Демо

#outer::before, #outer::after {
    display: block;
    content: "";
    height: 10%;
}
#inner {
    height: 80%;
    margin-left: 10%;
    margin-right: 10%;
}

Перемещение горизонтального промежутка к внешнему элементу делает его относительно родителя внешнего. Демо

#outer {
    padding-left: 10%;
    padding-right: 10%;
}

Второй вариант: использовать абсолютное позиционирование. Демо

#outer {
    position: relative;
}
#inner {
    position: absolute;
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}
30 голосов
/ 08 октября 2015

Ответ на немного другой вопрос: Вы можете использовать vh единицы, чтобы добавить элементы к центру области просмотра :

.centerme {
    margin-top: 50vh;
    background: red;
}

<div class="centerme">middle</div>
10 голосов
/ 05 февраля 2016

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

Тогда дочерний элемент 'top' относится к высоте родительского элемента.Поэтому вам также нужно «перевести» ребенка на 50% выше его собственного роста.

.base{
    background-color: green;
    width: 200px;
    height: 200px;
    overflow: auto;
    position: relative;
}
    
.vert-align {
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
}
    <div class="base">
        <div class="vert-align">
            Content Here
        </div>
    </div>

Существует еще одно решение с использованием flex box.

.base{
    background-color:green;
    width: 200px;
    height: 200px;
    overflow: auto;
    display: flex;
    align-items: center;
}
<div class="base">
    <div class="vert-align">
        Content Here
    </div>
</div>

Вы найдете преимущества / недостатки для обоих.

3 голосов
/ 04 декабря 2018

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

Из спецификации :

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

Определение встроенный размер :

Измерение в линейном измерении: относится к физической ширине (горизонтальному измерению) в режимах горизонтальной записи и к физической высоте (вертикальному измерению) в режимах вертикальной записи.

Пример с изменяемым размером элемента, где горизонтальные поля относятся к ширине, а вертикальные поля - к высоте.

.resize {
  width: 400px;
  height: 200px;
  resize: both;
  overflow: hidden;
}

.outer {
  height: 100%;
  background-color: red;
}

.middle {
  writing-mode: vertical-lr;
  margin: 0 10%;
  width: 80%;
  height: 100%;
  background-color: yellow;
}

.inner {
  writing-mode: horizontal-tb;
  margin: 10% 0;
  width: 100%;
  height: 80%;
  background-color: blue;
}
<div class="resize">
  <div class="outer">
    <div class="middle">
      <div class="inner"></div>
    </div>
  </div>
</div>

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

3 голосов
/ 25 мая 2014

Другой способ центрировать одну строку текста:

.parent{
  position: relative;
}

.child{
   position: absolute;
   top: 50%;
   line-height: 0;
}

или просто

.parent{
  overflow: hidden; /* if this ins't here the parent will adopt the 50% margin of the child */
}

.child{
   margin-top: 50%;
   line-height: 0;
}
1 голос
/ 13 февраля 2011

50% -ая обивка не отцентрирует вашего ребенка, она поместит его ниже центра. Я думаю, что вы действительно хотите, чтобы верхний слой составлял 25%. Может быть, вам просто не хватает места, так как ваш контент становится выше? Также вы пытались установить поле отступа вместо отступа?

РЕДАКТИРОВАТЬ: Nevermind, сайт w3schools говорит

% Определяет отступ в процентах от ширины содержащего элемента

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

То, что вы делаете, может быть достигнуто с помощью display: table, хотя (по крайней мере для современных браузеров). Техника объясняется здесь .

0 голосов
/ 08 апреля 2018

Это очень интересная ошибка.(На мой взгляд, это ошибка в любом случае) Отличная находка!

Что касается как установить его, я бы порекомендовал ответ Камило Мартина.Но что касается почему , я бы хотел немного объяснить это, если вы, ребята, не возражаете.


В спецификации CSS я обнаружил:

'padding'
Проценты: относятся к ширине вмещающего блока

… что странно, ноокей.

Итак, с родителем width: 210px и ребенком padding-top: 50% я получаю вычисленное / вычисленное значение padding-top: 96.5px - что не является ожидаемым 105px.

Это связано с тем, что в Windows (я не уверен насчет других ОС) размер общих полос прокрутки по умолчанию равен 17px × 100% (или 100% × 17px для горизонтальных полос).Те 17px вычитаются перед вычислением 50%, следовательно 50% of 193px = 96.5px.

...