是否可以根据百分比从底部到顶部制作SVG圆形填充颜色?

时间:2015-09-18 06:15:57

标签: svg geometry svg-filters svg-animate

<svg viewbox="-20 -20 100 100">

  <circle r="15.29563" cx="0" stroke="#7dc4c2" fill="#5ea4a2">

</svg>

如何根据百分比填充下面的圆圈!!

http://i.stack.imgur.com/gVAN5.png

提前致谢。

2 个答案:

答案 0 :(得分:21)

您可以使用具有停止不透明度的渐变来执行此操作。 你会添加两个“中间”停靠点,分别为0和1,并将两者的偏移量设置为你需要的百分比。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="200" height="200">
  <linearGradient id="lg" x1="0.5" y1="1" x2="0.5" y2="0">
      <stop offset="0%" stop-opacity="1" stop-color="royalblue"/>
      <stop offset="40%" stop-opacity="1" stop-color="royalblue"/>
      <stop offset="40%" stop-opacity="0" stop-color="royalblue"/>
      <stop offset="100%" stop-opacity="0" stop-color="royalblue"/>
  </linearGradient>
  <circle cx="50" cy="50" r="45" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
</svg>

你甚至可以为它制作动画

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="200" height="200">
      <linearGradient id="lg" x1="0.5" y1="1" x2="0.5" y2="0">
          <stop offset="0%" stop-opacity="1" stop-color="royalblue"/>
          <stop offset="40%" stop-opacity="1" stop-color="royalblue">
            <animate attributeName="offset" values="0;1;0" repeatCount="indefinite" dur="10s" begin="0s"/>
          </stop>
          <stop offset="40%" stop-opacity="0" stop-color="royalblue">
            <animate attributeName="offset" values="0;1;0" repeatCount="indefinite" dur="10s"  begin="0s"/>
          </stop>
          <stop offset="100%" stop-opacity="0" stop-color="royalblue"/>
      </linearGradient>
      <circle cx="50" cy="50" r="45" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
</svg>

优点是,它适用于任何形状和大小而不改变渐变

   <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 300" width="400" height="200">
      <linearGradient id="lg" x1="0.5" y1="1" x2="0.5" y2="0">
          <stop offset="0%" stop-opacity="1" stop-color="royalblue"/>
          <stop offset="40%" stop-opacity="1" stop-color="royalblue"/>
          <stop offset="40%" stop-opacity="0" stop-color="royalblue"/>
          <stop offset="100%" stop-opacity="0" stop-color="royalblue"/>
      </linearGradient>
      <circle cx="50" cy="50" r="45" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
     <circle cx="250" cy="150" r="145" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
     <rect x="400" y="20" width="100" height="100" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
     <path d="M50 150L95 290 h-90z" fill="url(#lg)" stroke="crimson" stroke-width="5"/>

     <path d="M450 205 A45 45 0 0 1 450 295A100 100 0 0 0 450 205z" fill="url(#lg)" stroke="crimson" stroke-width="5"/>
   </svg>

答案 1 :(得分:2)

最简单的方法是创建一个带圆孔的蒙版,然后为其后面的矩形设置动画。例如:

<path fill="#fff" fill-rule="evenodd"
        d="M0 0 200 0 200 200 0 200ZM20 100 A80 80 0 0 0 180 100 80 80 0 0 0 20 100Z"/>

此处的路径数据以200个单位宽(M0 0 200 0 200 200 0 200Z)的方框开头,然后使用两个弧在其中绘制一个直径为80个单位的圆(A80 80 0 0 0 180 100 80 80 0 0 0 20 100Z)。 evenodd填充规则可确保从正方形中删除圆圈。

如果您希望圆圈从下到上填充,那么您必须使用rotate转换:

<rect transform="rotate(180 100 100)" x="20" y="20" width="160" height="0" fill="#47f" id="fillup"/>

这会使坐标系围绕SVG图像的中间旋转,以便在增加高度时矩形向上增长。在这里,当你将鼠标悬停在它上面时,我正在使用CSS过渡来改变矩形的高度。但是你可以使用Javascript或JQuery将高度更改为你想要的任何高度。

这是一个有效的例子:

svg #fillup { height:0px; transition:height 0.5s; }
svg:hover #fillup { height:160px; }
<svg width="200" height="200" viewBox="0 0 200 200">
  <rect x="10" y="10" width="180" height="180" fill="#eee"/>
  <rect transform="rotate(180 100 100)" x="20" y="20"
        width="160" height="0" fill="#47f" id="fillup"/>
  <path fill="#fff" fill-rule="evenodd"
        d="M0 0 200 0 200 200 0 200ZM20 100 A80 80 0 0 0
           180 100 80 80 0 0 0 20 100Z"/>
  <circle cx="100" cy="100" r="90" fill="none" stroke="#888"
          stroke-width="20"/>
  <circle cx="100" cy="100" r="99" fill="none" stroke="#333"
          stroke-width="1"/>
  <circle cx="100" cy="100" r="80" fill="none" stroke="#333"
          stroke-width="1"/>
</svg>