<script>
/* ---------------------------
メガメニュー(2段・プルダウンあり) v1.0.0
--------------------------- */
/*--- PC or SP 判定 ---*/
function windowPCorSP() {
if (window.matchMedia('(min-width: 770px)').matches) {
/* 画面幅が770px以上のときの処理(PC) */
return 'pc';
} else {
/* 画面幅が769px以下のときの処理(SP) */
return 'sp';
}
};
jQuery(function() {
/*---------------------------------
初期化 (変数定義やクラス付与) START
---------------------------------*/
/* メガメニューのパーツを配置しているURLのパスを指定する (先頭に「/」を入れてください) */
const megaMenuPartsPath = '/js/mega-menu03-parts';
/* メガメニューを一時的に格納するセクション */
const megaMenuTemporarilyContentsSec = jQuery('.js-megaMenu_contents_sec');
/* theme-fo-base */
const themeFoBase = jQuery('#fo-base');
/* メインビジュアル(main-visual) */
const mainVisual = jQuery('.main-visual');
/*------------- 初期化 (変数定義やクラス付与) END -------------*/
/*------------- メガメニューを別ページから読み込んで初期機能設定 START -------------*/
megaMenuTemporarilyContentsSec.load(`${megaMenuPartsPath} .contents`,
function() {
/*---------------------------------
メガメニューPC時 START
---------------------------------*/
/* ヘッダーメガメニュー */
const megaMenuSec = jQuery('.js-megaMenu_custom_sec');
/* メガダウンメニュー */
const megaDownMenuSec = jQuery('.js-megaMenu_down_list_sec');
/* メガダウンメニュー02 */
const megaDownMenuSec02 = jQuery('.js-megamenu_pullList_sec');
/* メガメニューナビゲーションリンク */
const nav_menu_link = jQuery('.js-megaMenu_custom_sec .nav_menu_list a');
/* ダウンメニューか否か判定用テキスト */
const downMenu_reference_text = jQuery('.js-downMenu_reference_row p');
/* メガメニュー要素以外のセクションを駆除 */
jQuery('.js-megaMenu_contents_sec section').not(
'.js-megaMenu_custom_sec, .js-megaMenu_down_list_sec').css('display',
'none');
/* メガメニューを「#fo-base」の上に配置 */
megaMenuTemporarilyContentsSec.insertBefore(themeFoBase);
/* メガメニューを囲んでいる不要なタグを削除 */
megaMenuSec.unwrap().unwrap();
/* JSで「display: none;」を付与して、チラツキ防止用クラスを外す */
megaDownMenuSec.css('display', 'none');
/*--- ダウンメニューか否か判定してクラスを付与 ----*/
nav_menu_link.each(function(index01, element01) {
downMenu_reference_text.each(function(index02, element02) {
if (jQuery(element01).text() === jQuery(element02).text()) {
/* idを生成 */
let id = index01 + 101;
let list = jQuery(element01).parent();
let downMenu = jQuery(element02).closest(
'.js-megaMenu_down_list_sec');
/* ダウンメニューをリンクリスト内部に移動 */
downMenu.appendTo(list);
/* ダウンメニュー用のクラスを付与 */
list.addClass('downMenu');
/* ダウンメニュー用のidをdata属性で付与 */
list.attr('data-mega-target', `${id}`);
/* ダウンメニュー用のidをdata属性で付与 */
downMenu.attr('data-mega-id', `${id}`);
}
});
});
/* 判定用に使用したテキストを削除 */
jQuery('.js-downMenu_reference_row').css('display', 'none');
/* ダウンメニューのリンクのみを取得 */
const downMenuLink = jQuery(
'.js-megaMenu_custom_sec .nav_menu_list .downMenu');
/*ダウンメニューをホバーしたときにサブメガメニューを開く */
downMenuLink.hover(function() {
/*--- マウスカーソルが重なった時の処理 ---*/
jQuery(this).addClass('is-opened');
let hoverLinkId = jQuery(this).attr('data-mega-target');
let downMenu = jQuery(`[data-mega-id="${hoverLinkId}"]`);
downMenu.css('display', '');
}, function() {
/*--- マウスカーソルが離れた時の処理 ---*/
let hoverLinkId = jQuery(this).attr('data-mega-target');
let downMenu = jQuery(`[data-mega-id="${hoverLinkId}"]`);
downMenu.css('display', 'none');
jQuery(this).removeClass('is-opened');
});
function pcMegaMenuSetUp() {
/* js-megamenu_pullList_sec を持つ downMenu に position: relative を追加 */
megaDownMenuSec02.closest('.downMenu').css('position',
'relative');
/* js-menu_lists 内の ul と li にクラスを付与 */
/* メインメニュー(Gナビ) */
const mainMenu = jQuery('.js-menu_lists').first();
/* 1階層目 */
const level_01 = jQuery('.js-menu_lists > div > ul > li');
level_01.each(function() {
jQuery(this).addClass('js-level-01');
});
/* 2階層目 */
const level_02 = jQuery('.js-menu_lists > div > ul > li > ul > li');
level_02.each(function() {
jQuery(this).addClass('js-level-02');
});
/* 3階層目 */
const level_03 = jQuery('.js-menu_lists > div > ul > li > ul > li > ul > li');
level_03.each(function() {
jQuery(this).addClass('js-level-03');
});
/* 1階層目トリガー */
level_01.each(function() {
const el = jQuery(this);
if (el.find('.js-level-02').length > 0) {
el.addClass('js-level-01-trigger').removeClass('js-level-01');
const iconElement = jQuery('<span class="toggle_icon"></span>');
const link = el.find('a').first();
if (link.length) {
link.append(iconElement);
}
}
});
/* 2階層目 [ul] */
level_02.each(function() {
const level_01_cont = jQuery(this).parent();
level_01_cont.addClass('js-level-01-cont').hide();
});
/* 2階層目トリガー */
level_02.each(function() {
const el = jQuery(this);
if (el.find('.js-level-03').length > 0) {
el.addClass('js-level-02-trigger').removeClass('js-level-02');
const iconElement = jQuery('<span class="toggle_icon"></span>');
const link = el.find('a').first();
if (link.length) {
link.append(iconElement);
}
}
});
/* 3階層目 [ul] */
level_03.each(function() {
const level_02_cont = jQuery(this).parent();
level_02_cont.addClass('js-level-02-cont').hide();
});
/*------------- 初期化 (変数定義やクラス付与) END -------------*/
/*------------- イベント設定 START -------------*/
function setupTriggerEvents(triggerSelector, targetSelector) {
if (windowPCorSP() === 'pc') {
/* PC時はクリックイベントを削除し、ホバーのみにする */
jQuery(triggerSelector).off('click').hover(function() {
const targetCont = jQuery(this).find(targetSelector).first();
if (targetCont.length) {
targetCont.css('display', 'block'); /* ホバー時に表示 */
}
}, function() {
const targetCont = jQuery(this).find(targetSelector).first();
if (targetCont.length) {
targetCont.css('display', 'none'); /* ホバーを外したら非表示 */
}
});
}
}
/* 1階層目トリガーのクリックイベント */
setupTriggerEvents('.js-level-01-trigger', '.js-level-01-cont');
/* 2階層目トリガーのクリックイベント */
setupTriggerEvents('.js-level-02-trigger', '.js-level-02-cont');
/*------------- イベント設定 END -------------*/
/* PCのみでホバー処理:li内にulがある場合 */
if (windowPCorSP() === 'pc') {
jQuery('.js-megaMenu_custom_sec .js-menu_lists li').has('ul').hover(function() {
jQuery(this).children('ul').css('display', 'block');
}, function() {
jQuery(this).children('ul').css('display', 'none');
});
}
}
/*------------- メガメニューPC時 END -------------*/
/*---------------------------------
メガメニューSP時 START
---------------------------------*/
/*--- 変数定義 ---*/
/* ハンバーガーメニューボタン */
const megaMenuTriggerElement = jQuery('<div class="megaMenu_trigger">' +
'<span></span>' + '<span></span>' + '<span></span>' + '</div>');
const mainMegaMenuElement = jQuery(
'<nav class="main-megaMenu"><ul></ul></nav>');
function spMegaMenuSetUp() {
/* ハンバーガメニューを挿入&削除 */
if (windowPCorSP() === 'sp' && !jQuery('.megaMenu_trigger').length) { /*--- 画面幅SPのとき ---*/
/* ハンバーガメニューボタンとメインメニューを追加 */
megaMenuTriggerElement.appendTo('.js-megaMenu_custom_sec > .inner').ready(
function() {
mainMegaMenuElement.insertAfter('.megaMenu_trigger');
const megaMenuTrigger = jQuery('.megaMenu_trigger');
const mainMegaMenu = jQuery('.main-megaMenu');
mainMegaMenu.css('display', 'none');
/* メインメニューにメニュー要素を追加 */
nav_menu_link.parent().clone().appendTo('.main-megaMenu > ul');
/* メニューの下層(プルダウン)要素を追加する */
/* 1階層目のメニューを取得 */
const level01 = jQuery('.main-megaMenu > ul > li');
level01.addClass('js-level-01');
level01.each(function(index01, element01) {
let id = jQuery(element01).attr('data-mega-target');
let section = jQuery(
`.main-megaMenu .js-megaMenu_down_list_sec[data-mega-id="${id}"]`
);
/* ボタンパーツの場合 */
let buttonLink = section.find('.button a').clone();
let buttonLinkList = buttonLink.removeClass().addClass(
'wrap-item');
if (buttonLink.length) {
buttonLinkList.appendTo(jQuery(element01));
}
/* リッチテキストもしくはリンクリストの場合 */
/* 新リッチ/旧リッチともに UL だけをクローン(wrapper DIV は連れてこない) */
let v2Ul = section
.find('.styles_richtext-v2-content__l0LFT > ul, [data-designpart="rich-text-normal-v2"] ul')
.first();
let legacyUl = section
.find('.richtext > div > ul, .richtext > ul, .list > ul')
.first();
if (v2Ul.length) {
v2Ul.clone(false).appendTo(jQuery(element01));
} else if (legacyUl.length) {
legacyUl.clone(false).appendTo(jQuery(element01));
}
section.css('display', 'none');
});
jQuery('.main-megaMenu .js-megaMenu_down_list_sec').css('display',
'none');
jQuery('.wrap-item').wrap('<li class="js-level-02">');
jQuery('.wrap-item').removeAttr('class');
level01.each(function(index, element) {
let target = jQuery(element).find('.js-level-02');
target.wrapAll('<ul class="js-level-01-cont">');
});
/* 1階層目 */
const level01List = jQuery('.main-megaMenu > ul > li');
const level02List = jQuery('.main-megaMenu > ul > li > ul > li');
const level03List = jQuery(
'.main-megaMenu > ul > li > ul > li > ul > li');
const level04List = jQuery(
'.main-megaMenu > ul > li > ul > li > ul > li > ul > li');
level01List.addClass('js-level-01');
level02List.addClass('js-level-02');
level03List.addClass('js-level-03');
level04List.addClass('js-level-04');
level02List.closest('ul').addClass('js-level-01-cont');
level03List.closest('ul').addClass('js-level-02-cont');
level04List.closest('ul').addClass('js-level-03-cont');
const downMenu = jQuery('.downMenu a');
const toggleIconElement = jQuery('<span class="toggle_icon"></span>');
jQuery('.main-megaMenu > ul > li ul').css('display', 'none');
let toggle_icon_link = [];
jQuery('.main-megaMenu > ul li ul').prevAll().each(function(index,
element) {
if (element.tagName.toLowerCase() === 'a') {
toggle_icon_link.push(jQuery(element));
return
} else if (element.tagName.toLowerCase() === 'strong') {
toggle_icon_link.push(jQuery(element).find('a'));
}
});
toggleIconElement.appendTo(toggle_icon_link);
/* 指定したリスト要素に対してテキストノードや <strong> をラップし、アイコンを追加する関数 */
function wrapTextWithIcon(list) {
list.each(function() {
const el = jQuery(this); /* 現在の <li> 要素を変数に格納 */
const hasSubMenu = el.children('ul').length > 0; /* 子ulがあるか */
const hasAnchor = el.children('a, div > a, strong > a').length > 0; /* 見出しがaか */
if (!hasSubMenu || hasAnchor) { return; } /* 子ulなし or a直下なら何もしない */
/* 直下のテキストノードまたは <strong> を取得 */
const textNode = el.contents().filter(function() {
/* テキストノードまたは <strong> を対象にする */
return (this.nodeType === 3 && jQuery(this).text().trim() !==
'') || /^(STRONG|SPAN|EM|B|DIV)$/i.test(this.tagName || '');
});
/* テキストノードまたは <strong> がある場合に処理を実行 */
if (textNode.length > 0) {
/* js-trigger-wrapper と toggle_icon の要素を作成 */
const wrapper = jQuery(
'<span class="js-trigger-wrapper"></span>');
const toggleIcon = jQuery('<span class="toggle_icon"></span>');
/* テキストノードや <strong> の内容を移動 */
textNode.each(function() {
if (this.nodeType === 3) { /* テキストノードの場合 */
const textContent = jQuery(this).text().trim();
wrapper.append(textContent);
jQuery(this).remove(); /* 元のテキストノードを削除 */
} else { /* STRONG/SPAN/EM/B/DIV の場合 */
const strongContent = jQuery(this).text().trim();
wrapper.append(strongContent);
jQuery(this).remove(); /* 元の要素を削除 */
}
});
/* toggle_icon を追加 */
wrapper.append(toggleIcon);
/* 親要素の先頭に挿入 */
el.prepend(wrapper);
}
});
}
/* level02List に対して処理を実行 */
level02List.each(function() {
const el = jQuery(this); /* 現在の <li> 要素を変数に格納 */
const hasSubMenu = el.children('ul').length > 0;
const hasAnchor = el.children('a, div > a, strong > a').length > 0;
/* level02List の処理 */
if (hasSubMenu && !hasAnchor) {
wrapTextWithIcon(el);
}
/* level03List の処理を追加 */
const level03List = el.find('> ul > li'); /* level03 の <li> を取得 */
level03List.each(function() {
const level03El = jQuery(this);
/* 条件: <li> 直下に <ul> があるかつ <a> タグで囲われていない場合 */
const hasSubMenu3 = level03El.children('ul').length > 0;
/* 直下に <ul> があるか確認 */
const hasAnchor3 = level03El.children('a, div > a, strong > a').length > 0;
/* <a> タグがあるか確認 */
if (hasSubMenu3 && !hasAnchor3) {
wrapTextWithIcon(level03El);
}
});
});
jQuery(
'.downMenu a .toggle_icon, .downMenu .js-trigger-wrapper > .toggle_icon'
).on('click', function(e) {
e.preventDefault();
e.stopPropagation();
let list = jQuery(this).closest('li');
let openTarget = list.children('ul');
jQuery(this).toggleClass('is-open');
openTarget.toggleClass('is-open');
openTarget.stop(true, true).slideToggle(300);
});
/* ハンバーガメニュークリックイベント */
megaMenuTrigger.on('click', function() {
megaMenuTrigger.toggleClass('is-active');
mainMegaMenu.toggleClass('is-active');
mainMegaMenu.toggle();
jQuery('html').toggleClass('is-locked');
megaMenuSec.toggleClass('is-open');
});
});
} else if (windowPCorSP() === 'pc') { /*--- 画面幅PCのとき ---*/
/* ハンバーガメニューボタンとメインメニューを削除 */
jQuery('.megaMenu_trigger').removeClass('is-active');
jQuery('.main-megaMenu').removeClass('is-active');
jQuery('.megaMenu_trigger').css('display', 'none');
jQuery('.main-megaMenu ul li').css('display', 'none');
jQuery('.main-megaMenu').css('display', 'none');
jQuery('.downMenu a .toggle_icon').css('display', 'none');
/* ハンバーガメニューが開いてるときのクラス名を削除 */
jQuery('html').removeClass('is-locked');
jQuery('is-open').removeClass('is-open');
}
};
/*------------- メガメニューSP時 END -------------*/
/* 初期化: PCのみで関数を実行 */
if (windowPCorSP() === 'pc') {
pcMegaMenuSetUp(); /* PCの場合にのみ実行 */
}
/*--- ウィンドウのリサイズ完了後の処理 ---*/
const windowResize = () => {
let timer = 0;
let delay = 100;
window.addEventListener('resize', () => {
clearTimeout(timer);
timer = setTimeout(() => {
spMegaMenuSetUp();
}, delay);
}, false);
};
spMegaMenuSetUp();
windowResize();
});
/*------------- メガメニューを別ページから読み込んで初期機能設定 END -------------*/
});
/*--- ページ内遷移ずれる対策 ---*/
window.addEventListener('load', () => {
setTimeout(() => {
const headerSec = document.querySelector('.js-megaMenu_custom_sec'); /* メガメニューを取得 */
if (headerSec) {
const headerHeight = headerSec.offsetHeight; /* メガメニューの高さを取得 */
/* 固定ナビの場合の処理 */
if (headerSec.classList.contains('fixed')) {
document.documentElement.style.setProperty('--navi-height',
`${headerHeight}px`);
}
}
}, 300);
});
/*--- ページ内遷移ずれる対策 END ---*/
/* ---------------------------
メガメニュー(2段・プルダウンあり) END
--------------------------- */
</script>