Подтвердить что ты не робот

Элементы уровня блока внутри дисплея: встроенный блок

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

Однако дисплей: элементы блока внутри дисплея: встроенные блоки блокируют остальную часть страницы; так что не имеет ничего вообще внутри встроенного блока или даже базового элемента, такого как абзац; только простой текст позволяет избежать нарушения остальной части страницы (путем нарушения я имею в виду сдвиг других разделов вниз, например, в этом случае левый красный блок перемещается по строке и имеет пустое пустое пространство над ним). Я использую 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>

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

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

4b9b3361

Ответ 1

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

CSS

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

display: -moz-inline-stack для Firefox 2. Все ближайшие дети должны иметь отображение: block или иначе быть элементами уровня блока. Обратите внимание, если вам нужен ваш встроенный блок для сжатия упаковки, я думаю, что вы можете использовать отображение: -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>

Ответ 2

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

Вы укусаетесь разворот маржи, умение CSS, которое является болью так часто, как это благо. Поля <p> сворачиваются наружу, чтобы стать верхним краем встроенного блока; это ведет себя так же, как маржа будет на "встроенном элементе", нажав вертикальное выравнивание строки текста.

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

Является ли это ошибкой Firefox

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

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

Ответ 3

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