Чому кулі мого списку елементів перекриваються плаваючими елементами


166

У мене є (строга XHTML) сторінка, на якій я плаваю зображення поряд із звичайними абзацами тексту. Все добре, за винятком випадків, коли замість абзаців використовується список. Кулі списку перекривають плаваюче зображення.

Зміна поля списку або елементів списку не допомагає. Маржа розраховується з лівої частини сторінки, а поплавок штовхає елементи списку праворуч всередині на liсебе. Тож поле допомагає лише в тому випадку, якщо я розширюю його, ніж зображення.

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

Налаштування li { list-style-position: inside }дійсно переміщує кулі разом із вмістом, але це також призводить до того, що лінії, які обгортають, починають вирівнюватись із кулею, а не вирівнюватись з рядком вище.

Проблема, очевидно, викликана тим, що куля виноситься поза коробкою, поплавок висуває вміст коробки вправо (а не сам ящик). Ось як IE і FF вирішують ситуацію, і, наскільки я знаю, не помиляються відповідно до специфікації. Питання в тому, як я можу це запобігти?

Відповіді:


280

Я знайшов рішення цієї проблеми. Застосовуючи ul { overflow: hidden; }до, ulгарантується, що сам ящик буде відсунутий поплавцем, а не вмістом.

ul { zoom: 1; }У наших умовних коментарях потрібен лише IE6, щоб переконатися, що ulмає макет.


1
+1: Чудовий CSS, я шукав, як божевільний, для ДОБРОГО ВЕРСАТИЛЬНОГО рішення, і ось він на ТАК. Єдиний невеликий зворотний результат - це те, що властивість масштабування не підтверджує CSS, але я тестував і на IE7, IE8 не потрібен, тому, ймовірно, це лише для IE6.
Марко Демайо

14
Для того, щоб це справді працювало, мені довелося також застосувати: ul, ol {overflow: hidden; підкладка-зліва: 40px; край-ліворуч: 0; } ol li, ul li {список-стиль-положення: зовні; підкладка-зліва: 0; } Це примусово послідовно відображало в браузерах і змушувало IE6 показувати кулі. Кулі були заховані інакше. Уль {зум: 1; }, як і раніше, потрібно було встановити в специфічних параметрах ie6.
Мандраке

1
Настільки смішно просте рішення такого смішного БУГу в MSIE.
СФ.

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 кулі перекриваються з плаваючим елементом.
Munawwar

1
Поки ul {overflow: hidden;}вирішували цю проблему у всіх браузерах, вищевказане рішення було єдиним діючим засобом вирішення цієї проблеми з принтером 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>

EDIT: Не забудьте додати клас, щоб виділити списки, для яких ви хочете це зробити. Наприклад, "ul.in-content" або загалом ".content ul"


29

Спробуйте список-стиль-позиція: всередині, щоб змінити компонування куль.


3
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-форматування

Приклад

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

Мій веб-сайт як приклад

Відповідні відповіді

Стаття з прикладами


1
дякую за пояснення, чому це працює (не згадується у прийнятому рішенні)
schellmax

17

Додавши overflow: auto;до своїх ulтворів принаймні для мене.

Оновлення

Я оновив свою jsfiddle, щоб візуалізувати, що відбувається. Маючи ulпоруч плаваючий img, вміст ulволі буде витіснятися поплавцем, але не фактичним контейнером. Додавши overflow: autoвесь ul-box буде витіснений поплавцем замість лише вмісту.


13

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

Або, якщо ви хочете використовувати floatдля ul- як це пропонують інші - ви, ймовірно, можете зупинити решту плаваючого права ul, використовуючи clear: leftелемент, що слідує за ul.


спасибі Кріс, що позиція: відносна працювала. Проблема, яка виникла б при очищенні елемента після ul, полягає в тому, що елемент також очистить лівий плаваючий div.
superUntitled


7

Відмова від відповідальності

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

Простий дизайн із центрованими зображеннями між абзацами виглядатиме дуже привабливо та буде набагато простіше підтримати, ніж намагатися надто фантазувати. Це також в одному кроці від a <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>

Таке поводження може робити дивні речі для складного вмісту, тому я не рекомендую додавати його за замовчуванням. Набагато простіше налаштувати його як щось, що можна вибрати, а не щось, що треба переосмислити.


Мені подобається другий варіант, але текст насправді починається з пунктів кулі на довших текстах (2 ряди) :-(
Арані

4

Спробуйте наступне на своєму тезі UL. Це повинно піклуватися про кулі, що накладають ваше зображення, і вам не доведеться псувати ліве вирівнювання, викликане цим list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Мені довелося використовувати це з рішенням Блаземонгера (№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: зліва; фон: синій; }


спасибі, це працює, однак тепер параграфи нижче пливуть проти правої сторони.
superUntitled

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.
superUntitled

дав вам +1 для цього ... Я робив припущення, переглядаючи посилання, пов’язане з цим питанням, що <p> буде плавати праворуч від <ul>. Хороший улов.
Рис


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

margin-left: auto призведе до вирівнювання самого елемента вправо. Встановіть висоту та ширину потрібного елемента - по моєму це фонове зображення у діві всередині


0

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

Щось трохи схоже на цю jsfiddle ?




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.