CSS: Керуйте пробілом між кулею та <li>


177

Я хотів би контролювати, скільки горизонтального простору куля штовхає її <li>вправо в <ol>або <ul>.

Тобто замість того, щоб завжди мати

*  Some list text goes
   here.

Я хотів би мати можливість це змінити

*         Some list text goes
          here.

або

*Some list text goes
 here.

Я озирнувся, але міг знайти лише вказівки щодо переміщення всього блоку вліво або вправо, наприклад, http://www.alistapart.com/articles/taminglists/


3
Майже дублікат stackoverflow.com/questions/2441059/…
rds

Відповіді:


161

Помістіть його вміст у spanвідносно розташоване, тоді ви можете керувати простором за leftвластивістю span.

li span {
  position: relative;
  left: -10px;
}
<ul>
  <li><span>item 1</span></li>
  <li><span>item 2</span></li>
  <li><span>item 3</span></li>
</ul>


Просто для уточнення, тег <span> може бути семантичним, коли йому призначений клас, наприклад, <span class = "tel"> 123-456-7890 </span> неявно семантичний.
ingyhere

4
+1 за те, що насправді відповів на запитання хлопця;) (хоча в реальному житті прольот в будь-якому випадку повинен мати клас для належної практики майбутньої ізоляції, а також семантики: якщо в майбутньому будь-який JavaScript або розвиток нових функцій тощо мали б вагомий привід додати додаткові проміжки до вашого вмісту все може заплутатися)
user56reinstatemonica8

у Firefox не відображається належним чином текст, який перекриває кулі за допомогою цього фокусу
Jay Bhalodi

@ingyhere я не сумніваюся, що це правда, оскільки я не можу знайти нічого, що підтверджує це твердження. Чи можете ви надати будь-які джерела?
WoIIe

@Wolle Hmmm. Це старий коментар, і я не впевнений у своїй стурбованості. Якщо це стосується того, чи <SPAN>можна використовувати idабо classтеги, подивіться на W3C . Якщо питання полягає в тому, чи може він передати смислове значення, дивіться цю відповідь . Технічно <SPAN>тег сам по собі є несемантичним вбудованим елементом, але певним чином, що забезпечує більшу гнучкість при його повторному використанні. Сьогодні я вважаю, що можна використовувати inline-blockдескриптор, щоб дозволити набагато більший спектр опцій форматування.
ingyhere

120

Щоб узагальнити інші відповіді тут - якщо ви хочете точніше контролювати пробіл між куль і текстом у <li>списку, вашими параметрами є:

(1) Використовуйте фонове зображення:

<style type="text/css">
li {
    list-style-type:none;
    background-image:url(bullet.png);
}
</style>

<ul>
    <li>Some text</li>
</ul>

Переваги:

  • Ви можете використовувати будь-яке зображення для кулі
  • Ви можете використовувати CSS background-positionдля розташування зображення в будь-якому місці, де ви хочете, по відношенню до тексту, використовуючи пікселі, еми або%

Недоліки:

  • Додає додатковий (хоч і невеликий) файл зображення на вашу сторінку, збільшуючи вагу сторінки
  • Якщо користувач збільшує розмір тексту у своєму браузері, куля залишиться на початковому розмірі. Це також, ймовірно, вийде з місця, оскільки розмір тексту збільшується
  • Якщо ви розробляєте "чуйний" макет, використовуючи лише відсотки для ширини, може бути важко дістати кулю саме там, де ви хочете, для діапазону ширини екрана.

2. Використовуйте набивки на <li>тегу

<style type="text/css">
ul {padding-left:1em}
li {padding-left:1em}
</style>

<ul>
    <li>Some text</li>
</ul>

Переваги:

  • Немає зображення = 1 менший файл для завантаження
  • Регулюючи прокладку на <li>, ви можете додати стільки зайвого горизонтального простору між кулею та текстом, скільки вам подобається
  • Якщо користувач збільшує розмір тексту, відстань і розмір кулі повинні пропорційно масштабуватися

Недоліки:

  • Неможливо перемістити кулю ближче до тексту, ніж за замовчуванням у веб-переглядачі
  • Обмежено формами та розмірами вбудованих типів куль CSS
  • Куля повинна бути того ж кольору, що і текст
  • Немає контролю над вертикальним розташуванням кулі

(3) Обгорніть текст додатковим <span>елементом

<style type="text/css">
li {
    padding-left:1em;
    color:#f00; /* red bullet */
}
li span {
    display:block;
    margin-left:-0.5em;
    color:#000; /* black text */
}
</style>

<ul>
    <li><span>Some text</span></li>
</ul>

Переваги:

  • Немає зображення = 1 менший файл для завантаження
  • Ви отримуєте більше контролю над положенням кулі, ніж за допомогою опції (2) - ви можете перемістити її ближче до тексту (хоча, незважаючи на мої найкращі зусилля, здається, ви не можете змінити вертикальне положення, додавши padding-topдо <span>. Хтось інший, можливо, матиме але вирішення цього питання, хоча ...)
  • Куля може бути різного кольору тексту
  • Якщо користувач збільшує розмір тексту, куля повинна масштабуватися пропорційно (за умови встановлення прокладки та поля в ems не px)

