初めてのスクリプトをブラウザに送信する
クライアントサイドのインタラクションを必要とするような、モバイルの画面サイズでリンクを開閉するハンバーガーメニューを追加しましょう!
ここで学ぶことは…
- ハンバーガーメニューコンポーネントを作成する
- サイト訪問者がナビゲーションメニューを開閉できるように<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がユーザーのブラウザに送信されるのは、それがどこに書かれた・インポートされたときですか?