チェックボックスの機能を使って動作させるので、
JavaScriptなしで実装できます。
<label class="menuWrap">
<input type="checkbox">
<span class="menu">
<span class="menuBtn"></span>
</span>
<div class="openTxt">
<p>OPEN</p>
</div>
</label>
<p class="closeTxt">CLOSE</p>/* reset */
@import url('https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css');
/* setting */
body {
background: #d8e698;
}
.closeTxt{
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.menuWrap .menu {
position: absolute;
right: 10px;
top: 10px;
z-index: 100;
width: 60px;
height: 60px;
background: #FFF;
border-radius: 50%;
transition: 0.5s ease-in-out;
box-shadow: 0 0 0 0 #FFF, 0 0 0 0 #FFF;
cursor: pointer;
}
.menuWrap .menuBtn {
position: absolute;
top: 30px;
left: 15px;
width: 30px;
height: 3px;
background: #316745;
display: block;
transform-origin: center;
transition: 0.5s ease-in-out;
}
.menuWrap .menuBtn:after,
.menuWrap .menuBtn:before {
transition: 0.5s ease-in-out;
content: "";
position: absolute;
display: block;
width: 100%;
height: 100%;
background: #316745;
}
.menuWrap .menuBtn:before {
top: -10px;
}
.menuWrap .menuBtn:after {
bottom: -10px;
}
.menuWrap input {
display: none;
}
.menuWrap input:checked + .menu {
box-shadow: 0 0 0 100vw #FFF, 0 0 0 100vh #FFF;
border-radius: 0;
}
.menuWrap input:checked + .menu .menuBtn {
transform: rotate(45deg);
}
.menuWrap input:checked + .menu .menuBtn:after {
transform: rotate(90deg);
bottom: 0;
}
.menuWrap input:checked + .menu .menuBtn:before {
transform: rotate(90deg);
top: 0;
}
.menuWrap input:checked + .menu + .openTxt {
opacity: 1;
}
.menuWrap .openTxt {
z-index: 200;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
opacity: 0;
transition: 0.25s 0s ease-in-out;
}See the Pen circle overlay by Chiharu (@chiharu) on CodePen.