Вертикальное выравнивание glyphicon в Bootstrap 3
У меня есть glyphicon так:
<div class="col-xs-4 col-sm-2">
<span class="glyphicon glyphicon-circle-arrow-up glyphicon-large"></span>
</div>
.glyphicon-large {
min-height: 260px;
font-size: 35px;
width: 1em;
display: block;
top: 50%;
margin: -0.5em auto 0px;
}
Глификон не будет выравниваться по центру по вертикали. Когда я открываю firefox, проверяю элемент и отключаю / включаю Правило top 50%
, оно внезапно работает. Как же так?
3 ответа:
Объяснение Ошибки Браузера
Согласно MDN на
top
:Для относительно расположенных элементов (имеющих
position: relative
), он определяет величину, на которую элемент перемещается ниже своего нормального положения.
Примечание : процент применяется как процент высоты содержащего элемент блокаСогласно W3 на
top
:Для относительно расположенных ящиков, смещение происходит по отношению к верхним краям самой коробки (т. е. коробке задается положение в нормальном потоке, а затем смещение от этого положения в соответствии с этими свойствами). Примечание: проценты относятся к высоте содержащего блока
Вот мое предположение:
Я думаю, что происходит то, что когда браузер сначала визуализирует визуальное дерево и видитtop:50%;
, он смотрит на родителя, чтобы установить высоту. Поскольку высота не была специально применена, и он не загрузил никакого дочернего содержимого, высота этого div (и всех divs) эффективно начинается как ноль , пока не указано иное. Затем он сдвигает глиф вниз на 50% от нуля.Когда вы переключаете свойство позже, браузер уже отрисовал все, поэтому вычисленная высота родительского контейнера определяется высотой его дочерних элементов.
Минимальный, полный и проверяемый пример
Примечание : это на самом деле не имеет ничего общего с Bootstrap или технологии glyphicons. Чтобы избежать зависимости от bootstrap, мы добавим
top: 1px
, который был бы применен классом.glyphicon
. Несмотря на то, что он перезаписан50%
, он все еще играет важную роль.Вот простой набор родительских / дочерних элементов:
<div id="container"> <div id="child">Child</div> </div>
Чтобы имитировать переключение свойства более воспроизводимым способом, мы можем просто подождать две секунды, а затем применить стиль в javascript, как это:
window.setTimeout(function() { document.getElementById("child").style.top = '50%'; },2000);
Пример 1 (jsFiddle )
В качестве отправной точки давайте воссоздадим вашу проблему.
Обратите внимание, что как только вы измените размер окна, браузер перекрасит экран и переместит элемент обратно наверх.#container { position: relative; /* For Visual Effects */ border: 1px solid grey; } #child { position: relative; height: 50px; top: 1px; /* For Visual Effects */ border: 1px solid orange; width: 50px; margin: 0px auto; }
Пример 2 (jsFiddle )
Если вы добавите
top: 50%
к дочернему элементу, ничего не произойдет, когда javascript добавит свойство, потому что ему нечего будет перезаписывать.Пример 3 (jsFiddle )
Если вы добавите
top: 49%
к дочернему элементу, то DOM действительно должен что-то обновить, поэтому мы снова получим странный глюк.Пример 4 (jsFiddle )
Если вы добавляете
height: 50px;
к контейнеру вместо дочернего, то свойствоtop
имеет что-то для позиционирования справа от get go, и вам не нужно использовать toggle в JavaScript.
Как выровнять по вертикали
Если бы вы просто хотели знать, как это сделать. вертикально центрируйте что-то последовательно, тогда вы можете сделать следующее:
Трюк с вертикальным центрированием текста заключается в том, чтобы установить
line-height
равна высоте контейнера. Если строка занимает 100 пикселей, а строка текста в интернете занимает 10, то браузеры будут пытаться центрировать текст в пределах оставшихся 90 пикселей, с 45 сверху и снизу..glyphicon-large { min-height: 260px; line-height: 260px; }
Решение в jsFiddle
Попробовал центрировать значок глифа, который был внутри тега H1, что заняло некоторое время - так что я обнаружил, что вы действительно можете изменить размер шрифта и цвет внутри тега SPAN, содержащего глиф.
Таким образом:
<h1><span class="glyphicon glyphicon-envelope" style="font-size: 24px; color: #108db7;"></span> Mes Messages</h1>
На самом деле сработало для меня.