【问题标题】:Customize list item bullets using CSS使用 CSS 自定义列表项项目符号
【发布时间】:2011-06-23 15:57:53
【问题描述】:

是否可以更改 <li> 元素的 bullet 的大小?

看看下面的代码:

li {
    list-style: square; // I want to change the size of this squared bullet. 
}

我似乎找不到任何方法来实现这一点。

【问题讨论】:

  • 你是指它的“子弹”部分,而不是li元素的文本内容吗?

标签: css size html-lists listitem


【解决方案1】:

你的意思是改变子弹的大小,我猜?我相信这与 li 标签的字体大小有关。因此,您可以放大 LI 的字体大小,然后针对其中包含的元素减小它。添加额外的标记有点糟糕 - 但类似于:

li {font-size:omgHuge;}
li span {font-size:mehNormal;}

或者,您可以为列表项目符号指定一个图像文件,该文件可以任意大:

ul{
  list-style: square url("38specialPlusP.gif");
 }

见:http://www.w3schools.com/css/css_list.asp

【讨论】:

  • 正确 - 正如@dan 提到的 - 使用自定义图像,您需要更改填充以适应。
  • 在那个学派中,我认为你也可以使用 CSS :before 创建一个方形 div,而不是项目符号,如果它是你所追求的方形项目符号。
  • 我查找了这个问题,因为我有一个项目符号图标,我想将其用作项目符号的自定义样式。但是原始文件很大。我想让浏览器调整它的大小,这样我就不必下载图像、调整大小、重新上传和重新热链接。 cdn2.iconfinder.com/data/icons/bullet-points/64/…
  • 我的两分钱@Musixauce3000:我参加了一个名为“Web Graphics”的必修网页设计课程。第一天他们告诉我们,文件越小越好。让浏览器调整网站大小会消耗用户的带宽(如果他们在移动设备上浏览,则非常不利),从而导致页面加载时间变慢并耗尽用户的数据计划。最佳实践是当前(2016 年 8 月)下载文件,修改它,然后上传修改后的文件——这正是你所说的你想要避免的。我希望有一个更简单的方法。不过问题很好。
【解决方案2】:

基于@dzimney answer,类似于@Crisman answer(但不同)

这个答案很好,但有缩进问题(子弹出现在li范围内)。可能你不想要这个。请参阅下面的简单示例列表(这是默认的 HTML 列表):

  • Lorem ipsum dolor sit amet, ei cum offendit partiendo iudicabit。在 mei quaestioHonestatis,duo dicit affert persecuti ei。 Etiam nusquam cu his, nec alterum posidonium philosophia te。 Nec an purto iudicabit, no vix quod clita expetendis。

  • Quem suscipiantur no eos, sed impedit impedit explicari ea, falli inermis comprehensam est in. Vide dicunt ancillae cum te, habeo delenit deserunt mei in. Tale sint ex his, ipsum essent appellantur et cum。

但如果您使用上述答案,列表将如下所示(忽略项目符号的大小):

Lorem ipsum dolor sit amet, ei cum offendit partiendo iudicabit。在 mei quaestioHonestatis,duo dicit affert persecuti ei。 Etiam nusquam cu his, nec alterum posidonium philosophia te。 Nec an purto iudicabit, no vix quod clita expetendis。

Quem suscipiantur no eos, sed impedit impedit explicari ea, falli inermis comprehensam est in. Vide dicunt ancillae cum te, habeo delenit deserunt mei in. Tale sint ex his, ipsum essent appellantur et cum。


所以我推荐这种解决问题的方法:

li {
    list-style-type: none;
    position: relative;    /* It's needed for setting position to absolute in the next rule. */
}

li::before {
    content: '■';
    position: absolute;
    left: -0.8em;          /* Adjust this value so that it appears where you want. */
    font-size: 1.1em;      /* Adjust this value so that it appears what size you want. */
}
<ul>
    <li>Lorem ipsum dolor sit amet, ei cum offendit partiendo iudicabit. At mei quaestio honestatis, duo dicit affert persecuti ei. Etiam nusquam cu his, nec alterum posidonium philosophia te. Nec an purto iudicabit, no vix quod clita expetendis.</li>
    <li>Quem suscipiantur no eos, sed impedit explicari ea, falli inermis comprehensam est in. Vide dicunt ancillae cum te, habeo delenit deserunt mei in. Tale sint ex his, ipsum essent appellantur et cum.</li>
</ul>

【讨论】:

  • 这应该是正确的答案。像魅力一样工作
  • 只是添加这个,您可能还需要设置font-family 以确保正确渲染子弹。例如,某些字体将圆形项目符号呈现为正方形。
【解决方案3】:

您可以将li 的内容包装在另一个元素中,例如span。然后,给li 一个更大的font-size,并在span 上设置一个普通的font-size

http://jsfiddle.net/RZr2r/

li {
    font-size: 36px;
}
li span {
    font-size: 18px;
}
<ul>
    <li><span>Item 1</span></li>
    <li><span>Item 2</span></li>
    <li><span>Item 3</span></li>
