こんにちは!株式会社プロットハブのエンジニア、山名です。
ホームページ制作をしていると、必ず必要になるものにレスポンシブ対応のハンバーガーメニューがあります。
コピペで使えるハンバーガーメニューに関しては以前にもご紹介はしているのですが、今回はコピペでそのまま使える、初心者でも安心して使えるに作ってみました。
一般的なハンバーガーメニューはJavaScriptやjQueryを使って実装しますが、実はHTMLとCSSだけでもシンプルに作成することが可能なのです。
よければ最後まで見てコピペして使ってみてください!
このハンバーガーメニューの特徴
- JavaScriptやjQueryを一切使用していないため、初心者の方でも安心して使えます。
- HTMLとCSSのみで構成されているので、コードの理解やカスタマイズが容易です。
- レスポンシブ対応済みで、デバイスの画面サイズに応じて自動的にメニューが切り替わります。
- コピペでそのまま使用可能なので、時間の節約になります。
- 今回のコードはTailwind cssを使って生成したものを使用しています。
HTMLの記述
HTMLのコードを表示
<header class="header">
<div class="header-content">
<h1 class="site-logo">
<a href="#"></a>
</h1>
<input type="checkbox" id="menu-toggle" class="menu-toggle">
<nav class="navbar">
<!-- ハンバーガーメニュー -->
<label for="menu-toggle" class="menu-icon">
<span></span>
<span></span>
<span></span>
</label>
</nav>
<!-- メニュー -->
<div class="menu-wrap">
<ul class="menu">
<li>
<a href="#">
Home
<svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
</a>
</li>
<li>
<a href="#">
About
<svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
</a>
</li>
<li>
<a href="#">
Services
<svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
</a>
</li>
<li>
<a href="#">
Contact
<svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
</a>
</li>
</ul>
</div>
</div>
</header>
CSSの記述
CSSのコードを表示
html{
overflow-x: hidden; /* これが無いと.menuがはみでちゃう */
}
header {
position: absolute;
left: 0px;
right: 0px;
top: 0px;
--tw-bg-opacity: 1;
background-color: rgb(238 238 238 / var(--tw-bg-opacity));
}
.header-content {
position: relative;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
padding-left: 5%;
padding-right: 5%;
padding-top: clamp(8px, 2.666666666666667vw, 30px);
padding-bottom: clamp(8px, 2.666666666666667vw, 30px);
}
@media (min-width: 1025px) {
.header-content {
padding-top: clamp(10px, 1.3888888888888888vw, 30px);
padding-bottom: clamp(10px, 1.3888888888888888vw, 30px);
padding-right: clamp(80px, 6.944444444444445vw, 120px);
padding-left: clamp(80px, 6.944444444444445vw, 120px);
}
}
.site-logo {
--tw-bg-opacity: 1;
background-color: rgb(194 194 194 / var(--tw-bg-opacity));
width: clamp(100px, 11.11111111111111vw, 200px);
height: clamp(40px, 4.166666666666666vw, 80px);
}
@media (min-width: 1025px) {
.navbar {
display: none;
}
}
.navbar {
position: relative;
}
@media (max-width: 1024px) {
.menu-wrap {
position: absolute;
top: 100%;
right: 0px;
z-index: -1;
width: 100%;
overflow-x: hidden;
--tw-bg-opacity: 1;
background-color: rgb(51 51 51 / var(--tw-bg-opacity));
opacity: 0;
-webkit-transition-duration: 300ms;
transition-duration: 300ms;
}
}
.menu {
list-style-type: none;
-webkit-transition-duration: 300ms;
transition-duration: 300ms;
}
@media (min-width: 1025px) {
.menu {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.menu > :not([hidden]) ~ :not([hidden]) {
--tw-divide-x-reverse: 0;
border-right-width: calc(1px * var(--tw-divide-x-reverse));
border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
--tw-divide-opacity: 1;
border-color: rgb(0 0 0 / var(--tw-divide-opacity));
}
}
@media (max-width: 1024px) {
.menu {
--tw-translate-x: 100%;
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.menu > :not([hidden]) ~ :not([hidden]) {
--tw-divide-y-reverse: 0;
border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
--tw-divide-opacity: 1;
border-color: rgb(255 255 255 / var(--tw-divide-opacity));
}
}
.menu li a {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-weight: 700;
-webkit-transition-duration: 300ms;
transition-duration: 300ms;
font-size: clamp(14px, 4.266666666666667vw, 18px);
padding-right: clamp(10px, 5.333333333333334vw, 30px);
padding-left: clamp(10px, 5.333333333333334vw, 30px);
}
.menu li a:hover {
opacity: 0.6;
}
@media (min-width: 1025px) {
.menu li a {
font-size: clamp(14px, 1.1111111111111112vw, 18px);
padding-right: clamp(10px, 1.3888888888888888vw, 30px);
padding-left: clamp(10px, 1.3888888888888888vw, 30px);
}
}
@media (max-width: 1024px) {
.menu li a {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
padding-top: clamp(10px, 5.333333333333334vw, 30px);
padding-bottom: clamp(10px, 5.333333333333334vw, 30px);
}
}
@media (min-width: 1025px) {
.menu li a svg {
display: none !important;
}
}
/* ハンバーガーアイコン */
.menu-icon {
position: relative;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
cursor: pointer;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
width: clamp(30px, 10.666666666666668vw, 60px);
height: clamp(18px, 5.866666666666666vw, 30px);
}
.menu-icon span {
position: absolute;
display: block;
width: 100%;
-webkit-transform-origin: center;
transform-origin: center;
--tw-bg-opacity: 1;
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
-webkit-transition-duration: 300ms;
transition-duration: 300ms;
height: clamp(1px, 0.5333333333333333vw, 4px);
}
.menu-icon span:nth-child(1) {
top: 0px;
}
.menu-icon span:nth-child(2) {
top: 0px;
bottom: 0px;
margin-top: auto;
margin-bottom: auto;
}
.menu-icon span:nth-child(3) {
bottom: 0px;
}
/* トグルのチェック状態に応じた変化 */
.menu-toggle {
display: none;
}
.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(1) {
top: 0px;
bottom: 0px;
margin-top: auto;
margin-bottom: auto;
--tw-rotate: -45deg;
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(2) {
opacity: 0;
}
.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(3) {
top: 0px;
bottom: 0px;
margin-top: auto;
margin-bottom: auto;
--tw-rotate: 45deg;
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.menu-toggle:checked ~ .menu-wrap {
z-index: 10;
opacity: 1;
}
.menu-toggle:checked ~ .menu-wrap .menu {
--tw-translate-x: 0%;
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
デモ
デモはコチラ
※デモではPCサイズの見た目から作成しているので、ハンバーガーメニューの表示を見たい方は検証モードやウィンドウサイズの縮小をして1024px以下でご確認ください!
いかがでしたか?
私が紹介するコードは、いずれもレスポンシブ対応やクロスブラウザの互換性を考慮してベンダープレフィックスなども付けているのでどうしても記述が長くなります…。
ただ、その分汎用性は高くなっているはず!多分、きっと…。
コードはご自由に変更してもらって構わないので、皆さんなりのカスタマイズで使ってみていただいて、もっと使い勝手のいいものがあればぜひ教えてください!
それではまた!
コメント