有没有办法将SVG用作伪元素中的内容:before或:after

Sun*_*nny 188 css svg

我想在一些选定的元素之前放置一些SVG图像.我正在使用JQuery,但这是无关紧要的.我想将:before元素作为:

  #mydiv:before {
    content:"<svg.. code here</svg>";
    display:block;
    width:22px;
    height:10px;
    margin:10px 5px 0 10px;
  }
Run Code Online (Sandbox Code Playgroud)

如果我如上所示,它只显示字符串.我检查了规格,似乎对内容有什么限制.是否有解决此限制的工作?只有内容css与我的问题相关.

dez*_*man 204

是的你可以!刚试过这个,效果很好,真棒!它仍然不能用于html,但它与svg一起使用.

在我的index.html中,我有:

<div id="test" style="content: url(test.svg); width: 200px; height: 200px;"></div>
Run Code Online (Sandbox Code Playgroud)

我的test.svg看起来像这样:

<svg xmlns="http://www.w3.org/2000/svg">
   <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
   <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-width:3"/>
</svg> 
Run Code Online (Sandbox Code Playgroud)

  • 除非SVG是特殊的,否则您应该能够像处理图像一样处理它们:`content:url(path/to/my.svg)`.但这并不一定意味着它可以与jQuery UI工具提示库一起使用. (17认同)
  • 正如其他回复中提到的;2020 年,SVG 也是如此:``content:url("data:image/svg+xml,&lt;svg width='10' viewBox='0 0 8 8' xmlns='http://www.w3.org/ 2000/svg'&gt;&lt;circle cx='4' cy='4' r='4' fill='red'/&gt;&lt;/svg&gt;");`` (5认同)
  • 不幸的是,我不相信这个解决方案适用于SVG精灵.例如,`content:url(mysprite.svg#my-icon)`实际上不会拉出你的图标.我很想被证明是错的,但是:) (4认同)
  • @Jason:如果您在 SVG 中定义视图,则带有片段标识符的精灵(`content: url(mysprite.svg#my-icon)`)将起作用,例如 `&lt;view id="my-icon" viewBox="0 0 32 32" /&gt;`:https://css-tricks.com/svg-fragment-identifiers-work/ (3认同)
  • 你为什么想做这个?如果你已经在文件中有svg代码,那么就不需要将它放在伪类中.当你想要添加一些内容时,伪类的重点是减少DOM元素,但是在你的情况下,如果你只是正常使用你的svg代码,那么将它放在伪的情况下并不会更糟(并且可能更清晰) -class(也可能是不可能的).当然,除非您想将svg代码放在一堆位置中,否则您应该将svg代码保存在单独的文件中,如图像. (2认同)
  • @watson,语义。HTML = 结构,CSS = 展示。如果 SVG 是装饰性的,那么它不应该在 HTML 结构中,而应该在 CSS 中。 (2认同)
  • Dezman:这样做有充分的理由,例如您无权修改 HTML 结构。例如,某些第3方插件渲染了一个按钮,并且该按钮需要自定义图标。只需注入一个伪元素并用它来完成(然后去炸更大的鱼)要容易得多,而不是花费大量时间调查并正确/安全/有效地分支和修改原始源代码。根据具体情况(1 人项目与大型企业项目、私人访问与公共访问等),这是好是坏。 (2认同)

Der*_*lop 114

是.您可以将SVG添加为空的背景图像:after或:before.干得好:

.anchor:before {
  display: block;
  content: ' ';
  background-image: url('../images/anchor.svg');
  background-size: 28px 28px;
  height: 28px;
  width: 28px;
}
Run Code Online (Sandbox Code Playgroud)

  • @NicolasBoisteault我尝试过,但对我有用的实际上是使用这个结构作为答案之一:`url("data:image/svg+xml; utf8, &lt;svg.. code here&lt;/svg&gt;");` (7认同)
  • 在找了一段时间后,我发现这是最好的解决方案之一.您可以控制插入元素的每个方面,并以CSS样式表的正常方式工作,具有分离的逻辑.大 (3认同)

小智 100

#mydiv:before {
    content: url("data:image/svg+xml; utf8, <svg.. code here</svg>");
    display:block;
    width:22px;
    height:10px;
    margin:10px 5px 0 10px;
}
Run Code Online (Sandbox Code Playgroud)

