【问题标题】:Inline SVG doesn't scale内联 SVG 无法缩放
【发布时间】:2015-03-13 04:26:46
【问题描述】:

我正在尝试为一些矢量图形制作动画。因此,我需要使用 svg inline 或使用 https://github.com/jonathantneal/svg4everybody 之类的东西在 IE 中进行外部嵌入。所以我的 HTML 目前看起来像这样:

<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
  <symbol id="chart" viewBox="0 0 1042 1024"><!-- SVG CODE --></symbol>
</svg>

<svg role="img" class="icon" width="200" height="200">
  <use xlink:href="#chart"></use>
</svg>

http://codepen.io/anon/pen/LEWjvX

但是您可能会看到 SVG 非常小,尽管我在 HTML 和 CSS 中都使用了width(不确定我是否需要两者?)。它只是无法扩展。根据我读到的有关此问题的许多文章(例如http://css-tricks.com/svg-symbol-good-choice-icons/http://css-tricks.com/scale-svg/),它应该以这种方式工作。我做错了什么?

仅供参考:我使用 icomoon 创建 SVG 精灵,使用 Illustrator 创建 SVG。为了使 SVG 动画化,我为大多数路径指定了一个类名,如果这有什么不同的话。

【问题讨论】:

    标签: html css svg


    【解决方案1】:

    我不确定我是否清楚地了解您寻求帮助的问题是什么,因此我将尝试回答我在您的 sn-p 中看到的最大值。

    • 如果您看不到chart,我认为更多是因为默认fill 颜色为黑色,而不是因为尺寸。如果将fill: #FFF 添加到#wrapper 的css 或适当的svg{} 语句中,您会清楚地看到它。

    • 如果你的指南针这么小,我想这是因为你绘制的路径在 1024x1024 文档中只有 50px 大。 (您将 viewBox="0 0 1024 1024" 设置为 &lt;symbol&gt; 元素,但将其设置为 0 0 50 50 之类的内容会有所帮助,如果您想稍后使用转换,或者更好的是,在合适的文档中重新绘制它)。

    • 您说要为这些图形设置动画。实际上有很多方法可以做到这一点。您可以查看CSS 动画(通过样式表)或SMIL(直接在内联svg 中)或通过javascript(通过直接修改attributes,如Nicholas Kyriakides 答案中所述)。看看下面sn-p中的例子。

    var scale = 1;
    window.onload = function(){
    document.getElementById('p').addEventListener('click', function(){document.getElementById('linked').setAttribute('transform', 'scale('+(scale+=.1)+')');}, false);
    document.getElementById('m').addEventListener('click', function(){document.getElementById('linked').setAttribute('transform', 'scale('+(scale-=.1)+')');}, false);
    };
    .icon {
    	width: 400px;
    	height: 200px;
    	}
    .wrapper {
    	background: black;
    	width: 80%;
    	max-width: 400px;
    	margin: 0 auto;
    	color:#fff;
    	fill: #fff;
    	}
    text {
    	cursor: pointer;
    	}
    .icon:hover{
    	cursor: pointer;
    	}
    .icon:hover .chart{
    	fill: #FAF;
    	-webkit-animation: color 5s;
    	animation: color 5s forwards alternate;
    	}
    @-webkit-keyframes color{ 
      0%{ fill : #FFF;}
      10%{ fill : #508694;}
      50%{fill: #FBB03B;}
      90%{ fill : #D19B6F;}
      100%{ fill : #FFF;}
      }
    @keyframes color{ 
      0%{ fill : #FFF;}
      10%{ fill : #508694;}
      50%{fill: #FBB03B;}
      90%{ fill : #D19B6F;}
      100%{ fill : #FFF;}
      }
    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
    	<symbol id="chart" viewBox="0 0 1042 1024">
    		<path class="chart" d="M893.78 455.769h145.017v568.231h-145.017v-568.231z"  />
    		<path class="chart" d="M671.815 0h145.017v1024h-145.017v-1024z"  />
    		<path class="chart bar3" d="M446.89 624.462h145.017v396.578h-145.017v-396.578z"  />
    		<path class="chart" d="M224.925 227.884h145.017v796.116h-145.017v-796.116z"  />
    		<path class="chart" d="M0 71.029h145.017v952.971h-145.017v-952.971z"  />
    	</symbol>
    	<symbol id="compass" viewBox="0 0 46.6 46.6">
    		<path class="compas__outer" fill="#FFFFFF" d="M22.7,0C10.2,0,0,10.2,0,22.7c0,12.5,10.2,22.7,22.7,22.7   c12.5,0,22.7-10.2,22.7-22.7C45.4,10.2,35.3,0,22.7,0L22.7,0z M22.7,42.9c-11.1,0-20.1-9-20.1-20.1c0-11.1,9-20.1,20.1-20.1   c11.1,0,20.1,9,20.1,20.1C42.9,33.8,33.8,42.9,22.7,42.9L22.7,42.9z M22.7,42.9"/>
    		<path class="compass__needle" fill="#FFFFFF" d="M24.7,20.7C24,20,23,19.7,22,19.9l1.5-1.5l-12-6.9l6.9,12l1.5-1.5   c-0.2,0.9,0,2,0.8,2.7c0.7,0.7,1.8,1,2.7,0.8L21.9,27l12,6.9l-6.9-12l-1.5,1.5C25.7,22.5,25.5,21.4,24.7,20.7L24.7,20.7z    M21.8,23.6c-0.5-0.5-0.5-1.3,0-1.8c0.5-0.5,1.3-0.5,1.8,0c0.5,0.5,0.5,1.3,0,1.8C23.1,24.1,22.3,24.1,21.8,23.6L21.8,23.6z    M31.9,31.9l-8.7-5.1l3.7-3.7L31.9,31.9z M31.9,31.9">
    			<animateTransform attributeName="transform" begin="0s" dur="2s" type="rotate" from="0 22.7 22.7" to="360 22.7 22.7" repeatCount="indefinite" />
    		</path>
    	</symbol>
    	<symbol id="linked-in" viewBox="0 0 1070 1024">
    		<path d="M241.778 1024v-689.778h-227.556v689.778h227.556zM128 238.222c78.222 0 128-53.333 128-120.889s-46.222-117.333-128-117.333c-78.222 0-128 49.778-128 120.889 0 64 49.778 117.333 128 117.333v0 0zM369.778 1024c0 0 3.556-625.778 0-689.778h227.556v99.556c28.444-46.222 85.333-117.333 209.778-117.333 149.333 0 263.111 99.556 263.111 309.333v394.667h-227.556v-366.222c0-92.444-32-156.444-117.333-156.444-64 0-99.556 42.667-117.333 85.333-7.111 14.222-7.111 35.556-7.111 56.889v384h-231.111z" fill="#FFF"/>
    	</symbol>
    </svg>
    
    <div class="wrapper">
    	<h1>CSS @keyframe</h1>
    	<svg role="img" class="icon" width="400" height="200">
    	<!-- I had to get it out of the <use> because webkit browsers #@ø‡~! http://codepen.io/AmeliaBR/pen/lshrp-->
    		<g id="chart">
    			<path class="chart" d="M172.1,90.6H200V200h-27.9V90.6L172.1,90.6z"/>
    			<path class="chart" d="M129.3,2.8h27.9V200h-27.9L129.3,2.8L129.3,2.8z"/>
    			<path class="chart" d="M86,123.1H114v76.4H86V123.1L86,123.1z"/>
    			<path class="chart" d="M43.3,46.7h27.9V200H43.3L43.3,46.7L43.3,46.7z"/>
    			<path class="chart" d="M0,16.5h27.9V200H0C0,200,0,16.5,0,16.5z"/>
    		</g>
    		<use xlink:href="#chart" id="charts" x="100"></use>
    	</svg>
    	<h1>SMIL animateTransfrom</h1>
    	<svg viewBox="0 0 1024 1024" preserveAspectRatio="xMidYMin slice" style="width: 100%; padding-bottom: 80%; height: 70px; overflow: visible">
    		<use xlink:href="#compass"></use>
    	</svg>
    	<h1>Javascript</h1>
    	<svg viewBox="0 0 1024 1024">
    		<use xlink:href="#linked-in" id="linked"></use>
    		<text id="p" font-size="200" y="140" x="650">+</text>
    		<text id="m" font-size="200" y="140" fill="" x="800">-</text>
    	</svg>
    </div>

    【讨论】:

    • 非常感谢。我认为我的主要问题是 SVG 图标的奇怪缩放。但是正如您所指出的,视口大小有点混乱。这可能就是为什么......我需要修复这些,看看它是否有效。不过我有一个问题:我不需要为这个项目在悬停时为 svg 设置动画,而是在父元素的类更改上(例如单击或滚动到某个点)。在这种情况下,对于 Webkit 浏览器,我是否也必须使用 而不是 ?或者如果我想在悬停时设置动画,我是否只需要使用
    • @demrks 好吧,这实际上取决于您要制作什么动画以及如何制作动画。 combine javascript and SMIL 很容易。但是,是的,如果您决定使用 CSS(我应该承认这不是我最喜欢的),您可能应该重新格式化您的文档以避免 &lt;use&gt; 元素。即使用 chrome 浏览器检查 this fiddle
    【解决方案2】:

    试试这个;将符号的 viewBox 更改为更接近其设计尺寸。我快速查看了路径的外部尺寸,然后假设为 100x100。

    <symbol id="compass" viewBox="0 0 100 100">
    

    代码笔:http://codepen.io/rfornal-ssi/pen/GgWMvZ

    我只调整了一个部分,假设您可以从这一点上继续使用其余代码。

    更新: 根据 OP 的测试,我们了解到将 viewBox 添加到 &lt;svg&gt; 标签本身不需要,因为使用了 &lt;symbol&gt; 标签。

    【讨论】:

    • 谢谢,我认为 icomoon 弄乱了视口大小,我会手动尝试。我不确定 上的 viewBox。根据这篇文章(css-tricks.com/svg-symbol-good-choice-icons),如果你使用 ,你就不需要那个?
    • 可能是你不需要它......我在测试符号之前确实设置了SVG viewBox。根据适合您的方式在此处发表评论,我会调整答案。
    • 我刚刚测试过了。如果您使用 ,则似乎可以在 元素上没有 viewBox 的情况下工作。我只需要修复 上的 viewBox。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多