Запустите демонстрацию:
* {
margin: 0;
padding: 0;
}
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
height: 400px;
width: 400px;
line-height: 2;
vertical-align: baseline;
}
.body span {
background-color: pink;
}
.body .inline-block {
display: inline-block;
background: orange;
height: 50px;
}
.inline-block.text {
vertical-align: text-top;
}<div class = "body">
<span>
words-g words words-g
<span class = "inline-block text">with inline-block box child</span> words-g w
</span>
</div>Дело в том, что я установил
.inline-block.text {
vertical-align: text-top;
}
Согласно Технические характеристики:
In the following definitions, for inline non-replaced elements, the box used for alignment is the box whose height is the 'line-height' (containing the box's glyphs and the half-leading on each side, see above). For all other elements, the box used for alignment is the margin box.
и в разделе line-height:
On a block container element whose content is composed of inline-level elements, 'line-height' specifies the minimal height of line boxes within the element. The minimum height consists of a minimum height above the baseline and a minimum depth below it, exactly as if each line box starts with a zero-width inline box with the element's font and line height properties. We call that imaginary box a "strut." (The name is inspired by TeX.).
Итак, в данном случае .inline-block.text является
И вот мой вопрос:
the box used for alignment is the box whose height is the 'line-height'
.inline-block.text?Как показывает демонстрация, я думаю, что это коробка высотой 50 пикселей. Однако высота блока не является высотой строки, что противоречит приведенной выше спецификации. Итак, я был сбит с толку и не понимаю вышеприведенное предложение в спецификации.
Пожалуйста отметьте:
Я просто хочу понять это предложение, которое является блок, используемый для выравнивания, - это блок, высота которого равна 'line-height', чтобы лучше понять выравнивание по вертикали.
Я не прошу конкретного решения.
Как бы то ни было, спасибо за вашу помощь!






Я думаю, вы сбиваете с толку ссылку на выравнивание (относительно чего оно выравнивается?).
Я постараюсь объяснить это легкими словами. При использовании vertical-align с элементом a вы выравниваете его относительно его родительского элемента bкакая высотаa (b является ссылкой). Используя правильные слова, это выглядит так:
The vertical-align property can be used in two contexts:
To vertically align an inline element's box inside its containing linebox. For example, it could be used to vertically position an
<img>in a line of text.ref
Таким образом, элемент a - это поле встроенного элемента, а элемент b - это содержащий строку, а высота b определяется его высота линии, как вы уже читали в спецификации.
Теперь давайте рассмотрим ваш код и пошагово добавим свойства.
Первоначально снимаем inline-block
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
}<div class = "body">
<span>
words-g
<span class = "inline-block text">inline-block</span> words-g w
</span>
</div>Как вы можете видеть, внутренний промежуток имеет тот же height / line-height, что и внешний промежуток, и оба используют один и тот же font-family. Таким образом, логически мы ничего не видим при использовании text-top в качестве вертикального выравнивания.
Теперь добавим в контейнер line-height:2:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
}<div class = "body">
<span>
words-g
<span class = "inline-block text">inline-block</span> words-g w
</span>
</div>В этой ситуации оба диапазона унаследуют line-height:2, таким образом, вычисленное значение будет 32px (2 * font-size), и это сделает верхнюю ссылку разные из текста сверху. Чтобы напомнить об этом, вот цифра, которой я поделился с вашим beforeref:

