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

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

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

    .vert-align{
		padding-top:50%;
		height:50%;
	}
<!-- and used the following div structure. -->

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

Ответ 1

Исправление состоит в том, что да, вертикальное заполнение и маржа относительно ширины, но top и bottom нет.

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Затем дочерний элемент "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>

Ответ 5

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

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

Ответ 6

Это может быть достигнуто с помощью свойства writing-mode. Если вы установите 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>

Ответ 7

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

EDIT: Nevermind, сайт w3schools говорит

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

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

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

Ответ 8

Это очень интересная ошибка. (По-моему, это все равно ошибка) Приятная находка!

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


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

"обивка"
Проценты: см. Ширину содержащего блока

... что странно, но все в порядке.

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

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