Почему пули моего списка перекрывают плавающие элементы


166

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

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

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

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

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

Ответы:


280

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

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


1
+1: Отличный CSS, я искал, как сумасшедший, для ХОРОШЕГО УНИВЕРСАЛЬНОГО решения, и вот оно на ТАК. Единственным небольшим недостатком является то, что свойство zoom не проверяет CSS, но я тестировал и в IE7 IE8 не нужен, так что, вероятно, это только для IE6.
Марко Демайо

14
Чтобы это действительно заработало, мне также пришлось применить: ul, ol {overflow: hidden; отступ слева: 40 пикселей; поле слева: 0; } ol li, ul li {list-style-position: outside; отступ слева: 0; } Это вынудило согласованное отображение в браузерах и заставило IE6 показывать маркеры. В противном случае пули были спрятаны. Уль {увеличить: 1; } все еще требовалось в специфических настройках ie6.
Mandrake

1
Столь смехотворно простое решение такой нелепой ошибки в MSIE.
SF.

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

2
Ницца! Однако я не понимаю, как это имеет смысл, когда читаешь документацию W3C о переполнении: w3schools.com/cssref/pr_pos_overflow.asp
MSC

66

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

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чтобы они не переполнили свой контейнер.


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

2
Спасибо за это. Применение переполнения: скрыто; чтобы контейнер UL препятствовал правильному перемещению текста в отдельных позициях вокруг плавающего блока. Это решение сделало свое дело!
Jsdalton

1
Я столкнулся с небольшой, но критической проблемой с этим решением, и я хотел бы предложить дополнение к вашему улучшению. Я не уверен, почему, но когда вы добавляете position: relative;в позицию, это создает проблему с размещаемым контентом. Я обнаружил (в Chrome и Firefox), что трудно парить и нажимать на ссылки в плавающем контенте. Для меня исправлением было добавить position: relative; z-index: 1;к плавающему элементу, который, казалось, решил проблему с наложением.
Jsdalton

7
К сожалению, в IE 10 маркеры перекрываются с плавающим элементом.
Мунавар

1
Принимая во внимание, что ul {overflow: hidden;}эта проблема решена во всех браузерах, вышеуказанное решение было единственным исправлением этой проблемы с Prince XML , конвертером XHTML + CSS3 в PDF.
Серж Строобандт

36

Здесь свойство «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"


29

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


3
list-style-position:insideбыло бы отличным решением, но заставляет линии, которые переносятся, начинаться с маркером, а не с линией выше.
Марко Демайо

переполнение: скрытое; не работает для моего левого плавающего изображения, но list-style-position: inside сделал это! спасибо
menardmam

Это было единственное решение, которое по-прежнему оборачивалось контентом в IE для меня. Спасибо!
Jordan314

Это отличное решение для случаев, когда контент перемещается между маркерами и маркерами.
TylersSN

Это должен быть выбранный ответ.
Гладкий Компьютерщик

18

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

position: relative;
left: 1em;

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


2
Фантастическое решение, работает как шарм! Хотя мне пришлось испачкать руки в IE7, так как он не отображал номера элементов списка в списках, которые не были рядом с плавающим элементом.
maryisdead

@maryisdead Каково ваше решение для IE7?
TJ.

IE7 требовался дополнительный запас слева в элементах списка. Посмотрите эту скрипку jsfiddle.net/maryisdead/wu6ew/5 и обратите внимание на два взлома IE7. Извините, что не добавил это ранее.
maryisdead

18

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

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

ul {overflow: hidden;}

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

пример

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

Мой сайт в качестве примера

Похожие ответы

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


1
спасибо за объяснение, почему это работает (не упоминается в принятом решении)
schellmax

17

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

Обновить

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


13

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

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


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


7

отказ

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

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

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


Мне нравится второй вариант, но на самом деле текст начинается с маркеров на длинных текстах (2 строки) :-(
Arany

4

Попробуйте следующее в вашем UL-теге. Это должно позаботиться о пулях, наложенных на ваше изображение, и вам не нужно испортить левое смещение, вызванное list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Я должен был использовать это с решением Blazemonger (# 2 выше). Один только BLazemonger не работал в IE 9-11 и Opera. При этом он работает во всех браузерах. Решение Камиэля (# 1) не сработало для меня, поскольку скрыло мои пули. Конфликт с Bootstrap3 возможно.
Лераа

3

Боролся с этим сам. Лучшее, что мне удалось, это следующее:

ul {
    list-style-position: inside;
    padding-left: 1em;
    text-indent: -1em;
}

Текст на самом деле не с отступом, а с маркером.


2

Отредактировано для обновления на основе комментария ОП

хорошо, тогда просто разбить его на 2 деления, вложенных вместе

ul  {background: blue; position:static;}
.therest {position:relative; width:100%}
.indent {float:left; }

<div class="therest">
<p>
Est tincidunt doming iis nobis nibh. Ullamcorper eorum elit lius me delenit. 
</p>
<hr />
<h3>Lorem</h3>
<div class="indent">
<ul>
<li>list element</li>
<li>list element</li>
<li>list element</li>
</ul> 
<div>
the rest now under the UL
</div>

попробуйте изменить ul li css на

ul {float: left; фон: синий; }


спасибо, это работает, однако, теперь параграфы ниже всплывают с правой стороны.
названия

2

После борьбы с этой интересной проблемой в нескольких проектах и ​​выяснения причин ее возникновения я, наконец, считаю, что нашел и то, и другое: работающее и «отзывчивое» решение.

Вот волшебная уловка, живой пример: http://jsfiddle.net/superKalo/phabbtnx/

ul {
    list-style: none;
    position: relative;
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    left: 35px;
}
li {
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    text-indent: -19px; /* adjust as much as needed */
}
li:before {
    content: '•\00a0\00a0\00a0';
    color: #000; /* bonus: you can customize the bullet color */
}

Я добавил display: flex;к li, так что bulletpoint вертикально по центру, когда я изменить размер шрифта в :beforeчасти.
Арани

1

Работая внутри LMS без доступа к руководству документа, было проще использовать его margin-right: 20pxв качестве встроенного стиля изображения. Который я обязан этому сайту .


0

попробуй это:

li{
    margin-left:5px;
}

Если вы хотите, чтобы они ушли влево, просто введите значение - ## px.


0

или вы могли бы сделать это:

 #content ul {
        background:none repeat scroll 0 0 #AACCDD;
        float:left;
        margin-right:10px;
        padding:10px;

а затем удалите все стили с


1
плавающее ul действительно решает проблему, однако возникает другая проблема ... все элементы абзаца, которые появляются после того, как ul плавают справа от ul.
названия

дал вам +1 за это ... Я делал здесь предположение, просматривая ссылку, связанную с этим вопросом, что <p> будет плавать справа от <ul>. Хороший улов.
Рис


0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

margin-left: auto приведет к выравниванию самого элемента по правому краю. Установите высоту и ширину элемента, который вы хотите - по моему это фоновое изображение в div внутри


0

Вы также можете попробовать плавать ulвлево и определить соответствующийwidth для него, чтобы он плавал рядом с изображением.

Что-то вроде этого jsfiddle ?




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.