</ul>

【讨论】:

  • 谢谢。经过更多研究,这似乎是唯一的解决方案,前提是我不想使用背景图像而不是
  • 元素。
  • 这很好用。但是有没有办法做到这一点,但让文本的中间与项目符号的中间垂直对齐?
  • 这似乎是最可维护和最少的工作。两行 CSS 和一个在 HTML 中的搜索和替换。谢谢!
  • 【解决方案4】:

    我假设您的意思是每个列表项开头的项目符号的大小。如果是这种情况,您可以使用图像来代替它:

    list-style-image:url('bigger.gif');
    list-style-type:none;
    

    如果您指的是li 元素的实际大小,那么您可以像往常一样使用widthheight 进行更改。

    【讨论】:

      【解决方案5】:

      您可以使用 ::marker CSS 伪元素来设置列表的编号或项目符号的样式。目前,2022 年 1 月,Safari 支持仅限于颜色和字体大小。

      例子:

      ::marker {
        color: red;
        font-size: 2rem
      }
      
      ul > li::marker {
        color: blue;
      }
      
      ol > li::marker {
        font-size: 1rem
      }
      <ul>
        <li>Step One</li>
        <li>Step Two</li>
        <li>Step Three</li>
      </ul>
       
      <ol>
        <li>Wake up</li>
        <li>Code</li>
        <li>Sleep</li>
      </ol>

      【讨论】:

        【解决方案6】:

        根据所需的 IE 支持级别,您还可以使用 :before 选择器并将项目符号样式设置为内容属性。

        li {  
          list-style-type: none;
          font-size: small;
        }
        
        li:before {
          content: '\2022';
          font-size: x-large;
        }
        

        您可能需要查找 HTML ASCII 以获得所需的项目符号样式,并使用 converter 作为 CSS Hex 值。

        【讨论】:

        • 这还不够::before 伪元素将在文本流中,没有在左侧分隔,所以如果列表项有 2 行以上,这看起来很丑
        【解决方案7】:

        改变子弹大小的另一种方法是:

        1. 完全禁用子弹
        2. 借助::before 伪元素重新添加自定义项目符号。

        示例:

        ul {
          list-style-type: none;
        }
        
        li::before {
          display:          inline-block;
          vertical-align:   middle;
          width:            5px;
          height:           5px;
          background-color: #000000;
          margin-right:     8px;
          content:          ' '
        }
        <ul>
          <li>first element</li>
          <li>second element</li>
        </ul>

        无需更改标记

        【讨论】:

        • 首先,它是:before,而不是::before;其次,与 dzimney 的回答相同的问题:伪元素将在文本流中,而不是在左侧分隔,所以如果列表项有 2 行以上,这看起来很丑
        • 伪元素用双冒号而不是单冒号表示(就像伪类那样)。不过,我同意你的第二点。
        • 好的,感谢您指出这一点。自从我(很久以前)阅读了有关伪元素的文档以来,情况发生了变化,确实建议将双冒号表示法用于伪元素,尽管支持旧的单冒号表示法以实现向后兼容性(w3schools.com/Css/css_pseudo_elements.asp
        • 这个解决方案很好 - 对项目符号的显示进行了大量控制。您可以通过添加 border-radius: 100% 来使子弹圈起来
        【解决方案8】:

        如果您不想用&lt;span&gt;s 将&lt;li&gt;s 中的内容包装起来,您也可以像这样使用:before

        ul {
          list-style: none;
          }
        li {
          position: relative;
          padding-left: 15px;
          line-height: 16px;
        }
        li:before {
          content: '\2022';
          line-height: 16px; /*match the li line-height for vertical centered bullets*/
          position: absolute;
          left: 0;
        }
        li.huge:before {
          font-size: 30px;
        }
        
        li.small:before {
          font-size: 10px;
        }
        

        :before 上的字体大小调整为您想要的任何大小。

        <ul>
          <li class="huge">huge bullet</li>
          <li class="small">smaller bullet</li>
          <li class="huge">multi line item with custom<br/> sized bullet</li>
          <li>normal bullet</li>
        </ul>
        

        【讨论】:

          【解决方案9】:
          <ul>
              <li id="bigger"></li>
              <li></li>
              <li></li>
            </ul>
          
            <style>
               #bigger .li {height:##px; width:##px;}
            </style>
          

          【讨论】:

            【解决方案10】:

            您必须使用图像来更改子弹本身的实际大小或形状:

            您可以使用带有适当填充的背景图像来微调内容,使其不重叠:

            list-style-image:url(bigger.gif);
            

            background-image: url(images/bullet.gif);
            

            【讨论】:

              【解决方案11】:

              如果您将&lt;li&gt; 内容包装在&lt;span&gt; 或其他标签中,您可以更改&lt;li&gt; 的字体大小,这将改变项目符号的大小,然后重置&lt;li&gt; 的内容到原来的大小。您可以使用em 单位按比例调整&lt;li&gt; 项目符号的大小。

              例如:

              <ul>
                  <li><span>First item</span></li>
                  <li><span>Second item</span></li>
              </ul>
              

              然后是 CSS:

              li {
                  list-style-type: disc;
                  font-size: 0.8em;
              }
              
              li * {
                  font-size: initial;
              }
              

              一个更复杂的例子:

              <!DOCTYPE html>
              <html lang="en">
              <head>
                  <title>List Item Bullet Size</title>
                  <meta charset="utf-8">
                  <meta name="viewport" content="width=device-width, initial-scale=1">
                  <style>
              ul.disc li {
                  list-style-type: disc;
                  font-size: 1.5em;
              }
              
              ul.square li {
                  list-style-type: square;
                  font-size: 0.8em;
              }
              
              li * {
                  font-size: initial;
              }
                  </style>
              </head>
              <body>
              
              <h1>First</h1>
              <ul class="disc">
                  <li><span>First item</span></li>
                  <li><span>Second item</span></li>
              </ul>
              
              <h1>Second</h1>
              <ul class="square">
                  <li><span>First item</span></li>
                  <li><span>Second item</span></li>
              </ul>
              
              </body>
              </html>
              

              结果:

              【讨论】:

              • 纯代码解决方案被视为劣质内容。请添加一些关于为什么这回答了问题的描述。
              【解决方案12】:

              我刚刚找到了一个我认为非常有效的解决方案,并且可以绕过自定义符号的所有缺陷。 li:before 解决方案的主要问题是,如果列表项长于一行,则不会在第一行文本之后正确缩进。通过使用带有负填充的文本缩进,我们可以规避这个问题并使所有行正确对齐:

              ul{
                  padding-left: 0; // remove default padding
              }
              
              li{
                  list-style-type: none;  // remove default styles
                  padding-left: 1.2em;    
                  text-indent:-1.2em;     // remove padding on first line
              }
              
              li::before{
                  margin-right:     0.5em; 
                  width:            0.7em; // margin-right and width must add up to the negative indent-value set above
                  height:           0.7em;
              
                  display:          inline-block;
                  vertical-align:   middle;
                  border-radius: 50%;
                  background-color: orange;
                  content:          ' '
              }
              

              【讨论】:

                【解决方案13】:

                此方法将光盘移出原始光盘所在的文本流,但可以调整。

                ul{
                    list-style-type: none;
                    
                    li{ 
                        position: relative;
                      }
                    li:before {
                        position: absolute;
                        top: .1rem;
                        left: -.8em;
                        content: '\2022';
                        font-size: 1.2rem;
                    }
                }
                

                【讨论】:

                  【解决方案14】:

                  这是一个Unicode 版本。这个允许您将任何您喜欢的文本符号或表情符号放入您的 CSS 项目符号列表中。您只需要 Unicode“代码点”值。

                  <style>
                  #html_list{
                      position: relative;
                      margin-left: 1em;
                      list-style: none;
                  }
                  #html_list li::before {
                      display: inline-block;
                      content: "\2023";
                      color: #114f66;
                      font-size: 3rem;
                      line-height: 0;
                      padding: 0 .1em 0 0;
                      margin: 0;
                      text-align: left;
                      vertical-align: top;
                      position: relative;
                      top: .2em;
                      left: 0em;
                  }
                  #html_list li {
                      text-align:left;
                      vertical-align: top;
                      padding: .2em 0em .2em 0em;
                      margin: 0;
                      font-size: 1rem;
                  }
                  </style>
                  
                  <ul id="html_list">
                      <li><a href="#">Area 1</a></li>
                      <li><a href="#">Area 2</a></li>
                      <li><a href="#">Area 3</a></li>
                  </ul>
                  

                  在列表中使用 Unicode 或文本符号的主要问题是调整大小。即使您去掉了高度、行高、填充和边距,符号在使用字体大小调整大小后仍有间距。其中大部分是基于您选择的字体。小心并在 CSS 中选择具有一系列 Unicode 字形的字体。

                  我在上面设计了最好的解决方案,它使用伪元素将 Unicode 项目符号文本及其样式与列表文本的其余部分分开。这个想法允许您删除父无序列表中的默认列表样式项目符号,将新的 Unicode 项目符号插入到 ::before 伪元素中。然后,您可以根据需要调整大小和重新定位它。将已调整大小的项目符号与列表文本对齐后,您可以根据需要开始填充或调整列表文本的大小,项目符号应随之移动。

                  【讨论】:

                    【解决方案15】:

                    还没有看到提到过这种技术。它基本上允许你有一个你想要的任何大小的“点”。它使用圆形边框来绘制圆形。

                    li {
                        list-style-type: none;
                        position: relative;
                        margin-left: 2.5rem;
                    }
                    
                    li:before {
                        content: " ";
                        border: 1rem solid #1b1b1b;
                        border-radius: 99rem;
                        height: 0; /* it's all controlled by the border */
                        width: 0;
                        margin-top: -0.4rem;
                        margin-left:  -2.5rem;
                        position: absolute;
                    }
                    

                    【讨论】:

                      猜你喜欢
                      相关资源
                      最近更新 更多
                      热门标签