Это интересный и тонкий, но важный момент при использовании inline-block
.
Краткий ответ: установите vertical-align
на вашем ul
на любое значение, отличное от baseline
.
Причина, по которой это работает, заключается в том, что встроенные блоки считаются текстом и, следовательно, подвергаются текстовым свойствам, таким как высота строки и выравнивание по вертикали.
Более длинный ответ следующий:
Спецификация CSS3 в некоторой (возможно, сбивающей с толку) глубине описывает работу блочной модели.Вот цитата из спецификации блока CSS3, в которой я выделил часть, относящуюся к этой проблеме:
9.5.'Inline-block' или плавающие, незаменяемые элементы
... Используемое значение height
является вычисленным значением, если только оно не равно 'auto', если используемое значение определено как '' Auto«высоты для корней потока».
Давайте проверим, каковы автоматические высоты для корней потока:
9.10.Высота 'Auto' для корней потока
В некоторых случаях (см. Предыдущие разделы) высота элемента вычисляется следующим образом:
- Если у него есть только дочерние элементы встроенного уровнявысота - это расстояние между верхней частью самого верхнего линейного блока и нижней частью самого нижнего линейного блока.
...
Детали линейного блока имеют видинтерес.Это фактически означает, что все, что установлено для отображения в виде встроенного блока, подчиняется неявным макетам блоков, которые использует простой текст.
Теперь вы можете догадаться, почему установка vertical-align
устраняет эту проблему, но давайте продолжим отслеживать эту проблему через спецификацию.
Определение line-box
немного тусклым, и пример в разделе 4.2 полезен лишь незначительно.
Давайте вернемся к спецификации CSS 2.1, которая делает гораздо более приятную работу с объяснением линейных блоков :
Прямоугольная область, содержащая прямоугольники, образующие линию, называется линейной рамкой ... [ее высота] определяется правилами, приведенными в разделе, посвященном вычислениям высоты линии.
Из этого объяснения мы видим, что свойства line-height
и vertical-align
имеют какое-то отношение к тому, как рассчитываются высоты (линейных блоков, то есть элементов inline-block).Чтение вычислений высоты строки почти проясняет:
... В случае, если [линейные блоки] выровнены «сверху» или «снизу», они должны быть выровненычтобы минимизировать высоту линейного блока.
Таким образом, на высоту нашего элемента встроенного блока влияют вычисления высоты его неявного линейного блока, которые в свою очередь подлежат этим вычислениям вертикального выравнивания.
Так что может показаться, что если мы не используем базовую линию в качестве выравнивания по вертикали для встроенного блока, блок неявной строки блока будет уменьшен до минимального размера.
Запутываетесь?...Да уж.Просто вернитесь к более короткому ответу:)