Как вы уже знаете, это связано с Chrome и тем, как он работает с высотой строки.
Хотя я написал обходной путь, который, похоже, хорошо работает в Linux (Chrome, Firefox), а также в Windows (Chrome, Firefox, Edge).
При vertical-align: text-bottom
все строки, кажется, работают, как и предполагалось, кроме первой. Таким образом, идея состоит в том, чтобы добавить разрыв строки (и затем обнулить его с помощью font-size: 0
)
p::before {
content: "\A";
white-space: pre;
display: inline;
}
p::first-line {
font-size: 0px;
}
Это очень хорошо работает в Chrome (как в Linux, так и в Windows), , но в Firefox. Мне не удалось отменить дополнительный разрыв строки. Итак, поскольку изначально все работало хорошо, я использовал правило firefox-only , чтобы скрыть дополнительный разрыв строки.
Итак, у нас есть обходной путь для Chrome и Firefox (как для Windows, так и для Linux) , но Edge столкнулся с некоторыми трудностями с vertical-align
, поэтому (еще раз) я использовал только мс Правило unset
vertical-align
.
Результат (работает на Chrome Windows / Linux, Firefox Windows / Linux, Edge Windows)
p {
display: inline-block;
margin: 0;
background: lightgrey;
}
span {
line-height: 2.5;
font-size: 30px;
background: lightblue;
vertical-align: text-bottom;
}
p::before {
content: "\A";
white-space: pre;
display: inline;
}
p::first-line {
font-size: 0px;
}
/* Firefox only */
@-moz-document url-prefix() {
p::before {
display: none;
}
}
/* Edge only */
@supports (-ms-ime-align:auto) {
span {
vertical-align: unset;
}
}
<p contenteditable><span>some text</span><br/><span>some text</span></p>
UPDATE
В обновленном тестовом примере, когда у вас есть несколько размеров шрифта на строку, вам нужно будет пропустить vertical-align: bottom|text-bottom
и пойти на компромисс с выделением дополнительного места для строки ниже (только в Chrome - Linux).
Обратите внимание, что вам все равно понадобится вышеупомянутый "хак" для первой строки, чтобы иметь согласованное поведение между всеми строками.
Посмотрите на этот codepen для обновленного теста.