【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ

【CSS & JavaScript & SVG対応】円グラフ(扇形図)のアニメーション表現まとめ

はじめに

円グラフ(パイチャート)は、比率や構成比を視覚的に伝えるのに最適なUIコンポーネントです。最近、業務で使う機会があり、さまざまな方法でエフェクトをつけて表示する実装を試しました。

この記事では、以下の3パターンで実装する方法を紹介します:

  • CSSのみでのグラフ描画
  • JavaScriptによるアニメーション付き描画
  • SVGによる柔軟なビジュアル表現

さらに、ツールチップ表示などの補足機能も加えています。シンプルな表示から動きのある演出まで、ニーズに合わせて活用してください。

CSSアニメーションで扇形図を表示

<!-- HTML -->
<div class="pie-chart" style="--percentage: 65; --color: #4CAF50;"></div>
/* CSS */
<style>
.pie-chart {
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: conic-gradient(
    var(--color) 0%,
    var(--color) calc(var(--percentage) * 1%),
    #eee calc(var(--percentage) * 1%),
    #eee 100%
  );
  transition: all 0.5s ease-out;
}

/* ホバーエフェクト */
.pie-chart:hover {
  transform: scale(1.05);
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
</style>

JavaScriptでアニメーション

// 扇形図をアニメーションで描画
function animatePieChart(elementId, percentage, color) {
  const chart = document.getElementById(elementId);
  let current = 0;
  const interval = setInterval(() => {
    if (current >= percentage) {
      clearInterval(interval);
      return;
    }
    current++;
    chart.style.setProperty('--percentage', current);
    chart.style.setProperty('--color', color);
  }, 20);
}

// 使い方
animatePieChart('myPieChart', 75, '#FF6384');

SVGを使った扇形図

<svg width="200" height="200" viewBox="0 0 200 200">
  <circle cx="100" cy="100" r="90" fill="none" stroke="#eee" stroke-width="20"/>
  <circle cx="100" cy="100" r="90" fill="none" stroke="#4CAF50" stroke-width="20"
          stroke-dasharray="565.48" stroke-dashoffset="565.48"
          style="animation: pie-fill 2s ease-out forwards;"/>
  <text x="100" y="110" text-anchor="middle" font-size="24" fill="#333">65%</text>
</svg>

<style>
  @keyframes pie-fill {
    to { stroke-dashoffset: calc(565.48 - (565.48 * 0.65)); }
  }
</style>

ツールチップ表示

// 扇形図のセクションにマウスオーバーした時にツールチップを表示
document.querySelectorAll('.pie-section').forEach(section => {
  section.addEventListener('mouseover', function(e) {
    const tooltip = document.createElement('div');
    tooltip.className = 'pie-tooltip';
    tooltip.textContent = this.dataset.value + '%: ' + this.dataset.label;
    document.body.appendChild(tooltip);
    
    const rect = this.getBoundingClientRect();
    tooltip.style.left = rect.left + 'px';
    tooltip.style.top = (rect.top - 30) + 'px';
  });
  
  section.addEventListener('mouseout', function() {
    const tooltip = document.querySelector('.pie-tooltip');
    if (tooltip) tooltip.remove();
  });
});

これらのコードはプロジェクトに応じて調整して使ってください。特にアニメーションの速度や色はデザインに合わせて変更すると良いでしょう。

関連記事
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
ブラウザのキャッシュによる古いJavaScript、CSS、画像の表示を防ぐには、URLにバージョン番号や日時パラメータを付けてリソースを更新する方法が有効です。 毎回タイムスタンプを使うとキャッシュ効果がなくなるため、手動や適切なタイミングでバージョン番号を管理するのがおすすめです。
Details
Details
1ヶ月前
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
2025年6月最新版のTIOBEインデックスから、今人気のプログラミング言語を解説。Python、C、C++、Javaなどの注目度や、インデックスの活用方法も紹介します。
解構人
解構人
14日前
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
inputのプレースホルダー(placeholder)の色を変更する
プレースホルダーの色は::placeholder疑似要素で変更可能 IEやEdgeなどの古いブラウザ向けに:-ms-input-placeholder、::-ms-input-placeholderを併用 Firefoxでは透明度の調整のためopacity指定が推奨される
Details
Details
23日前
inputのプレースホルダー(placeholder)の色を変更する
CSSによる絶対中央寄せ
実用性が高い方法順で7種類の実装方法を紹介 最も推奨されるのは Flexbox と Grid transform を使う方法はどんな要素にも応用可能 line-height や table-cell は特定用途向け JavaScript による制御も紹介されている
Details
Details
23日前
CSSによる絶対中央寄せ
画像の遅延読み込みはこう変わる!2025年最新版・Lazy LoadとIntersectionObserverの最適解
2025年最新の画像遅延読み込み(Lazy Load)完全ガイド。ネイティブloading="lazy"とIntersectionObserverの使い分け・実装例・SEOやLCPへの最新対応ポイントまで徹底解説。パフォーマンスと検索順位アップのための必読ノウハウ!
aki0o0
aki0o0
1ヶ月前
画像の遅延読み込みはこう変わる!2025年最新版・Lazy LoadとIntersectionObserverの最適解
SCSSの @for ループ(ループ文)
SCSSの @for ループ
無敵の小さな蚊
無敵の小さな蚊
1ヶ月前
SCSSの @for ループ(ループ文)
JavaScript を使って通貨形式を数値に変換する
JavaScriptの正規表現を利用し、通貨表記に含まれる無効な記号を取り除くことで、簡単に通貨文字列を数値に変換できます。これにより、数値計算や金額比較などが容易になります。
Details
Details
1ヶ月前
JavaScript を使って通貨形式を数値に変換する
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
モバイル端末でのクリックイベントとの競合を避けるため、タップ操作には click より touchstart を使うことを推奨。 jQuery UI のバージョンによっては、内部構造が異なる場合があるため、導入時はテストを行うこと。
Details
Details
1ヶ月前
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
JSでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
autoCopyright(startYear, elementId) 関数は、指定した開始年から現在年までの著作権表記(例: "2020 - 2025")を自動生成し、指定されたHTML要素に表示します。
Details
Details
1ヶ月前
JSでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
第1回:ウェブにおける色の基礎(2025年最新版)
ウェブデザインの基礎「色」について、2025年最新トレンドやアクセシビリティ・ダークモード対応まで、実務ですぐ使えるCSS色指定方法を分かりやすく解説。初心者から現場のデザイナーまで必見のカラーマネジメント入門ガイド。
aki0o0
aki0o0
1ヶ月前
SafariでGoogleフォントが正しく表示されない原因と対策【font-weight・font-style完全ガイド】
SafariやiOSでGoogleフォントが正しく表示されない主な原因と対策を徹底解説。font-weight・font-styleの指定ミスによるWebフォント崩れを解決するCSSサンプル付きガイド。
aki0o0
aki0o0
29日前
SafariでGoogleフォントが正しく表示されない原因と対策【font-weight・font-style完全ガイド】
フッターのJavaScriptは画像読み込みに影響する?ブラウザの読み込み順と最適化の基本
はじめに Webサイトの表示速度や操作感は、単にコンテンツの量や見た目だけでなく、ブラウザがリソースをどのように読み込むかによっても大きく左右されます。特にJavaScriptや画像の読み込み順序、そしてそれらがどのように相互作用しているか […]
解構人
解構人
9日前
フッターのJavaScriptは画像読み込みに影響する?ブラウザの読み込み順と最適化の基本
CSSで等間隔配置を実現:1行に複数または複数行に配置
CSSでは、特にレスポンシブデザインにおいて、複数の要素を等間隔に配置する必要があります。列数や間隔を動的に制御することで、柔軟なレイアウトが実現可能です。この記事では、FlexboxとGridの2つの方法を使って、1行に複数のアイテムを等間隔に配置する方法を紹介します。コード内の変数(列数や間隔)を調整することで、1行に表示するアイテム数やその間隔を簡単に管理でき、レイアウト調整が容易になり、開発効率が大幅に向上します。
無敵の小さな蚊
無敵の小さな蚊
6日前
CSSで等間隔配置を実現:1行に複数または複数行に配置
JavaScriptでURL(パス)からファイル名を取得する
window.location.pathname でURLのパス部分を取得。 lastIndexOf('/') で最後のスラッシュ位置を検出。 substring でスラッシュの次から最後までを切り出し、ファイル名を抽出。
Details
Details
1ヶ月前
JavaScriptでURL(パス)からファイル名を取得する
日本語用WebサイトのCSSフォント設定(日本語フォント/游ゴシック/游明朝)
日本語フォントはOSにより異なるため、複数のフォントを優先順に指定する。 "Yu Gothic"や"Yu Mincho"はモダンな日本語フォントでWindows 8.1以降に搭載。 "ヒラギノ角ゴ"や"ヒラギノ明朝"はmacOS向けで、高品質。 "メイリオ"や"MS 明朝"などは古いWindows環境にも対応。 ゴシック体はカジュアル・読みやすさ重視、明朝体はフォーマル・高級感重視に適している。
Details
Details
22日前
日本語用WebサイトのCSSフォント設定(日本語フォント/游ゴシック/游明朝)