【问题标题】:Custom li list-style with font-awesome icon带有字体真棒图标的自定义 li 列表样式
【发布时间】:2012-11-13 01:54:08
【问题描述】:

我想知道是否可以利用 font-awesome(或任何其他标志性字体)类来创建自定义 <li>list-style-type?

我目前正在使用 jQuery 来执行此操作,即:

$("li.myClass").prepend("<i class=\"icon-chevron-right\"></i>");

但是,当&lt;li&gt; 文本环绕页面时,它的样式不正确,因为它认为图标是文本的一部分,而不是实际的项目符号指示符。

有什么建议吗?

【问题讨论】:

  • 重要通知:以下几个答案表明不支持 ::marker psudeo-element。现在支持several browsers

标签: css html-lists font-awesome


【解决方案1】:

CSS Lists and Counters Module Level 3 引入了 ::marker 伪元素。据我了解,它会允许这样的事情。 Unfortunately, no browser seems to support it.

您可以做的是向父 ul 添加一些填充并将图标拉到该填充中:

ul {
  list-style: none;
  padding: 0;
}
li {
  padding-left: 1.3em;
}
li:before {
  content: "\f00c"; /* FontAwesome Unicode */
  font-family: FontAwesome;
  display: inline-block;
  margin-left: -1.3em; /* same as padding-left set on li */
  width: 1.3em; /* same as padding-left set on li */
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<ul>
  <li>Item one</li>
  <li>Item two</li>
</ul>

根据自己的喜好调整填充/字体大小/等,就是这样。

您可以也应该将间距单位放在 css 变量中,而不是在整个代码中重复。

=====

这适用于任何类型的标志性字体。然而,FontAwesome 提供了他们自己的方式来处理这个“问题”。查看下面 Darrrrrren 的回答了解更多详情。

【讨论】:

  • 我这里做了一个Font Awesome图标对应的CSS内容代码的参考页:astronautweb.co/snippet/font-awesome
  • 此解决方案甚至适用于多列元素。 (其他使用 position:absolute 不要)
  • @Astrotim 您可以直接从官方 FontAwesome 备忘单中获取这些代码:fortawesome.github.io/Font-Awesome/cheatsheet
  • 此解决方案需要稍作修改才能与 FontAwesome 5 一起使用。您需要 font-family: 'Font Awesome 5 Free';以及一个明确的字体粗细让它工作。见stackoverflow.com/questions/47894414/…
  • 我需要添加一个特定的权重才能让它工作:font-weight: 900;
【解决方案2】:

根据Font Awesome Documentation

<ul class="fa-ul">
  <li><i class="fa-li fa fa-check"></i>Barbabella</li>
  <li><i class="fa-li fa fa-check"></i>Barbaletta</li>
  <li><i class="fa-li fa fa-check"></i>Barbalala</li>
</ul>

或者,使用 Jade:

ul.fa-ul
  li
    i.fa-li.fa.fa-check
    | Barbabella
  li
    i.fa-li.fa.fa-check
    | Barbaletta
  li
    i.fa-li.fa.fa-check
    | Barbalala

【讨论】:

  • 这在 vue 中为我工作就像这样 &lt;ul class="fa-ul"&gt;&lt;li class="h4"&gt;&lt;font-awesome-icon icon="check" /&gt; ...
【解决方案3】:

我想提供一个替代的、更简单的特定于 FontAwesome 的解决方案。如果您使用不同的标志性字体,JOPLOmacedo 的答案仍然非常适合使用。

FontAwesome now handles list styles internally with CSS classes.

这是官方的例子:

<ul class="fa-ul">
  <li><span class="fa-li"><i class="fas fa-check-square"></i></span>List icons can</li>
  <li><span class="fa-li"><i class="fas fa-check-square"></i></span>be used to</li>
  <li><span class="fa-li"><i class="fas fa-spinner fa-pulse"></i></span>replace bullets</li>
  <li><span class="fa-li"><i class="far fa-square"></i></span>in lists</li>
</ul>

【讨论】:

  • 最后一个 Font-Awesome 你必须用 "fa-ul" 替换 "icons-ul" 和 "fa-li" 替换 "icon-li" : [code]
    • ...
    [/code]
【解决方案4】:

我想补充一下 JOPLOmacedo 的答案。他的解决方案是我最喜欢的,但是当 li 有多行时,我总是遇到缩进问题。找到带有边距等的正确缩进很繁琐。但这可能只与我有关。

对我来说,:before 伪元素的绝对定位效果最好。我在 ul 上设置了padding-left,在:before 元素上左侧为负位置,与 ul 的padding-left 相同。为了获得内容与:before 元素的距离,我只需在li 上设置padding-left。当然, li 必须具有相对位置。例如

ul {
  margin: 0 0 1em 0;
  padding: 0 0 0 1em;
  /* make space for li's :before */
  list-style: none;
}

li {
  position: relative;
  padding-left: 0.4em;
  /* text distance to icon */
}

li:before {
  font-family: 'my-icon-font';
  content: 'character-code-here';
  position: absolute;
  left: -1em;
  /* same as ul padding-left */
  top: 0.65em;
  /* depends on character, maybe use padding-top instead */
  /*  .... more styling, maybe set width etc ... */
}

希望这很清楚,并且对我以外的其他人有一些价值。

【讨论】:

  • 对于所有初学者来说,这是一种名为 SASS 的 CSS 预处理语言。纯 CSS 不能以这种方式嵌套。
【解决方案5】:

在@OscarJovanny 评论的启发下,我做了两件事,并做了一些小技巧。

第 1 步:

  • Here 下载图标文件为 svg,因为我只需要来自 font awesome 的这个图标

第 2 步:

<style>
ul {
    list-style-type: none;
    margin-left: 10px;
}

ul li {
    margin-bottom: 12px;
    margin-left: -10px;
    display: flex;
    align-items: center;
}

ul li::before {
    color: transparent;
    font-size: 1px;
    content: " ";
    margin-left: -1.3em;
    margin-right: 15px;
    padding: 10px;
    background-color: orange;
    -webkit-mask-image: url("./assets/img/check-circle-solid.svg");
    -webkit-mask-size: cover;
}
</style>

结果

【讨论】:

  • 嗨,我可以用png 代替svg 吗?谢谢
【解决方案6】:

我是这样做的:

li {
  list-style: none;
  background-image: url("./assets/img/control.svg");
  background-repeat: no-repeat;
  background-position: left center;
}

或者如果你想改变颜色,你可以试试这个:

li::before {
  content: "";
  display: inline-block;
  height: 10px;
  width: 10px;
  margin-right: 7px;

  background-color: orange;
  -webkit-mask-image: url("./assets/img/control.svg");
  -webkit-mask-size: cover;
}

【讨论】:

    【解决方案7】:

    现在::marker 元素在evergreen browsers 中可用,这就是您可以使用它的方式,包括使用:hover 来更改标记。如您所见,现在您可以使用任何您想要的 Unicode 字符作为列表项标记,甚至可以使用自定义计数器。

    @charset "UTF-8";
    @counter-style fancy {
      system: fixed;
      symbols: ? ? ?;
      suffix: " ";
    }
    
    p {
      margin-left: 8em;
    }
    
    p.note {
      display: list-item;
      counter-increment: note-counter;
    }
    
    p.note::marker {
      content: "Note " counter(note-counter) ":";
    }
    
    ol {
      margin-left: 8em;
      padding-left: 0;
    }
    
    ol li {
      list-style-type: lower-roman;
    }
    
    ol li::marker {
      color: blue;
      font-weight: bold;
    }
    
    ul {
      margin-left: 8em;
      padding-left: 0;
    }
    
    ul.happy li::marker {
      content: "?";
    }
    
    ul.happy li:hover {
      color: blue;
    }
    
    ul.happy li:hover::marker {
      content: "?";
    }
    
    ul.fancy {
      list-style: fancy;
    }
    <p>This is the first paragraph in this document.</p>
    <p class="note">This is a very short document.</p>
    <ol>
      <li>This is the first item.
        <li>This is the second item.
          <li>This is the third item.
    </ol>
    <p>This is the end.</p>
    
    <ul class="happy">
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
    
    <ul class="fancy">
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>

    【讨论】:

      【解决方案8】:

      这是我的版本:FontAwesome 5 ul

      ul {
        list-style-position: inside;
        padding-left: 0;
      }
      ul li {
        list-style: none;
        position: relative;
        padding-left: 20px;
      }
      ul li::before {
        position: absolute;
        top: calc(50% - 4px); /* half font-size */
        left: 0px;
        font-family: "Font Awesome 5 Free";
        content: "\f111";
        font-size: 8px;
        font-weight: 900;
      }
      <script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script>
      <ul>
        <li>Line 1</li>
        <li>Line 2</li>
        <li>Line 3</li>
        <li>Line 4</li>
        <li>Line 5</li>
      </ul>

      【讨论】:

        【解决方案9】:

        见参考:https://fontawesome.com/v5.15/how-to-use/on-the-web/styling/icons-in-a-list

        <ul class="fa-ul">
          <li><span class="fa-li"><i class="fas fa-check-square"></i></span>List icons can</li>
          <li><span class="fa-li"><i class="fas fa-check-square"></i></span>be used to</li>
          <li><span class="fa-li"><i class="fas fa-spinner fa-pulse"></i></span>replace bullets</li>
          <li><span class="fa-li"><i class="far fa-square"></i></span>in lists</li>
        </ul>
        

        【讨论】:

        • 尝试更多地描述您的答案,而不是仅仅粘贴解决方案。抓住亮点并找到文档的特定部分,而不是仅仅粘贴指向文档的链接。
        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
        猜你喜欢
        • 2022-08-16
        • 2013-12-06
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 2012-07-10
        • 2021-11-18
        • 2017-12-20
        • 1970-01-01
        相关资源
        最近更新 更多