【问题标题】:CSS list-style-image sizeCSS 列表样式图片大小
【发布时间】:2011-12-08 04:52:17
【问题描述】:

我正在尝试在 <ul> 的列表项上使用 CSS 设置自定义 SVG 图标。示例:

<ul>
    <li style="list-style-image: url('first.svg')">This is my first item</li>
    <li style="list-style-image: url('second.svg')">And here's my second</li>
</ul>

问题是图像太大,并且拉伸了线条的高度。我不想更改图像大小,因为使用 SVG 的目的是根据分辨率进行缩放。有没有办法使用 CSS 设置图像的大小而无需某种 background-image hack?

编辑:这是一个预览(特意为插图和戏剧选择大图):http://jsfiddle.net/tWQ65/4/
而我目前的background-image 解决方法,使用CSS3 的background-sizehttp://jsfiddle.net/kP375/1/

【问题讨论】:

标签: html css


【解决方案1】:

这是一个迟到的答案,但我把它放在这里是为了后代

您可以编辑 svg 并设置其大小。我喜欢使用 svg 的原因之一是您可以在文本编辑器中对其进行编辑。

以下是一个 3232 的 svg,我在内部调整了它的大小以最初显示为 1010 图像。它完美地替换了列表图像

<?xml version="1.0" ?><svg width="10" height="10"  id="chevron-right" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path style="fill:#34a89b;" d="M12 1 L26 16 L12 31 L8 27 L18 16 L8 5 z"/></svg>

然后我简单地将以下内容添加到我的 css 中

* ul {
  list-style: none;
  list-style-image: url(../images/chevron-right.svg);
}

list-style: none; 很重要,因为它可以防止在加载备用图像时显示默认列表图像。

