web関連

【javascript,css】svgで複数の円グラフアニメーション

2020/03/24

2020/03/26

/

カスタムデータ属性に入れた数値をもとにアニメーションする円グラフを作成したときのメモ

円グラフのソースコード

とりあえず円グラフ2個用意した

<style>
.pie_chart{
  transform:rotate(-90deg);/*頂点から始まるように調整*/
}
circle{
  fill:transparent;/*塗り*/
  stroke-width:100;/*線の幅*/
}
</style>

<svg class="pie_chart" width="400" height="400" data-num="20">
  <circle style="animation:circle1 1s forwards;" cx="200" cy="200" r="100" />
</svg>
<svg class="pie_chart" width="400" height="400" data-num="60">
  <circle style="animation:circle2 1s forwards;" cx="200" cy="200" r="100" />
</svg>

<script>
 function circle() {
    var css, rules, value;

    // styleタグを作成
    css = document.createElement('style');
    css.media = 'screen';
    css.type = 'text/css';

    var i = 1;
    const list = document.querySelectorAll('svg');
    var arrayList = [].slice.call(list);

    arrayList.forEach(function (val, index, array) {
      // パーセントの計算
      var num = val.dataset.num * 12.56;

      value = '@keyframes circle' + i + '{' + [
        '0%{stroke-dasharray:0 1256;stroke: black}',
        '100%{stroke-dasharray:' + num + ' 1256;stroke: black}'
      ].join(' ') + '}';

      // ルールをstyleタグに追加
      rules = document.createTextNode([value].join('\n'));
      css.appendChild(rules);
      i++;
    });

    // head内に作成
    document.getElementsByTagName('head')[0].appendChild(css);
  }
  circle();
</script>

data-num…○○%
cx="200" cy="200"…配置場所(真ん中寄席)
r="100"…半円の長さ
1256…円周の長さ
12.56…1%の数値

塗りで表示じゃなくて線で表示してるからstroke-width:100;を操作すれば太さは調整できる

円周長の計算は「半径×2×3.14」で出してる
久々に使ったわ

cssアニメーションを作成する@keyframesにカスタムデータ属性の数値を突っ込んでjavascriptのほうで作成して追加してる

レスポンシブ対応はしてない
svgだからかちゃんと数値入力しないと崩れる

参考

JavaScriptでCSSアニメーションの@keyframesを使う

cssとsvgで、円グラフをモーショングラフィックス風に見せる方法

【修正】↓↓↓↓↓レスポンシブに書き直してみた↓↓↓↓↓
【javascript,css】svgで複数の円グラフアニメーション2
前回、svgで複数の円グラフアニメーション作ったけどその続きでレスポンシブに対応させたアニメーション付き円グラフ 前回の続き ...
 

レスポンシブ対応させようするとコード長くなる
別の方法探すかな…