Я знаю, что это старый вопрос, но я нашел то, что для меня является идеальным решением.
Я добавляю этот CSS в div, который хочу центрировать:
div:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Это работает каждый раз, и это чисто.
Изменить: просто для завершения я использую scss, и у меня есть удобный миксин, который я включаю для каждого родителя , прямых детей которого я хочу вертикально центрировать:
@mixin vertical-align($align: middle) {
&:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: $align;
font-size: 0;
}
& > * {
vertical-align: $align;
font-size: 14px;
}
}
Полное объяснение:
div:beforeдобавит элемент внутри div, но перед любым из его дочерних элементов. При использовании :beforeили :afterмы должны использовать content:объявление, иначе ничего не произойдет, но для нашей цели содержимое может быть пустым. Затем мы говорим элементу, что он должен быть такого же высокого, как и его родительский элемент, при условии, что высота его родительского элемента определена и этот элемент является как минимум встроенным блоком. vertical-alignопределяет вертикальное положение себя по отношению к родителю, в отличие от того, text-alignчто работает по-другому.
В @mixinДекларация для пользователей Sass и он будет использоваться , как это:
div {
@include vertical-align(middle)
}