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.