По существу, vertical-align: middle;
выравнивает среднюю точку элемента по parent's baseline + 1/2 parent's height
В вашем случае первый span
выравнивается по baseline
, поэтому вы не видите никакого эффекта второго выравнивания span
. Так что здесь вам нужно указать vertical-align: middle;
для первого диапазона. Но если вы хотите выровнять .two
, например, по top
, для первого диапазона не требуется указывать vertical-align
.
В качестве альтернативы вы можете использовать flex-box
для выравнивания ваших отрезков:
p {
border: 1px solid red;
display: flex;
align-items: center;
justify-content: flex-start;
flex-wrap: wrap; /* if you suppose multiline content */
}
.one {
font-size: 50px;
}
.two {
font-size: 30px;
}
<p>
<span class="one">Textx</span>
<span class="two">-</span>
</p>
Почему среднее не работает без выравнивания первого элемента
На самом деле это так. Сначала давайте разберемся, как работает середина. Он принимает размер шрифта родительского элемента, базовую строку этого текста, 1/2 (половину) высоты текста и выравнивает элемент по вычисленной точке.
В вашем случае родительский элемент равен p
, а font-size
равен 16px (здесь по крайней мере). Первый диапазон имеет font-size: 50px
. Вы ожидаете, что второй диапазон будет выровнен на основе размера шрифта первого диапазона (50px), но на самом деле он выравнивается по родительскому значению 16px
. А так как первый диапазон выровнен по базовой линии (по умолчанию), вы не увидите никакого эффекта для .two
. Чтобы проиллюстрировать, что происходит, давайте попробуем добавить текст между интервалами
p {
border: 1px solid red;
}
.one {
font-size: 50px;
}
.two {
vertical-align: middle;
}
<p>
<span class="one">Textx</span>
xxx
<span class="two">-</span>
</p>
Вы можете видеть, что второй интервал фактически выровнен по середине общего текста.
Так что правило довольно простое. Если вы хотите выровнять все встроенные элементы по середине, вы должны добавить vertical-align: middle
к каждому элементу.
Также вы можете использовать table-cell
для родительского элемента (он работает немного по-другому и выравнивает все встроенные элементы внутри) или flex-box
, как я показал выше.