确保你的svg不包含双引号,并且uriencode任何#符号.

  • 由于SVG经常使用双引号,因此您也可以使用外部单引号.如果您不想使用外部SVG文件,@ Jenny的建议是一种很好的方法. (7认同)
  • 简单的方法:使用 https://yoksel.github.io/url-encoder/ 将 SVG 图像安全编码为 URL 数据(背景图像或内容属性)。 (7认同)
  • 仅供参考,`#` urlencodes 为 `%23`,并且还必须删除所有换行符。 (6认同)
  • 这很棒。不幸的是,它仅对我适用于Chrome(已在Chrome,Firefox和Edge上测试)。 (2认同)
  • 好吧它适用于FF.只需注意"不#"部分.还要确保使用div标签(似乎不适用于span).可悲的是Edge仍然没有成功. (2认同)
  • 我发现重要的是在&lt;svg&gt;部分中添加`xmlns ='http:// www.w3.org / 2000 / svg'`以在Chrome 66.x中工作。例如,小型人字形将为:`content:url(“ data:image / svg + xml; utf8,&lt;svg xmlns ='http://www.w3.org/2000/svg'width ='24px'height = '24px'fill ='white'&gt; &lt;路径d ='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z'/&gt; &lt;/ svg&gt;“);` (2认同)

LGS*_*Son 26

利用CSS精灵和数据uri提供额外的有趣好处,如快速加载和更少的请求,我们通过使用image/base64获得IE8支持:

使用SVG的Codepen示例

HTML

<div class="div1"></div>
<div class="div2"></div>
Run Code Online (Sandbox Code Playgroud)

CSS

.div1:after, .div2:after {
  content: '';
  display: block;
  height: 80px;
  width: 80px;
  background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20version%3D%221.1%22%20height%3D%2280%22%20width%3D%22160%22%3E%0D%0A%20%20%3Ccircle%20cx%3D%2240%22%20cy%3D%2240%22%20r%3D%2238%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22red%22%20%2F%3E%0D%0A%20%20%3Ccircle%20cx%3D%22120%22%20cy%3D%2240%22%20r%3D%2238%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22blue%22%20%2F%3E%0D%0A%3C%2Fsvg%3E);
}
.div2:after {
  background-position: -80px 0;
}
Run Code Online (Sandbox Code Playgroud)

对于IE8,更改为:

  background-image: url(data:image/png;base64,data......);
Run Code Online (Sandbox Code Playgroud)


Ale*_*rin 16

<div class="author_">Lord Byron</div>
Run Code Online (Sandbox Code Playgroud)

.author_ {  font-family: 'Playfair Display', serif; font-size: 1.25em; font-weight: 700;letter-spacing: 0.25em; font-style: italic;
  position:relative;
  margin-top: -0.5em;
  color: black;
  z-index:1;
  overflow:hidden;
  text-align:center;
 
}


.author_:after{
   left:20px;
  margin:0 -100% 0 0;
  display: inline-block;
  height: 10px;
  content: url(data:image/svg+xml,%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120px%22%20height%3D%2220px%22%20viewBox%3D%220%200%201200%20200%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%3Cpath%20stroke%3D%22black%22%20stroke-width%3D%223%22%20fill%3D%22none%22%20d%3D%22M1145%2085c17%2C7%208%2C24%20-4%2C29%20-12%2C4%20-40%2C6%20-48%2C-8%20-9%2C-15%209%2C-34%2026%2C-42%2017%2C-7%2045%2C-6%2062%2C2%2017%2C9%2019%2C18%2020%2C27%201%2C9%200%2C29%20-27%2C52%20-28%2C23%20-52%2C34%20-102%2C33%20-49%2C0%20-130%2C-31%20-185%2C-50%20-56%2C-18%20-74%2C-21%20-96%2C-23%20-22%2C-2%20-29%2C-2%20-56%2C7%20-27%2C8%20-44%2C17%20-44%2C17%20-13%2C5%20-15%2C7%20-40%2C16%20-25%2C9%20-69%2C14%20-120%2C11%20-51%2C-3%20-126%2C-23%20-181%2C-32%20-54%2C-9%20-105%2C-20%20-148%2C-23%20-42%2C-3%20-71%2C1%20-104%2C5%20-34%2C5%20-65%2C15%20-98%2C22%22%2F%3E%0A%3C%2Fsvg%3E%0A);
}
.author_:before {
  right:20px;
  margin:0 0 0 -100%;
  display: inline-block;
  height: 10px;
  content: url(data:image/svg+xml,%0A%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22120px%22%20height%3D%2220px%22%20viewBox%3D%220%200%201200%20130%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%3Cpath%20stroke%3D%22black%22%20stroke-width%3D%223%22%20fill%3D%22none%22%20d%3D%22M55%2068c-17%2C6%20-8%2C23%204%2C28%2012%2C5%2040%2C7%2048%2C-8%209%2C-15%20-9%2C-34%20-26%2C-41%20-17%2C-8%20-45%2C-7%20-62%2C2%20-18%2C8%20-19%2C18%20-20%2C27%20-1%2C9%200%2C29%2027%2C52%2028%2C23%2052%2C33%20102%2C33%2049%2C-1%20130%2C-31%20185%2C-50%2056%2C-19%2074%2C-21%2096%2C-23%2022%2C-2%2029%2C-2%2056%2C6%2027%2C8%2043%2C17%2043%2C17%2014%2C6%2016%2C7%2041%2C16%2025%2C9%2069%2C15%20120%2C11%2051%2C-3%20126%2C-22%20181%2C-32%2054%2C-9%20105%2C-20%20148%2C-23%2042%2C-3%2071%2C1%20104%2C6%2034%2C4%2065%2C14%2098%2C22%22%2F%3E%0A%3C%2Fsvg%3E%0A);
}
Run Code Online (Sandbox Code Playgroud)
	<div class="author_">Lord Byron</div>
