初めてのスクリプトをブラウザに送信する
クライアントサイドのインタラクションを必要とするような、モバイルの画面サイズでリンクを開閉するハンバーガーメニューを追加しましょう!
ここで学ぶことは…
- ハンバーガーメニューコンポーネントを作成する
- サイト訪問者がナビゲーションメニューを開閉できるように
<script>
を書く - JavaScriptを
.js
ファイルに移動する
ハンバーガーコンポーネントを作成する
セクションタイトル: ハンバーガーコンポーネントを作成するモバイルメニューを開閉する<Hamburger />
コンポーネントを作成します。
-
src/components/
にHamburger.astro
という名前のファイルを作成します。 -
以下のコードをコンポーネントにコピーします。これは、モバイルでナビゲーションリンクを開閉する3行の「ハンバーガー」メニューを表わします。(あとで
global.css
に新しいCSSスタイルを追加します。)src/components/Hamburger.astro ------<div class="hamburger"><span class="line"></span><span class="line"></span><span class="line"></span></div> -
Header.astro
の<Navigation />
コンポーネントの直前に、新しい<Hamburger />
コンポーネントを配置します。
コードを表示
---import Hamburger from './Hamburger.astro';import Navigation from './Navigation.astro';---<header> <nav> <Hamburger /> <Navigation /> </nav></header>
- 以下のハンバーガーコンポーネント用スタイルを追加します。
/* ナビゲーションのスタイル */.hamburger { padding-right: 20px; cursor: pointer;}
.hamburger .line { display: block; width: 40px; height: 5px; margin-bottom: 10px; background-color: #ff9776;}
.nav-links { width: 100%; top: 5rem; left: 48px; background-color: #ff9776; display: none; margin: 0;}
.nav-links a { display: block; text-align: center; padding: 10px 0; text-decoration: none; font-size: 1.2rem; font-weight: bold; text-transform: uppercase;}
.nav-links a:hover, a:focus { background-color: #ff9776;}
.expanded { display: unset;}
@media screen and (min-width: 636px) { .nav-links { margin-left: 5em; display: block; position: static; width: auto; background: none; }
.nav-links a { display: inline-block; padding: 15px 20px; }
.hamburger { display: none; }}
初めてのスクリプトタグを書く
セクションタイトル: 初めてのスクリプトタグを書くヘッダーはまだインタラクティブではありません。ハンバーガーメニューへのクリックに応じてナビゲーションリンクを表示したり非表示にしたりするように、ユーザーの入力に応答することができないからです。
<script>
タグを追加すると、クライアントサイドのJavaScriptがユーザーのイベントを「待ち受け(Listen)」、それに応答します。
-
index.astro
の</body>
閉じタグの直前に、以下の<script>
タグを追加します。src/pages/index.astro <Footer /><script>document.querySelector('.hamburger').addEventListener('click', () => {document.querySelector('.nav-links').classList.toggle('expanded');});</script></body> -
ブラウザのプレビューを複数のサイズで開き、このページのナビゲーションメニューがスクリーンサイズに対してレスポンシブであり、またユーザーの入力に反応することを確認します。
.js
ファイルをインポートする
セクションタイトル: .jsファイルをインポートする各ページにJavaScriptを直接書く代わりに、<script>
タグの内容をプロジェクト内の.js
ファイルに移動しましょう。
-
(新しく
/scripts/
フォルダを作成した上で)src/scripts/menu.js
を作成し、JavaScriptをそこに移動します。src/scripts/menu.js document.querySelector('.hamburger').addEventListener('click', () => {document.querySelector('.nav-links').classList.toggle('expanded');}); -
index.astro
の<script>
タグの内容を以下のファイルインポートに置き換えます。src/pages/index.astro <Footer /><script>document.querySelector('.hamburger').addEventListener('click', () => {document.querySelector('.nav-links').classList.toggle('expanded');});import "../scripts/menu.js";</script></body> -
ブラウザのプレビューを再度小さいサイズで開き、ハンバーガーメニューがナビゲーションリンクを開閉することを確認します。
-
他の
about.astro
とblog.astro
の2ページにも同じ<script>
とインポートを追加し、両ページにレスポンシブでインタラクティブなヘッダーがあることを確認します。src/pages/about.astro & src/pages/blog.astro <Footer /><script>import "../scripts/menu.js";</script></body>
これまでにも、サイトの一部を作成するためにJavaScriptを使用してきました。
- ページタイトルと見出しの動的な定義
- 概要ページでのスキルリストのマッピング
- HTML要素の条件に応じた表示
これらの命令はすべてビルド時に実行され、サイトの静的HTMLを作成したあと、コードは「捨てられます」。
<script>
タグ内のJavaScriptはブラウザに送信され、ユーザーの操作に応じてページの更新や入力の切り替えなどを実行します。
確認テスト
セクションタイトル: 確認テスト-
Astroは、コンポーネントのフロントマターに書かれたJavaScriptをいつ実行しますか?
-
Astroでは任意でJavaScriptをブラウザに送信できますが、その目的は何ですか?
-
クライアントサイドのJavaScriptがユーザーのブラウザに送信されるのは、それがどこに書かれた・インポートされたときですか?