Недоліки:

  • Потрібен додатковий несемантичний елемент (це, ймовірно, втратить у вас більше друзів на SO, ніж це буде в реальному житті;), але це дратує тих, хто любить їх код, бути максимально витонченим та ефективним, і це порушує розділення презентації та змісту що повинен запропонувати HTML / CSS)
  • Немає контролю за розміром і формою кулі

Ось сподіваємось на нові функції стилю списку в CSS4, тому ми можемо створювати розумніші кулі, не вдаючись до зображень або екстра-надбавок :)


4
Чудова відповідь. Щоб робота №2 працювала, переконайтеся, що ви дотримуєтесь свого списку-стилю outside.
Том Ожер

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

Якщо у вас є текст, який обертає рядки, я виявив, що мені потрібно додати display: block;елемент прольоту, щоб обернутий текст також вирівнювався (я також в кінці використовував якірні теги замість прольотів)
Кевін М

Використовувати фонові зображення для всього, що є не просто, майже завжди є дуже поганою ідеєю. Вони не можуть бути збережені, не надруковані та не згадані читачами екрану. Використовуючи <span> ist найелегантніший спосіб вирішити це. прокладки не працюватимуть, оскільки вони також змінюють положення куль.
Бахсау

3
Я б ніколи не використовував для цього фонове зображення. Завжди можна використовувати елемент: перед вмістом: "•"; тоді ви використовуєте набивання і абсолютне положення на цьому перед елементом для управління ним.
Ян Чабо

37

Це має робити. Не забудьте встановити кулі зовні. ви також можете використовувати псевдоелементи CSS, якщо ви можете скинути їх у IE7 вниз. Я не рекомендую використовувати псевдоелементи для цього роду, але це працює для контролю відстані.

ul {
  list-style: circle outside;
  width: 100px;
}

li {
  padding-left: 40px;
}

.pseudo,
.pseudo ul {
  list-style: none;
}

.pseudo li {
  position: relative;
}

/* use ISO 10646 for content http://la.remifa.so/unicode/named-entities.html */
.pseudo li:before {
  content: '\2192';
  position: absolute;
  left: 0;
}
<ul>
  <li>Any Browser really</li>
  <li>List item
    <ul>
      <li>List item</li>
      <li>List item</li>
    </ul>
  </li>
</ul>

<ul class="pseudo">
  <li>IE8+ only</li>
  <li>List item
    <ul>
      <li>List item with two lines of text for the example.</li>
      <li>List item</li>
    </ul>
  </li>
</ul>


5
Я не можу повірити, що ця відповідь не прийнята. Це 100% CSS, він не додає жодного зайвого <span> елемента, і це змусило мене нарешті зрозуміти, чому є варіант "всередині / зовні"! (і це прийнята відповідь на згадане
повторне

1
Використання list-style-position: outsideта набивання на LIелементах дозволяє збільшити відстань між точками кулі, але це все одно не працює навпаки поза межами встановленого браузером зміщення. Дивіться цей JS Bin .
Mesagoma

4
Додаток: У сучасних веб-переглядачах (IE9 +, FF, Chrome тощо) використовуйте мінус text-indentна <UL>або, <LI>щоб заперечувати відстань, накладене браузером, на відстань між точкою кулі та <LI>вмістом. Тобто збільшуйте, padding-leftяк показано вище, щоб збільшити відстань і зменшити, text-indentщоб зменшити відстань між точкою кулі та вмістом за бажанням.
Mesagoma

1
На жаль , для всіх вищезгаданих браузерів настільних комп’ютерів, якщо вміст <LI>обгортання у другий рядок, такі наступні рядки в кінцевому підсумку будуть повторно відступом на основі поля / прокладки / відступу, який нам вдалося скасувати для першого рядка через text-indent. Зітхання
Mesagoma

Інший варіант полягає у використанні елементів: перед псевдоелементами та встановлення вмісту на все, що завгодно. звідти розташуйте псевдоелементи за бажанням.
Кевін

14

Старе питання, але ось: перш ніж псевдо елемент працює тут добре.

<style>
    li:before {
        content: "";
        display: inline-block;
        height: 1rem;  // or px or em or whatever
        width: .5rem;  // or whatever space you want
    }
</style>

Він працює дуже добре і не вимагає багато додаткових правил або html.

<ul>
    <li>Some content</li>
    <li>Some other content</li>
</ul>

Ура!


3
Приємна і проста відповідь. Я додам, що встановлення margin-left: -5px(або будь-яке значення) зменшить простір між кулею та <li>елементом
binaryfunt

2
Примітка. Це не підтримує висячі відступи
Ерік

Чудова відповідь, це прекрасно спрацювало з найменшою кількістю робіт! Дякую!
KyleFarris

12

Для типу списку: inline :

Це майже те саме, що відповідь DSMann8, але менше код css.

Вам просто потрібно

<style>
    li:before {
        content: "";
        padding-left: 10px;
    }
</style>

<ul>
    <li>Some content</li>
</ul>

Ура


Це list-style-position: insideтеж працює , що чудово!
Метт Додж

11

Ви можете використовувати padding-leftатрибут для елементів списку ( не для самого списку!).


5
Зверніть увагу, що це працює лише в тому випадку, якщо list-style-positionзначення за замовчуванням встановлено outside.
серпень

Це має бути прийнятою відповіддю, принаймні для звичайного використання. Це дозволяє уникати використання <span>елемента лише для дизайнерських цілей.
eukras

7

Використання тексту-відступу на li працює найкраще.

текст-відступ: -x px; перемістить кулю ближче до li і навпаки.

При використанні відносного періоду мінус ліворуч може не працювати належним чином у старих версіях для IE. PS - уникайте давати позиції стільки, скільки можете.


Це поводиться дивно в Chrome. Скорочується на невеликий простір на -5 пікселів;
Ян Варбуртон

7

Ось ще одне рішення з використанням лічильника css та псевдо елементів. Я вважаю його більш елегантним, оскільки не вимагає використання додаткової розмітки html або класів css:

ol,
ul {
    list-style-position: inside;
}

li {
    list-style-type: none;
}

ol {
    counter-reset: ol; //reset the counter for every new ol
}

ul li:before {
        content: '\2022 \00a0 \00a0 \00a0'; //bullet unicode followed by 3 non breakable spaces
}

ol li:before {
        counter-increment: ol;
        content: counter(ol) '.\00a0 \00a0 \00a0'; //css counter followed by a dot and 3 non breakable spaces
}

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


7

Старе питання, але все ще актуальне. Я рекомендую використовувати негативні text-indent. list-style-positionповинно бути outside.

Плюси:

  • Куля правильно розміщується автоматично
  • Зміна розміру шрифту не порушує положення кулі
  • Немає зайвих елементів (немає: також псевдоелементів)
  • Працює як для RTL, так і для LTR без зміни CSS.

Мінуси:

  • спробуйте
  • до
  • знайти
  • один :)

