Элементы уровня блока внутри дисплея: встроенный блок - PullRequest
12 голосов
/ 04 марта 2009

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

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

<html><head><style type="text/css">
#left {
  display: inline-block;
  background: red;
  width: 20%;
  height: 100%;
}
#right {
  display: inline-block;
  background: green;
  width: 80%;
  height: 100%;
}
</style></head><body>
  <div id="left">Left</div><div id="right">Right</div>
</body></html>

Выше показаны две панели, левая красная, правая зеленая, как и ожидалось. Если я изменю «Право» на

<p>Right</p>

или удалите его полностью, или (как я хочу сделать) замените его парой делений, я получаю плохое форматирование.

Это ошибка Firefox, или я делаю что-то не так, или мои ожидания неверны? (FWIW, IE 7 исправляет их все одинаково, как будто он не понимает inline-block; не имеет значения, это внутреннее приложение. Я использую только Firefox). Возможно, я смогу получить нужный макет, используя float / margin, но я бы предпочел не делать этого.

Ответы [ 3 ]

6 голосов
/ 04 марта 2009

Хорошее отображение: встроенный блок может быть немного сложнее, чтобы получить кросс-браузер. Для этого потребуется как минимум несколько хаков и, для Firefox 2, потенциально дополнительный элемент.

CSS

.inlineBlock { display: -moz-inline-stack; display: inline-block; zoom: 1; *display: inline; }

display: -moz-inline-stack для Firefox 2. Все непосредственные дочерние элементы должны иметь display: block или иначе быть элементами уровня блока. Обратите внимание, что если вам нужен элемент inline-block для сжатия, я думаю, вы можете использовать вместо него display: -moz-inline-box .

zoom: 1 дает hasLayout элементу (для IE 7 и ниже). Часть 1 хака, необходимая для IE7 и ниже совместимости.

** display: inline * - вторая часть взлома, необходимая для совместимости с IE7 и ниже.

Мне иногда нужно добавить переполнение: скрыто также для совместимости с IE.

Для вашей конкретной ситуации я думаю, что вам нужно:

<html><head><style type="text/css">
#left {
  display: inline-block;
  background: red;
  width: 20%;
  height: 100%;
  vertical-align: top;
}
#right {
  display: inline-block;
  background: green;
  width: 80%;
  height: 100%;
  vertical-align: top;
}
</style></head><body>
  <div id="left">Left</div><div id="right"><p>Right</p><p>Right 2</p></div>
</body></html>
3 голосов
/ 04 марта 2009

Я получаю плохое форматирование.

Вас укушает разрушение полей , CSS-«ум», который вызывает боль так же часто, как благо. Поле

сворачивается наружу, чтобы стать верхним полем для встроенного блока; тогда он ведет себя как поле для «встроенного» элемента, выталкивая вертикальное выравнивание текстовой строки наружу.

Вы можете остановить это, удалив поля из элементов «p» и используя вместо этого отступы. В качестве альтернативы поместите непустой элемент без верхнего поля вверху блока и один элемент без нижнего поля внизу.

Это ошибка Firefox

Я думаю, возможно, да, согласно спецификации:

Поля элементов встроенного блока не сворачиваются (даже при их дочерних элементах в потоке).

0 голосов
/ 06 декабря 2014

встроенный блок Это значение заставляет элемент генерировать контейнерный блок встроенного уровня. Внутренняя часть встроенного блока отформатирована как блок блока, а сам элемент отформатирован как атомарный блок на уровне строки. модель визуального рендеринга

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...