Из спецификации :
Поскольку поплавка нет в потоке, непозиционированные блоки блоков, созданные до и после блока поплавка, текут вертикально, как если бы поплавок не существовал.
Это означает, что элементы с display: block
, которые не расположены, игнорируют число с плавающей запятой.
Однако линейные блоки, созданные рядом с поплавком, укорачиваются, чтобы освободить место для поля полей поплавка.
Это означает, что встроенные элементы обтекают поплавки. Вот почему ваш <span>
и текст внутри <p>
обтекают div.left
, хотя <p>
и div.right
этого не делают.
Граничный блок таблицы, замененный элемент уровня блока или элемент в нормальном потоке, который устанавливает новый контекст форматирования блока (например, элемент с «переполнением», отличным от «видимого»), не должен перекрывать какие-либо плавает в том же контексте форматирования блока, что и сам элемент. Если необходимо, реализации должны очистить указанный элемент, поместив его ниже любых предыдущих поплавков, но могут разместить его рядом с такими поплавками, если есть достаточно места.
И это - как бы глупо это ни было - является ответом на вашу проблему. Вы должны вставить «новый контекст форматирования блока ».
Плавающие, абсолютно позиционированные элементы, встроенные блоки, ячейки таблицы, заголовки таблиц и элементы с «переполнением», отличным от «видимого» (кроме случаев, когда это значение было передано в область просмотра), устанавливают новые контексты форматирования блоков.
Самый простой из них для вас: 1 :
div.right { overflow: auto; }
Обратите внимание, что вы, вероятно, также хотите 1 :
div.comment { overflow: auto; }
Исправить связанную, но другую проблему. Если ваш контент <p>
короче вашего изображения, то всплывающее div.left
не увеличит высоту div.comment
. Добавление overflow: auto;
перенесет вас в точно названную Сложную ситуацию часть спецификации:
Если элемент [Уровень блока, незаменяемые элементы в обычном потоке, когда «переполнение» не вычисляется для «видимого»] элемента, имеет плавающих потомков, нижний край поля которых находится ниже нижнего, то высота увеличивается, чтобы включить эти края
Что в основном говорит, что числа с плавающей точкой расширяют overflow <> visible
содержащие элементы.
1 overflow: hidden;
также будет работать, но будет обрезать содержимое вместо броска полос прокрутки, если это необходимо.