Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Untitled

2025年09月18日に「Dev.to」が公開したITニュース「Untitled」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

開発者がWeb上で動作するプログラムを作成し、その成果物を公開した。これは「Pen」として共有されており、詳細は提供されたURLから確認できる。

出典: Untitled | Dev.to公開日:

ITニュース解説

この記事で紹介されているCodePenは、マウスの動きに反応して画面上に色とりどりの円が生成され、それがマウスカーソルを追いかけるように滑らかに動き、徐々に消えていくインタラクティブなアニメーションを実現している。このような動的なウェブコンテンツは、HTML、CSS、JavaScriptというウェブ開発の三つの基本的な技術が連携して作られている。

まず、ウェブページの骨格を作るのがHTMLだ。このCodePenでは、<canvas>という特別な要素がHTMLファイル内に一つだけ配置されている。このcanvas要素は、ウェブページ上にプログラムを使ってグラフィックを描画するための「描画領域」を提供する。ちょうど画用紙のようなもので、HTMLはただその画用紙をページに置くだけで、具体的な絵を描くのは後述のJavaScriptの役割となる。

次に、ウェブページの見た目を整えるのがCSSだ。このCodePenのCSSは非常にシンプルだが、重要な役割を果たしている。body要素にmargin: 0;overflow: hidden;を設定することで、ページの余白をなくし、スクロールバーが表示されないようにしている。また、背景色を濃いグレー(background: #222;)に設定し、アニメーションが映えるようにしている。canvas要素にはdisplay: block;を指定することで、ブロック要素として適切に表示されるようにしている。CSSは、ウェブページの全体のデザインや個々の要素の配置、色、大きさなどを指定し、ユーザーインターフェースの見た目を決定する。

そして、ウェブページに動きやインタラクションを与えるのがJavaScriptだ。このCodePenのJavaScriptコードは、アニメーションのほとんどのロジックを担っている。

JavaScriptはまず、HTMLで配置されたcanvas要素を取得し、そのcanvasに絵を描くための「2D描画コンテキスト」というものを準備する。これは、画用紙に対して絵筆や絵の具、描画ツールを用意するようなものだ。

次に、このアニメーションの核となる「円」の振る舞いを定義するために、Circleという名前のクラスが使われている。クラスは、似たような性質を持つ複数の「モノ」を作るための設計図のようなものだ。このCircleクラスは、それぞれの円が持つべき情報、例えばx座標、y座標、半径r、色color、透明度alphaといった「状態」を定義している。さらに、それぞれの円が「どう動くか」や「どう描画されるか」という「振る舞い」もupdate()draw()といったメソッドとして定義されている。

マウスの動きを捉えるために、JavaScriptはwindow(ブラウザのウィンドウ全体)に対してmousemoveというイベントを監視する。マウスが動くと、このイベントが発火し、そのたびにマウスの現在のx座標とy座標が取得され、mouseという変数に保存される。

複数の円を同時に動かすために、circlesという配列(リストのようなもの)が使われている。新しい円が生成されると、その円のインスタンス(Circleクラスの設計図に基づいて作られた具体的な円の「モノ」)がこのcircles配列に追加される。

アニメーションの滑らかな動きを実現するために、線形補間(lerp関数)という技術が活用されている。lerp関数は、ある値から別の値へ、指定した割合で徐々に変化させる計算を行う。このCodePenでは、円のx座標とy座標をマウスの座標へ、また円の半径をターゲットの半径へ、透明度をゼロへと、このlerp関数を使って少しずつ変化させている。これにより、円がマウスに吸い付くように追いかけたり、サイズが変化したり、フェードアウトしたりする、非常に自然で滑らかな動きが生まれる。

アニメーション全体を繰り返す心臓部がanimate関数だ。この関数は、requestAnimationFrameという特別な方法で自身を繰り返し呼び出す。requestAnimationFrameは、ブラウザが画面を描画するタイミングに合わせてアニメーションを最適に実行するための仕組みで、通常のタイマーよりも滑らかで電力効率の良いアニメーションを可能にする。animate関数が呼び出されるたびに、まずctx.clearRect()でキャンバス全体を一度クリアする。これは、前のフレームで描画された絵を消し、新しいフレームで現在の状態の絵を上書き描画するための準備だ。

その後、circles配列内のすべての円について、update()メソッドを呼び出して状態(位置、半径、透明度など)を更新し、draw()メソッドを呼び出してキャンバス上にそれぞれの円を描画する。円のdraw()メソッドでは、beginPath()で新しい描画パスを開始し、arc()で円の形状を定義し、fillStyleで色と透明度を設定してからfill()で塗りつぶすという手順を踏む。色の情報はrgba形式で指定されており、alpha値(透明度)が0に近づくほど円は透明になる。

新しい円は、setIntervalという別のタイマー機能を使って定期的に生成される。マウスの現在の位置に、ランダムな色とサイズの新しい円が一定間隔でcreateCircle関数によって作られ、circles配列に追加される。そして、アニメーションループの中で、それぞれの円の透明度が非常に低くなったり、半径が極端に小さくなったりすると、その円はcircles配列から削除される。これにより、画面上の円の数が適切に管理され、常に新しい円が生まれ、古い円が消えていくという流動的なアニメーションが維持される。

このシンプルなCodePenは、システムエンジニアを目指す初心者にとって多くの学びがある。HTML、CSS、JavaScriptがどのように連携してインタラクティブなウェブコンテンツを作り出すかというウェブ開発の基本を理解できる。イベント処理によるユーザーからの入力(マウスの動き)の検知、canvas要素を使ったプログラムによるグラフィック描画、requestAnimationFrameによる効率的なアニメーションループの実現、lerp関数のような数学的アプローチによる滑らかな動きの表現、そしてクラスと配列を使った複数のオブジェクトの管理といった、現代のフロントエンド開発における基礎的な概念やテクニックが凝縮されている。これらを学ぶことは、ユーザーインターフェースの設計と実装、動的なウェブアプリケーションの開発、さらにはゲームやデータビジュアライゼーションといったより高度な分野への第一歩となるだろう。

関連コンテンツ