调整使用SVG圈子的圆环图,同时保持段的比例

时间:2017-07-13 11:43:57

标签: html svg

我是following a tutorial,详细介绍了如何使用SVG圈子和笔画创建圆环图。

然而,我正在努力弄清楚如何根据自己的喜好将最终对象调整为任何大小,例如,我希望圆环图能够完全缩放到svg元素设置的任何值(在本例中为500x500)。

我的目标是从500x500甜甜圈图表开始,稍后调整大小(基于css类的存在)到50x50

这是基本代码(但请参阅整个事情的jsfiddle)

<svg width="100%" height="100%" viewBox="0 0 42 42" class="donut">
  <circle class="donut-hole" cx="21" cy="21" r="15.91549430918954" fill="#fff"></circle>
  <circle class="donut-ring" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#d2d3d4" stroke-width="3"></circle>

  <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#ce4b99" stroke-width="3" stroke-dasharray="40 60" stroke-dashoffset="25"></circle>
  <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#b1c94e" stroke-width="3" stroke-dasharray="20 80" stroke-dashoffset="85"></circle>
  <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#377bbc" stroke-width="3" stroke-dasharray="30 70" stroke-dashoffset="65"></circle>
  <!-- unused 10% -->
  <g class="chart-text">
    <text x="50%" y="50%" class="chart-number">
      10
    </text>
    <text x="50%" y="50%" class="chart-label">
      Beers
    </text>
  </g>
</svg>

https://jsfiddle.net/BrightPixels/99symn4L/

1 个答案:

答案 0 :(得分:1)

很简单。只需在CSS类中为<div>定义不同的大小。

<div class="donut-chart">
</div>

<div class="donut-chart small">
</div>


.donut-chart {
  width: 500px;
}

.donut-chart.small {
  width: 100px;
}

演示:

.donut-chart {
  width: 500px;
}

.donut-chart.small {
  width: 100px;
}



    html {
      box-sizing: border-box;
    }

    *, *:before, *:after {
      box-sizing: inherit;
    }
    @import url(https://fonts.googleapis.com/css?family=Montserrat:400);

    .chart-text {
      font: 16px/1.4em "Montserrat", Arial, sans-serif;
      fill: #000;
      -moz-transform: translateY(0.25em);
      -ms-transform: translateY(0.25em);
      -webkit-transform: translateY(0.25em);
      transform: translateY(0.25em);
    }

    .chart-number {
      font-size: 0.6em;
      line-height: 1;
      text-anchor: middle;
      -moz-transform: translateY(-0.25em);
      -ms-transform: translateY(-0.25em);
      -webkit-transform: translateY(-0.25em);
      transform: translateY(-0.25em);
    }

    .chart-label {
      font-size: 0.2em;
      text-transform: uppercase;
      text-anchor: middle;
      -moz-transform: translateY(0.7em);
      -ms-transform: translateY(0.7em);
      -webkit-transform: translateY(0.7em);
      transform: translateY(0.7em);
    }
  <div class="donut-chart">

    <svg width="100%" height="100%" viewBox="0 0 42 42" class="donut">
      <circle class="donut-hole" cx="21" cy="21" r="15.91549430918954" fill="#fff"></circle>
      <circle class="donut-ring" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#d2d3d4" stroke-width="3"></circle>

      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#ce4b99" stroke-width="3" stroke-dasharray="40 60" stroke-dashoffset="25"></circle>
      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#b1c94e" stroke-width="3" stroke-dasharray="20 80" stroke-dashoffset="85"></circle>
      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#377bbc" stroke-width="3" stroke-dasharray="30 70" stroke-dashoffset="65"></circle>
      <!-- unused 10% -->
      <g class="chart-text">
        <text x="50%" y="50%" class="chart-number">
          10
        </text>
        <text x="50%" y="50%" class="chart-label">
          Beers
        </text>
      </g>
    </svg>
  </div>
  
  
  <div class="donut-chart small">

    <svg width="100%" height="100%" viewBox="0 0 42 42" class="donut">
      <circle class="donut-hole" cx="21" cy="21" r="15.91549430918954" fill="#fff"></circle>
      <circle class="donut-ring" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#d2d3d4" stroke-width="3"></circle>

      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#ce4b99" stroke-width="3" stroke-dasharray="40 60" stroke-dashoffset="25"></circle>
      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#b1c94e" stroke-width="3" stroke-dasharray="20 80" stroke-dashoffset="85"></circle>
      <circle class="donut-segment" cx="21" cy="21" r="15.91549430918954" fill="transparent" stroke="#377bbc" stroke-width="3" stroke-dasharray="30 70" stroke-dashoffset="65"></circle>
      <!-- unused 10% -->
      <g class="chart-text">
        <text x="50%" y="50%" class="chart-number">
          10
        </text>
        <text x="50%" y="50%" class="chart-label">
          Beers
        </text>
      </g>
    </svg>
  </div>