Почему пули моего элемента списка перекрывают плавающие элементы - PullRequest
157 голосов
/ 02 апреля 2009

У меня есть страница (XHTML Strict), где я размещаю изображение рядом с обычными абзацами текста. Все идет хорошо, кроме случаев, когда список используется вместо абзацев. Пули списка перекрывают всплывающее изображение.

Изменение поля списка или элементов списка не помогает. Поле рассчитывается с левой стороны страницы, но с плавающей точкой элементы списка перемещаются вправо внутри самого li. Таким образом, поле помогает, только если я сделаю его шире, чем изображение.

Плавающий список рядом с изображением также работает, но я не знаю, когда список находится рядом с плавающей точкой. Я не хочу размещать каждый список в моем контенте только для того, чтобы это исправить. Кроме того, плавающее влево портит макет, когда изображение перемещается вправо вместо левого списка.

Установка li { list-style-position: inside } действительно перемещает маркеры вместе с содержимым, но также заставляет линии, которые переносятся, начинаться с маркером, а не с линией выше.

Проблема, очевидно, вызвана тем, что пуля выводится за пределы коробки, а поплавок толкает содержимое коробки вправо (не саму коробку). Вот как IE и FF справляются с ситуацией, и, насколько я знаю, не ошибаются в соответствии со спецификацией. Вопрос в том, как я могу это предотвратить?

Ответы [ 23 ]

269 голосов
/ 02 апреля 2009

Я нашел решение этой проблемы. Применение ul { overflow: hidden; } к ul гарантирует, что сам ящик отодвигается поплавком, а не содержимым ящика.

Только IE6 нуждается в ul { zoom: 1; } в наших условных комментариях, чтобы убедиться, что ul имеет макет.

64 голосов
/ 10 августа 2012

Добавление улучшения к решению Глена Э. Айви :

ul {
    list-style: outside disc;
    margin-left: 1em;
}
ul li {
    position: relative;
    left: 1em;
    padding-right: 1em;    
}​

http://jsfiddle.net/mblase75/TJELt/

Я предпочитаю эту технику, так как она работает, когда список должен обтекать плавающее изображение, тогда как техника overflow: hidden не будет. Однако также необходимо добавить padding-right: 1em к li, чтобы они не переполнили свой контейнер.

35 голосов
/ 02 июля 2012

Здесь свойство «display» вступает в свои права. Установите CSS ниже, чтобы список работал вместе с плавающим контентом.

дисплей: таблица; работает вместе с плавающим контентом (заполняя пробел), но не пряча контент за ним. Очень похоже на таблицу: -)

.img {
  float: left;
}

.table {
  display: table;
}
<img class="img" src="https://via.placeholder.com/350x350" alt="">
<ul>
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>
<ul class="table">
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>

РЕДАКТИРОВАТЬ: Не забудьте добавить класс, чтобы изолировать, для каких списков вы хотите сделать это. Например. "ul.in-content" или в более общем смысле ".content ul"

28 голосов
/ 02 апреля 2009

Попробуйте list-style-position: inside , чтобы изменить расположение пуль.

17 голосов
/ 30 апреля 2012

Добавление overflow: auto; к вашему ul работает как минимум для меня.

Обновление

Я обновил моего jsfiddle , чтобы визуализировать, что происходит. При наличии ul рядом с плавающим img содержимое ul будет перемещаться поплавком, но не фактическим контейнером. При добавлении overflow: auto все поле ul будет перемещено поплавком, а не только содержимым.

17 голосов
/ 26 февраля 2010

В http://archivist.incutio.com/viewlist/css-discuss/106382 Я нашел предложение, которое сработало для меня: стилизовать элементы 'li' с помощью:

position: relative;
left: 1em;

Где вы заменяете «1em» шириной левого отступа / поля, которая была бы у ваших элементов списка, если бы не было поплавка. Это прекрасно работает в моем приложении, даже обрабатывая случай, когда нижняя часть поплавка находится в середине списков - пули возвращаются к (локальному) левому полю справа.

16 голосов
/ 06 августа 2014

Почему overflow: hidden работает

Решение так же просто, как:

ul {overflow: hidden;}

Блок блока с overflow:, отличным от visible , устанавливает новый контекст форматирования блока для его содержимого. Рекомендация W3C: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

Пример:

Кнопки на моем веб-сайте , которые <li> замаскированы, сделаны следующим образом. Уменьшите область просмотра (окно) вашего браузера до , см. отступ в действии .

Ответы по теме:

Статья с примерами:

13 голосов
/ 03 мая 2010

Вы можете назначить position: relative; left: 10px; на li. (Вы можете дополнительно указать margin-right: 10px;, в противном случае он может стать слишком широким с правой стороны.)

Или, если вы хотите использовать float для ul - как предлагали другие - вы, вероятно, можете запретить остальным плавать справа от ul, используя clear: left на элементе, который следует за ul .

7 голосов
/ 02 сентября 2013

Я использую это для решения этой проблемы:

ul {
   display: table;
}
6 голосов
/ 26 февраля 2015

Отказ

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

Простой дизайн, состоящий из центрированных изображений между абзацами, будет выглядеть очень привлекательно и его будет гораздо легче поддерживать, чем пытаться стать слишком причудливым. Это также один шаг от <figure>.

Но я действительно хочу плавающие изображения!

Хорошо, поэтому, если вы сумасшедший достаточно настойчив, чтобы продолжать идти по этому пути, есть пара методов, которые можно использовать.

Самое простое - заставить список использовать overflow: hidden или overflow: scroll, чтобы список был по существу сокращен, что возвращает отступ туда, где он полезен:

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

У этой техники есть несколько проблем. Если список становится длинным, он фактически не оборачивается вокруг изображения, что в значительной степени сводит на нет всю цель использования float на изображении.

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Но я действительно хочу упаковывать списки!

Хорошо, так что если вы даже сумасшедший более настойчивый и вы обязательно должны продолжать идти по этому пути, есть еще один метод, который можно использовать для переноса элементов списка и поддержания маркеров .

Вместо того, чтобы дополнять <ul> и пытаться заставить его вести себя хорошо с пулями (чего он никогда не хочет делать), уберите эти пули из <ul> и отдайте их <li> с. Пули опасны, и <ul> просто не отвечает за правильное обращение с ними.

img {
  float: left;
}
.wrapping-list {
  padding: 0;
  list-style-position: inside;
}
.wrapping-list li {
  overflow: hidden;
  padding-left: 25px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Такое поведение может вызывать странные вещи в сложном контенте, поэтому я не рекомендую добавлять его по умолчанию. Гораздо проще настроить его как нечто, на что можно переключиться, а не как то, что нужно переопределить.

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