VIDEO LESSON
HTML・CSSとJavaScriptを連携する:メニュー・テーマ切り替え・入力確認を実装の解説動画
再生時間 7:57動画を別のタブで開く ↗
動画の字幕・文字起こしを読む
再生中の字幕を濃い黒で表示し、一番上に追従します。字幕の行を選ぶと、その位置から再生できます。
- 0:00こんにちは。
- 0:00エイチティーエムエル、シーエスエス入門、第九回です。
- 0:04今回のテーマは、ジャバスクリプトとの連携です。
- 0:08これまで、エイチティーエムエルで意味と入力部品を作り、シーエスエスで見た目を整えてきました。
- 0:15今回はそこへ、状態と操作を担当するジャバスクリプトを加えて、サイトを動かします。
- 0:21目標は、クリックのたびに画面全体を作り直すのではなく、必要な属性や文字だけを変更できるようになることです。
- 0:29作る機能は三つ。
- 0:30メニューの開閉、テーマの切り替え、そして送信しない入力確認フォームです。
- 0:36元になる記事は、エスイーの部屋の、エイチティーエムエル、シーエスエスとジャバスクリプトを連携する、
- 0:40です。
- 0:44まず、ジャバスクリプトのファイルを読み込みます。
- 0:47インデックス、エイチティーエムエルと同じフォルダーに、スクリプト、ドット、
- 0:51ジェイエスというファイルを作ります。
- 0:55そして、エイチティーエムエルのヘッドの中、シーエスエスの読み込み行の後ろに、
- 0:59スクリプトタグを一行追加します。
- 1:03画面に表示しているのが、その一行です。
- 1:05ポイントは、ディファーという属性です。
- 1:08これを付けた外部スクリプトは、エイチティーエムエルの解析が終わった後に実行されます。
- 1:14そのため、本文の中のボタンやフォームなどの要素を、確実に取得できます。
- 1:19なお、今回使うドキュメントや画面のイベントは、ブラウザーの機能です。
- 1:24ノードで実行しても、ページを操作することはできません。
- 1:28登場する二つの言葉を押さえます。
- 1:30一つ目は、ドムです。
- 1:32ブラウザーは、エイチティーエムエルを読み込むと、要素の構造を作ります。
- 1:37これをドムと呼びます。
- 1:39ジャバスクリプトは、このドムを通してページを操作します。
- 1:43二つ目がイベントです。
- 1:44クエリセレクターで要素を取得し、アドイベントリスナーで、クリックされたとき、
- 1:49入力されたときに呼ぶ処理を登録します。
- 1:53ここで注意点が一つ。
- 1:54指定したアイディーがエイチティーエムエル側にない場合、取得結果はヌル、つまり空っぽになり、
- 2:00そのまま操作しようとするとエラーで止まってしまいます。
- 2:05複数のファイルを組み合わせるときは、アイディーの綴りを一致させることが大切です。
- 2:11一つ目の機能は、スマートフォン向けメニューの開閉です。
- 2:15設計のポイントは、状態の置き場所です。
- 2:18開いているか閉じているかは、ボタンの、アリア、エクスパンデッドという属性に入れます。
- 2:24そして、表示するかしないかは、ナビゲーションのヒドゥン属性に反映します。
- 2:30さらに、マッチメディアという機能で、シーエスエスと同じ、四十八レムという幅の境界を確認します。
- 2:37ピーシー幅ではナビゲーションを常に表示し、スマートフォンで閉じたまま画面を広げても、
- 2:42リンクが消えたままにならないようにします。
- 2:46エスケープキーで閉じたときは、操作していたボタンへフォーカスを戻す、という配慮も入れます。
- 2:53メニューの中心部分のコードです。
- 2:56上の三行で、ボタンとナビゲーションを取得し、広い画面かどうかを判定するオブジェクトを用意します。
- 3:03中心は、セットメニューという関数です。
- 3:06開いているかどうかを真偽値で受け取り、ボタンの属性と表示する文字、ナビゲーションの非表示を、
- 3:10まとめて更新します。
- 3:14ボタンがクリックされたら、今の状態の反対をセットメニューへ渡して、開閉を切り替えます。
- 3:20状態の変更を一つの関数に集めておくことで、エスケープキーやリンクのクリックなど、
- 3:25ほかの閉じる操作からも、同じ処理を呼べるようになります。
- 3:30二つ目の機能は、テーマの切り替えです。
- 3:33エイチティーエムエル要素の、データテーマという属性を切り替えると、第八回で定義した色の変数が丸ごと入れ替わります。
- 3:42ボタン側では、アリア、プレストという属性で、ダークモードが選ばれている状態を表します。
- 3:49選んだテーマは、ローカルストレージに保存して、次に開いたときも引き継ぎます。
- 3:54ただし、ブラウザーの設定によっては、保存が使えない場合があります。
- 3:59そこで、保存の処理を、トライ、キャッチで囲みます。
- 4:03保存に失敗しても、切り替え自体は止まらないようにするためです。
- 4:08保存するのは配色の選択だけです。
- 4:10名前やフォームの入力値は保存しません。
- 4:13テーマ切り替えのコードです。
- 4:15アプライテーマという関数が、データテーマ属性とボタンの状態を更新する中心です。
- 4:21ページを開いたら、まず保存済みの値を読み込むことを試みます。
- 4:26ダークが保存されていれば、初期テーマをダークにします。
- 4:30読み込みに失敗しても、キャッチで受け止めて、明るいテーマのまま続行します。
- 4:36その後、初期テーマを適用し、それまで隠していたテーマボタンを表示します。
- 4:41ボタンが押されるたびに、今と反対のテーマへ切り替えて、保存も試みます。
- 4:46ジャバスクリプトが動いた時点でボタンを出すやり方なら、動かない環境で、押せないボタンが表示されることもありません。
- 4:55三つ目の機能は、入力確認だけを行うフォームです。
- 4:59申し込みの送信は行わず、入力内容のチェックだけをジャバスクリプトで体験します。
- 5:04送信ボタンが押されると、サブミットイベントが発生します。
- 5:08ここで、プリベントデフォルトを呼び、ブラウザーの通常の送信を止めます。
- 5:14チェックは二段構えです。
- 5:15必須項目の確認に加えて、スペースだけの名前も、セットカスタムバリディティでエラーにします。
- 5:22大切なのは、入力し直したときに、エラーを空の文字列で解除する処理です。
- 5:27これを忘れると、正しく直しても先へ進めません。
- 5:31結果の表示には、テキストコンテンツを使います。
- 5:34入力した文字列をインナーエイチティーエムエルへ直接入れると、文字がエイチティーエムエルとして解釈されてしまう問題があるからです。
- 5:43フォームのコードです。
- 5:45大きく二つの処理に分かれます。
- 5:47一つ目は、入力イベントです。
- 5:49名前を打ち直すたびに、カスタムエラーを空にして、結果の表示も消します。
- 5:54二つ目が、送信イベントです。
- 5:56まず、プリベントデフォルトで通常の送信を止めます。
- 5:59次に、名前の前後の空白を取り除き、空ならエラーメッセージを付けます。
- 6:04最後に、レポートバリディティで検証の結果を表示し、問題がなければ、結果を表示する欄へ、
- 6:09確認のメッセージをテキストで入れます。
- 6:13エラーを付ける処理と外す処理が、対になっている点を確認してください。
- 6:18動くことを確認したら、正常時以外も試しましょう。
- 6:21名前が空欄なら、必須チェックの表示が出ます。
- 6:24空白だけなら、独自のエラーメッセージが出るはずです。
- 6:28名前に、太字タグのような文字列を入力して確認を押すと、太字にはならず、入力した文字がそのまま表示されます。
- 6:36テキストコンテンツで表示している効果です。
- 6:39最後に、ブラウザーでジャバスクリプトを無効にして読み込んでみてください。
- 6:44ナビゲーションは表示されたままで、学習内容やページ内リンクは使えます。
- 6:49基本の内容はエイチティーエムエルで提供し、便利な機能をジャバスクリプトで足していく。
- 6:55この考え方が、壊れにくいサイト作りの土台になります。
- 6:59まとめです。
- 7:00練習として、画面の幅を変えながらメニューの表示を確認すること、ダークモードへ切り替えて再読み込みし、
- 7:09テーマが残っているか確かめること、空白だけの名前で送信して、エラーの表示と解除を試すこと。
- 7:17この三つをやってみてください。
- 7:20今回の要点は、役割分担です。
- 7:23エイチティーエムエルは意味と入力部品、シーエスエスは見た目、ジャバスクリプトは状態と操作。
- 7:31状態を変えるときは、属性やクラス、文字といった小さな変更にとどめ、画面全体は作り直しません。
- 7:39そして、保存の失敗やジャバスクリプトが使えない状況でも、基本の内容が読めるようにしておくことが、
- 7:45実務でも大切な考え方です。
- 7:50次回は最終回、完成したサイトを検証して公開します。
- 7:55お疲れさまでした。
この動画で学べること
HTMLとCSSにJavaScriptを連携。レスポンシブメニュー、ダークモード、保存失敗への対応、送信しない入力確認フォームを実装します。
解説記事・サンプルコードを読む:HTML・CSSとJavaScriptを連携する:メニュー・テーマ切り替え・入力確認を実装 →