グローバルメニューとは?
グローバルメニューは、ヘッダーメニューやメインメニューなどとも呼ばれ、画面上部のメニューのことです。
グローバルメニューの作り方(html)
<body>
<!-- ヘッダー -->
<header>
<div id="headerContent">
</div>
<!--グローバルナビ-->
<nav id="globalNav">
<ul class="menu">
<li class="menu-item">
<a href="#" class="menu-item-link"><span>menu1</span><span class="triangular_arrow"></span></a>
<div class="menuDrop">
<ul class="menu_children">
<li><a href="">初めて受診する方</a></li>
<li><a href="">通院中・再来の方</a></li>
<li><a href="">入院される患者さん・面会の方</a></li>
<li><a href="">人間ドックを受診する方</a></li>
</ul>
</div><!--menuDrop-->
</li><!--menu-item-->
<li class="menu-item">
<a href="#" class="menu-item-link"><span>menu2</span><span class="triangular_arrow"></span></a>
<div class="menuDrop md2">
<ul class="menu_children">
<li><a href="">診療科・部門一覧</a></li>
<li><a href="">病名・医師名検索</a></li>
<li><a href="">役割・機能</a></li>
<li><a href="">健康・医療情報</a></li>
</ul>
</div><!--menuDrop-->
</li><!--menu-item-->
<li class="menu-item">
<a href="#" class="menu-item-link"><span>menu3</span><span class="triangular_arrow"></span></a>
<div class="menuDrop md3">
<ul class="menu_children">
<li><a href="">地図・フロア図</a></li>
<li><a href="">院内施設のご案内</a></li>
<li><a href="">よくあるお問い合わせ</a></li>
<li><a href="">お問い合わせ一覧</a></li>
</ul>
</div><!--menuDrop-->
</li><!--menu-item-->
</ul><!--menu-->
</nav><!--globalNav-->
</header>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script type="text/javascript" src="js/script.js"></script>
</body>
グローバルメニューの作り方(css)
@charset "UTF-8";
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
@media screen and (min-width:768px) {
#headerContent {
width: 100%;
height: 100px;
}
}
@media screen and (max-width:767px) {
#headerContent {
width: 100%;
height: 50px;
}
}
/* グローバルナビ */
#globalNav {
width: 100%;
background-color: #005;
}
.menu {
display: flex;
margin: 0 auto;
list-style: none;
}
@media screen and (min-width:1025px) {
.menu {
width: 980px;
height: 50px;
}
}
@media screen and (max-width:1024px) {
.menu {
width: 100%;
height: 50px;
}
}
.menu-item {
width: calc(100% / 3);
height: 100%;
position: relative;
}
.menu-item::before {
content: "";
display: inline-block;
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 0;
width: 1px;
height: 20px;
background-color: #6e6c95;
}
.menu-item:nth-child(3)::after {
content: "";
display: inline-block;
position: absolute;
top: 50%;
transform: translateY(-50%);
right: 0;
width: 1px;
height: 20px;
background-color: #6e6c95;
}
.menu-item-link {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
color: #fff;
text-decoration: none;
font-size: 17px;
}
.menu-item-link:hover {
background-color: #cc0000;
}
.triangular_arrow {
display: block;
width: 6px;
height: 6px;
margin-left: 15px;
border-bottom: solid 2px #fff;
border-right: solid 2px #fff;
transform: rotate(45deg);
}
.triangular_arrow.open {
transform: rotate(225deg);
}
.menuDrop {
display: none;
border: 1px solid #ccc;
position: relative;
}
.menuDrop.open {
display: block;
}
@media screen and (max-width:767px) {
.menuDrop {
width: 300%;
}
.md2 {
right: 100%;
}
.md3 {
right: 200%;
}
}
.menu_children {
list-style: none;
}
.menu_children li {
padding: 10px;
}
.menu_children li:not(:last-child) {
border-bottom: 1px solid #ccc;
}
.menu_children li a {
display: inline-block;
color: #245dc1;
font-size: 15px;
}
.menu_children li a:hover {
text-decoration: none;
}
.menu_children li a::before {
content: '';
display: inline-block;
width: 19px;
height: 17px;
background-image: url('../images/arrow_01.png');
vertical-align: middle;
margin-top: -3px;
margin-right: 5px;
}
box-sizing: border-box;
とdisplay: flex;
と::before
は重要です。
こちらのサイトが分かりやすいです。
【CSS】box-sizing:border-boxの使い方|効かない時は? | サルワカ
【CSS】疑似要素の画像サイズを変更する方法 | サルワカ
https://saruwakakun.com/html-css/reference/change-before-after
日本語対応!CSS Flexboxのチートシートを作ったので配布します | Webクリエイターボックス
グローバルメニューの作り方(jQuery)
$(function(){
let timer = false;
let prewidth = $(window).width();
$(window).resize(function() {
if (timer !== false) {
clearTimeout(timer);
}
timer = setTimeout(function() {
let nowWidth = $(window).width();
if(prewidth !== nowWidth){
// リロード
location.reload();
}
prewidth = nowWidth;
}, 200);
});
});
$(function () {
if (window.matchMedia('(min-width: 768px)').matches) {
$('.menu-item').hover(function() {
$(this).children('.menuDrop').stop().slideDown('fast');
// マウスを離した際のイベント
}, function() {
$(this).children('.menuDrop').css('display', 'none');
return false;
});
} else if (window.matchMedia('(max-width:767px)').matches) {
$('.menu-item').click(function() {
$(this).children('.menuDrop').toggleClass('open');
$(this).find('.triangular_arrow').toggleClass('open');
$('.menu-item').not($(this)).children('.menuDrop').removeClass('open');
$('.menu-item').not($(this)).find('.triangular_arrow').removeClass('open');
return false;
});
}
});
1行目から17行目は、リロード(再読み込み)の為に書いています。
画面サイズが変わった時に、新たに発生すべきイベントが、再読み込みボタンを押すまで発生しません。
それを押さずとも、発生するようにしたものです。
19行目から37行目は、画面サイズが768px以上の時、ホバーしたらメニューが開きます。
それ以外は、閉じます。
画面サイズが767px以下の時、クリックしたらopenクラスが付与され、メニューが開き、三角矢印が反転します。
それと同時に、クリックされていないものはopenクラスが除去され、メニューは閉じ、三角矢印は元に戻ります。
また、toggleの為、クリックしてopenクラスが付与されたものを、もう1度クリックするとopenクラスが除去されます。
あと、22行目のstop()
は、実行中のアニメーションを中止するメソッドです。
1回ホバーするだけだったら、書いても書かなくても一緒ですが、マウスで何回もホバーしたら、延々とメニューが開いたり閉じたりするんですよね。(笑)
前のイベントが終わってないと、次のイベントが始まらないという性質からです。
そうならない様に、書いています。
さいごに
jQueryは、今現在(2024/02)最新版は、ver3.7.1になります。
今日は、ありがとうございました。では、また!