Как настроить поля и отступы в процентах от высоты родительского контейнера?

Я ломал голову над созданием вертикального выравнивания в 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>

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

7 ответов


у меня также была эта проблема (+1). Меня это серьезно раздражает, глупо так поступать.

исправление заключается в том, что да, вертикальный padding и margin относительно ширины, но top и bottom нет.

поэтому просто поместите div внутри другого, а во внутреннем div используйте что-то вроде top:50% (помню position вопросы, если он все еще не работает)


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

<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%;
}

ответ на немного другой вопрос: Вы можете использовать vh единицы для размещения элементов в центре просмотра:

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

<div class="centerme">middle</div>

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

тогда на дочернем элементе '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 коробка.

.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>

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


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

.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;
}

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

EDIT: неважно, сайт w3schools говорит

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

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

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


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

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


на спецификации CSS я нашел:

'padding'
процентов: см. ширину содержания блок

... что странно, но ладно.

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

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