どうも、くまだです。
ハンバーガーメニューではなく、弁当ボックスメニューボタンの実装になります。
【HTML】弁当メニューボタンの実装【CSS】
動き的なものは下記になります。右上にあるボタンが、いわゆるハンバーガーメニュー…ではなく弁当ボックスメニューといわれるものです。
コードは下記になります。
<div class="l-container">
<header class="l-header p-header">
<div class="p-header__inner">
<h1 class="p-header__title" id="logo-label">
<a href="" aria-labelledby="logo-label">ロゴ</a>
</h1>
<div class="p-header__hamburger">
<button class="c-hamburger" aria-expanded="false" aria-label="メニューを開く">
</button>
</div>
<nav class="p-header__nav p-nav" aria-expanded="false">
<div class="p-nav__inner">
<ul class="p-nav__list">
<li class="p-nav__item">
<a href="#" class="p-nav__link">メニュー</a>
</li>
<li class="p-nav__item">
<a href="#" class="p-nav__link">メニュー</a>
</li>
<li class="p-nav__item">
<a href="#" class="p-nav__link">メニュー</a>
</li>
<li class="p-nav__item">
<a href="#" class="p-nav__link">メニュー</a>
</li>
</ul>
</div>
</nav>
</div>
</header>
<main>
メインコンテンツ
</main>
</div>
ul,
li {
list-style: none;
}
p {
margin: 0;
}
a {
text-decoration: none;
}
main {
padding-top: 72px;
background: skyblue;
height: 1200px;
}
.l-header {
display: block;
z-index: 999;
position: fixed;
top: 0;
right: 0;
left: 0;
width: 100%;
height: 72px;
background: #fff;
}
.c-hamburger {
position: relative;
width: inherit;
height: inherit;
margin: 0;
cursor: pointer;
background-color: lightblue;
}
.c-hamburger::after {
position: absolute;
content: '';
width: 6px;
height: 6px;
background: orange;
display: block;
left: calc(50% - 4px);
top: calc(50% - 4px);
box-shadow: -12px 0 0 orange, 12px 0 0 orange, -12px -12px 0 orange, 0 -12px 0 orange, 12px -12px 0 orange, -12px 12px 0 orange, 0 12px 0 orange, 12px 12px 0 orange;
transition: box-shadow .4s;
}
.c-hamburger::before {
opacity: 0;
content: "";
position: absolute;
width: 40px;
height: 1px;
background: orange;
transform: translate(-50%, -50%) rotate(135deg);
top: 50%;
left: 50%;
transition: opacity .4s;
}
.c-hamburger[aria-expanded="true"]::before {
opacity: 1;
}
.c-hamburger[aria-expanded="true"]::after {
box-shadow: initial;
content: "";
position: absolute;
width: 40px;
height: 1px;
background: orange;
transform: translate(-50%, -50%) rotate(45deg);
top: 50%;
left: 50%;
}
.p-header__nav {
display: flex;
z-index: 10;
position: absolute;
top: 0;
right: -100%;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100vh;
background: transparent;
font-weight: 700;
opacity: 0;
transition: 0.6s;
}
@media screen and (min-width:768px) {
.p-header__nav {
position: static;
height: 100%;
opacity: initial;
align-items: flex-end;
}
}
.p-header__inner {
display: flex;
align-items: center;
justify-content: space-between;
height: inherit;
padding: 13px 20px;
}
.p-header__title {
width: 100%;
max-width: 120px;
height: 48px;
background: lightgray;
}
.p-header__title a {
display: block;
width: 100%;
height: auto;
}
.p-header__title a img {
height: 100%;
}
.p-header__hamburger {
z-index: 100;
position: absolute;
top: 0;
right: 0;
width: 95px;
height: 100%;
}
@media screen and (min-width:768px) {
.p-header__hamburger {
display: none;
}
}
.p-header__nav[aria-expanded="true"] {
position: fixed;
top: 0;
right: 0;
background: lightblue;
opacity: 1;
transition: 0.6s;
}
.p-nav {
padding-top: 72px;
padding-bottom: 72px;
}
@media screen and (min-width:768px) {
.p-nav {
padding-top: 16px;
padding-bottom: 16px
}
}
.p-nav__list {
display: block;
width: 100%;
padding-right: 20px;
padding-left: 20px;
background: lightblue;
}
@media screen and (min-width:768px) {
.p-nav__list {
display: flex;
background: #fff;
padding-right: 0;
}
}
.p-nav__item {
position: relative;
width: 100%;
}
.p-nav__link {
display: block;
width: 100%;
height: 100%;
padding: 20px;
text-align: center;
}
window.addEventListener('DOMContentLoaded', () => {
const hamburger = document.querySelector('.c-hamburger');
const nav = document.querySelector('.p-header__nav');
hamburger.addEventListener('click', () => {
const hamburgerAriaValue = hamburger.getAttribute('aria-expanded');
if (hamburgerAriaValue === 'false') {
hamburger.setAttribute('aria-expanded', true);
nav.setAttribute('aria-expanded', true);
} else {
hamburger.setAttribute('aria-expanded', false);
nav.setAttribute('aria-expanded', false);
}
});
});
なお、WAI-ARIA属性とJavaScriptを使った実装の方法は、下記の記事で解説しているのでここでは省略します。
肝心の弁当ボックス部分は、下記のHTMLのみでつくり、小さい四角はCSSで実装。
<button class="c-hamburger" aria-expanded="false" aria-label="メニューを開く">
</button>
.c-hamburger::after {
position: absolute;
content: '';
width: 6px;
height: 6px;
background: orange;
display: block;
left: calc(50% - 4px);
top: calc(50% - 4px);
box-shadow: -12px 0 0 orange, 12px 0 0 orange, -12px -12px 0 orange, 0 -12px 0 orange, 12px -12px 0 orange, -12px 12px 0 orange, 0 12px 0 orange, 12px 12px 0 orange;
transition: box-shadow .4s;
}
小さい四角の大きさ1つ1つは、widthとheightで指定。複数の四角はbox-shadowで作っています。
分かりやすくするために、上記のコードのbackgroundを赤色にすると、中央の四角が赤色になります。(それ以外の四角はbox-shadowで出来ている)
box-shadowは複数の値が設定できます。わかりやすくするため、box-shadowの値を一つだけにします。
.c-hamburger::after {
position: absolute;
content: '';
width: 6px;
height: 6px;
background: red;
display: block;
left: calc(50% - 4px);
top: calc(50% - 4px);
box-shadow: 0 -12px 0 orange;
transition: box-shadow .4s;
}
0 -12pxなので、x軸に0、y軸に-12pxの位置にシャドウができます。斜めに配置したい場合は、
box-shadow: -12px -12px 0 orange;
のように記述するとx軸に-12px、y軸に-12pxの位置なので、斜めに配置されます。
あとは、下記のように上下左右と斜めにそれぞれ配置するように記述すると、最初のような弁当ボックスメニューボタンができます。
box-shadow:
-12px 0 0 orange,
12px 0 0 orange,
-12px -12px 0 orange,
0 -12px 0 orange,
12px -12px 0 orange,
-12px 12px 0 orange,
0 12px 0 orange,
12px 12px 0 orange;
ここまで読んでくださりありがとうございました。