diff --git a/files/ja/learn_web_development/extensions/client-side_apis/client-side_storage/index.md b/files/ja/learn_web_development/extensions/client-side_apis/client-side_storage/index.md index 3141bc3baaa69b..5f52d1e56df2ba 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/client-side_storage/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/client-side_storage/index.md @@ -1,14 +1,13 @@ --- title: クライアント側ストレージ slug: Learn_web_development/Extensions/Client-side_APIs/Client-side_storage -original_slug: Learn/JavaScript/Client-side_web_APIs/Client-side_storage l10n: - sourceCommit: bc0d0d1ef796435e969f6d65c7e5d3c08f4023aa + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- {{LearnSidebar}} -{{PreviousMenu("Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs", "Learn/JavaScript/Client-side_web_APIs")}} +{{PreviousMenuNext("Learn_web_development/Extensions/Client-side_APIs/Drawing_graphics", "Learn_web_development/Extensions/Client-side_APIs/Third_party_APIs", "Learn_web_development/Extensions/Client-side_APIs")}} 現代のブラウザーは、ウェブサイトがユーザーの許可を得た上で、ユーザーのコンピューターにデータを格納し、必要なときにそれを取得するためのさまざまな方法に対応しています。これにより、データを長期保存したり、サイトや文書をオフラインで使用するために保存したり、サイトのユーザー固有の設定を保持したりと、さまざまなことが可能になります。この記事では、これらがどのように動作するのか、ごく基本的なことを説明します。 @@ -17,21 +16,19 @@ l10n: 前提知識: - JavaScript の基本 - (第一歩、 - 構成要素, - JavaScript のオブジェクト)、 - クライアントサイド API の基本 + HTMLCSSJavaScript に親しんでおくこと、特に JavaScript オブジェクトの基本DOM スクリプティングネットワークリスクエストなどのコア API を扱っているものを理解しておくこと。 - 目的: + 学習成果: - アプリケーションデータを格納するために、クライアント側ストレージ API を使用する方法について学ぶこと。 + @@ -39,7 +36,7 @@ l10n: ## クライアント側ストレージとは -MDN 学習領域の他の場所で、[静的サイト](/ja/docs/Learn/Server-side/First_steps/Client-Server_overview#静的サイト)と[動的サイト](/ja/docs/Learn/Server-side/First_steps/Client-Server_overview#動的サイト)の違いについて説明しました。現代の主要なウェブサイトのほとんどは動的です。何らかのデータベース(サーバー側ストレージ)を使用してサーバーにデータを格納し、[サーバー側](/ja/docs/Learn/Server-side)コードを動作させて必要なデータを取得し、静的なページテンプレートに挿入し、結果の HTML をクライアントに提供してユーザーのブラウザーで表示させています。 +MDN 学習領域の他の場所で、[静的サイト](/ja/docs/Learn_web_development/Extensions/Server-side/First_steps/Client-Server_overview#静的サイト)と[動的サイト](/ja/docs/Learn_web_development/Extensions/Server-side/First_steps/Client-Server_overview#動的サイト)の違いについて説明しました。現代の主要なウェブサイトのほとんどは動的です。何らかのデータベース(サーバー側ストレージ)を使用してサーバーにデータを格納し、[サーバー側](/ja/docs/Learn_web_development/Extensions/Server-side)コードを動作させて必要なデータを取得し、静的なページテンプレートに挿入し、結果の HTML をクライアントに提供してユーザーのブラウザーで表示させています。 クライアント側ストレージは、同様の原理で動作しますが、用途は異なります。これは、クライアント(つまりユーザーのマシン)上にデータを格納し、必要なときにそれを取得することを可能にする JavaScript API で構成されています。これには、以下のような多くの明確な用途があります。 @@ -86,7 +83,7 @@ MDN 学習領域の他の場所で、[静的サイト](/ja/docs/Learn/Server-sid 2. ブラウザーの開発者ツールの JavaScript コンソールを開いてください。 3. ウェブストレージのデータはすべて、ブラウザーの中にある 2 つのオブジェクト風の構造、 {{domxref("Window.sessionStorage", "sessionStorage")}} と {{domxref("Window.localStorage", "localStorage")}} の中に入っています。前者は、ブラウザーを開いている間だけデータを維持し(ブラウザーを閉じるとデータは失われる)、後者はブラウザーを閉じてから再び開いた後でもデータを維持するものです。一般的には後者の方が有用なので、この記事では後者を使用することにします。 - {{domxref("Storage.setItem()")}} メソッドによって、ストレージ内にデータ項目を保存できます。このメソッドは 2 つの引数をとります。すなわち、その項目の名前と、その値です。JavaScript コンソールに以下のように打ち込んでみてください(もし良ければ、値は自分の名前に変更してください)。 + {{domxref("Storage.setItem()")}} メソッドによって、ストレージ内にデータ項目を保存できます。このメソッドは 2 つの引数をとります。すなわち、その項目の名前と、その値です。 JavaScript コンソールに以下のように打ち込んでみてください(もし良ければ、値は自分の名前に変更してください)。 ```js localStorage.setItem("name", "Chris"); @@ -236,7 +233,8 @@ MDN 学習領域の他の場所で、[静的サイト](/ja/docs/Learn/Server-sid 例が完成しました。よくできましたね! 現時点で残っているのは、コードを保存して HTML ページをブラウザーでテストすることだけです。[ライブ実行される完成版をここで](https://mdn.github.io/learning-area/javascript/apis/client-side-storage/web-storage/personal-greeting.html)見られます。 -> **メモ:** [ウェブストレージ API の使用](/ja/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API)のところには、探究するにはほんの少しだけ更に複雑な別の例もあります。 +> [!NOTE] +> もう一つ、探求すべき少し複雑な例が[ウェブストレージ API の使用](/ja/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API)にあります。 > [!NOTE] > 完成版のソースのうち `` という行では、`defer` 属性により、ページを読み込み終わるまでは {{htmlelement("script")}} 要素の中身を実行しないように指定しています。 @@ -249,11 +247,11 @@ IndexedDB API では、データベースを作成し、そのデータベース オブジェクトストアはリレーショナルデータベースのテーブルのようなもので、各オブジェクトストアはいくつものオブジェクトを格納することができます。 IndexedDB API の詳細については、[IndexedDB の使用](/ja/docs/Web/API/IndexedDB_API/Using_IndexedDB) を参照してください。 -しかし、これには代償があります。IndexedDB はウェブストレージ API よりも使うのがはるかに複雑です。この節では、実際にそれが可能なことの表面に触れるだけですが、 始めるには十分な情報を提供します。 +しかし、これには代償があります。 IndexedDB はウェブストレージ API よりも使うのがはるかに複雑です。この節では、実際にそれが可能なことの表面に触れるだけですが、 始めるには十分な情報を提供します。 ### メモのストレージの例での作業 -ここでは、ブラウザーの中にメモを格納し、好きな時に閲覧・削除できるようにする例を実行し ましょう。自分で構築してもらい、IDB の最も基本的な部分を説明しながら、進めていきます。 +ここでは、ブラウザーの中にメモを格納し、好きな時に閲覧・削除できるようにする例を実行し ましょう。自分で構築してもらい、 IDB の最も基本的な部分を説明しながら、進めていきます。 アプリは、次のような外見です。 @@ -342,7 +340,7 @@ IndexedDB API の詳細については、[IndexedDB の使用](/ja/docs/Web/API/ }); ``` - ここでは、データベースのスキーマ(構造)、つまり、データベースに含まれるカラム(またはフィールド)の集合を定義します。ここでは、まず既存のデータベースへの参照を、イベントのターゲット (`e.target.result`) の `result` プロパティ (`request` オブジェクト) から取得します。これは `success` イベントハンドラーの `db = openRequest.result;` という行と同じですが、ここでは別個に行う必要があります。それは、`upgradeneeded` イベントハンドラーが(必要なら) `success` イベントハンドラーの前に実行されるためです。つまり、この処理を行わない場合は `db` の値を利用することはできないのです。 + ここでは、データベースのスキーマ(構造)、つまり、データベースに含まれるカラム(またはフィールド)の集合を定義します。ここでは、まず既存のデータベースへの参照を、イベントのターゲットの `result` プロパティ (`e.target.result`) から取得し、これは `request` オブジェクトです。これは `success` イベントハンドラーの `db = openRequest.result;` という行と同じですが、ここでは別個に行う必要があります。 `upgradeneeded` イベントハンドラーが(必要なら) `success` イベントハンドラーの前に実行されるためです。つまり、この処理を行わない場合は `db` の値を利用することはできません。 次に {{domxref("IDBDatabase.createObjectStore()")}} を使用して、呼び出されたデータベースの中に `notes_os` という名前の新しいオブジェクトストアを作成します。これは、従来のデータベースシステムにおける単一の表に相当します。これに notes という名前をつけて、 `id` という `autoIncrement` キーフィールドも指定しました。新しいレコードが作成されるたびに、このフィールドに自動的に値が増加するので、開発者は明示的にこのフィールドを設定する必要はありません。キーである `id` フィールドは、レコードを削除するときや表示するときなど、レコードを一意に識別するために使用されます。 @@ -556,7 +554,7 @@ function deleteItem(e) { ]; ``` -2. 始めるには、データベースを正常に開くために、`init()`関数を実行します。これは、さまざまな動画の名前をループして、 `videos` データベースからそれぞれの名前で指定されたレコードを読み込もうとするものです。 +2. 始めに、データベースを正常に開くために、`init()`関数を実行します。これは、さまざまな動画の名前をループして、 `videos` データベースからそれぞれの名前で指定されたレコードを読み込もうとするものです。 それぞれの動画がデータベースで見つかった場合(`request.result` の評価値が `true` かどうかで確認します。記録が存在しない場合は `undefined` となります)、その動画ファイル(blob として格納されています)と動画名が `displayVideo()` 関数に直接渡され、UI に配置されます。存在しない場合、動画名は `fetchVideoFromNetwork()` 関数に渡され、ご想像のとおり、ネットワークから動画を取得します。 @@ -665,7 +663,7 @@ function deleteItem(e) { 上記の例では、大きな資産を IndexedDB データベースに格納し、複数回ダウンロードする必要を避けるアプリを作成する方法を既に示しました。これはすでにユーザー体験の大きな改善ですが、まだ一つ足りないことがあります。メインの HTML、CSS、JavaScript ファイルは、サイトにアクセスするたびにダウンロードする必要があり、ネットワーク接続がないときには動作しないことを意味します。 -![Firefoxのオフライン画面の内側へ、右手に2ピンプラグ、左手に2ピンソケットを持った漫画のキャラクターのイラストが描かれています。右側の辺には、オフラインモードのメッセージと「再試行」と書かれたボタンがあります。](ff-offline.png) +![Firefox のオフライン画面の中、右手に 2 ピンプラグ、左手に 2 ピンソケットを持った漫画のキャラクターのイラストが描かれています。右側の辺には、オフラインモードのメッセージと `Try again`と書かれたボタンがあります。](ff-offline.png) ここは、 [サービスワーカー](/ja/docs/Web/API/Service_Worker_API)およびそれと緊密に関連した [キャッシュ API](/ja/docs/Web/API/Cache) の出番です。 @@ -673,11 +671,11 @@ function deleteItem(e) { リクエストに介入した場合、望むことは何でもできますが([用途のアイディア](/ja/docs/Web/API/Service_Worker_API#その他の使用例)を参照)、よくある例は、ネットワークのレスポンスをオフラインで保存して、ネットワークからのレスポンスの代わりにリクエストに応答するものを提供することです。事実上、これはウェブサイトを完全にオフラインで動作させることを可能にします。 -Cache API もクライアント側のストレージ機構ですが、少し異なる点があります。 HTTP レスポンスを保存するように設計されているため、サービスワーカーと一緒に非常にうまく動作します。 +キャッシュ API もクライアント側のストレージ機構ですが、少し異なる点があります。 HTTP レスポンスを保存するように設計されているため、サービスワーカーと一緒に非常にうまく動作します。 ### サービスワーカーの例 -例を見て、これがどのように見えるかを少し考えてみましょう。前の章で見たビデオストアの例の別バージョンを作成しました。この例は、HTML、CSS、JavaScript をサービスワーカー経由で Cache API に保存し、例をオフラインで実行できるようにした以外は、まったく同じように機能します。 +例を見て、これがどのように見えるかを少し考えてみましょう。前の章で見たビデオストアの例の別バージョンを作成しました。この例は、HTML、CSS、JavaScript をサービスワーカー経由でキャッシュ API に保存し、例をオフラインで実行できるようにした以外は、まったく同じように機能します。 [サービスワーカーを用いた IndexedDB ビデオストアがライブで実行中のところ](https://mdn.github.io/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/) をご覧ください。また、[ソースコードも参照してください](https://github.com/mdn/learning-area/tree/main/javascript/apis/client-side-storage/cache-sw/video-store-offline)。 @@ -701,13 +699,13 @@ if ("serviceWorker" in navigator) { #### サービスワーカーのインストール -次にサービスワーカーが制御するページがアクセスされたとき(例:リロードされたとき)、サービスワーカーはそのページに対してインストールされます。つまり、そのページを制御し始めることになります。このとき、サービスワーカーに対して `install` イベントが発行されます。サービスワーカー自身の内部で、インストールに応答するコードを書くことができます。 +次にサービスワーカーが制御するページがアクセスされたとき(例:この例が再読み込みされたとき)、サービスワーカーはそのページに対してインストールされます。つまり、そのページを制御し始めることになります。このとき、サービスワーカーに対して `install` イベントが発行されます。サービスワーカー自身の内部で、インストールに応答するコードを書くことができます。 -例として、[sw.js](https://github.com/mdn/learning-area/blob/main/javascript/apis/client-side-storage/cache-sw/video-store-offline/sw.js) ファイル(サービスワーカー)の中を見てみましょう。インストールを待ち受けするために、`self`というキーワードが登録されているのがわかります。この `self` キーワードは、サービスワーカーファイルの内部から、サービスワーカーのグローバルスコープを参照するためのものです。 +例として、 [sw.js](https://github.com/mdn/learning-area/blob/main/javascript/apis/client-side-storage/cache-sw/video-store-offline/sw.js) ファイル(サービスワーカー)の中を見てみましょう。インストールを待ち受けするために、 `self` というキーワードが登録されているのがわかります。この `self` キーワードは、サービスワーカーファイルの内部から、サービスワーカーのグローバルスコープを参照するためのものです。 `install` ハンドラーの内部では、イベントオブジェクトで利用できる {{domxref("ExtendableEvent.waitUntil()")}} メソッドを使用して、ブラウザーはサービスワーカーのインストールを、イベント内のプロミスが正常に履行されるまで完了すべきでないことを通知しています。 -ここで、キャッシュ API の動作を確認します。Domxref("CacheStorage.open()")}} メソッドを使用して、レスポンスを格納できる新しいキャッシュオブジェクトを開いています(IndexedDB オブジェクトストアのようなものです)。このプロミスは `video-store` キャッシュを表す {{domxref("Cache")}} オブジェクトで履行されます。次に {{domxref("Cache.addAll()")}} メソッドを使用して、一連のアセットをフェッチし、そのレスポンスをキャッシュに追加しています。 +ここで、キャッシュ API の動作を確認します。 {{domxref("CacheStorage.open()")}} メソッドを使用して、レスポンスを格納できる新しいキャッシュオブジェクトを開いています(IndexedDB オブジェクトストアのようなものです)。このプロミスは `video-store` キャッシュを表す {{domxref("Cache")}} オブジェクトで履行されます。次に {{domxref("Cache.addAll()")}} メソッドを使用して、一連の資産をフェッチし、そのレスポンスをキャッシュに追加しています。 ```js self.addEventListener("install", (e) => { @@ -728,9 +726,9 @@ self.addEventListener("install", (e) => { さて、これで終わりです。インストールが済みました。 -#### さらなるリクエストへの応答 +#### 以降のリクエストへの応答 -サービスワーカーが登録され、 HTML ページに対してインストールされ、関連するアセットがすべてキャッシュに追加されたので、ほぼ準備が整いました。やるべきことはもう一つあります。さらなるネットワークリクエストに応答するためのコードを書くことです。 +サービスワーカーが登録され、 HTML ページに対してインストールされ、関連する資産がすべてキャッシュに追加されたので、ほぼ準備が整いました。やるべきことはもう一つあります。以降のネットワークリクエストに応答するためのコードを書くことです。 これが `sw.js` の 2 つ目のコードの役割です。サービスワーカーのグローバルスコープに別のリスナーを追加して、`fetch` イベントが発生したときにハンドラー関数を実行するようにします。これは、ブラウザーが、サービスワーカーが登録されているディレクトリーにある資産に対してリクエストを行うたびに発生します。 @@ -757,7 +755,7 @@ self.addEventListener("fetch", (e) => { [サービスワーカーの例](https://mdn.github.io/learning-area/javascript/apis/client-side-storage/cache-sw/video-store-offline/)を試すには、それが確実にインストールされるように、2、3 度読み込む必要があるでしょう。それが済んだら、以下のことができます。 -- ネットワーク接続ケーブルを抜いてみましょう。あるいは、Wi-Fi を切ってみましょう。 +- ネットワーク接続ケーブルを抜いてみましょう。あるいは、 Wi-Fi を切ってみましょう。 - Firefox を使っているなら、\[ファイル] > \[オフライン作業] を選択してください。 - Chrome を使っているなら、\[デベロッパーツール] へ進み、 \[_Application] > \[Service Workers]_ を選び、それから、\[_Offline]_ のチェックボックスをチェックしてください。 @@ -774,4 +772,4 @@ self.addEventListener("fetch", (e) => { - [クッキー](/ja/docs/Web/HTTP/Cookies) - [ウェブワーカー API](/ja/docs/Web/API/Service_Worker_API) -{{PreviousMenu("Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs", "Learn/JavaScript/Client-side_web_APIs")}} +{{PreviousMenuNext("Learn_web_development/Extensions/Client-side_APIs/Drawing_graphics", "Learn_web_development/Extensions/Client-side_APIs/Third_party_APIs", "Learn_web_development/Extensions/Client-side_APIs")}} diff --git a/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/index.md b/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/index.md index 9c44220a3e80f1..0204bc1d1acc61 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/index.md @@ -1,12 +1,13 @@ --- title: グラフィックの描画 slug: Learn_web_development/Extensions/Client-side_APIs/Drawing_graphics -original_slug: Learn/JavaScript/Client-side_web_APIs/Drawing_graphics l10n: - sourceCommit: 4d4e7617f5d573bbf8f51333b959c73b10262d52 + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- -{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Third_party_APIs", "Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs", "Learn/JavaScript/Client-side_web_APIs")}} +{{LearnSidebar}} + +{{PreviousMenuNext("Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs", "Learn_web_development/Extensions/Client-side_APIs/Client-side_storage", "Learn_web_development/Extensions/Client-side_APIs")}} ブラウザーには、Scalable Vector Graphics ([SVG](/ja/docs/Web/SVG)) 言語から HTML の {{htmlelement("canvas")}} 要素に描画するための API まで、とても強力なグラフィックプログラミングツールが含まれています([キャンバス API](/ja/docs/Web/API/Canvas_API) と [WebGL](/ja/docs/Web/API/WebGL_API) を参照)。この記事では、キャンバスについて紹介し、さらに詳しく学ぶためのリソースを提供します。 @@ -15,21 +16,17 @@ l10n: 前提知識: - JavaScript の基本 - (第一歩、 - 構成要素, - JavaScript のオブジェクト)、 - クライアントサイド API の基本 + HTMLCSSJavaScript に親しんでおくこと、特に JavaScript オブジェクトの基本DOM スクリプティングネットワークリスクエストなどのコア API を扱っているものを理解しておくこと。 - 目的: + 学習成果: - JavaScript で<canvas> 要素に描画するための基本を学ぶこと。 + @@ -37,21 +34,21 @@ l10n: ## ウェブでのグラフィック -HTML の [マルチメディアと埋め込み](/ja/docs/Learn/HTML/Multimedia_and_embedding) モジュールで話したように、ウェブはもともとテキストだけでした、それはとても退屈だったので、画像が登場しました。最初は {{htmlelement("img")}} 要素によって、後には {{cssxref("background-image")}} といった CSS のプロパティを経て、 [SVG](/ja/docs/Web/SVG) が導入されました。 +ウェブはもともとテキストだけでした、それではとてもつまらなかったので、画像が登場しました。最初は {{htmlelement("img")}} 要素によって、後には {{cssxref("background-image")}} といった CSS のプロパティを経て、 [SVG](/ja/docs/Web/SVG) が導入されました。 -しかし、これではまだ十分ではありません。 [CSS](/ja/docs/Learn/CSS) や [JavaScript](/ja/docs/Learn/JavaScript) を使用して、マークアップで表わされた SVG ベクター画像をアニメーションさせたり操作したりすることはできますが、ビットマップ画像に対して同じことをする方法はまだなく、利用できるツールもかなり限定されていたのです。ウェブでは、アニメーションやゲーム、 3D シーンなど、 C++ や Java といった低水準の言語が扱う要件を効果的に作成する方法がまだありませんでした。 +しかし、これではまだ十分ではありませんでした。 [CSS](/ja/docs/Learn_web_development/Core/Styling_basics) や [JavaScript](/ja/docs/Learn_web_development/Core/Scripting) を使用して、マークアップで表現された SVG ベクター画像をアニメーションさせたり操作したりすることはできますが、ビットマップ画像に対して同じことをする方法はまだなく、利用できるツールもかなり限定されていたのです。ウェブでは、アニメーションやゲーム、 3D シーンなど、 C++ や Java といった低水準の言語が扱う要件を効果的に作成する方法がまだありませんでした。 ブラウザーが {{htmlelement("canvas")}} 要素と関連する[キャンバス API](/ja/docs/Web/API/Canvas_API) に対応し始めた頃から状況は改善されました。後述するように、キャンバスは 2D アニメーション、ゲーム、データの視覚化、その他の種類のアプリケーションを作成するためのいくつかの有用なツールを提供し、特にウェブプラットフォームが提供する他の API と組み合わせたときにその威力を発揮しますが、アクセシブルにするには難しかったり不可能であったりします。 -以下の例は、もともと [JavaScript オブジェクト入門](/ja/docs/Learn/JavaScript/Objects/Object_building_practice)モジュールで出会った、キャンバスベースのシンプルな 2D の弾むボールアニメーションを示しています。 +以下の例は、もともと [JavaScript オブジェクト入門](/ja/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_building_practice)モジュールで出会った、キャンバスベースのシンプルな 2D の弾むボールアニメーションを示しています。 {{EmbedGHLiveSample("learning-area/javascript/oojs/bouncing-balls/index-finished.html", '100%', 500)}} -2006〜2007年頃、Mozilla は 3D キャンバスの実装を実験的に行うために動作を開始しました。これが [WebGL](/ja/docs/Web/API/WebGL_API) となり、ブラウザーベンダーの間で評判となり、2009 年から 2010 年頃に標準化されました。WebGL を使うと、ウェブブラウザーの中で本格的な 3D グラフィックを作成することができます。以下の例では、単純な回転する WebGL 立方体を示しています。 +2006〜2007 年頃、Mozilla は 3D キャンバスの実装を実験的に行うために作業を開始しました。これが [WebGL](/ja/docs/Web/API/WebGL_API) となり、ブラウザーベンダーの間で評判となり、 2009 年から 2010 年頃に標準化されました。 WebGL を使うと、ウェブブラウザーの中で本格的な 3D グラフィックを作成することができます。以下の例では、単純な回転する WebGL 立方体を示しています。 {{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/threejs-cube/index.html", '100%', 500)}} -この記事では、生の WebGL コードはとても複雑であるため、主に 2D キャンバスに焦点を当てます。しかし、WebGL ライブラリーを使用してより簡単に 3D シーンを作成する方法を紹介します。また、生の WebGL を使用するチュートリアルは他の場所にあります。 [WebGL 入門](/ja/docs/Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL)を参照してください。 +この記事では、生の WebGL コードはとても複雑であるため、主に 2D キャンバスに焦点を当てます。しかし、 WebGL ライブラリーを使用してより簡単に 3D シーンを作成する方法を紹介します。また、生の WebGL を使用するチュートリアルは他の場所にあります。 [WebGL 入門](/ja/docs/Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL)を参照してください。 ## アクティブラーニング: \ を始めよう @@ -63,7 +60,7 @@ HTML の [マルチメディアと埋め込み](/ja/docs/Learn/HTML/Multimedia_a これにより、ページ上に 320 × 240 ピクセルの大きさのキャンバスが作成されます。 -`` タグの中には、代替コンテンツを記述してください。これは、キャンバスに対応していないブラウザのユーザーや、スクリーンリーダーのユーザーに対して、キャンバスのコンテンツを記述するものです。 +`` タグの中には、代替コンテンツを記述してください。これは、キャンバスに対応していないブラウザのユーザーや、スクリーンリーダーのユーザーに対して、キャンバスのコンテンツを説明するものです。 ```html @@ -71,10 +68,10 @@ HTML の [マルチメディアと埋め込み](/ja/docs/Learn/HTML/Multimedia_a ``` -代替コンテンツは、キャンバスのコンテンツに代わる有益なコンテンツを提供する必要があります。例えば、常に更新される株価のグラフをレンダリングしている場合、代替コンテンツは最新の株価グラフの静止画像で、`alt` テキストで株価の内容を言ったり、個々の株価ページへのリンクのリストを表示したりすることができます。 +代替コンテンツは、キャンバスのコンテンツに代わる有益なコンテンツを提供する必要があります。例えば、常に更新される株価のグラフをレンダリングしている場合、代替コンテンツは最新の株価グラフの静止画像で、 `alt` テキストで株価の内容を言ったり、個々の株価ページへのリンクのリストを表示したりすることができます。 > [!NOTE] -> キャンバスのコンテンツはスクリーンリーダーにアクセスできません。キャンバス要素自体に直接 [`aria-label`](/ja/docs/Web/Accessibility/ARIA/Attributes/aria-label) 属性の値として説明テキストを含めるか、開始タグと閉じられた `` タグ内に代替コンテンツを記述してください。キャンバスのコンテンツは DOM に所属しませんが、その中にある代替コンテンツは所属します。 +> キャンバスのコンテンツはスクリーンリーダーにとってアクセシブルではありません。キャンバス要素自体に直接 [`aria-label`](/ja/docs/Web/Accessibility/ARIA/Attributes/aria-label) 属性の値として説明テキストを含めるか、開始タグと閉じられた `` タグ内に代替コンテンツを記述するかしてください。キャンバスのコンテンツは DOM に所属しませんが、その中にある代替コンテンツは所属します。 ### キャンバスの作成とサイズ変更 @@ -88,7 +85,7 @@ HTML の [マルチメディアと埋め込み](/ja/docs/Learn/HTML/Multimedia_a ```html -

