【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();
  });
});

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

関連記事
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
モバイル端末でのクリックイベントとの競合を避けるため、タップ操作には click より touchstart を使うことを推奨。 jQuery UI のバージョンによっては、内部構造が異なる場合があるため、導入時はテストを行うこと。
Details
Details
6ヶ月前
jQuery Sortableがスマホなどのタッチスクリーンで使えない場合の対処法
相対パスと絶対パスの使い方
相対パスは、モジュールやディレクトリ内のローカルな参照に適しており、柔軟性があります。一方、絶対パスはウェブサイト全体で共通のリソース(CSS、画像、CDNなど)を参照する際に便利です。両者を理解して使い分けることで、パスのエラーや読み込み不具合を防げます。
Details
Details
6ヶ月前
相対パスと絶対パスの使い方
!important なしでも大丈夫!CSS @layer でスタイル管理をもっと簡単に
CSS の !important は便利ですが、乱用すると保守が難しくなります。そこで注目されているのが新機能 @layer。この記事では、@layer を使って優先度を整理する方法を実装例とともに紹介します。
Details
Details
4ヶ月前
!important なしでも大丈夫!CSS @layer でスタイル管理をもっと簡単に
【CSSテクニック】:not()セレクタで階層を跨いだ除外を実現
:not()疑似クラスはCSSでの除外指定に便利ですが、親要素や階層関係に対しては思わぬ制約があります。本記事では、WordPressの投稿構造を例に、インラインコードとコードブロックを正確に区別するためのセレクタ設計を解説します。
無敵の小さな蚊
無敵の小さな蚊
5ヶ月前
【CSSテクニック】:not()セレクタで階層を跨いだ除外を実現
CSSで等間隔配置を実現:1行に複数または複数行に配置
CSSでは、特にレスポンシブデザインにおいて、複数の要素を等間隔に配置する必要があります。列数や間隔を動的に制御することで、柔軟なレイアウトが実現可能です。この記事では、FlexboxとGridの2つの方法を使って、1行に複数のアイテムを等間隔に配置する方法を紹介します。コード内の変数(列数や間隔)を調整することで、1行に表示するアイテム数やその間隔を簡単に管理でき、レイアウト調整が容易になり、開発効率が大幅に向上します。
無敵の小さな蚊
無敵の小さな蚊
5ヶ月前
CSSで等間隔配置を実現:1行に複数または複数行に配置
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
ブラウザのキャッシュによる古いJavaScript、CSS、画像の表示を防ぐには、URLにバージョン番号や日時パラメータを付けてリソースを更新する方法が有効です。 毎回タイムスタンプを使うとキャッシュ効果がなくなるため、手動や適切なタイミングでバージョン番号を管理するのがおすすめです。
Details
Details
6ヶ月前
ユーザーのブラウザに保存されているJavaScript、CSS、画像のキャッシュを削除するにはどうすればいいですか?
IT業界の初心者が知っておくべきの用語(2025版)
新しいテクノロジーについて話すとき、時々自分がみんなのペースについていけないと感じることはありませんか?あるいは、その業界にいるのに、自分はまだ十分ではないと感じ、多くの専門用語を理解しなければならないこともあるでしょう。
Details
Details
5ヶ月前
IT業界の初心者が知っておくべきの用語(2025版)
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
2025年6月最新版のTIOBEインデックスから、今人気のプログラミング言語を解説。Python、C、C++、Javaなどの注目度や、インデックスの活用方法も紹介します。
解構人
解構人
5ヶ月前
【2025年6月最新版】TIOBEインデックスで見る人気プログラミング言語ランキングとは?
JavaScriptでナビゲーション以外の場所をクリックしたらナビゲーションを閉じる
本コードは典型的なモバイル用サイドナビゲーションの実装例です。ボタンによる表示切替と、メニュー外クリック検知を組み合わせることで、ユーザー体験を向上させています。さらにESCキーでのメニュー閉鎖も可能にし、アクセシビリティも配慮しています。
Details
Details
5ヶ月前
JavaScriptでナビゲーション以外の場所をクリックしたらナビゲーションを閉じる
scroll-behaviorで平滑スクロール、一行でいけるんだ
一般的に、アンカーリンクをスムーズにスクロールさせる時、JavaScriptやjQueryで実装することが多いです。例えば、 でも実は、CSSだけでもできるんです。そのためのプロパティがこちら: これを書くだけで、リンクをクリックした時にス […]
メモ・ノートスケ
メモ・ノートスケ
6ヶ月前
scroll-behaviorで平滑スクロール、一行でいけるんだ
JSでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
autoCopyright(startYear, elementId) 関数は、指定した開始年から現在年までの著作権表記(例: "2020 - 2025")を自動生成し、指定されたHTML要素に表示します。
Details
Details
6ヶ月前
JSでウェブサイトのフッターにあるCopyrightの年数範囲を自動更新する
JavaScriptでURL(パス)からファイル名を取得する
window.location.pathname でURLのパス部分を取得。 lastIndexOf('/') で最後のスラッシュ位置を検出。 substring でスラッシュの次から最後までを切り出し、ファイル名を抽出。
Details
Details
6ヶ月前
JavaScriptでURL(パス)からファイル名を取得する
日本語用WebサイトのCSSフォント設定(日本語フォント/游ゴシック/游明朝)
日本語フォントはOSにより異なるため、複数のフォントを優先順に指定する。 "Yu Gothic"や"Yu Mincho"はモダンな日本語フォントでWindows 8.1以降に搭載。 "ヒラギノ角ゴ"や"ヒラギノ明朝"はmacOS向けで、高品質。 "メイリオ"や"MS 明朝"などは古いWindows環境にも対応。 ゴシック体はカジュアル・読みやすさ重視、明朝体はフォーマル・高級感重視に適している。
Details
Details
6ヶ月前
日本語用WebサイトのCSSフォント設定(日本語フォント/游ゴシック/游明朝)
SCSSの @for ループ(ループ文)
SCSSの @for ループ
無敵の小さな蚊
無敵の小さな蚊
6ヶ月前
SCSSの @for ループ(ループ文)
ページ遷移の一般的な方法
本記事では、Webページにおけるページ遷移(リダイレクト)の一般的な実装方法について紹介しています。JavaScript、HTMLのメタタグ、PHP、ASPを用いたリダイレクト方法をそれぞれ具体的なコード例と共に解説しています。
Details
Details
6ヶ月前
ページ遷移の一般的な方法