Номер телефона

Последнее обновление:

Парадоксы HTML: display: inline-block

Свойство display: inline-block используется в языке для верстки вебстраниц для реализации элементов, ограниченных шириной содержащегося в них контента и, кроме того, ведущих себя практически так же, как инлайновые элементы (display: inline). Но при этом такие элементы являются блочными. Например, они могут быть расположены друг за другом в одну строку, что невозможно, в общем случае, если задано display: block.

Если точнее, расположение блочных элементов в одну строку все же возможно, но требует специальных подходов. Например, с использованием свойства position.

Как определяется ширина родительского блока при заданном display: inline-block ?

Ширина родительского блока определяется, как сумма ширин блоков-потомков плюс ширины пробелов(!), если в html-коде между потомками есть текстовые узлы (например, хотя бы один пробел или перенос строки).

Например, ширина блока

 <div><div>123</div><div>456</div></div>

будет отличаться от ширины блока

 <div>
<div>123</div>
<div>456</div>
</div>

Последний будет шире из-за наличия переносов строк.

Но что, если у хотя бы одного из потомков задана ширина?

Т.е. как тогда будет определяться ширина родителя? Давайте сразу посмотрим простой пример, иллюстрирующий этот нюанс. Вот такой html-код:

<div style="display: inline-block; border: 4px solid green; box-shadow: 0px 0px 0px 40px rgb(116, 116, 116);">
    <div style="min-width: 100%; border: medium solid red; display: inline-block; background-color: rgb(255, 206, 108); color: red;" contenteditable="true">qwerty </div>
  <div style="border: medium solid blue; background-color: rgb(255, 206, 108); color: blue; display: inline-block;" contenteditable="true">12345 </div>
</div>

Для убедительности, в обоих потомках задан атрибут contenteditable="true", чтобы их содержимое можно было редактировать. Вот что будет в итоге:


qwerty
12345


Как видно, ширина родительского блока (имеющего зеленую границу) равна СУММЕ ширин красного и синего блока, плюс ширина пробелов (переносов строк). Чтобы дополнительно убедиться в этом - можно попробовать вводить символы в блоки-потомки, при этом ширина родителя будет увеличиваться вне зависимости от того, в каакой именно потомок вводятся символы. Почему такое произошло?

Дело в том, что первому потомку (имеющему красный цвет) назначено свойство min-width: 100%. Т.е. получается парадокс. С одной стороны, оба потомка имеют свойство display: inline-block. С другой стороны, минимальная ширина первого должна составлять ВСЮ ширину родителя. Как поступает браузер в данной ситуации?

Вначале он честно определяет общую ширину родителя, исходя из свойств display: inline-block у обоих потомков. В данном случае ширина каждого из потомков определяется, исходя из его содержимого, т.е. исходя из контента. А потом... браузер изменяет ширину первого потомка, делая ее 100% от ширины родителя (т.е. равной его ширине). Поэтому первый потомок растягивается на 100%, тогда как второй имеет такую ширину, которая задается его контентом.

Парадокс заключается в том, что минимальная ширина первого потомка, вроде как, задана первой, а потом уже идет display: inline-block. Тем не менее, как видим, вначале применяется не она, а display. Т.е. тот факт, что минимальная ширина первого потомка равна ширине родителя, НЕ ПРИНИМАЕТСЯ во внимание при расчете общей ширины родителя. А иначе, собственно, последнюю определить было бы невозможно.

По крайней мере, такое наблюдается в браузерах Firefox≤36.

Любопытно узнать, что будет происходить в других браузерах...


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-2024 Научный консалтинг