Add suitable fallback here.

+

ここに最適な代替テキストを追加します。

``` @@ -102,7 +99,7 @@ HTML の [マルチメディアと埋め込み](/ja/docs/Learn/HTML/Multimedia_a const height = (canvas.height = window.innerHeight); ``` - ここでは、定数 `canvas` にキャンバスへの参照を格納しています。2 つ目の行では、新しい定数 `width` とキャンバスの `width` プロパティを {{domxref("Window.innerWidth")}} (ビューポート幅に等しい値)に設定しています。3 行目では、新しい定数 `height` とキャンバスの `height` プロパティを {{domxref("Window.innerHeight")}} (ビューポートの高さを指定)に等しくなるように設定しています。これで、ブラウザーウィンドウの幅と高さをすべて満たすキャンバスを保有することができます。 + ここでは、定数 `canvas` にキャンバスへの参照を格納しています。 2 つ目の行では、新しい定数 `width` とキャンバスの `width` プロパティを {{domxref("Window.innerWidth")}} (ビューポート幅に等しい値)に設定しています。3 行目では、新しい定数 `height` とキャンバスの `height` プロパティを {{domxref("Window.innerHeight")}} (ビューポートの高さを指定)に等しくなるように設定しています。これで、ブラウザーウィンドウの幅と高さをすべて満たすキャンバスを保有することができます。 また、複数の等号で代入を一斉に連結しているのがわかると思います。これは JavaScript で許可されており、複数の変数をすべて同じ値にしたい場合に有効なテクニックです。キャンバスの幅と高さは、変数 width/height で簡単にアクセスできるようにしたいと思いました。後で利用できるようにするために有用な値だからです(たとえば、キャンバスの幅のちょうど半分の大きさのものを描きたい場合など)。 @@ -131,19 +128,19 @@ ctx.fillStyle = "rgb(0 0 0)"; ctx.fillRect(0, 0, width, height); ``` -ここでは、キャンバスの {{domxref("CanvasRenderingContext2D.fillStyle", "fillStyle")}} プロパティを使用して塗り色を設定し(これは、CSS のプロパティと同様に [color values](/ja/docs/Learn/CSS/Building_blocks/Values_and_units#colors) をとります)、次に {{domxref("CanvasRenderingContext2D.fillRect", "fillRect")}} メソッドを用いてキャンバスの全領域を占める矩形を描画しています(最初の 2 つの引数は矩形の左上隅の座標です。最後の 2 つは矩形を描く幅と高さで、変数 `width` と `height` は有用であることは既に示しました)。 +ここでは、キャンバスの {{domxref("CanvasRenderingContext2D.fillStyle", "fillStyle")}} プロパティを使用して塗りつぶし色を設定し(これは、CSS のプロパティと同様の[色値](/ja/docs/Learn_web_development/Core/Styling_basics/Values_and_units#色)をとります)、次に {{domxref("CanvasRenderingContext2D.fillRect", "fillRect")}} メソッドを用いてキャンバスの全領域を占める長方形を描画しています(最初の 2 つの引数は長方形の左上隅の座標です。最後の 2 つは長方形を描く幅と高さで、変数 `width` と `height` は有用であることは既に示しました)。 さて、テンプレートが完成しましたので、次に移動させます。 ## 2D キャンバスの基本 -上で述べたように、すべての描画処理は {{domxref("CanvasRenderingContext2D")}} オブジェクト(ここでは `ctx` )に対する操作で行われます。多くの処理では、どこに何を描くかを正確に指定するために座標を与える必要があります。キャンバスの左上は点 (0, 0) で、水平 (x) 軸は左から右へ、垂直 (y) 軸は上から下へ走ります。 +上で述べたように、すべての描画処理は {{domxref("CanvasRenderingContext2D")}} オブジェクト(ここでは `ctx`)に対する操作で行われます。多くの処理では、どこに何を描くかを正確に指定するために座標を与える必要があります。キャンバスの左上は点 (0, 0) で、水平 (x) 軸は左から右へ、垂直 (y) 軸は上から下へ走ります。 ![小さな正方形がその領域を覆い、真ん中にスチールブルーの正方形がある格子状のグラフ用紙。キャンバスの左上隅は、キャンバスの X 軸と Y 軸の点 (0, 0) である。横軸 (x) は左から右に動作して幅を表し、縦軸 (y) は上から下に動作して高さを表す。青い正方形の左上隅は、 Y 軸から x 単位、 X 軸から y 単位の距離であることがラベル付けされている。](canvas_default_grid.png) -図形を描くには、矩形図形プリミティブを使用するか、一定のパスに沿って線をなぞり、その図形を塗りつぶす方法を取る傾向があるようです。以下では、その両方の方法を示します。 +図形を描くには、長方形図形プリミティブを使用するか、一定のパスに沿って線をなぞり、その図形を塗りつぶす方法を取る傾向があるようです。以下では、その両方の方法を示します。 -### 簡単な矩形 +### 簡単な長方形 まずは簡単な長方形から始めてみましょう。 @@ -155,16 +152,16 @@ ctx.fillRect(0, 0, width, height); ctx.fillRect(50, 50, 100, 150); ``` - 保存して更新すると、キャンバスには赤い矩形が現れるはずです。その左上隅はキャンバスの上端と左端から 50 ピクセル離れており(最初の 2 つの引数で定義)、幅は 100 ピクセル、高さは 150 ピクセルです(3 番目と 4 番目の引数で定義)。 + 保存して更新すると、キャンバスには赤い長方形が現れるはずです。その左上隅はキャンバスの上端と左端から 50 ピクセル離れており(最初の 2 つの引数で定義)、幅は 100 ピクセル、高さは 150 ピクセルです(3 番目と 4 番目の引数で定義)。 -3. もうひとつ矩形を追加してみましょう。今度は緑色の矩形です。 JavaScript の一番下に以下のものを追加してください。 +3. もうひとつ長方形を追加してみましょう。今度は緑色の長方形です。 JavaScript の一番下に以下のものを追加してください。 ```js ctx.fillStyle = "rgb(0 255 0)"; ctx.fillRect(75, 75, 100, 100); ``` - 保存して更新すると、新しい矩形が表示されます。この点は重要です。矩形や行を描くなどのグラフィック処理は、発生した順番に実行されます。たとえば、壁にペンキを塗るとき、ペンキが重なり合うと、その下にあるものが隠れてしまうことがあります。これは何らかの方法で変更することはできないので、グラフィックを描く順序を注意深く考える必要があります。 + 保存して更新すると、新しい長方形が表示されます。この点は重要です。長方形や行を描くなどのグラフィック処理は、発生した順番に実行されます。たとえば、壁にペンキを塗るとき、ペンキが重なり合うと、その下にあるものが隠れてしまうことがあります。これは何らかの方法で変更することはできないので、グラフィックを描く順序を注意深く考える必要があります。 4. 半透明の色を指定することで、例えば `rgb()` を使用して半透明のグラフィックを描画することができることに注意してください。「アルファチャンネル」は、色が持つ透明度の量を定義します。この値が高いほど、その背後にあるものをより見えなくすることができます。コードに以下のように追加してください。 @@ -177,7 +174,7 @@ ctx.fillRect(0, 0, width, height); ### ストロークと線の幅 -これまで、塗りつぶされた長方形の描画について見てきましたが、輪郭だけの長方形(グラフィックデザインでは**ストローク**と呼びます)を描画することも可能です。ストロークに必要な色を設定するには、{{domxref("CanvasRenderingContext2D.strokeStyle", "strokeStyle")}} プロパティを使用します。ストロークの長方形を描くには {{domxref("CanvasRenderingContext2D.strokeRect", "strokeRect")}} を使用して行われます。 +これまで、塗りつぶされた長方形の描画について見てきましたが、輪郭だけの長方形(グラフィックデザインでは**ストローク**と呼びます)を描画することも可能です。ストロークに必要な色を設定するには、 {{domxref("CanvasRenderingContext2D.strokeStyle", "strokeStyle")}} プロパティを使用します。ストロークの長方形を描くには {{domxref("CanvasRenderingContext2D.strokeRect", "strokeRect")}} を使用して行われます。 1. 前の例に以下のものを追加してください。また、前の JavaScript の行の下に追加してください。 @@ -207,9 +204,9 @@ ctx.fillRect(0, 0, width, height); 以下の節すべてにおいて、いくつかの共通のメソッドとプロパティを使用します。 -- {{domxref("CanvasRenderingContext2D.beginPath", "beginPath()")}} — キャンバス上で現在ペンがあるこの点からパスの描画を開始します。新しいキャンバスには、ペンは (0, 0) から開始されます。 +- {{domxref("CanvasRenderingContext2D.beginPath", "beginPath()")}} — キャンバス上で現在ペンがある点からパスの描画を開始します。新しいキャンバスの場合、ペンは (0, 0) から開始されます。 - {{domxref("CanvasRenderingContext2D.moveTo", "moveTo()")}} — ペンをキャンバス上の異なる点に移動させると、線を記録したりトレースしたりせずに、ペンは新しい位置に「ジャンプ」します。 -- {{domxref("CanvasRenderingContext2D.fill", "fill()")}} — これまでなぞったパスを埋めて、塗りつぶした図形を描きます。 +- {{domxref("CanvasRenderingContext2D.fill", "fill()")}} — これまでなぞったパスの中身を塗りつぶして、塗りつぶした図形を描きます。 - {{domxref("CanvasRenderingContext2D.stroke", "stroke()")}} — これまでに描いたパスに沿ってストロークを描き、アウトライン図形を描きます。 - また、長方形だけでなく、パスに対しても `lineWidth` や `fillStyle`/`strokeStyle` のような機能を使用することができます。 @@ -227,7 +224,7 @@ ctx.fill(); キャンバスには正三角形を描いてみましょう。 -1. まずはじめに、以下のヘルパー関数をコードの一番下に追加してください。これは度数の値をラジアンに変換するもので、 JavaScript で角度の値を指定する必要があるときは常にラジアン単位で指定されますが、人間は通常度数で考えるので有用です。 +1. まずはじめに、以下のヘルパー関数をコードの一番下に追加してください。これは度数の値をラジアンに変換するもので、 JavaScript で角度の値を指定する必要があるときは、常にラジアン単位で指定しますが、人間は通常度数で考えるので有用です。 ```js function degToRad(degrees) { @@ -260,12 +257,12 @@ ctx.fill(); 次に、この正三角形の高さを、簡単な三角法を使用して算出します。基本的には、三角形は下向きに描かれています。正三角形の角度は常に 60 度です。高さを計算するには、正三角形を真ん中から 2 つに分割し、それぞれ 90 度、 60 度、 30 度の角度を持つようにすればいいのです。それぞれの辺は次のように呼びます。 - 一番長い辺は、**斜辺 (hypotenuse)** と呼ばれます。 - - 60度の角度の横にある辺は、**隣辺 (adjacent)** と呼ばれています。これは、先ほど引いた線の半分なので、50ピクセルであることが分かっています。 + - 60 度の角度の横にある辺は、**隣辺 (adjacent)** と呼ばれています。これは、先ほど引いた線の半分なので、50ピクセルであることが分かっています。 - 60度の角と反対側にある辺は、**対辺 (opposite)** と呼ばれています。これが計算したい三角形の高さになります。 ![角と辺にラベル付けされた下向きの正三角形。上部の水平線は「隣辺」とラベル付けされている。隣接する線の中央から「対辺」とラベル付けされた垂直な点線が三角形を分割し、2つの等しい直角三角形が作成される。三角形の右辺は、「対辺」と書かれた行によって形成された直角三角形の斜辺であるため、「斜辺」と書かれる。三角形のすべての三辺の長さが同じであるのに対し、斜辺は直角三角形の最も長い辺となる。](trigonometry.png) - 三角測量の基本的な公式の1つは、隣接する角度の長さに角度の正接(タンジェント)を掛けたものは、その反対側に等しいという状態です。したがって、 `50 * Math.tan(degToRad(60))` と結論づけられます。 {{jsxref("Math.tan()")}} はラジアン単位の入力値を想定しているので、 60 度をラジアンに変換するために `degToRad()` 関数を使用しています。 + 三角測量の基本的な公式の 1 つは、隣辺の長さに角度の正接(タンジェント)を掛けたものは、対辺に等しいということです。したがって、 `50 * Math.tan(degToRad(60))` といえます。 {{jsxref("Math.tan()")}} はラジアン単位の入力値を想定しているので、 60 度をラジアンに変換するために `degToRad()` 関数を使用しています。 4. 高さが計算できたので、 `(100, 50 + triHeight)` へもう一本線を引きます。X 座標は単純で、前に設定した 2 つの X 値の中間の値でなければなりません。一方 Y 値は、三角形の頂点がキャンバスの頂点から 50 ピクセル離れていることが分かっているため、50 に三角形の高さを足した値でなければなりません。 5. 次の行は、三角形の開始点まで戻る線を描きます。 @@ -287,7 +284,7 @@ ctx.fill(); `arc()` は 6 つの引数を取ります。最初の 2 つは円弧の中心の位置を指定します (それぞれ X と Y)。3 番目は円の半径、4 番目と 5 番目は円を描く開始角度と終了角度を指定し(つまり 0 と 360 度を指定すると完全な円になります)、6 番目は円を反時計回りに描くか(反時計回り)時計回りに描くか(`false` は時計回り)を定義します。 > [!NOTE] - > 0度は水平方向で右側です。 + > 0 度は水平方向で右側です。 2. もうひとつ、円弧を加えてみましょう。 @@ -302,7 +299,7 @@ ctx.fill(); こちらのパターンもとてもよく似ていますが、 2 つの違いがあります。 - `arc()` の最後の引数を `true` に設定しています。これは、反時計回りに弧を描くという意味で、たとえ弧が -45 度から始まって 45 度で終わるように指定されていても、この部分の内側ではなく 270 度の周囲に弧を描くということになります。もし、 `true` を `false` に変更してからコードを再実行すると、 90 度の輪切りだけが描画されます。 - - fill()`を呼び出す前に、円の中心に線を引いています。これは、パックマンスタイルの切り抜きレンダリングを得ることを意味しています。この行を削除して(試してみてください!)コードを再実行すると、円弧の開始点と終了点の間で円の端が切り落とされただけの状態になります。これは、キャンバスのもう一つの重要な点を示しています。不完全なパス(つまり、閉じられていないパス)を塗りつぶそうとすると、ブラウザーは始点と終点の間を直線で埋めてから、それを塗りつぶします。 + - `fill()` を呼び出す前に、円の中心に線を引いています。これは、パックマンスタイルの切り抜きレンダリングになります。この行を削除して(試してみてください!)コードを再実行すると、円弧の開始点と終了点の間で円の端が切り落とされただけの状態になります。これは、キャンバスのもう一つの重要な点を示しています。不完全なパス(つまり、閉じられていないパス)を塗りつぶそうとすると、ブラウザーは始点と終点の間を直線で埋めてから、それを塗りつぶします。 最終的には以下のような例となります。 @@ -316,7 +313,7 @@ ctx.fill(); ### テキスト -キャンバスには、テキストを描画するための機能も保有されています。これらを簡単に調べてみましょう。キャンバステンプレート([1_canvas_template](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/getting-started/1_canvas_template))を新しくコピーし、そこに新しい例を描画することから始めましょう。 +キャンバスには、テキストを描画するための機能あります。これらを簡単に探検してみましょう。キャンバスのテンプレート([1_canvas_template](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/getting-started/1_canvas_template))を新しくコピーし、そこに新しい例を描画することから始めましょう。 テキストは2つのメソッドを使用して描画されます。 @@ -325,7 +322,7 @@ ctx.fill(); どちらも基本的な使い方として、描画する文字列と、テキストの描画を開始する点の X 座標と Y 座標の 3 つのプロパティを取ります。これは、**テキストボックス**(文字通り、描画するテキストを囲むボックス)の**左下**隅となりますが、他の描画処理は左上隅から開始する傾向があるので混乱するかもしれません。気を付けてください。 -また、テキスト レンダリングをコントロールするのに役立つプロパティもいくつかあります。このプロパティは、CSSの{{cssxref("font")}}プロパティと同じ構文を値として受け取ります。 +また、テキストのレンダリングを制御するのに役立つプロパティも、 {{domxref("CanvasRenderingContext2D.font", "font")}} をはじめとしていくつかあります。このプロパティは、 CSS の {{cssxref("font")}} プロパティと同じ構文を値として受け取ります。 キャンバスのコンテンツはスクリーンリーダーに対するアクセシビリティがありません。キャンバスに描かれたテキストは DOM では利用できませんが、アクセシビリティを確保するためには利用できるようにする必要があります。この例では、テキストを `aria-label` の値として記載しています。 @@ -368,9 +365,9 @@ canvas.setAttribute("aria-label", "Canvas text"); image.src = "firefox.png"; ``` - ここでは {{domxref("HTMLImageElement.Image()", "Image()")}} コンストラクターを使用して、新しい {{domxref("HTMLImageElement")}} オブジェクトを作成しています。返されるオブジェクトは、既存の {{htmlelement("img")}} 要素への参照を取得したときに返されるオブジェクトと同じ型です。次に、その [`src`](/ja/docs/Web/HTML/Element/img#src) 属性を、Firefox ロゴ画像と同じになるように設定します。この時点で、ブラウザーは画像の読み込みを開始します。 + ここでは新しい {{domxref("HTMLImageElement")}} オブジェクトを、 {{domxref("HTMLImageElement.Image()", "Image()")}} コンストラクターを使用して作成しています。返されるオブジェクトは、既存の {{htmlelement("img")}} 要素への参照を取得したときに返されるオブジェクトと同じ型です。次に、その [`src`](/ja/docs/Web/HTML/Element/img#src) 属性を、 Firefox のロゴ画像と同じになるように設定します。この時点で、ブラウザーは画像の読み込みを開始します。 -3. ここで、`drawImage()` を使用して画像を埋め込むことができますが、最初に画像ファイルが読み込まれたことを確認する必要があり、そうでなければコードは失敗してしまいます。これは `load` イベントを使用して実現することができます。このイベントは画像の読み込みが完了したときにのみ発行されます。前のブロックの下に、以下のブロックを追加してください。 +3. ここで、 `drawImage()` を使用して画像を埋め込むことができますが、最初に画像ファイルが読み込まれたことを確認する必要があり、そうでなければコードは失敗してしまいます。これは `load` イベントを使用して実現することができます。このイベントは画像の読み込みが完了したときにのみ発行されます。前のブロックの下に、以下のブロックを追加してください。 ```js image.addEventListener("load", () => ctx.drawImage(image, 20, 20)); @@ -378,7 +375,7 @@ canvas.setAttribute("aria-label", "Canvas text"); 今、ブラウザーで例を読み込むと、キャンバスに埋め込まれた画像が表示されるはずです。 -4. でも、まだあります。 画像の一部分だけを表示したり、サイズを変更したりしたい場合はどうすればよいのでしょうか。 `drawImage()` のより複雑なバージョンを使用すれば、どちらも可能です。 `ctx.drawImage()` の行を次のように更新してください。 +4. でも、まだあります。 画像の一部だけを表示したり、サイズを変更したりしたい場合はどうすればよいのでしょうか。 `drawImage()` のより複雑なバージョンを使用すれば、どちらも可能です。 `ctx.drawImage()` の行を次のように更新してください。 ```js ctx.drawImage(image, 20, 20, 185, 175, 50, 50, 185, 175); @@ -409,7 +406,7 @@ canvas.setAttribute("aria-label", "Canvas text"); ### ループの作成 -キャンバスでループを使うのはなかなか楽しいものです。他の JavaScript コードと同じように、[`for`](/ja/docs/Web/JavaScript/Reference/Statements/for) (または他の種類のの)ループの中でキャンバスのコマンドを実行することができます。 +キャンバスでループを使うのはなかなか楽しいものです。他の JavaScript コードと同じように、 [`for`](/ja/docs/Web/JavaScript/Reference/Statements/for) (または他の種類のの)ループの中でキャンバスのコマンドを実行することができます。 簡単な例を作ってみましょう。 @@ -649,7 +646,7 @@ loop(); {{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/loops_animation/8_canvas_drawing_app/index.html", '100%', 600)}} -最も興味深い部分を見ていきましょう。まず最初に、マウスの X と Y の座標と、クリックされているかどうかを `curX`、`curY`、`pressed` という 3 つの変数で記録しています。マウスが移動したら、 `mousemove` イベントハンドラーとして設定された関数を発行し、現在の X と Y の値を取得します。また、`mousedown` と `mouseup` イベントハンドラーを使用して、マウスボタンが押されたときに `pressed` の値を `true` に変更し、離したときに再び `false` に戻しています。 +最も興味深い部分を見ていきましょう。まず最初に、マウスの X と Y の座標と、クリックされているかどうかを `curX`、`curY`、`pressed` という 3 つの変数で記録しています。マウスが移動したら、 `onmousemove` イベントハンドラーとして設定された関数を発行し、現在の X と Y の値を取得します。また、`onmousedown` と `onmouseup` イベントハンドラーを使用して、マウスボタンが押されたときに `pressed` の値を `true` に変更し、離したときに再び `false` に戻しています。 ```js let curX; @@ -716,11 +713,11 @@ WebGL は [OpenGL](/ja/docs/Glossary/OpenGL) (Open Graphics Library) に基づ ### 立方体の作成 -WebGLライブラリーを使って何かを作成する簡単な例を見てみましょう。ここでは、最も人気のあるものの 1 つである [Three.js](/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js) を選んでみましょう。このチュートリアルでは、先ほど見た 3D の回転する立方体を作成します。 +WebGL ライブラリーを使って何かを作成する簡単な例を見てみましょう。ここでは、最も人気のあるものの 1 つである [Three.js](/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js) を選んでみましょう。このチュートリアルでは、先ほど見た 3D の回転する立方体を作成します。 1. まず、新しいフォルダーに [threejs-cube/index.html](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/threejs-cube/index.html) をローカルにコピーし、同じフォルダーに [metal003.png](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/threejs-cube/metal003.png) をコピーして保存してください。これは、後で立方体の表面テクスチャとして使用する画像です。 2. 次に、 `script.js` というファイルを新規に作成し、これも先ほどと同じフォルダーに保存します。 -3. 次に、Three.js ライブラリーがインストールしてある必要があります。[Three.js を使った基本的なデモの作成](/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js)で記述されている環境構築の段階に従って、Three.js が期待通りに動作するようにしてください。 +3. 次に、 Three.js ライブラリーがインストールしてある必要があります。[Three.js を使った基本的なデモの作成](/ja/docs/Games/Techniques/3D_on_the_web/Building_up_a_basic_demo_with_Three.js)で記述されている環境構築の段階に従って、Three.js が期待通りに動作するようにしてください。 4. これで `three.js` をページに割り当てることができたので、これを使用する JavaScript を `script.js` に書き始めることができます。まず、新しいシーンを作成することから始めましょう。`script.js` ファイルに以下のように追加してください。 ```js @@ -843,4 +840,4 @@ WebGLライブラリーを使って何かを作成する簡単な例を見てみ - [Violent theremin](https://github.com/mdn/webaudio-examples/tree/main/violent-theremin) — 音声を生成するためにウェブオーディオ API を使用し、それと一緒に美しく視覚化するためにキャンバスを使用します。 - [Voice change-o-matic](https://github.com/mdn/voice-change-o-matic) — ウェブオーディオ API からのリアルタイムの音声データを視覚化するためにキャンバスを使用します。 -{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Third_party_APIs", "Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs", "Learn/JavaScript/Client-side_web_APIs")}} +{{PreviousMenuNext("Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs", "Learn_web_development/Extensions/Client-side_APIs/Client-side_storage", "Learn_web_development/Extensions/Client-side_APIs")}} diff --git a/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/trigonometry.png b/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/trigonometry.png new file mode 100644 index 00000000000000..5dd46e79bfac5a Binary files /dev/null and b/files/ja/learn_web_development/extensions/client-side_apis/drawing_graphics/trigonometry.png differ diff --git a/files/ja/learn_web_development/extensions/client-side_apis/index.md b/files/ja/learn_web_development/extensions/client-side_apis/index.md index fa113d63dc0e88..47b94538082574 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/index.md @@ -1,45 +1,36 @@ --- title: クライアントサイド Web API slug: Learn_web_development/Extensions/Client-side_APIs -original_slug: Learn/JavaScript/Client-side_web_APIs l10n: - sourceCommit: 904cdf09c7e328b7a15a6a4db6bc6bd31f969cce + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- {{LearnSidebar}} -ウェブサイトやアプリケーション用にクライアント側の JavaScript を書いていると、すぐに**アプリケーションプログラミングインターフェイス** (**A**pplication **P**rogramming **I**nterfaces、**API**) にでくわします。API とはブラウザーやサイトが動作している OS の様々な面を操作したり、他のウェブサイト、サービスから取得したデータを操作するためのプログラムされた機能です。このモジュールでは API とは何か、開発作業の中でよく見かける最もよく利用される API のいくつかについて、どのように使うかを説明していきます。 +{{NextMenu("Learn_web_development/Extensions/Client-side_APIs/Introduction", "Learn_web_development/Extensions")}} -> [!CALLOUT] -> -> #### フロントエンドのウェブ開発者を目指している方へ -> -> ゴールに向かって頑張るために必要な情報をまとめたコースをご用意しました。 -> -> [**始めましょう**](/ja/curriculum/) +**アプリケーションプログラミングインターフェイス** (Application Programming Interfaces、**API**) とは、ブラウザーやサイトが動作している OS の様々な面を操作したり、他のウェブサイト、サービスから取得したデータを操作するためのプログラムされた機能です。このモジュールでは API とは何か、開発作業の中でよく見かける最もよく利用される API のいくつかについて、どのように使うかを説明していきます。 ## 前提条件 -このモジュールをよく理解するためには、ここまでの一連の JavaScript に関するモジュール([第一歩](/ja/docs/Learn/JavaScript/First_steps)、[構成要素](/ja/docs/Learn/JavaScript/Building_blocks) と [JavaScript オブジェクト](/ja/docs/Learn/JavaScript/Objects))の学習をすませているべきです。これらのモジュールでは大抵簡単な API を使っていますが、その助けなしにクライアント側の JavaScript を書き上げるのは難しいからです。このチュートリアルの中では、JavaScript 言語のコア部分については十分理解しているものとして、よく使われる Web API についてもう少し詳しく探っていきます。 +このモジュールをよく理解するためには、 [JavaScript](/ja/docs/Learn_web_development/Core/Scripting) の基本、特に [JavaScript オブジェクトの基本](/ja/docs/Learn_web_development/Core/Scripting/Object_basics) と [DOM スクリプティング](/ja/docs/Learn_web_development/Core/Scripting/DOM_scripting)や[ネットワークリスクエスト](/ja/docs/Learn_web_development/Core/Scripting/Network_requests)などのコア API を扱っているものを学んでおいてください。 -[HTML](/ja/docs/Learn/HTML) と [CSS](/ja/docs/Learn/CSS) に関する基礎知識も役に立つでしょう。 +[HTML](/ja/docs/Learn_web_development/Core/Structuring_content) や [CSS](/ja/docs/Learn_web_development/Core/Styling_basics) に関する基礎知識も役に立つでしょう。 > [!NOTE] -> もし自分のファイルを作成できないような端末上で作業しているなら、大半のコード例を [JSBin](https://jsbin.com/) や [Glitch](https://glitch.com/) のようなオンラインプログラム作成・実行環境で試してみることもできます。 +> もし自分のファイルを作成できないような端末上で作業しているなら、(大半の)コード例を [JSBin](https://jsbin.com/) や [Glitch](https://glitch.com/) のようなオンラインプログラム作成・実行環境で試してみることもできます。 ## ガイド -- [Web API の紹介](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction) +- [Web API の紹介](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction) - : まずは API を高い視点から見ていきます — これは何なのか、どう働くのか、あなたのコードでどう使うのか、どういう風に作られているのか? また様々なクラスの API が何なのか、どんな使い方があるのかも見ていきます。 -- [文書の操作](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Manipulating_documents) - - : ウェブページやアプリケーションを書くとき、最も一般的なことのひとつは、何らかの方法でウェブ文書を操作することでしょう。これは通常、ドキュメントオブジェクトモデル (DOM) を使用することで行われます。これは HTML とスタイル設定情報をコントロールするための API のセットで、 {{domxref("Document")}} オブジェクトを多用します。この記事では、 DOM を使用する方法を詳しく見ていきます。また、他にも興味深い方法であなたの環境を変化させることができる API もいくつか紹介します。 -- [サーバーからのデータ取得](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Fetching_data) - - : また、現代のウェブサイトやアプリケーションでは、新しいページ全体を読み込むことなくウェブページの節を更新するために、サーバーから個々のデータ項目を取得することも非常に一般的なタスクです。この一見小さなことが、サイトのパフォーマンスや動作に大きな影響を及ぼしています。この記事では、この概念を説明し、 {{domxref("XMLHttpRequest")}} や [Fetch API](/ja/docs/Web/API/Fetch_API) など、これを可能にする技術について見ていきます。 -- [サードパーティの API](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Third_party_APIs) - - : これまで取り上げた API はブラウザーに内蔵されていますが、すべての API が内蔵されているわけではありません。 Google マップ、Twitter、Facebook、PayPal など、多くの大規模なウェブサイトやサービスが API を提供しており、開発者はそれらのデータ(例:ブログに Twitter のストリームを表示する)やサービス(例:サイトにカスタム Google マップを表示したり、 Facebook ログインを使ってユーザーにログインしてもらう)を使用することができます。この記事では、ブラウザー API とサードパーティ API の違いを見て、後者の典型的な使用方法をいくつか示します。 -- [グラフィックの描画](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Drawing_graphics) - - : ブラウザーにはグラフィックを描くためのとても強力なツールがいくつか組み込まれています。[SVG](/ja/docs/Web/SVG) (Scalable Vector Graphics) 言語から、 HTML の {{htmlelement("canvas")}} キャンバス要素に描画するための API ([キャンバス API](/ja/docs/Web/API/Canvas_API) や [WebGL](/ja/docs/Web/API/WebGL_API)を参照)まで。 この記事ではキャンバス API への導入を説明し、もっと深く学習していくためのリソースをご紹介します。 -- [動画と音声の API](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs) +- [動画と音声の API](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs) - : HTML には文書にリッチなメディアを埋め込むための要素 — {{htmlelement("video")}} と {{htmlelement("audio")}} — が備わっています。それぞれに再生やシークなどの操作するための独自 API を備えています。この記事では独自の再生操作パネルを作成するような、よくある仕事をどうやればいいのかお見せします。 -- [クライアント側ストレージ](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage) +- [グラフィックの描画](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Drawing_graphics) + - : ブラウザーにはグラフィックを描くためのとても強力なツールがいくつか組み込まれています。 [SVG](/ja/docs/Web/SVG) (Scalable Vector Graphics) 言語から、 HTML の {{htmlelement("canvas")}} キャンバス要素に描画するための API ([キャンバス API](/ja/docs/Web/API/Canvas_API) や [WebGL](/ja/docs/Web/API/WebGL_API) を参照)まで。 この記事ではキャンバス API への導入を説明し、もっと深く学習していくためのリソースをご紹介します。 +- [クライアント側ストレージ](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Client-side_storage) - : 現代のブラウザーには、ウェブサイトに関するデータを保存し必要なときに取り出すための様々に異なる技術が実装されており、これを使ってデータを長期間保存したり、サイトをオフラインに保存したりなどなどができます。この記事ではこれらがいかに動作するのか、その基本の基本について説明します。 +- [サードパーティの API](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Third_party_APIs) + - : これまで取り上げた API はブラウザーに内蔵されていますが、すべての API が内蔵されているわけではありません。 Google マップ、Twitter、Facebook、PayPal など、多くの大規模なウェブサイトやサービスが API を提供しており、開発者はそれらのデータ(例:ブログに Twitter のストリームを表示する)やサービス(例:サイトにカスタム Google マップを表示したり、 Facebook ログインを使ってユーザーにログインしてもらう)を使用することができます。この記事では、ブラウザー API とサードパーティ API の違いを見て、後者の典型的な使用方法をいくつか示します。 + +{{NextMenu("Learn_web_development/Extensions/Client-side_APIs/Introduction", "Learn_web_development/Extensions")}} diff --git a/files/ja/learn_web_development/extensions/client-side_apis/introduction/index.md b/files/ja/learn_web_development/extensions/client-side_apis/introduction/index.md index 2527ee2e5d1e8f..1f4aa621f90746 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/introduction/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/introduction/index.md @@ -1,12 +1,13 @@ --- title: Web API の紹介 slug: Learn_web_development/Extensions/Client-side_APIs/Introduction -original_slug: Learn/JavaScript/Client-side_web_APIs/Introduction l10n: - sourceCommit: 904cdf09c7e328b7a15a6a4db6bc6bd31f969cce + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- -{{LearnSidebar}}{{NextMenu("Learn/JavaScript/Client-side_web_APIs/Manipulating_documents", "Learn/JavaScript/Client-side_web_APIs")}} +{{LearnSidebar}} + +{{NextMenu("Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs", "Learn_web_development/Extensions/Client-side_APIs")}} まずは API を高い視点から見ていきます — これは何なのか、どう働くのか、あなたのコードでどう使うのか、どういう風に作られているのか? また様々なクラスの API は何なのか、どのような使い方があるのかも見ていきます。 @@ -15,20 +16,16 @@ l10n: 前提条件: - 基本的なコンピューターリテラシー、 - HTML、 - CSS、JavaScript の基本 - (第一歩、 - 構成要素、 - JavaScript のオブジェクト)の基本的な理解。 + HTMLCSSJavaScript に親しんでおくこと、特に JavaScript オブジェクトの基本DOM スクリプティングネットワークリスクエストなどのコア API を扱っているものを理解しておくこと。 - 目標: + 学習成果: - API に親しみ、API で何ができるのか、API をどのようにコードで使用するのかを知ること。 +
    +
  • Web API とは何か、 API を使って何ができるのか。
  • +
  • API がどのように使われるか。
  • +
