блок выравнивания для незаменяемых элементов inline-block - PullRequest
0 голосов
/ 19 мая 2018

Пожалуйста, запустите демо:

* {
  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;
}

Согласно спецификации :

В следующих определениях для встроенных незаменяемых элементов поле, используемое для выравнивания, - это поле, высота которого равна 'line-height' (содержащее глифы блока и половину перед каждымсторона, см. выше).Для всех других элементов поле, используемое для выравнивания, является полем поля.

и в разделе 'line-height':

На элементе контейнера блока, содержимое которогосостоит из элементов уровня строки, 'line-height' определяет минимальную высоту линейных блоков внутри элемента.Минимальная высота состоит из минимальной высоты над базовой линией и минимальной глубины под ней, точно так же, как если бы каждый линейный блок начинался со встроенного блока нулевой ширины со свойствами шрифта и высоты строки элемента.Мы называем эту воображаемую коробку "стойкой".(Название основано на TeX.).

Итак, в этом случае .inline-block.text является

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

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

поле, используемое для выравнивания, - это поле, высота которого равна 'line-height'

  1. На что указывает точка вышев этом случае для .inline-block.text?

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

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

Пожалуйста,обратите внимание:

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

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

В любом случае спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Выражение

для встроенных незаменяемых элементов, поле для выравнивания - это поле, высота которого равна 'line-height'

не применяетсядля inline-блоков.Встроенные блоки не являются встроенными элементами.Встроенные элементы - это элементы с display: inline, которые генерируют встроенные блоки.Inline-блоки не являются встроенными блоками, а inline-level (важна часть "-level") block box box .Поэтому выражение

Для всех других элементов поле, используемое для выравнивания, является полем поля. Вместо этого применяется

, в результате чего vertical-align: text-top вызывает верхний внешнийкрай встроенного блока для выравнивания с верхом линейного блока.

Любая часть спецификации, которая, как говорят, применяется к встроенным элементам, не применяется к встроенным блокам.

0 голосов
/ 19 мая 2018

Полагаю, вы не понимаете эталон выравнивания (относительно чего он выравнивается?).

Я попытаюсь объяснить это простыми словами.При использовании vertical-align с элементом a вы выравниваете его относительно его родительского элемента b , где высота равна a (b является ссылкой).Используя правильные слова, это выглядит так:

Свойство вертикального выравнивания можно использовать в двух контекстах:

Для вертикального выравнивания встроенного блока элемента внутри его содержит строку box .Например, его можно использовать для вертикального позиционирования <img> в строке текста. ref

Таким образом, элемент a является блок встроенного элемента , а элемент b - это строка , содержащая строку , а высота b определяется как line-height , как вы уже прочиталив спецификации.


Теперь давайте рассмотрим ваш код и шаг за шагом добавим свойства.

Сначала давайте удалим 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), и это сделает верхссылка отличается от text-top.Чтобы напомнить об этом, вот фигура, которую я поделился с вами до ref :

Location of the baseline on text

И если мы прочитаем определение означение text-top из vertical-align:

Выравнивает верх элемента с верхом шрифта родительского элемента .

Таким образом, верхняя часть внутреннего промежутка будет совмещена с верхом текста наружного промежутка, поэтому она переместилась в нижнюю часть.Тогда высота основного контейнера .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, поскольку он является блочным элементом. Попробуйте создать элемент .body inline и посмотрите, что произойдет.

Теперь вы также можете добавить определенный элемент 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>
...