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/


Answers:


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 2012年

4
+1代表实际回答这个人的问题;)(尽管理想情况下,跨度应该在现实生活中至少有一个类可以用于未来实践以及语义学:如果将来有任何javascript或新功能开发等,有充分的理由添加额外的跨度到您的内容,事情可能会变得凌乱)
user56reinstatemonica8'8

在firefox中,无法正确显示文本,使用此技巧使子弹重叠
Jay Bhalodi

@ingyhere我不是真的,因为我找不到任何能证明这一主张的东西。您能提供任何资料吗?
WoIIe

@Wolle Hmmm。这是一个古老的评论,我不确定是否要担心-如果是关于是否<SPAN>可以利用idclass标记,请查看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使用像素,ems或%将图像定位在与文本相关的几乎任何位置

缺点:

  • 向您的页面添加一个额外的(尽管很小)图像文件,从而增加页面的权重
  • 如果用户在其浏览器上增加了文本大小,则项目符号将保持原始大小。随着文字大小的增加,它也有可能进一步偏离位置
  • 如果要仅使用百分比的宽度来开发“响应式”布局,则可能难以在整个屏幕宽度范围内将子弹准确地放置在所需位置

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中具有一些新的列表样式功能,因此我们可以创建更智能的项目符号,而无需使用图像或exta标记:)


4
好答案。为了使#2正常工作,请确保将list-style-position保持为outside
Tom Auger 2012年

span元素适合我。我为这个答案+1的原因仅在于,我没有理由就偏向于负绝对定位而不是负绝对定位。
FlipMcF

如果您有用于换行的文本,我发现我必须添加display: block;到span元素,这样换行的文本也才能排成一行(我也最终使用了定位标记而不是span)
Kevin M

将背景图像用于不仅限于此几乎总是一个坏主意。它们无法保存,不打印且屏幕阅读器未提及。使用<span> ist是最优雅的方法来解决此问题。填充物不会起作用,因为它们也会改变子弹的位置。
巴查(Bachsau)'16

3
我永远不会为此使用背景图片。您始终可以将:before元素与以下内容一起使用:“•”; 然后,您可以在元素前的元素上使用填充和绝对位置来控制它。
Yann Chabot

37

这应该做。确保将子弹放到外面。如果您可以将CSS伪元素向下放入IE7,也可以使用CSS伪元素。我真的不建议对这种东西使用伪元素,但是它确实可以控制距离。

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>元素,这使我终于明白了为什么要使用内部/外部选项!(这是提到的重复问题的公认答案...)
MindTailor

1
list-style-position: outsideLI元素上使用和填充可以使您增加项目符号点之间的距离,但是在浏览器指定的偏移量之外仍然无法正常工作。看到这个JS Bin
Mesagoma

4
附录:在现代浏览器(IE9 +,FF,Chrome等)中,text-indent<UL>或上使用负号<LI>可否定浏览器在项目符号和<LI>内容之间的强制距离。即,padding-left如上所示按需增加以增加距离,并减小text-indent以减小项目符号与内容之间的距离。
Mesagoma

1
,对于所有的上述的桌面浏览器,如果一个内容<LI>缠绕到第二线,例如随后的行最终被基于所述余量/填充/缩进,我们设法撤消用于经由第一线路重缩进text-indent叹息
Mesagoma

另一个选择是使用:before伪元素并将内容设置为您喜欢的任何内容。从那里根据需要放置伪元素。
凯文

14

老问题了,但是:before伪元素在这里很好用。

<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 2015年

2
注意:这不支持悬挂式缩进
Eric

很棒的答案,这可以用最少的工作量完美地工作!谢谢!
KyleFarris '04

12

对于list-style-type: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
2015年8

至少对于正常使用,这应该是可接受的答案。它避免了<span>仅出于设计目的而使用元素。
eukras


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
}

我使用不可中断的空格,以便间距仅影响列表元素的第一行(如果列表元素长于一行)。您可以在此处使用填充。


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>

text-indent属性指定文本块中第一行的缩进。
注意:允许使用负值。如果值为负,第一行将向左缩进。

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

感谢您的回答,但是请尝试注释您的解决方案,以方便他人理解。
统治

这是最好的答案,应该接受。最低CSS!
KawaiKx

6

旧问题,但仍然有意义。我建议使用负数text-indentlist-style-position必须是outside

优点:

  • 项目符号已正确自动定位
  • 更改字体大小不会破坏项目符号的位置
  • 没有额外的元素(也没有:: pseudo-elements)
  • RTL和LTR均可使用,而无需更改CSS。

缺点:

  • 尝试
  • 一个:)

2
我尝试使用此方法,但是如果有换行符,缩进对我不起作用。文字缩进只会缩进第一行。
马特

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;
}



0

您可以使用ul li:before和背景图像,并分配position: relativeposition:absolutelili: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>

在此处输入图片说明


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.