【问题标题】:What is the correct way of <use>ing an svg?<use> svg 的正确方法是什么?
【发布时间】:2017-12-07 21:18:23
【问题描述】:

我对@9​​87654328@ 规范与&lt;use&gt; 标签相关感到非常困惑,因为我在网上阅读的所有内容似乎都实现了带有细微差别的标签。

css-tricks 上,&lt;svg&gt;&lt;symbol&gt; 中添加了viewBox

<svg style="display: none;">
  <defs>
    <symbol id="basketball" viewBox="0 0 100 100">
      <title>Basketball</title>
      <path d="M28.1,3 ... "/>
    </symbol>
  </defs>
</svg> 

然后&lt;symbol&gt;id 明确引用:

<svg class="icon-basketball">
  <use xlink:href="#basketball"></use>
</svg>

this article 也是如此,Chris Coyier 在this article 中更是如此,他明确指出&lt;symbol&gt; 是一个更好的标签,因为在引用它时不需要viewBox

但是,用viewBox 引用符号对我不起作用,我最终会遇到与this SO question 相同的错误,这得出结论,事实上,在引用a 时需要viewBox &lt;symbol&gt;This article 甚至提出了一种处理“内在 svg 大小”的技巧。

确实,在这个简短的jsfiddle/sn-p 中,您可以看到,如果我将视图框添加到&lt;svg&gt; 引用中,则使用单个&lt;symbol&gt;,它的大小是正确的,没有任何空格。然而,移除视图框后,顶部和底部都有很大的“边距”。

<link href="https://unpkg.com/tachyons@4.9.0/css/tachyons.min.css" rel="stylesheet"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-zap" id="zap"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" /></symbol></defs></svg>

<div class="tc">


	<!-- svg is always oversized -->
	<svg class="outline w3 bg-red">
		<use xlink:href="#zap"></use>
	</svg>
	
	<!-- svg is the correct size -->
	<svg class="outline w3 bg-green"  viewBox="0 0 24 24">
		<use class="black" xlink:href="#zap"></use>
	</svg>
	

		
</div>

那么我对&lt;use&gt; 的误解是我定义&lt;symbol&gt; 的方式,它目前是通过webpack 上的svg-sprite 生成的。或者最近在外部引用 &lt;svg&gt;s 的方式发生了变化?

谢谢!

【问题讨论】:

  • 你想用js来操作你的svg吗?或者你可以在 img 标签中加载它并使用 css 设置尺寸。
  • 两种情况下的用法是相同的,包含 元素是不一样的,但是,在一种情况下它具有大小信息,在另一种情况下则没有。

标签: html css svg


【解决方案1】:

在您所指的article 中,Chris Coyier 使用symbol 将图标存储在精灵中。

sprite 中的每个symbol 都可以有自己的viewBox,带有单独的参数值,这允许您单独缩放和定位每个图标。

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">

  <symbol id="beaker" viewBox="214.7 0 182.6 792">
    <!-- <path>s and whatever other shapes in here -->  
  </symbol>

  <symbol id="shape-icon-2" viewBox="0 26 100 48">
    <!-- <path>s and whatever other shapes in here -->  
  </symbol>

</svg>          

就你而言,当使用 &lt;use&gt; 时,正如 Robert Longson 所写:

在一种情况下它有尺寸信息,在另一种情况下没有。

在嵌套的 svg 中,还有一个额外的缩放。
因此,如果您希望两个克隆的大小相同,请将 svg viewBox 添加到具有相同参数的第二个实例 viewBox =" 0 0 24 24 "

<link href="https://unpkg.com/tachyons@4.9.0/css/tachyons.min.css" rel="stylesheet"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-zap" id="zap"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z" /></symbol></defs></svg>

<div class="tc">


	<!-- svg is the correct size -->
	<svg class="outline w3 bg-red" viewBox="0 0 24 24">
		<use xlink:href="#zap"></use>
	</svg>
	
	<!-- svg is the correct size -->
	<svg class="outline w3 bg-green"  viewBox="0 0 24 24">
		<use class="black" xlink:href="#zap"></use>
	</svg>
	

		
</div>

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 2019-07-28
    • 2011-12-11
    • 1970-01-01
    • 2013-10-04
    • 2014-11-07
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多