2
Я спробував використовувати цей метод, але відступ не працює для мене, якщо є розриви рядків. Текстовий відступ буде відступати лише першим рядком.
Метт

6

Непорядкований список починається з тегу ul. Кожен елемент списку починається з пунктів "Список" за замовчуванням позначаються кулями (маленькими чорними кружечками):

    <!DOCTYPE html>
    <html>
       <body>
          <h2>Normal List </h2>
          <ul>
             <li>Coffee</li>
             <li>Tea</li>
             <li>Milk</li>
          </ul>
       </body>
    </html>

Вихід:

<!DOCTYPE html>
<html>
<body>

<h2>Normal List </h2>

<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

</body>
</html>

Властивість "текст-відступ" визначає відступ першого рядка в текстовому блоці.
Примітка: негативні значення дозволені. Перший рядок буде з відступом зліва, якщо значення від’ємне.

<ul style='text-indent: -7px;'>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

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

це найкраща відповідь і його слід прийняти. мінімальний CSS!
KawaiKx

5

Здається, ви можете (дещо) керувати міжряддями, використовуючи набивання на тезі <li>.

<style type="text/css">
    li { padding-left: 10px; }
</style>

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

Для цього ви можете спробувати вимкнути тип списку та використовувати & bull;

<ul style="list-style-type: none;">
    <li>&bull;Some list text goes here.</li>
</ul>

5

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

li:before {
    content: "";
    margin-left: -0.5rem;
}

4

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

Дивіться відповідь на це запитання


3
ul
{
list-style-position:inside;
} 

Визначення та використання

Властивість позиції-стилю списку визначає, чи повинні з’являтися маркери елементів списку всередині або поза потоком вмісту.

Джерело: http://www.w3schools.com/cssref/pr_list-style-position.asp


1
Це не дає відповіді на запитання. Він запитує метод контролю розміру відступу.
Езотеричне ім'я екрана

0

Можна використовувати ul li:beforeі фонове зображення, і призначити, position: relativeі position:absoluteвідповідно, liі li:beforeвідповідно. Таким чином ви можете створити зображення та розмістити його там, де ви хочете відносно li.


0

Використовуйте padding-left:1em; text-indent:-1emдля <li>тегу.
Потім list-style-position: insideдля <ul>мітки.

<ul style='list-style-position: inside;'>
  <li style='padding-left: 1em; text-indent: -1em;'>Item 1</li>
</ul>

0

Наведене нижче рішення добре працює, коли ви хочете перенести текст ближче до кулі і навіть якщо у вас є кілька рядків тексту.

margin-right дозволяє перемістити текст ближче до кулі

text-indent гарантує, що кілька рядків тексту все-таки правильно вибудовуються

li:before {
  content: "";
  margin-right: -5px; /* Adjust this to move text closer to the bullet */
}

li {
  text-indent: 5px; /* Aligns second line of text */
}
<ul>
  <li> Item 1 ... </li>
  <li> Item 2 ... this item has tons and tons of text that causes a second line! Notice how even the second line is lined up with the first!</li>
  <li> Item 3 ... </li>
</ul>

введіть тут опис зображення


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