![見出し画像](https://assets.st-note.com/production/uploads/images/160281851/rectangle_large_type_2_f9b8519ed7fbaf8db7894986568579d2.jpeg?width=1200)
【web】ハンバーガーメニュー2(js)
こんにちは、つちだにんじんです。
前回はcssのみでのハンバーガーメニューを作成しましたので、今回はjsを使用してハンバーガーメニューを作成します。
作り方的に、あまり大差ないです(笑)
jsを使用してハンバーガーメニューを作成する
結論から言うと作りはこんな感じです。↓
<!-- html -->
<div class="hamburger" id="hamburger">
<span></span>
<span></span>
<span></span>
</div>
<!-- ナビゲーションメニュー -->
<nav class="nav-menu" id="navMenu">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
/* css */
*{
font-family: Arial, sans-serif;
}
.hamburger{
display: flex;
flex-direction: column;
cursor: pointer;
width: 30px;
margin: 20px 20px 20px auto;
}
.hamburger span{
height: 4px;
background-color: #257180;
margin: 4px 0;
width: 100%;
transition: 0.4s;
}
.nav-menu{
display: none; /* デフォルトでは非表示 */
background-color: #257180;
position: absolute;
top: 70px;
right: 0px;
width: 50%;
padding: 20px 3%;
}
.nav-menu ul{
list-style-type: none;
margin: 0;
padding: 0;
}
.nav-menu ul li:not(:last-child){
border-bottom: 1px solid #fff;
}
.nav-menu ul li a{
color: #fff;
text-decoration: none;
display: block;
padding: 20px 0;
}
.nav-menu ul li a:hover{
color: #FD8B51;
}
/* メニューがアクティブなときのスタイル */
.nav-menu.active{
display: block;
}
/* .changeがついた時のスタイル */
.change span:nth-of-type(2){
opacity: 0;
}
.change span:nth-of-type(1){
transform: rotate(45deg) translateY(7px) translateX(9px);
}
.change span:nth-of-type(3){
transform: rotate(-45deg) translateY(-10px) translateX(10px);
}
// js
// hamburgerとnavMenuを取得
const hamburger = document.getElementById('hamburger');
const navMenu = document.getElementById('navMenu');
hamburger.addEventListener('click', () => { // hamburgerをクリックしたら
navMenu.classList.toggle('active'); // メニューの表示切り替え
hamburger.classList.toggle('change'); // アイコンのスタイル変更用クラス
});
こんな感じです。
前回も書きましたが、見る人側の環境でjsをブロックしていると作動できないです。
HTML
まずはHTMLでのマークアップです。
前回はcssのみで作成するため、チェックボックスを使用して作りましたが、今回はクリック動作の判定をjsで行うのでチェックボックスは不要です。
<!-- 三本線 -->
<div class="hamburger" id="hamburger">
<span></span>
<span></span>
<span></span>
</div>
<!-- ナビゲーションメニュー -->
<nav class="nav-menu" id="navMenu">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
cssのみの時に比べると、htmlは説明不要なくらいとてもシンプルになりました。
id名をつけているのは、jsでid名を取得させているためです。
ちなみにclass名を取得したい場合は
// js
const elements = document.getElementsByClassName('クラス名');
jsはこう書いてください。
CSS
.hamburger{
display: flex;
flex-direction: column;
cursor: pointer;
width: 30px;
margin: 20px 20px 20px auto;
}
.hamburger span{
height: 4px;
background-color: #257180;
margin: 4px 0;
width: 100%;
transition: 0.4s;
}
.nav-menu{
display: none; /* デフォルトでは非表示 */
background-color: #257180;
position: absolute;
top: 70px;
right: 0px;
width: 50%;
padding: 20px 3%;
}
.nav-menu ul{
list-style-type: none;
margin: 0;
padding: 0;
}
.nav-menu ul li:not(:last-child){
border-bottom: 1px solid #fff;
}
.nav-menu ul li a{
color: #fff;
text-decoration: none;
display: block;
padding: 20px 0;
}
.nav-menu ul li a:hover{
color: #FD8B51;
}
/* メニューがアクティブなときのスタイル */
.nav-menu.active{
display: block;
}
/* .changeクラス */
.change span:nth-of-type(2){
opacity: 0;
}
.change span:nth-of-type(1){
transform: rotate(45deg) translateY(7px) translateX(9px);
}
.change span:nth-of-type(3){
transform: rotate(-45deg) translateY(-10px) translateX(10px);
}
面倒になったのでスタイルもとてもシンプルにしてあります。
.nav-menu.active{ display: block; }は、「デフォルトでは非表示」とある部分でdisplay: none;で非表示にしているのを解除するためです。
jsでクリックしたら.changeクラスが付与されるように指定したので、その.changeに対して三本線の動きをつけています。
JavaScript
最後はjsです。
これも複雑ではなくシンプルなものです。
const hamburger = document.getElementById('hamburger');
const navMenu = document.getElementById('navMenu');
hamburger.addEventListener('click', () => {
navMenu.classList.toggle('active'); // メニューの表示切り替え
hamburger.classList.toggle('change'); // アイコンのスタイル変更用クラス
});
1,2行目で「#hamburger」と「#navMenu」を取得しています。
hamburger.addEventListener('click', () => { });で「#hamburger」がクリックされたら行う動作を指定しています。
これの{ }の中にその動作を書きます。
navMenu.classList.toggle('active');は「#navMenu」にactiveというクラス名を付与、
hamburger.classList.toggle('change');は「#hamburger」にchangeというクラス名を付与するものです。
これでjsを用いたハンバーガーメニューは完成です。
jsもシンプルなものなので、js初心者でも作りやすいかと思います!
私のHPです。
webやグラフィックデザイン、イラスト制作などのお仕事がありましたら、ぜひこちらからお気軽にお問合せください!