И если мы прочитаем определение значения text-top для vertical-align:
Aligns the top of the element with the top of the parent element'sfont.
Таким образом, верх внутреннего диапазона будет выровнен с верхом текста внешнего диапазона, поэтому он переместился вниз. Тогда высота основного контейнера .body не будет равна 32px, а будет больше, потому что он будет учитывать движение внутреннего пролета (у нас будет 37px).
Теперь добавим inline-block во внутренний элемент:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
vertical-align: text-top;
display:inline-block;
}<div class = "body">
<span>
words-g
<span class = "inline-block text">inline-block</span> words-g w
</span>
</div>Первое, что вы заметите, это то, что текст не сдвинулся, НО оранжевый фон покрывает большую высоту. Это связано с тем, что наш элемент будет вести себя как блок-контейнер, и эта высота равна line-height текста (32px), которая также является расстоянием между верхом и низом на изображении выше (изначально он охватывал от text-bottom до text-top).
Это также похоже на синий фон элемента .body, поскольку этот элемент является блочным. Попробуйте сделать элемент .bodyinline и посмотрите, что будет.
Теперь вы также можете добавить к элементу конкретный height, и ничего не изменится, потому что мы выравниваем относительно родительский элемент. Вы также можете поиграть со всеми достоинствами vertical-align, чтобы увидеть различное поведение:
.body {
font-family: Microsoft Yahei;
font-size: 16px;
background-color: lightblue;
line-height:2;
margin:5px;
}
.body span {
background-color: pink;
}
.body .inline-block {
background: orange;
}
.inline-block.text {
display:inline-block;
height:50px;
}<div class = "body">
<span>
Align the
<span class = "inline-block text" style = "
vertical-align: text-top;">top of this</span> with text-top
</span>
</div>
<div class = "body">
<span>
Align the
<span class = "inline-block text" style = "
vertical-align: top;">top of this</span> with top
</span>
</div>
<div class = "body">
<span>
align the
<span class = "inline-block text" style = "
vertical-align: text-bottom;">bottom of this</span> with text-bottom
</span>
</div>
<div class = "body">
<span>
align the
<span class = "inline-block text" style = "
vertical-align: bottom;">bottom of this</span> with bottom
</span>
</div>Заявление
for inline non-replaced elements, the box used for alignment is the box whose height is the 'line-height'
не относится к инлайн-блокам. Встроенные блоки не являются встроенными элементами. Встроенные элементы - это элементы с display: inline, которые генерируют встроенные блоки. Встроенные блоки - это не встроенные блоки, а встроенный уровень (важна часть «-уровня»!) блочные контейнерные ящики. Следовательно, заявление
For all other elements, the box used for alignment is the margin box.
вместо этого применяется, что приводит к тому, что vertical-align: text-top заставляет верхний внешний край встроенного блока выравниваться с верхом строчного блока.
Любая часть спецификации, которая, как говорят, применяется к встроенным элементам, не применяется к встроенным блокам.
Я надеялся, что вы правы, потому что это прояснит многие вопросы. Однако я не нашел никакого определения inline element. Итак, где вы это нашли: Inline elements are elements with display: inline, and generate inline boxes.?
@xianshenglu: В прозе для line-height в предложении «На незамещенном встроенном элементе« line-height »указывает высоту, которая используется при вычислении высоты строки строки.», слово «inline» ссылки на раздел 9.2.2. В разделе 9 «встроенный элемент» и «встроенный блок» взаимозаменяемы, за исключением того, что разница между элементом и блоком состоит в том, что элемент может генерировать один или несколько блоков, что является отдельной темой.
Похоже на словесную игру. Я ненавижу это ! Я проверю и постараюсь найти определение в спецификации или что-то в этом роде. В любом случае спасибо за вашу помощь. Мне может потребоваться некоторое время, чтобы ответить на этот вопрос.
@xianshenglu: Да, я согласен с тем, что спецификация должна быть немного более последовательной в использовании слов.
По данным самшит. Возможно, мы можем думать, что этот встроенный блок соответствует встроенному элементу, а блок встроенного уровня соответствует элементу встроенного уровня. Дать согласие?
Спасибо за Ваш ответ. Но я думаю, вы упускаете то, о чем я спрашивал. Вы можете увидеть другой ответ, которого я хочу. Однако конкретного определения он не нашел. И я прошу рабочую группу css дать определение
inline-elementпрямо сейчас.