@@ -53,7 +50,7 @@ _画像提供: [超タコ足コンセント](https://www.flickr.com/photos/easy- クライアントサイド API では、実際とてもたくさんの API が使えます、それらは JavaScript 言語本体の一部ではなく、あなたにスーパーパワーを与えるべく JavaScript 言語のコアの上に築かれた代物です。それらはおおよそ二つのカテゴリーに分けられます。 -- **ブラウザー API** はウェブブラウザーに組み込まれていて、ブラウザーやコンピューターの環境の情報を取得し、これを使って役に立つ複雑なことを行えるようにするものです。 例えば [ウェブオーディオ API](/ja/docs/Web/API/Web_Audio_API) は、ブラウザー内での音声を操作、たとえば音声トラックの取得、音量の変更、エフェクトの適用などを行うための JavaScript の仕組みを提供します。実際には、裏でブラウザーは低レベル(例えば C++ や Rust)の複雑なコードを使って実際の音声処理を行います。しかし、この複雑さを API が抽象化して隠蔽します。 +- **ブラウザー API** はウェブブラウザーに組み込まれていて、ブラウザーやコンピューターの環境の情報を取得し、これを使って役に立つ複雑なことを行えるようにするものです。 例えば [ウェブオーディオ API](/ja/docs/Web/API/Web_Audio_API) は、ブラウザー内での音声の操作、たとえば音声トラックの取得、音量の変更、エフェクトの適用などを行うための JavaScript の仕組みを提供します。実際には、裏でブラウザーは低レベル(例えば C++ や Rust)の複雑なコードを使って実際の音声処理を行います。しかし、この複雑さを API が抽象化して隠蔽します。 - **サードパーティ API** は既定ではブラウザーに組み込まれておらず、一般的にウェブのどこかから、コードと情報を取得する必要があります。例えば [Twitter API](https://developer.twitter.com/ja/docs) を使うと、自分のウェブサイトに自分の最新のツイートを表示したりすることができます。これは、 Twitter サービスに問い合わせを行い、特定の情報を返すために使用することができる特別な一連の仕組みを提供します。 ![ブラウザーに firefox ブラウザーのホームページを開いた状態のスクリーンショット。既定でブラウザーに組み込まれている API があります。サードパーティの API は既定でブラウザーに組み込まれているわけではありません。それらのコードや情報を利用するためには、ウェブ上のどこかから取得する必要があります。](browser.png) @@ -62,10 +59,10 @@ _画像提供: [超タコ足コンセント](https://www.flickr.com/photos/easy- ここまででクライアントサイド API とは何か、JavaScript 言語とどう関係しているのかお話しました。もっとはっきりさせるために一度おさらいして、ついでに他の JavaScript ツールがどう関係してくるのかもお話しましょう。 -- JavaScript — ブラウザーに組込まれた高水準スクリプト言語で、ウェブページやアプリに機能を実装するのに使うことができます。 [Node](/ja/docs/Learn/Server-side/Express_Nodejs/Introduction) のようなブラウザー以外の他のプログラミング環境でも使えます。 +- JavaScript — ブラウザーに組込まれた高水準スクリプト言語で、ウェブページやアプリに機能を実装するのに使うことができます。 [Node](/ja/docs/Learn_web_development/Extensions/Server-side/Express_Nodejs/Introduction) のようなブラウザー以外の他のプログラミング環境でも使えます。 - ブラウザー API — JavaScript 言語の上に乗って、より簡単に機能を実装するためにブラウザーに組み込まれた仕組みです。 - サードパーティ API — サードパーティのプラットフォーム(Twitter や Facebook など)上に作られた構造で、それらのプラットフォームの機能をウェブページで利用できるようにします(例えば自分の最新のツイートを自分のウェブページに表示するなど)。 -- JavaScript ライブラリー — 多くは、[独自の関数](/ja/docs/Learn/JavaScript/Building_blocks/Build_your_own_function)を含んだ 1 つ以上の JavaScript ファイルで、ウェブページに装着することで、スピードアップさせたりよくある機能を書いたりできるものです。例えば、jQuery、Mootools、React などがあります。 +- JavaScript ライブラリー — 多くは、[独自の関数](/ja/docs/Learn_web_development/Core/Scripting/Build_your_own_function)を含んだ 1 つ以上の JavaScript ファイルで、ウェブページに装着することで、スピードアップさせたりよくある機能を書いたりできるものです。例えば、jQuery、Mootools、React などがあります。 - JavaScript フレームワーク — ライブラリーの一階層上にあたる JavaScript フレームワーク(Angular や Ember など)は、HTML、CSS、JavaScript などの技術をパッケージ化してインストールする傾向があり、これを使用してウェブアプリケーション全体をゼロから書きます。ライブラリーとフレームワークの大きな違いは、「制御の逆転 (Inversion of Control)」です。ライブラリーからメソッドを呼び出す場合、制御するのは開発者です。フレームワークでは、制御が逆転しています。フレームワークが開発者のコードを呼び出すのです。 ## API で何ができる? @@ -76,28 +73,26 @@ _画像提供: [超タコ足コンセント](https://www.flickr.com/photos/easy- 特に、使用する(このモジュールでより詳細に取り上げる)ブラウザー API の最も一般的なカテゴリーは、次のとおりです。 -- ブラウザーに読み込まれた**文書を操作するための API**。最も顕著な例は [DOM (Document Object Model) API](/ja/docs/Web/API/Document_Object_Model) で、 HTML と CSS を操作することができます。 HTML を作成、削除、書き換えしたり、動的に新しいスタイルをページに適用したり、などなど。例えばページにポップアップウィンドウが表われたり、何か新しい中身が表示されたりする時、DOM が使われています。この種の API について、詳しくは[文書の操作](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Manipulating_documents#ドキュメントオブジェクトモデル)で分かります。 -- **サーバーからのデータ取得 API** で、ウェブページの小さな部分を自分自身で更新するために、とてもよく使用されています。この一見すると些細なことが、サイトのパフォーマンスや動作に大きな影響を与えてきました。株価リストや利用できる新着記事のリストを更新するだけなら、ページ全体をサーバーから再読み込みすることなく瞬時に行うことで、サイトやアプリの応答性や「キビキビ感」がずっと良くなります。このために使用される主な API は [Fetch API](/ja/docs/Web/API/Fetch_API) ですが、古いコードではまだ [`XMLHttpRequest`](/ja/docs/Web/API/XMLHttpRequest) API を使用している場合があります。また、この技術を記述した **Ajax** という用語に出会うこともあります。このような API については、[サーバーからのデータ取得](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Fetching_data)で詳しく調べてください。 +- ブラウザーに読み込まれた**文書を操作するための API**。最も顕著な例は [DOM (Document Object Model) API](/ja/docs/Web/API/Document_Object_Model) で、 HTML と CSS を操作することができます。 HTML を作成、削除、書き換えしたり、動的に新しいスタイルをページに適用したり、などなど。例えばページにポップアップウィンドウが表われたり、何か新しい中身が表示されたりする時、DOM が使われています。この種の API について、詳しくは[文書の操作](/ja/docs/Learn_web_development/Core/Scripting/DOM_scripting#ドキュメントオブジェクトモデル)で分かります。 +- **サーバーからのデータ取得 API** で、ウェブページの小さな部分を自分自身で更新するために、とてもよく使用されています。この一見すると些細なことが、サイトのパフォーマンスや動作に大きな影響を与えてきました。株価リストや利用できる新着記事のリストを更新するだけなら、ページ全体をサーバーから再読み込みすることなく瞬時に行うことで、サイトやアプリの応答性や「キビキビ感」がずっと良くなります。このために使用される主な API は [Fetch API](/ja/docs/Web/API/Fetch_API) ですが、古いコードではまだ [`XMLHttpRequest`](/ja/docs/Web/API/XMLHttpRequest) API を使用している場合があります。また、この技術を記述した **AJAX** という用語に出会うこともあります。このような API については、[サーバーからのデータ取得](/ja/docs/Learn_web_development/Core/Scripting/Network_requests)で詳しく調べてください。 - **グラフィックの描画や操作のための API** は、ブラウザーが広く対応しています。最も普及しているのは[キャンバス](/ja/docs/Web/API/Canvas_API)と [WebGL](/ja/docs/Web/API/WebGL_API) で、HTML の {{htmlelement("canvas")}} 要素に含まれるピクセルデータをプログラムで更新して 2D や 3D の場面を作成することが可能です。例えば、矩形や円などの図形を描いたり、画像をキャンバス上に取り込んで、キャンバス API を使用してセピアやグレースケールなどのフィルターを適用したり、WebGL を使用して照明やテクスチャを含む複雑な 3D シーンを作成したりすることができます。こうした API は、アニメやゲームのように常に更新される場面を作るために、アニメーションのループを作成する API({{domxref("window.requestAnimationFrame()")}} など)とよく組み合わせて使用されます。 - **[動画と音声の API](/ja/docs/Web/Media/Audio_and_video_delivery)** 、例えば {{domxref("HTMLMediaElement")}}、[ウェブオーディオ API](/ja/docs/Web/API/Web_Audio_API)、[WebRTC](/ja/docs/Web/API/WebRTC_API) などを使用すると、音声や動画を再生するためのカスタム UI コントロールを作成したり、動画と一緒にキャプションや字幕などのテキストトラックを表示したり、ウェブカメラから動画を取得してキャンバス(上記参照)を介して操作したり、ウェブ会議で他の人のコンピューターに表示したり、音声にエフェクト(ゲイン、歪曲、パンニングなど)を追加したりと、マルチメディアを使って実に興味深いことを行うことができます。 - **端末 API** は、端末のハードウェアと対話することができます。例えば、[位置情報 API](/ja/docs/Web/API/Geolocation_API) を使用すると、端末の GPS にアクセスしてユーザーの位置を特定することが可能です。 -- **クライアント側でのデータ保持 API** は今多くのブラウザーに普及しつつあります。— クライアント側にデータを保存できると、ページを移動しても状態を保存したり、たとえデバイスがオフラインでも動作するようなアプリを作成したいような場合、とても役に立ちます。いくつもの選択肢があり、例えば [Web Storage API](/ja/docs/Web/API/Web_Storage_API) を使ったキーバリューストアや、 [IndexedDB API](/ja/docs/Web/API/IndexedDB_API) を使ったもっと複雑なテーブル型データ保存などです。 +- **クライアント側でのデータ保持 API** は今多くのブラウザーに普及しつつあります。— クライアント側にデータを保存できると、ページを移動しても状態を保存したり、たとえデバイスがオフラインでも動作するようなアプリを作成したいような場合、とても役に立ちます。いくつもの選択肢があり、例えば[ウェブストレージ API](/ja/docs/Web/API/Web_Storage_API) を使ったキーバリューストアや、 [IndexedDB API](/ja/docs/Web/API/IndexedDB_API) を使ったもっと複雑なテーブル型データ保存などです。 ### 一般的なサードパーティ API サードパーティ API はバラエティーに富んでいます。遅かれ早かれ使うことになりそうな、世間でよく使われているものには以下のようなものがあります。 -- [Twitter API](https://developer.twitter.com/ja/docs)、これで自分の最新のツイート自分のウェブサイトにしたりすることができます。 - [Mapquest](https://developer.mapquest.com/) や [Google Maps API](https://developers.google.com/maps/) のような地図の API で、ウェブページ上の地図で様々なことをすることができます。 - [Facebook API スイート](https://developers.facebook.com/docs/)によって Facebook エコシステムの様々な部品を使ってあなたのアプリを強化できます。例えばアプリへのログインを Facebook のログインで行なったり、アプリ内での支払い、ターゲット広告を出したりなどです。 - [Telegram API](https://core.telegram.org/api) を使用すると、ボットのサポートに加えて、Telegram チャネルのコンテンツをウェブサイトに埋め込むことができます。 - [YouTube API](https://developers.google.com/youtube/) を使うと、サイトに YouTube の動画を埋め込んだり、 YouTube を検索したり、プレイリストを作成したりすることができます。 - [Pinterest API](https://developers.pinterest.com/) は、 Pinterest のボードとピンを管理して、ウェブサイトに表示するためのツールを提供します。 - [Twilio API](https://www.twilio.com/) は、自分のアプリに音声や動画の通話機能を作成したり、SMS/MMS を送信したりなどするためのフレームワークを提供します。 +- [Disqus API](https://disqus.com/api/docs/) は、自分のサイトに統合できるコメントプラットフォームを提供します。 - [Mastodon API](https://docs.joinmastodon.org/api/) を使用すると、Mastodon ソーシャルネットワークの機能をプログラムで操作できます。 - -> [!NOTE] -> サードパーティ API については [Programmable Web API directory](http://www.programmableweb.com/category/all/apis) でもっと多くの情報を見られます。 +- [IFTTT API](https://ifttt.com/developers) は、 1 つのプラットフォームで複数の API を統合できます。 ## API はどのように動作するのか @@ -105,10 +100,10 @@ _画像提供: [超タコ足コンセント](https://www.flickr.com/photos/easy- ### オブジェクトベース -コードは 1 つ以上の [JavaScript オブジェクト](/ja/docs/Learn/JavaScript/Objects)を使用して API と対話します。オブジェクトは API が使用するデータ(オブジェクトプロパティに含まれる)、および API が利用可能にする機能(オブジェクトメソッドに含まれる)のコンテナーとして機能します。 +コードは 1 つ以上の [JavaScript オブジェクト](/ja/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects)を使用して API と対話します。オブジェクトは API が使用するデータ(オブジェクトプロパティに含まれる)、および API が利用可能にする機能(オブジェクトメソッドに含まれる)のコンテナーとして機能します。 > [!NOTE] -> もし、まだオブジェクトがどのように動作するのかよくわからない場合は、先に進む前に [JavaScript オブジェクト](/ja/docs/Learn/JavaScript/Objects)モジュールに戻って練習をしてください。 +> もし、まだオブジェクトがどのように動作するのかよくわからない場合は、先に進む前に [JavaScript オブジェクト](/ja/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects)モジュールに戻って練習をしてください。 ウェブオーディオ API の例に戻ってみましょう。ウェブオーディオ API はとても複雑な API で、たくさんのオブジェクトから成り立っています。わかりやすいものでいうと下記が挙げられます。 @@ -133,7 +128,6 @@ _画像提供: [超タコ足コンセント](https://www.flickr.com/photos/easy- まず、トラックを操作するための `AudioContext` インスタンスを作成します。 ```js -const AudioContext = window.AudioContext || window.webkitAudioContext; const audioCtx = new AudioContext(); ``` @@ -231,11 +225,11 @@ Ball.prototype.draw = function () { ``` > [!NOTE] -> この実例を[弾むボールのデモ](https://github.com/mdn/learning-area/blob/main/javascript/apis/introduction/bouncing-balls.html) で見られます([ライブ実行](https://mdn.github.io/learning-area/javascript/apis/introduction/bouncing-balls.html) も見てください)。 +> この例を[バウンスボールのデモ](https://github.com/mdn/learning-area/blob/main/javascript/apis/introduction/bouncing-balls.html) で見られます([ライブ実行](https://mdn.github.io/learning-area/javascript/apis/introduction/bouncing-balls.html) も見てください)。 -### 状態の変化を捉えるのにイベントを使う +### イベントを使用して状態の変化を捉えることが多い -イベントについては、このコースの早い段階で、[イベントへの入門](/ja/docs/Learn/JavaScript/Building_blocks/Events)という記事ですでに説明しましたが、この記事ではクライアントサイドのウェブイベントとは何か、そしてそれらがコードでどのように使用されるかについて詳細に見ています。もしあなたがクライアントサイドのウェブ API イベントがどのように動作するかについてまだよく知らないのであれば、先にこの記事を読んでから続きを読んでください。 +イベントについては、このコースの早い段階で、[イベントへの入門](/ja/docs/Learn_web_development/Core/Scripting/Events)という記事ですでに説明しましたが、この記事ではクライアントサイドのウェブイベントとは何か、そしてそれらがコードでどのように使用されるかについて詳細に見ています。もしあなたがクライアントサイドのウェブ API イベントがどのように動作するかについてまだよく知らないのであれば、先にこの記事を読んでから続きを読んでください。 ウェブ API の中にはイベントを含まないものもありますが、ほとんどは少なくともいくつかのイベントを含んでいます。イベントが発行されたときに関数を動作させるためのハンドラープロパティは、一般に、リファレンス資料の中で個々の「イベントハンドラー」の節に掲載されています。 @@ -280,10 +274,10 @@ WebAPI 機能は、 JavaScript や他のウェブ技術(例えば [同一オ ウェブオーディオ API や {{domxref("HTMLMediaElement")}} API には、[自動再生ポリシー](/ja/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy)と呼ばれるセキュリティ機構が適用されます。これは、基本的に、ページの読み込み時に音声を自動的に再生できないことを意味します。ユーザーに次のことを許可する必要があります。ボタンのようなコントロールを介して音声再生を開始します。これは、音声の自動再生は通常非常に煩わしいものであり、ユーザーにそれを課すべきではないためです。 > [!NOTE] -> ブラウザーの厳格さによっては、このようなセキュリティ機構により、例がローカルでは動作しなくなる場合があります。つまり、ローカルの例のファイルをウェブサーバーから実行するのではなく、ブラウザーに読み込んだ場合です。執筆時点では、ウェブオーディオ API の例はローカルでは Google Chrome で動作しません。動作する前に、GitHub にアップロードする必要がありました。 +> ブラウザーの厳格さ次第では、このようなセキュリティ機構により、例がローカル、つまり、例のファイルをウェブサーバーから実行するのではなく、ローカルからブラウザーに読み込んだ場合には動作しなくなる場合があります。執筆時点では、ウェブオーディオ API の例はローカルでは Google Chrome で動作しません。動作する前に、GitHub にアップロードする必要がありました。 ## まとめ -この時点で、 API が何であるか、それがどのように動作するか、そして JavaScript コードで API を使って何ができるかについて、よく分かったはずです。おそらく、実際に特定の API を使って楽しいことを始めることに期待していることでしょうから、さっそく始めましょう。次は、 Document Object Model (DOM) を使った文書内の操作について見ていきます。 +この時点で、 API が何であるか、それがどのように動作するか、そして JavaScript コードで API を使って何ができるかについて、よく分かったはずです。おそらく、実際に特定の API を使って楽しいことを始めることに期待していることでしょうから、さっそく始めましょう。次は、動画と音声の API を見てみましょう。 -{{NextMenu("Learn/JavaScript/Client-side_web_APIs/Manipulating_documents", "Learn/JavaScript/Client-side_web_APIs")}} +{{NextMenu("Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs", "Learn_web_development/Extensions/Client-side_APIs")}} diff --git a/files/ja/learn_web_development/extensions/client-side_apis/third_party_apis/index.md b/files/ja/learn_web_development/extensions/client-side_apis/third_party_apis/index.md index d23df3a535705a..10aa8727d0b162 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/third_party_apis/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/third_party_apis/index.md @@ -1,12 +1,13 @@ --- title: サードパーティ API slug: Learn_web_development/Extensions/Client-side_APIs/Third_party_APIs -original_slug: Learn/JavaScript/Client-side_web_APIs/Third_party_APIs l10n: - sourceCommit: bc0d0d1ef796435e969f6d65c7e5d3c08f4023aa + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- -{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Fetching_data", "Learn/JavaScript/Client-side_web_APIs/Drawing_graphics", "Learn/JavaScript/Client-side_web_APIs")}} +{{LearnSidebar}} + +{{PreviousMenu("Learn_web_development/Extensions/Client-side_APIs/Client-side_storage", "Learn_web_development/Extensions/Client-side_APIs")}} これまで説明してきた API はブラウザーに組み込まれていましたが、すべての API がそうというわけではありません。Google マップ、Twitter、Facebook、PayPal などの大規模なサイトやサービスの多くは開発者がそれらのデータ(ブログに Twitter のストリームを表示するなど)やサービス(ユーザーのログインに Facebook ログインを利用するなど)を利用できるように API を提供しています。この記事ではブラウザー API とサードパーティ API の違いを見て、後者の典型的な使い方について説明します。 @@ -15,38 +16,32 @@ l10n: 前提知識: - JavaScript の基本 - (第一歩、 - 構成要素, - JavaScript のオブジェクト)、 - クライアントサイド API の基本 + HTMLCSSJavaScript に親しんでおくこと、特に JavaScript オブジェクトの基本DOM スクリプティングネットワークリスクエストなどのコア API を扱っているものを理解しておくこと。 - 目的: + 学習成果: - サードパーティ API の仕組み、それらを利用してウェブサイトを強化する方法を学習すること。 +
    +
  • サードパーティ API の背後にある概念と、 API キーなどの関連パターン。
  • +
  • サードパーティの地図 API を使用すること。
  • +
  • RESTful API を使用すること。
  • +
  • Google の YouTube API を使用すること。
  • +
-## サードパーティ API とは? +## サードパーティ API とは サードパーティ API は、サードパーティ(通常は Facebook、Twitter、Google などの企業)が提供する API で、JavaScript を介して機能にアクセスしてサイトで使用することができます。最もわかりやすい例の 1 つとして、マッピング API を使用してページにカスタム地図を表示することがあります。 [Simple Mapquest API の例](https://github.com/mdn/learning-area/tree/main/javascript/apis/third-party-apis/mapquest)を参考に、サードパーティ API とブラウザー API の違いを説明します。 -> [!NOTE] -> 一度に[すべてのコード例を取得](/ja/docs/Learn#コード例の入手)したいかもしれませんが、その場合は、それぞれの節で必要な例ファイルをリポジトリーから検索すればよいでしょう。 - ### サードパーティのサーバーにある -ブラウザー API はブラウザーに組み込まれており、すぐに JavaScript からアクセスできます。たとえば、[紹介記事で見た](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction#api_はどのように動作するのか)ウェブオーディオ API は、ネイティブの {{domxref("AudioContext")}} オブジェクトを使ってアクセスします。例えば以下のようにします。 +ブラウザー API はブラウザーに組み込まれており、すぐに JavaScript からアクセスできます。たとえば、[紹介記事で見た](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction#api_はどのように動作するのか)ウェブオーディオ API は、ネイティブの {{domxref("AudioContext")}} オブジェクトを使ってアクセスします。例えば以下のようにします。 ```js const audioCtx = new AudioContext(); @@ -80,14 +75,14 @@ const map = L.mapquest.map("map", { ここでは、地図情報を格納するための変数を作成し、次に `mapquest.map()` メソッドを使用して新しい地図を作成します。このメソッドは、必要な {{htmlelement("div")}} 要素の ID を受け取ります。('map') で地図を表示し、表示したい特定の地図の詳細を含む options オブジェクトを表示します。この場合は、地図の中心座標、表示する `map` 型の地図レイヤー (`mapquest.tileLayer()` メソッドを使用して作成)、および既定のズームレベルを指定します。 -これが、Mapquest API が単純な地図を描くために必要なすべての情報です。接続しているサーバーは、表示されている地域の正しい地図タイルを表示するなど、複雑なものをすべて処理します。 +これが、 Mapquest API が単純な地図を描くために必要なすべての情報です。接続しているサーバーは、表示されている地域の正しい地図タイルを表示するなど、複雑なものをすべて処理します。 > [!NOTE] > API の中には、機能へのアクセスをわずかに異なる方法で処理するものがあり、開発者はデータを取得するために特定の URL パターンに対して HTTP リクエストを行う必要があります。これらは [RESTful API と呼ばれ、後で例が出てきます](#restful_api_—_nytimes)。 -### 通常は API キーが必要です +### 通常は API キーが必要 -[最初の記事で説明した](/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction#必要に応じて追加のセキュリティ機構がある)ように、ブラウザー API のセキュリティは許可プロンプトによって処理される傾向があります。これらの目的は、ユーザーが訪問したウェブサイトで何が起こっているのかをユーザー自身が認識できるようにし、悪意のある方法で API を使用している人の被害にあう可能性を低くすることです。 +[最初の記事で説明した](/ja/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction#必要に応じて追加のセキュリティ機構がある)ように、ブラウザー API のセキュリティは許可プロンプトによって処理される傾向があります。これらの目的は、ユーザーが訪問したウェブサイトで何が起こっているのかをユーザー自身が認識できるようにし、悪意のある方法で API を使用している人の被害にあう可能性を低くすることです。 サードパーティの API には、少し異なる権限システムがあります。開発者が API 機能にアクセスできるようにするために開発者キーを使用する傾向があります。 @@ -104,14 +99,14 @@ L.mapquest.key = "YOUR-API-KEY-HERE"; 他の API では、少し異なる方法でキーを含める必要があるかもしれませんが、ほとんどのパターンは比較的似ています。 -キーを要求することで、API プロバイダーは API のユーザーに自分のアクションに対する責任を持たせることができます。開発者がキーを登録すると、それらは API プロバイダに認識され、彼らが API に悪意のあることをし始めたらアクション(たとえば、人々の位置を追跡したり、API を機能させないために大量のリクエストで API をスパムしようとするなど)を取ることができます。最も簡単なアクションは、単にそれらの API 特権を取り消すことです。 +キーを必須とすることで、API プロバイダーは API のユーザーに自分のアクションに対する責任を持たせることができます。開発者がキーを登録すると、それらは API プロバイダに認識され、彼らが API に悪意のあることをし始めたらアクション(たとえば、人々の位置を追跡したり、API を機能させないために大量のリクエストで API をスパムしようとするなど)を取ることができます。最も簡単なアクションは、単にそれらの API 権限を取り消すことです。 ## Mapquest の例を拡張する -API の他の機能の使用方法を示すために、Mapquest の例にさらに機能を追加しましょう。 +API の他の機能の使用方法を示すために、 Mapquest の例にさらに機能を追加しましょう。 -1. この節を始めるにあたり、新しいディレクトリーに [mapquest starter file](https://github.com/mdn/learning-area/blob/main/javascript/apis/third-party-apis/mapquest/start/index.html) をコピーしましょう。もしもすでに[例のリポジトリー](/ja/docs/Learn#コード例の入手)をクローンしているようなら、必要な _javascript/apis/third-party-apis/mapquest/start_ を見つけてコピーしてください。 -2. 次に [Mapquest developer site](https://developer.mapquest.com/) に行ってください。アカウントを作り、開発者キーを使用してサンプルに利用してください。(アカウント作成時、開発者キーは "consumer key" と呼ばれています。そして、"callback URL" を尋ねられると思いますが、その入力欄は空欄でかまいません。) +1. この節を始めるにあたり、新しいディレクトリーに [mapquest starter file](https://github.com/mdn/learning-area/blob/main/javascript/apis/third-party-apis/mapquest/start/index.html) をコピーしましょう。もしもすでに[例のリポジトリー](https://github.com/mdn/learning-area)をクローンしているようなら、必要な _javascript/apis/third-party-apis/mapquest/start_ を見つけてコピーしてください。 +2. 次に [Mapquest developer site](https://developer.mapquest.com/) に行ってください。アカウントを作り、開発者キーを使用してサンプルに利用してください。(アカウント作成時、開発者キーは "consumer key" と呼ばれています。そして、 "callback URL" を尋ねられると思いますが、その入力欄は空欄でかまいません。) 3. starting file を開き、API キーのプレースホルダーに自分のキーを入力してください。 ### 地図の種類を変更する @@ -173,7 +168,7 @@ L.marker([53.480759, -2.242631], { ## RESTful API — NYTimes -では、もう一つの API の例を見てみましょう — [New York Times API](https://developer.nytimes.com/) です。この API を使用すると、New York Times のニュースストーリー情報を取得して、サイトに表示することができます。この種類の API は **RESTful API** として知られています。Mapquest で行ったように JavaScript ライブラリーの機能を使用してデータを取得するのではなく、特定の URL に HTTP リクエストを行い、検索語やその他のプロパティのようなデータを URL 内にエンコードしてデータを取得します(多くの場合、URL 引数として)。これは、API でよく見られるパターンです。 +では、もう一つの API の例を見てみましょう。 [New York Times API](https://developer.nytimes.com/) です。この API を使用すると、New York Times のニュースストーリー情報を取得して、サイトに表示することができます。この種類の API は **RESTful API** として知られています。Mapquest で行ったように JavaScript ライブラリーの機能を使用してデータを取得するのではなく、特定の URL に HTTP リクエストを行い、検索語やその他のプロパティのようなデータを URL 内にエンコードしてデータを取得します(多くの場合、URL 引数として)。これは、API でよく見られるパターンです。 以下では、 NYTimes API の使用方法を示すエクササイズを紹介しますが、新しい API を使用するためのアプローチとして、より一般的なステップのセットを提供します。 @@ -187,7 +182,7 @@ L.marker([53.480759, -2.242631], { 1. 記事検索 API のキーを要求してみよう — 新規アプリを作成し、これを利用したい API として選択します (名前と説明を記入し、「記事検索 API 」の下のスイッチをオンに切り替えて「作成」をクリックします)。 2. 結果のページから API キーを取得します。 -3. さて、例題を始めるために、 [nytimes/start](https://github.com/mdn/learning-area/tree/main/javascript/apis/third-party-apis/nytimes/start) ディレクトリー内のすべてのファイルをコピーしてください。すでに [examples リポジトリーをクローン](/ja/docs/Learn#コード例の入手)している場合は、 _javascript/apis/third-party-apis/nytimes_ ディレクトリーに既にこれらのファイルのコピーがあります。最初に `script.js` ファイルには、例のセットアップに必要な変数がいくつか含まれています。以下では、必要な機能を埋めていきます。 +3. さて、例題を始めるために、 [nytimes/start](https://github.com/mdn/learning-area/tree/main/javascript/apis/third-party-apis/nytimes/start) ディレクトリー内のすべてのファイルをコピーしてください。すでに [examples リポジトリー](https://github.com/mdn/learning-area)をクローンしている場合は、 _javascript/apis/third-party-apis/nytimes_ ディレクトリーに既にこれらのファイルのコピーがあります。最初に `script.js` ファイルには、例のセットアップに必要な変数がいくつか含まれています。以下では、必要な機能を埋めていきます。 このアプリは、検索用語とオプションの開始日と終了日を入力することを可能にし、 Article Search API をクエリーして検索結果を表示するために使用します。 @@ -256,7 +251,7 @@ https://api.nytimes.com/svc/search/v2/articlesearch.json?api-key=YOUR-API-KEY-HE > どのような URL 引数を含めることができるかについての詳細は、[NYTimes developer docs](https://developer.nytimes.com/) を参照してください。 > [!NOTE] -> この例では初歩的なフォームデータの検証を行っています — 検索語フィールドは、フォームを送信する前に入力しなければなりません (`required` 属性を使用して達成されます)。日付フィールドには `pattern` 属性が指定されており、値が 8 個の数字 (`pattern="[0-9]{8}"`) で構成されていないと送信されません。これらがどのように機能するかについての詳細は[フォームデータ検証](/ja/docs/Learn/Forms/Form_validation)を参照してください。 +> この例では初歩的なフォームデータの検証を行っています — 検索語フィールドは、フォームを送信する前に入力しなければなりません (`required` 属性を使用して達成されます)。日付フィールドには `pattern` 属性が指定されており、値が 8 個の数字 (`pattern="[0-9]{8}"`) で構成されていないと送信されません。これらがどのように機能するかについての詳細は[フォームデータ検証](/ja/docs/Learn_web_development/Extensions/Forms/Form_validation)を参照してください。 ### API からデータを要求する @@ -265,7 +260,7 @@ https://api.nytimes.com/svc/search/v2/articlesearch.json?api-key=YOUR-API-KEY-HE 以下のコードブロックを `fetchResults()` 関数の中に追加してください。 ```js -// Use fetch() to make the request to the API +// fetch() を使用して、 API へのリクエストを作成する fetch(url) .then((response) => response.json()) .then((json) => displayResults(json)) @@ -388,7 +383,7 @@ function displayResults(json) { この例は、2 つの関連するサードパーティ API を一緒に使用してアプリを構築していることを示しているので興味深いです。1 つ目は RESTful API で、2 つ目は Mapquest のように動作します (API 固有のメソッドなどがあります)。ただし、どちらの API もページに適用するために JavaScript ライブラリーを必要とする点は注目に値します。RESTful API には、HTTP リクエストを行い、結果を返すための関数が用意されています。 -![関連する 2 つの API を使用した Youtube 動画検索のサンプルのスクリーンショット。画像の横に並んでいるのは、 YouTube Data API を使用した検索クエリーのサンプルです。画像の横に並んでいるのは、 Youtube Iframe Player API を使用して検索した結果を表示しています。](youtube-example.png) +![関連する 2 つの API を使用した Youtube 動画検索のサンプルのスクリーンショット。画像の横に並んでいるのは、 YouTube Data API を使用した検索クエリーのサンプルです。画像の横に並んでいるのは、 YouTube Iframe Player API を使用して検索した結果を表示しています。](youtube-example.png) この例については、記事の中ではあまり多くを語るつもりはありません。[ソースコード](https://github.com/mdn/learning-area/tree/main/javascript/apis/third-party-apis/youtube)には、それがどのように動作するかを説明するために、その中に詳細なコメントが挿入されています。 @@ -404,4 +399,4 @@ function displayResults(json) { この記事では、サードパーティ API を使用してウェブサイトに機能を追加するための便利な方法を紹介しました。 -{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Fetching_data", "Learn/JavaScript/Client-side_web_APIs/Drawing_graphics", "Learn/JavaScript/Client-side_web_APIs")}} +{{PreviousMenu("Learn_web_development/Extensions/Client-side_APIs/Client-side_storage", "Learn_web_development/Extensions/Client-side_APIs")}} diff --git a/files/ja/learn_web_development/extensions/client-side_apis/video_and_audio_apis/index.md b/files/ja/learn_web_development/extensions/client-side_apis/video_and_audio_apis/index.md index b836503dd1d594..5f307d004a4ab0 100644 --- a/files/ja/learn_web_development/extensions/client-side_apis/video_and_audio_apis/index.md +++ b/files/ja/learn_web_development/extensions/client-side_apis/video_and_audio_apis/index.md @@ -1,12 +1,13 @@ --- title: 動画と音声の API slug: Learn_web_development/Extensions/Client-side_APIs/Video_and_audio_APIs -original_slug: Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs l10n: - sourceCommit: 05d8b0eb3591009b6b7fee274bb7ed1bc5638f18 + sourceCommit: 5b20f5f4265f988f80f513db0e4b35c7e0cd70dc --- -{{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Drawing_graphics", "Learn/JavaScript/Client-side_web_APIs/Client-side_storage", "Learn/JavaScript/Client-side_web_APIs")}} +{{LearnSidebar}} + +{{PreviousMenuNext("Learn_web_development/Extensions/Client-side_APIs/Introduction", "Learn_web_development/Extensions/Client-side_APIs/Drawing_graphics", "Learn_web_development/Extensions/Client-side_APIs")}} HTML にはリッチメディアを文書内に埋め込むための要素、 {{htmlelement("video")}} と {{htmlelement("audio")}} があり、それらには再生やシークなどを制御するための独自の API が付属しています。この記事では、カスタム再生コントロールの作成など、よくある作業の方法を紹介します。 @@ -15,20 +16,17 @@ HTML にはリッチメディアを文書内に埋め込むための要素、 {{ 前提条件: - JavaScript の基本(最初のステップ、 - 構成要素、 - JavaScript オブジェクト)、 - クライアント側 API の基本 + HTMLCSSJavaScript に親しんでおくこと、特に JavaScript オブジェクトの基本DOM スクリプティングネットワークリスクエストなどのコア API を扱っているものを理解しておくこと。 - 目的: + 学習成果: - ブラウザー API を使用して動画や音声の再生を操作する方法を学ぶこと。 +
    +
  • コーデックとは何か、そして異なる動画と音声の形式について。
  • +
  • 音声と動画に関連付けられた主な機能(再生、一時停止、停止、早送り・巻き戻し、再生時間、現在時点)を理解すること。
  • +
  • HTMLMediaElement API を使用して、基本的なカスタムメディアプレーヤーを構築することで、アクセシビリティが向上し、すべてのブラウザーで十分に対応できるようになります。
  • +
@@ -36,17 +34,14 @@ HTML にはリッチメディアを文書内に埋め込むための要素、 {{ ## HTML での動画と音声 -{{htmlelement("video")}} と {{htmlelement("audio")}} 要素で、ウェブページに動画や音声を埋め込むことができます。[動画と音声のコンテンツ](/ja/docs/Learn/HTML/Multimedia_and_embedding/Video_and_audio_content)で示したように、典型的な実装はこのような形になります。 +{{htmlelement("video")}} と {{htmlelement("audio")}} 要素で、ウェブページに動画や音声を埋め込むことができます。[動画と音声のコンテンツ](/ja/docs/Learn_web_development/Core/Structuring_content/HTML_video_and_audio)で示したように、典型的な実装はこのような形になります。 -```html +```html-nolint ``` @@ -102,7 +97,6 @@ HTML のインデックスファイルを開いてください。多くの機能 ``` - プレイヤー全体は {{htmlelement("div")}} 要素で囲まれているため、必要に応じて 1 つの単位としてスタイル設定することができます。 - - {{htmlelement("video")}} 要素には 2 つの {{htmlelement("source")}} 要素が含まれているので、サイトを表示しているブラウザーに応じて異なる形式を読み込むことができます。 - 最も興味深いのは、操作用の HTML でしょう。 @@ -170,7 +164,7 @@ button:before { 次に、生成コンテンツを使用して、各ボタンにアイコンを表示します。 - {{cssxref("::before")}} セレクターを、それぞれの {{htmlelement("button")}} 要素の前にコンテンツを表示するために、使用しています。 -- それぞれの場合に表示するコンテンツは、 {{cssxref("content")}} プロパティを使って、[`data-icon`](/ja/docs/Learn/HTML/Howto/Use_data_attributes) 属性のコンテンツと等しくなるよう設定しています。再生ボタンの場合、 `data-icon` は大文字の "P" を含んでいます。 +- それぞれの場合に表示するコンテンツは、 {{cssxref("content")}} プロパティを使って、[`data-icon`](/ja/docs/Learn_web_development/Howto/Solve_HTML_problems/Use_data_attributes) 属性のコンテンツと等しくなるよう設定しています。再生ボタンの場合、 `data-icon` は大文字の "P" を含んでいます。 - ボタンには {{cssxref("font-family")}} を使用して、カスタムウェブフォントを適用しています。このフォントでは、 "P" は実際には「再生」アイコンであるため、再生ボタンには「再生」アイコンが保有されています。 アイコンフォントは多くの理由でとてもクールです。アイコンを画像ファイルとしてダウンロードする必要がないため HTTP リクエストを削減でき、拡張性が高く、また {{cssxref("color")}} や {{cssxref("text-shadow")}} のようにテキストのプロパティを使用してスタイルを設定することも可能だからです。 @@ -190,7 +184,7 @@ button:before { .timer div { position: absolute; - background-color: rgba(255, 255, 255, 0.2); + background-color: rgb(255 255 255 / 20%); left: 0; top: 0; width: 0; @@ -205,7 +199,7 @@ button:before { } ``` -- 外側の `.timer` `
` に flex: 5 を持つように設定して、コントロールバーの幅のほとんどを受け取れるようにしています。また、 {{cssxref("position")}}`: relative` を指定して、 {{htmlelement("body")}} 要素の境界線ではなく、その境界線に従って内側の要素を便利に配置できるようにします。 +- 外側の `.timer` `
` に flex: 5 を持つように設定して、コントロールバーの幅のほとんどを受け取れるようにしています。また、 {{cssxref("position", "position: relative")}} を指定して、 {{htmlelement("body")}} 要素の境界線ではなく、その境界線に従って内側の要素を便利に配置できるようにします。 - 内側の `
` は、外側の `
` の上に直接置かれるように絶対配置されます。また、初期状態では幅が 0 に指定されているため、まったく見えません。動画が再生されるにつれて、 JavaScript によって幅が拡大されます。 - また、`` はタイマーバーの左側付近に絶対的な位置が決まっています。 - また、内側の `
` と `` には正しい {{cssxref("z-index")}} を与え、タイマーが上に、内側の `
` がその下に表示されるようにしました。こうすることで、すべての情報が見えるようになり、あるボックスが他のボックスを隠してしまうことがなくなります。 @@ -299,7 +293,7 @@ button:before { 後は、表示されているアイコンを「再生」アイコンに設定するだけです。停止ボタンが押されたときに動画が一時停止していたか再生していたかに関係なく、その後再生できる状態にしたいのです。 -#### 前後をシーク +#### 前後にシーク 巻き戻しや早送りの機能を実装する方法はたくさんあります。ここでは、比較的複雑な方法を紹介します。この方法では、異なるボタンが予期しない順番で押されても壊れることはありません。 @@ -351,12 +345,12 @@ button:before { それでは `mediaBackward()` を実行してみましょう(`mediaForward()` の機能はまったく同じですが、逆になっています)。 - 1. これは、 `fwd` ボタンを押した後に `rwd` ボタンを押すと、早送り機能が取り消され、巻き戻し機能に置き換わるからです。もし、両方を一度に行おうとすると、プレイヤーが壊れてしまいます。 - 2. `if`ステートメントを使用して、 `active` クラスが `rwd` ボタンに設定されているかどうかを調べ、すでに押されていることを示します。 {{domxref("Element.classList", "classList")}} はすべての要素に存在する便利なプロパティで、要素に設定されているすべてのクラスのリストと、クラスを追加/削除するためのメソッドなどが含まれています。 `classList.contains()` メソッドを使用して、リストに `active` クラスが含まれているかどうかを調べています。これは論理値 `true`/`false` の結果を返します。 + 1. 早送り機能に設定されているクラスや間隔をすべてクリアします。これは、 `fwd` ボタンを押した後に `rwd` ボタンを押すと、早送り機能が取り消され、巻き戻し機能に置き換わるからです。もし、両方を一度に行おうとすると、プレイヤーが壊れてしまいます。 + 2. `if` 文を使用して、 `active` クラスが `rwd` ボタンに設定されているかどうかを調べ、すでに押されていることを示します。 {{domxref("Element.classList", "classList")}} はすべての要素に存在する便利なプロパティで、要素に設定されているすべてのクラスのリストと、クラスを追加/削除するためのメソッドなどが含まれています。 `classList.contains()` メソッドを使用して、リストに `active` クラスが含まれているかどうかを調べています。これは論理値 `true`/`false` の結果を返します。 3. `rwd` ボタンに `active` が設定されている場合は、 `classList.remove()` を使用してそれを削除し、最初にボタンが使用されたときに設定された間隔をクリアし(詳細は以下を参照)、 {{domxref("HTMLMediaElement.play()")}} を使用して巻き戻しを取り消し、通常の動画の再生を開始しています。 - 4. まだ設定されていない場合は、`classList.add()` を使用して `rwd` ボタンに `active` クラスを追加し、 {{domxref("HTMLMediaElement.pause()")}} を使用して動画を一時停止し、 `intervalRwd` 変数を {{domxref("setInterval()")}} 呼び出しを使用して等しい値にセットしています。 `setInterval()` が呼び出されると、アクティブなインターバルを作成します。つまり、最初の引数で指定された関数を x ミリ秒ごとに実行します(ここで x は 2 番目の引数の値)。つまり、ここでは200ミリ秒ごとに `windBackward()` 関数を実行しています。この関数は、動画を常に逆方向に巻き戻すために使用します。domxref("setInterval()")}} の実行を停止するには、 {{domxref("clearInterval", "clearInterval()")}} を呼び出す必要があります。このときクリアする間隔の識別名、この場合は変数名 `intervalRwd` (関数内で先に呼び出した `clearInterval()` を参照)を持つようにしてください。 + 4. まだ設定されていない場合は、 `active` クラスを `rwd` ボタンに `classList.add()` を使って追加し、 {{domxref("HTMLMediaElement.pause()")}} を使用して動画を一時停止し、 `intervalRwd` 変数を {{domxref("Window.setInterval", "setInterval()")}} 呼び出しと同じ値に設定しています。 `setInterval()` が呼び出されると、アクティブなインターバルタイマーを作成します。つまり、最初の引数で指定された関数を x ミリ秒ごとに実行します(ここで x は 2 番目の引数の値)。つまり、ここでは 200 ミリ秒ごとに `windBackward()` 関数を実行しています。この関数は、動画を常に逆方向に巻き戻すために使用します。 {{domxref("Window.setInterval", "setInterval()")}} の実行を停止するには、 {{domxref("Window.clearInterval", "clearInterval()")}} を呼び出す必要があります。このときクリアする間隔の識別名、この場合は変数名 `intervalRwd` (関数内で先に呼び出した `clearInterval()` を参照)を持つようにしてください。 -3. 最後に、 `setInterval()` の呼び出しで呼び出される `windBackward()` と `windForward()` の関数を定義する必要があります。前の 2 つの関数の下に、以下を追加してください。 +3. 最後に、 `setInterval()` の呼び出しで呼び出される `windBackward()` と `windForward()` の関数を定義する必要があります。前の 2 つの関数の下に、以下のものを追加してください。 ```js function windBackward() { @@ -380,14 +374,14 @@ button:before { } ``` - 繰り返しますが、この関数の最初のものは、ほとんど同じように動作しますが、互いに逆に動作するので、読み終えておきます。windBackward()` では、以下のことを行っています。インターバルが有効な場合、この関数は 200 ミリ秒に一度実行されることを覚えておいてください。 + 繰り返しますが、この関数の最初のものは、ほとんど同じように動作しますが、互いに逆に動作するので、読み終えておきます。 `windBackward()` では、以下のことを行っています。インターバルが有効な場合、この関数は 200 ミリ秒に一度実行されることに留意してください。 1. まず最初に `if` 文で、現在の時刻が 2 つ目よりも小さいかどうか、つまりあと 3 秒巻き戻せば動画の開始時刻を過ぎてしまうかどうかを調べます。これは奇妙な動作を発生させるので、この場合は `stopMedia()` を呼び出して動画の再生を停止し、巻き戻しボタンから `active` クラスを削除し、巻き戻し機能を停止するために `intervalRwd` 間隔をクリアしています。もし、この最後のステップを行わなければ、動画は永遠に巻き戻し続けることになります。 - 2. もし現在時刻が動画の開始時刻から 3 秒以内でなければ、`media.currentTime -= 3` を実行して現在時刻から 3 秒を削除しています。つまり、実質的には 200 ミリ秒に一度、動画を 3 秒ずつ巻き戻していることになります。 + 2. もし現在時刻が動画の開始時刻から 3 秒以内でなければ、 `media.currentTime -= 3` を実行して現在時刻から 3 秒を削除しています。つまり、実質的には 200 ミリ秒に一度、動画を 3 秒ずつ巻き戻していることになります。 #### 経過時間の更新 -メディアプレイヤーの実装する最後の部分は、経過時間の表示です。そのために、 {{domxref("HTMLMediaElement/timeupdate_event", "timeupdate")}} イベントが `