Run Code Online (Sandbox Code Playgroud)


Jak*_*uda 11

To extend further this topic. In case you want to add Font Awesome 5 icons you need to add some extra CSS.

Icons by default have classes svg-inline--fa and fa-w-*.

There are also modifier classes like fa-lg, fa-rotate-* and other. You need to check svg-with-js.css file and find proper CSS for that.

You need to add your own color to css icon otherwise it will be black by default, for example fill='%23f00' where %23 is encoded #.

h1::before{

  /* svg-inline--fa */
  display:inline-block;
  font-size:inherit;
  height:1em;
  overflow:visible;
  vertical-align:-.125em;
  
  /* fa-w-14 */
  width:.875em;
  
  /* Icon */
  content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%23f00' d='M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z'%3E%3C/path%3E%3C/svg%3E");
  
  /* Margin */
  margin-right:.75rem;
}
Run Code Online (Sandbox Code Playgroud)
<h1>Lorem Ipsum</h1>
Run Code Online (Sandbox Code Playgroud)


小智 7

使用带有空内容的背景蒙版图像,您可以在 css 中控制颜色:(不要忘记您喜欢的位置、宽度和高度)...!

background-color: red;
-webkit-mask-image: url(icon.svg);
mask-image: url(icon.svg);
content:'';
Run Code Online (Sandbox Code Playgroud)


zby*_*ycz 6

小心所有其他答案在 IE 中都有一些问题。

让我们来看看这种情况 - 带有前置图标的按钮。所有浏览器都能正确处理这个问题,但 IE 获取元素的宽度并缩放之前的内容以适应它。 JSFiddle

#mydiv1 { width: 200px; height: 30px; background: green; }
#mydiv1:before {
    content: url("data:url or /standard/url.svg");
}
Run Code Online (Sandbox Code Playgroud)

解决方案是将 size 设置为元素之前并将其保留在原处:

#mydiv2 { width: 200px; height: 30px; background: green; }
#mydiv2:before {
    content: url("data:url or /standard/url.svg");
    display: inline-block;
    width: 16px; //only one size is alright, IE scales uniformly to fit it
}
Run Code Online (Sandbox Code Playgroud)

background-image+background-size解决方案可以作为很好,但有点不方便,因为你必须指定两次相同的尺寸。

在 IE11 中的结果:

IE渲染


小智 5

虽然这是很多年前的事了,但我也想分享一下。

上面的答案是正确的,您可以直接将编码的 svg 字符串附加到 css content 属性中。对于那些对 URL 有任何问题的人,可能是由于空格和字符无效,在这种情况下,将解码的 SVG 代码粘贴到: https: //mothereff.in/url

使用编码的 SVG URL,它应该可以正常工作。错误与正确示例:

#incorrect::before {
  content: url(
    data:image/svg + xml,
    <svgid="Layer_1"data-name="Layer 1"xmlns="http://www.w3.org/2000/svg"viewBox="0 0 15.37 188.41"><defs><style>.cls-1{fill:#aeadad;}</style></defs><circleclass="cls-1"cx="7.69"cy="7.69"r="7.69"/><rectclass="cls-1"x="6.69"y="27.72"width="2"height="160.69"/></svg>
  );
}
Run Code Online (Sandbox Code Playgroud)
#correct::before {
  content: url(data:image/svg+xml,%0A%3Csvg%20id%3D%22Layer%5f1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2015.37%20188.41%22%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill%3A%23aeadad%3B%7D%3C%2Fstyle%3E%3C%2Fdefs%3E%3Ccircle%20class%3D%22cls-1%22%20cx%3D%227.69%22%20cy%3D%227.69%22%20r%3D%227.69%22%2F%3E%3Crect%20class%3D%22cls-1%22%20x%3D%226.69%22%20y%3D%2227.72%22%20width%3D%222%22%20height%3D%22160.69%22%2F%3E%3C%2Fsvg%3E%0A);
}
Run Code Online (Sandbox Code Playgroud)