※この記事は最終更新日から10か月以上経過しています。内容が古い可能性があります。
Circular Fly-Out Navigation Menuの作り方
Circular Fly-Out Navigation MenuのBlogを参考にさせていただいてサークルをClick(Tap)すると「ぴょっこり」飛び出すサークルナビゲーションメニューを作ったので覚えがき。
Demo
Click(Tap)すると
メニューリスト(ul)でHTMLを追加します。
HTML
<div id="c-circle-nav" class="c-circle-nav"> <button id="c-circle-nav__toggle" class="c-circle-nav__toggle"> <span>Toggle</span> </button> <ul class="c-circle-nav__items"> <li class="c-circle-nav__item"> <a href="#" class="c-circle-nav__link"> <center><img src="images/House.png"></center> </a> </li> <li class="c-circle-nav__item"> <a href="#" class="c-circle-nav__link"> <center><img src="images/Facebook.png"></center> </a> </li> <li class="c-circle-nav__item"> <a href="#" class="c-circle-nav__link"> <center><img src="images/Pinterest.png"></center> </a> </li> <li class="c-circle-nav__item"> <a href="#" class="c-circle-nav__link"> <center><img src="images/Twitter.png"></center> </a> </li> <li class="c-circle-nav__item"> <a href="#" class="c-circle-nav__link"> <center><img src="images/Google.png"></center> </a> </li> </ul> </div>
レスポンシブでも対応できるように下記のようなCSSを記述しました。
CSS
.c-circle-nav__toggle, .c-circle-nav__toggle span { transition: background 0.3s; -webkit-transition: background 0.3s; } .c-circle-nav { position: fixed; bottom: 12px; right: 12px; z-index: 1000; width: 48px; height: 48px; border-radius: 24px; } @media (min-width:480px)and (min-height:480px) { .c-circle-nav { width: 96px; height: 96px; border-radius: 48px; } } .c-circle-nav__items { display: block; list-style: none; position: absolute; z-index: 90; margin: 0; padding: 0; } .c-circle-nav__item { display: block; position: absolute; top: 0; left: 0; width: 48px; height: 48px; border-radius: 24px; opacity: 0; -webkit-transition-property: -webkit-transform,opacity; transition-property: transform,opacity; -webkit-transition-duration: 0.3s,.3s; transition-duration: 0.3s,.3s; -webkit-transition-timing-function: cubic-bezier(.35,-.59,.47,.97); transition-timing-function: cubic-bezier(.35,-.59,.47,.97); } .c-circle-nav__item:nth-child(1) { -webkit-transition-delay: 0.4s; transition-delay: 0.4s; } .c-circle-nav__item:nth-child(2) { -webkit-transition-delay: 0.3s; transition-delay: 0.3s; } .c-circle-nav__item:nth-child(3) { -webkit-transition-delay: 0.2s; transition-delay: 0.2s; } .c-circle-nav__item:nth-child(4) { -webkit-transition-delay: 0.1s; transition-delay: 0.1s; } .c-circle-nav__item:nth-child(5) { -webkit-transition-delay: 0s; transition-delay: 0s; } .c-circle-nav.is-active .c-circle-nav__item { -webkit-transition-timing-function: cubic-bezier(.35,.03,.47,1.59); transition-timing-function: cubic-bezier(.35,.03,.47,1.59); opacity: 1; } .c-circle-nav.is-active .c-circle-nav__item:nth-child(1) { -webkit-transition-delay: 0s; transition-delay: 0s; -webkit-transform: translate(-144px,0); -ms-transform: translate(-144px,0); transform: translate(-144px,0); } @media (min-width:480px)and (min-height:480px) { .c-circle-nav__item { width: 96px; height: 96px; border-radius: 48px; } .c-circle-nav.is-active .c-circle-nav__item:nth-child(1) { -webkit-transform: translate(-288px,0); -ms-transform: translate(-288px,0); transform: translate(-288px,0); } } .c-circle-nav.is-active .c-circle-nav__item:nth-child(2) { -webkit-transition-delay: 0.1s; transition-delay: 0.1s; -webkit-transform: translate(-134px,-56px); -ms-transform: translate(-134px,-56px); transform: translate(-134px,-56px); } @media (min-width:480px)and (min-height:480px) { .c-circle-nav.is-active .c-circle-nav__item:nth-child(2) { -webkit-transform: translate(-267px,-111px); -ms-transform: translate(-267px,-111px); transform: translate(-267px,-111px); } } .c-circle-nav.is-active .c-circle-nav__item:nth-child(3) { -webkit-transition-delay: 0.2s; transition-delay: 0.2s; -webkit-transform: translate(-102px,-102px); -ms-transform: translate(-102px,-102px); transform: translate(-102px,-102px); } @media (min-width:480px)and (min-height:480px) { .c-circle-nav.is-active .c-circle-nav__item:nth-child(3) { -webkit-transform: translate(-204px,-204px); -ms-transform: translate(-204px,-204px); transform: translate(-204px,-204px); } } .c-circle-nav.is-active .c-circle-nav__item:nth-child(4) { -webkit-transition-delay: 0.3s; transition-delay: 0.3s; -webkit-transform: translate(-56px,-134px); -ms-transform: translate(-56px,-134px); transform: translate(-56px,-134px); } @media (min-width:480px)and (min-height:480px) { .c-circle-nav.is-active .c-circle-nav__item:nth-child(4) { -webkit-transform: translate(-111px,-267px); -ms-transform: translate(-111px,-267px); transform: translate(-111px,-267px); } } .c-circle-nav.is-active .c-circle-nav__item:nth-child(5) { -webkit-transition-delay: 0.4s; transition-delay: 0.4s; -webkit-transform: translate(0,-144px); -ms-transform: translate(0,-144px); transform: translate(0,-144px); } .c-circle-nav__link { display: block; width: 100%; height: 100%; border-radius: 24px; box-shadow: inset 0 0 0 2px #fff; } @media (min-width:480px)and (min-height:480px) { .c-circle-nav.is-active .c-circle-nav__item:nth-child(5) { -webkit-transform: translate(0,-288px); -ms-transform: translate(0,-288px); transform: translate(0,-288px); } .c-circle-nav__link { border-radius: 48px; } } .c-circle-nav__link img { display: block; max-width: 100%; height: auto; padding-top: 15px; } .c-circle-nav__link:hover { box-shadow: inset 0 0 0 2px #e91e63; } .c-circle-nav__toggle { display: block; position: absolute; z-index: 100; margin: 0; padding: 0; width: 48px; height: 48px; background-color: #e91e63; font: inherit; font-size: 0; text-indent: -9999px; border-radius: 24px; cursor: pointer; border: none; -webkit-appearance: none; -moz-appearance: none; appearance: none; box-shadow: none; } @media (min-width:480px)and (min-height:480px) { .c-circle-nav__toggle { width: 96px; height: 96px; border-radius: 48px; } } .c-circle-nav__toggle.is-active, .c-circle-nav__toggle:focus, .c-circle-nav__toggle:hover { outline: 0; background-color: #e91e63; } .c-circle-nav__toggle span, .c-circle-nav__toggle span::after, .c-circle-nav__toggle span::before { display: block; position: absolute; height: 4px; background: #fff; border-radius: 1px; } .c-circle-nav__toggle span { top: 22px; left: 10px; right: 10px; } @media (min-width:480px)and (min-height:480px) { .c-circle-nav__toggle span, .c-circle-nav__toggle span::after, .c-circle-nav__toggle span::before { height: 8px; border-radius: 2px; } .c-circle-nav__toggle span { top: 44px; left: 20px; right: 20px; } } .c-circle-nav__toggle span::after, .c-circle-nav__toggle span::before { left: 0; width: 100%; content: ""; -webkit-transition-duration: 0.3s,.3s; transition-duration: 0.3s,.3s; -webkit-transition-delay: 0.3s,0s; transition-delay: 0.3s,0s; } .c-circle-nav__toggle span::before { top: -8px; -webkit-transition-property: top,-webkit-transform; transition-property: top,transform; } .c-circle-nav__toggle span::after { bottom: -8px; -webkit-transition-property: bottom,-webkit-transform; transition-property: bottom,transform; } @media (min-width:480px)and (min-height:480px) { .c-circle-nav__toggle span::before { top: -16px; } .c-circle-nav__toggle span::after { bottom: -16px; } } .c-circle-nav__toggle.is-active span { background: 0 0; } .c-circle-nav__toggle.is-active span::before { top: 0; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); -webkit-transition-delay: 0s,.3s; transition-delay: 0s,.3s; } .c-circle-nav__toggle.is-active span::after { bottom: 0; -webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-transition-delay: 0s,.3s; transition-delay: 0s,.3s; } .c-mask { position: fixed; top: 0; left: 0; z-index: 900; visibility: hidden; opacity: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,.8); -webkit-transition: opacity 0.3s,visibility 0.3s; transition: opacity 0.3s,visibility 0.3s; } .c-mask.is-active { opacity: 1; visibility: visible; }
js(jQuery)
「jquery.js」と外部ファイルとして「circleMenu.js」を記述します。
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22https%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.11.3%2Fjquery.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" /> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22js%2FcircleMenu.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" />
「circleMenu.js」の内容は下記のようになっています。
!function () { "use strict"; function c() { s .classList .add(n), t .classList .add(n), i .classList .add(n) } function e() { s .classList .remove(n), t .classList .remove(n), i .classList .remove(n) } var s = document.querySelector("#c-circle-nav"), t = document.querySelector("#c-circle-nav__toggle"), i = document.createElement("div"), n = "is-active"; i .classList .add("c-mask"), document .body .appendChild(i), t.addEventListener("click", function (s) { s.preventDefault(), t .classList .contains(n) ? e() : c() }), i.addEventListener("click", function () { e(), console.log("click") }) }();
これで、レスポンシブで使えるサークルメニューができました。
以上、今日の覚えがき。