【讨论】:

    【解决方案2】:

    我通过在 li 之前放置图像标签来实现它:


    HTML

    <img src="https://www.pinclipart.com/picdir/big/1-17498_plain-right-white-arrow-clip-art-at-clipart.png" class="listImage">
    

    CSS

    .listImage {
      float:left;
      margin:2px;
      width:25px
    }
    .li {
      margin-left:29px;
    }
    

    【讨论】:

      【解决方案3】:
      .your_class li {
        list-style-image: url('../images/image.svg');
      }
      
      .your_class li::marker {
        font-size: 1.5rem; /* You can use px, but I think rem is more respecful */
      }
      

      【讨论】:

      • 这似乎不会影响图像的尺寸。
      【解决方案4】:

      感谢 Chris 的出发点,这是一项解决所用图像大小调整的改进,使用 first-child 只是表示您可以使用列表中的各种图标来完全控制。

      ul li:first-child:before {
        content: '';
        display: inline-block;
        height: 25px;
        width: 35px;
        background-image: url('../images/Money.png');
        background-size: contain;
        background-repeat: no-repeat;
        margin-left: -35px;
      }
      

      这似乎适用于所有现代浏览器,您需要确保宽度和剩余的负边距具有相同的值,希望对您有所帮助

      【讨论】:

        【解决方案5】:

        我会使用:

        li {
          list-style: none;
        }
        li::before {
          content: '';
          display: inline-block;
          height: y;
          width: x;
          background-image: url();
        }
        

        【讨论】:

        • 没用,我什至试过background-size:16px auto;
        • background-size:contain 是更好的选择,但我不知道为什么它不适合你。我所有的 SVG 图像我都将高度和宽度设置为 100%,有些浏览器很有趣,除非你在 SVG 中设置。
        • .ladybug{ list-style:none; } .ladybug:before{ content:''; display:inline-block; height:1em; width:1em; background-image:url(http://www.openclipart.org/people/lemmling/lemmling_Ladybug.svg); background-size:contain; background-repeat:no-repeat; } 这样做的好处是您可以独立调整大小甚至为其设置动画。我知道它在 Firefox 和 Chrome 中对我有用。
        • 感谢您的跟进。很有可能其他 CSS 文件之一可能会将其弄乱。我使出了老派在“PhotoShop”中调整图像大小的技巧......
        • 为我工作。我使用了一个自定义 SVG,发现它可以使用和不使用以百分比形式给出的宽度和高度值。这里给出了一些额外的注释 - w3.org/wiki/CSS/Properties/list-style-image
        【解决方案6】:

        这是一个使用 Inline SVG 制作列表项目符号的示例(2020 浏览器)

        list-style-image: url("data:image/svg+xml,
                              <svg width='50' height='50'
                                   xmlns='http://www.w3.org/2000/svg' 
                                   viewBox='0 0 72 72'>
                                <rect width='100%' height='100%' fill='pink'/>
                                <path d='M70 42a3 3 90 0 1 3 3a3 3 90 0 1-3 3h-12l-3 3l-6 15l-3
                                         l-6-3v-21v-3l15-15a3 3 90 0 1 0 0c3 0 3 0 3 3l-6 12h30
                                         m-54 24v-24h9v24z'/></svg>")
        
        • 使用 SVG width & height 设置大小
        • M70 42 来定位手
        • FireFox 或 Chromium 上的不同行为!
        • 删除rect

        li{
          font-size:2em;
          list-style-image: url("data:image/svg+xml,<svg width='3em' height='3em'                          xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 72'><rect width='100%' height='100%' fill='pink'/><path d='M70 42a3 3 90 0 1 3 3a3 3 90 0 1-3 3h-12l-3 3l-6 15l-3 3h-12l-6-3v-21v-3l15-15a3 3 90 0 1 0 0c3 0 3 0 3 3l-6 12h30m-54 24v-24h9v24z'/></svg>");
        }
        
        span{
          display:inline-block;
          vertical-align:top;
          margin-top:-10px;
          margin-left:-5px;
        }
        <ul>
          <li><span>Apples</span></li>
          <li><span>Bananas</span></li>
          <li>Oranges</li>
        </ul>

        【讨论】:

          【解决方案7】:

          我正在使用:

          li {
          	margin: 0;
          	padding: 36px 0 36px 84px;
          	list-style: none;
          	background-image: url("../../images/checked_red.svg");
          	background-repeat: no-repeat;
          	background-position: left center;
          	background-size: 40px;
          }

          其中 background-size 设置背景图片大小。

          【讨论】:

            【解决方案8】:

            我用BootstrapJavascript 做了一种终端模拟器,因为我需要一些动态来轻松添加新项目,我把提示来自Javascript

            HTML

              <div class="panel panel-default">
                  <div class="panel-heading">Comandos SQL ejecutados</div>
                  <div class="panel-body panel-terminal-body">
                      <ul id="ulCommand"></ul>
                  </div>
             </div>
            

            Javascript:

            function addCommand(command){
                //Creating the li tag   
                var li = document.createElement('li');
                //Creating  the img tag
                var prompt = document.createElement('img');
                //Setting the image 
                prompt.setAttribute('src','./lib/custom/img/terminal-prompt-white.png');
                //Setting the width (like the font)
                prompt.setAttribute('width','15px');
                //Setting height as auto
                prompt.setAttribute('height','auto');
                //Adding the prompt to the list item
                li.appendChild(prompt);
                //Creating a span tag to add the command
                //li.appendChild('el comando');   por que no es un nodo
                var span = document.createElement('span');
                //Adding the text to the span tag
                span.innerHTML = command;
                //Adding the span to the list item
                li.appendChild(span);
                //At the end, adding the list item to the list (ul)
                document.getElementById('ulCommand').appendChild(li);
            }
            

            CSS:

            .panel-terminal-body {
              background-color: #423F3F;
              color: #EDEDED;
              padding-left: 50px;
              padding-right: 50px;
              padding-top: 15px;
              padding-bottom: 15px;
              height: 300px;
            }
            
            .panel-terminal-body ul {
              list-style: none;
            }
            

            希望对你有所帮助。

            【讨论】:

              【解决方案9】:

              您可以在此处查看布局引擎如何确定列表图像的大小:http://www.w3.org/wiki/CSS/Properties/list-style-image

              在保持 CSS 优势的同时,有三种方法可以解决这个问题:

              1. 调整图像大小。
              2. 改用背景图像和填充(最简单的方法)。
              3. 使用 viewBox 使用未定义大小的 SVG,然后在用作 list-style-image 时将大小调整为 1em(感谢 Jeremy)。

              【讨论】:

              • 从链接的 W3C 文档中的规则来看,似乎最好的解决方案实际上是从 SVG 文件中删除 widthheight 声明。
              • 这就是我对 #3 的理解,尽管正如我所说,我不确定它是如何完成的,看看 SVG 文档通常需要基于声明的高度和宽度的 X 和 Y 坐标文档。
              • 好吧,如果你有一个没有声明宽度和高度的 SVG 图像,但是 viewBox,我想你会得到想要的效果。在浏览器中单独查看图像会填满窗口(保留纵横比),所以我想作为list-style-image 它会填满可用空间,即1em
              • 使用 SVG 解决方案,除了1em,还有其他方法可以指定尺寸吗?
              • 在 Firefox 52 ESR 中,删除 SVG 的高度和宽度会导致它不渲染。
              【解决方案10】:

              几乎就像作弊一样,我只是进入图像编辑器并将图像大小调整了一半。对我来说就像一个魅力。

              【讨论】:

                【解决方案11】:

                您可能想尝试使用 img 标签而不是设置 'list-style-image' 属性。使用 css 设置宽度和高度实际上会裁剪图像。但是如果你使用 img 标签,图片会被重新调整为宽度和高度的值。

                【讨论】:

                • 图片标签的问题是,如果我为不同的行重复使用一些图标,以后很难更改。它还混合了内容和演示,这是我尽量避免的事情。不过,如果没有其他工作正常,我会记住这一点。
                猜你喜欢
                • 1970-01-01
                • 2016-06-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-29
                • 2018-06-23
                相关资源
                最近更新 更多