Поле выравнивания для inline-block незамещенных элементов

Запустите демонстрацию:

* {
  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 является

  • блочный контейнерный элемент, содержимое которого состоит из элементов встроенного уровня
  • высота 50 пикселей и высота строки 32 пикселя
  • также является встроенными незамещенными элементами

И вот мой вопрос:

the box used for alignment is the box whose height is the 'line-height'

  1. Что означает в данном случае поле выше для .inline-block.text?

Как показывает демонстрация, я думаю, что это коробка высотой 50 пикселей. Однако высота блока не является высотой строки, что противоречит приведенной выше спецификации. Итак, я был сбит с толку и не понимаю вышеприведенное предложение в спецификации.

  1. И если вы думаете, что это поле высотой 50 пикселей, как вы объясните тот факт, что высота 50 пикселей не является высотой строки 32 пикселей?

Пожалуйста отметьте:

  • Я просто хочу понять это предложение, которое является блок, используемый для выравнивания, - это блок, высота которого равна 'line-height', чтобы лучше понять выравнивание по вертикали.

  • Я не прошу конкретного решения.

Как бы то ни было, спасибо за вашу помощь!

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
3
0
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы сбиваете с толку ссылку на выравнивание (относительно чего оно выравнивается?).

Я постараюсь объяснить это легкими словами. При использовании 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:

Location of the baseline on text

И если мы прочитаем определение значения 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>

Спасибо за Ваш ответ. Но я думаю, вы упускаете то, о чем я спрашивал. Вы можете увидеть другой ответ, которого я хочу. Однако конкретного определения он не нашел. И я прошу рабочую группу css дать определение inline-element прямо сейчас.

xianshenglu 21.05.2018 03:17
Ответ принят как подходящий

Заявление

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 20.05.2018 15:02

@xianshenglu: В прозе для line-height в предложении «На незамещенном встроенном элементе« line-height »указывает высоту, которая используется при вычислении высоты строки строки.», слово «inline» ссылки на раздел 9.2.2. В разделе 9 «встроенный элемент» и «встроенный блок» взаимозаменяемы, за исключением того, что разница между элементом и блоком состоит в том, что элемент может генерировать один или несколько блоков, что является отдельной темой.

BoltClock 20.05.2018 15:04

Похоже на словесную игру. Я ненавижу это ! Я проверю и постараюсь найти определение в спецификации или что-то в этом роде. В любом случае спасибо за вашу помощь. Мне может потребоваться некоторое время, чтобы ответить на этот вопрос.

xianshenglu 20.05.2018 15:22

@xianshenglu: Да, я согласен с тем, что спецификация должна быть немного более последовательной в использовании слов.

BoltClock 20.05.2018 15:32

По данным самшит. Возможно, мы можем думать, что этот встроенный блок соответствует встроенному элементу, а блок встроенного уровня соответствует элементу встроенного уровня. Дать согласие?

xianshenglu 23.05.2018 03:45

Другие вопросы по теме