Ответ 1
Я думаю, что это должно быть полезно:)
i{
-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
position: absolute;
top: 50%;
left: 50%;
}
<i>center</i>
Я создаю веб-сайт, и я пытаюсь вертикально сосредоточиться:
position: absolute;
width:1200px;
height:600px;
top: 50%;
left: 50%;
margin-left: -600px;
а мой HTML - это один div
Я думаю, что это должно быть полезно:)
i{
-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
position: absolute;
top: 50%;
left: 50%;
}
<i>center</i>
Свойство CSS top
работает точно как left
. Он толкает div с этого направления. Когда вы пишете top:50%
, div
будет нажата на 50% сверху. Вы хотите, чтобы он был центрирован по вертикали, поэтому вам нужно противостоять этому, потянув его назад. Это можно сделать, используя margin-top: -300px
так же, как вы использовали margin-left: -600px
, чтобы вытащить его.
position: absolute;
width: 1200px;
height: 600px;
top: 50%;
margin-top: -300px;
left: 50%;
margin-left: -600px;
Чтобы ответить на ваш вопрос, почему top: 50%
не работает, когда вы используете свойство top
для элемента, родительский элемент этого элемента должен иметь установленную статическую высоту. Это должно быть в px
или единица, отличная от процента. Если вам действительно нужно использовать проценты в своем родителе, тогда вы можете перейти к следующему родительскому элементу (который является родительским элементом этого родителя) и иметь фиксированную статическую высоту.
Чтобы вертикально центрировать что угодно. Я предпочитаю использовать этот метод
Использование CSS transform
, так как вам не нужно знать, какова ширина высоты вашего элемента.
position: relative;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
Не забудьте добавить префиксы браузера/поставщика.
Вы можете обратиться к префиксам поставщиков.
Если вы не знаете высоту своего родителя. У вас есть два варианта:
$('.parent').height( $(this).height() );
.parent {
/* Unkown height */
}
.child {
/* Create columns */
width: 50%;
float: left;
}
.child-1 {
position: relative;
top: 50%;
text-align: center;
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Example Start -->
<div class="parent">
<div class="child child-1">
Lorem ipsum
</div>
<div class="child child-2">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
</div>
top:50%;
отлично работает, но не будет "центрировать" элемент, он поместит верхний край на 50% высоты страницы сверху. Аналогично тому, как у вас есть margin-left:-600px;
, вы также должны добавить margin-top:-300px;
Я считаю, что это может несколько подражать ответу, который дал Кристиан, но здесь мои два цента, которые включают использование процентов, а также демонстрируют один внутри другого:
#parent {
position: absolute;
top: 50%;
left: 50%;
width: 120px;
height: 60px;
margin: -60px 0 0 -30px;
background: blue;
}
#center {
position: absolute;
width: 50%;
height: 50%;
top: 50%;
left: 50%;
margin: -12.5% 0 0 -25%;
background: green;
}
http://jsfiddle.net/userdude/MYD27/
ИЗМЕНИТЬ
Если посмотреть дальше, я думаю, что вы можете столкнуться с проблемами, если пытаетесь сделать это с помощью элемента, не являющегося контейнером в позиционированном элементе. Например:
Полный просмотр | Просмотр кода
Я не думаю, что работает так, как вы планировали. Когда я добавляю position: relative
(или, альтернативно, position: absolute
), он работает так, как вы предполагали:
Я хотел бы воспользоваться этой возможностью, чтобы явным образом рекламировать мой ответ на другой вопрос здесь на SO:)
При этом свойство css "top" корректно вычисляется на основе высоты элемента контейнера, эффективно отображая целевой элемент ниже средней линии. Это означает, что элемент нужно подталкивать наполовину вверх, как объяснено в связанном вопросе.
К сожалению, такая, казалось бы, простая задача не может быть достигнута путем корректировки верхнего поля и т.д. без использования абсолютных значений на основе пикселей (+1 для ответа Кристиана Антонсена) - можно было бы предположить, что параметр margin-top для "-50%" будет означать именно это, но, согласно спецификации css, значения маржи даже на вертикальной оси рассчитываются как процент всегда относительно ширины содержащий блок
Вы можете использовать
calc(%50 - (items_height/2));
к центру.
Если вы не знаете размер вещи, с которой работаете, я нашел это опрятное решение:
http://css-tricks.com/quick-css-trick-how-to-center-an-object-exactly-in-the-center/
(прокрутите вниз до последнего фрагмента кода на странице)