「レスポンシブ」ヘッダーを作る Part3【JavaScript編】
・前回の記事はこちら
Part1≫「レスポンシブ」ヘッダーを作る Part1【HTML編】
Part2≫「レスポンシブ」ヘッダーを作る Part2【CSS編】
今回はJavaScriptの部分。ハンバーガーメニューを押してレスポンシブ用のメニューの詳細をだしていくところをやっていきましょう。
- 実質コードは6行と簡単
- 使えればクリックしたときに色々と使えるから応用可能
さて、まず最初に作った「Header」フォルダのなかに「js」というフォルダを作りましょう。そしたらjsフォルダのなかに「master.js」を作っていきます。
※フォルダ階層
Header/ ├ index.html ├ css/ | └ master.css └ js/ └ master.js
はい、これで準備OK。master.jsをひらいてコードを書いていきましょう。
First Step: addEventListenerを使ってクリックしたときに処理する
const responsive_menu_btn = document.querySelector('.responsive_btn'); responsive_menu_btn.addEventListener('click', menuToggle);
- 1行目…htmlにあるハンバーガーボタンを選択、responsive_menu_btn変数に代入
- 2行目…ハンバーガーボタンを’click’したときにmenuToggle独自関数を実行
Next Step: レスポンシブ用のメニューを表示するfunctionを書いていこう
function menuToggle() { const header_menu_detail = document.querySelector('.header_nav'); header_menu_detail.classList.toggle('menu_active'); }
- 1行目…独自関数menuToggleを設定
- 2行目…header_menu_detail変数を設定、レスポンシブナビの一覧部分
- 3行目…「header_nav」classに「menu_active」、クリックするたび追加、削除をくりかえす
Final Step: index.htmlファイルにmaster.jsをつなげる
はい、最後はindex.htmlをひらいて、終わりの「body」タグの上にコードを追加していきましょう。
まとめ: レスポンシブヘッダーの動作を確認してみよう
これでレスポンシブ用のヘッダーは完成。
1回じゃ分からないと思うから、2回くらい読み返してみれば自然とレスポンシブヘッダーを作れるようになるからやってみて。
・他のJavaScriptツール
JavaScript DOMコードまとめ【jQueryなし】
JavaScriptでヘッダー画像を切り替えるコードを紹介
・前回の記事はこちら
Part1≫「レスポンシブ」ヘッダーを作る Part1【HTML編】
Part2≫「レスポンシブ」ヘッダーを作る Part2【CSS編】
終わりに全体のコードの流れをのせておくから確認してみよう。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="css/master.css"> <title>Responsive</title> </head> <body> <header class="header_bg"> <div class="header_contents"> <h1>Responsive</h1> <div class="responsive_btn"> <div class="menu_line"></div> <div class="menu_line"></div> <div class="menu_line"></div> </div> <nav class="header_nav"> <ul class="header_nav_lists"> <li><a class="nav_link" href="">About</a></li> <li><a class="nav_link" href="">Features</a></li> <li><a class="nav_link" href="">Contact</a></li> </ul> </nav> </div> </header> <script src="js/master.js"></script> </body> </html>
/* Reset style */ * { margin: 0; padding: 0; box-sizing: border-box; color: #fafafa; list-style: none; text-decoration: none; } /* Normal header style */ .header_bg { background: #323232; width: 100%; height: 80px; } .header_contents { width: 100%; max-width: 1024px; height: 100%; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; } .header_contents h1 { font-size: 22px; margin: 0 0 0 40px; } .header_nav_lists { display: flex; } .header_nav_lists li { margin: 0 40px 0 0; } .nav_link { font-size: 18px; } /* Responsive menu button */ .responsive_btn { display: none; flex-direction: column; align-items: center; justify-content: center; width: 32px; height: 32px; margin: 0 40px 0 0; cursor: pointer; position: relative; z-index: 10; } .menu_line { background: #fafafa; border-radius: 5px; width: 100%; height: 5px; margin: 4px 0; } /* Responsive style */ @media screen and (max-width: 768px) { .responsive_btn { display: flex; } .header_bg { position: relative; } .header_nav { background: #323232; width: 100%; height: 100vh; padding: 80px 0 0 0; position: absolute; top: 0; right: -100%; transition: .5s; } .header_nav_lists { display: block; text-align: center; } .header_nav_lists li { margin: 0 0 40px; text-align: center; } .nav_link { font-size: 20px; } } /* js function "menuToggle" starting only */ .menu_active { right: 0; }
const responsive_menu_btn = document.querySelector('.responsive_btn'); responsive_menu_btn.addEventListener('click', menuToggle); function menuToggle() { const header_menu_detail = document.querySelector('.header_nav'); header_menu_detail.classList.toggle('menu_active'); }