italia2024
Version:
Italia 2024 assets
186 lines (160 loc) • 6.57 kB
JavaScript
(function () {
//invisibleTab:CSS
var insertStyle = document.createElement('style');
insertStyle.insertAdjacentHTML('beforeend', `
/* タブパネル(PC)
-------------------------------------- */
@media print, screen and (min-width: 744px) {
.tab-panel {
overflow: hidden;
visibility: hidden;
height: 0;
opacity: 0;
}
.tab-panel.is-summoned {
visibility: visible;
height: auto;
opacity: 1;
}
}
`);
document.getElementsByTagName('head')[0].appendChild(insertStyle);
})(); ///function invisibleTab:CSS();
(function () {
//add-isSummon.js(URLハッシュ値から、'is-summoned'クラスを付与)
//URLのハッシュ値から、summonHashを取得
const summonHash = window.location.hash.slice(1);
//ウィンドウロード時のイベント
let timerV6PA = 0;
let fnLoadV6PA = function () {
if (timerV6PA) clearTimeout(timerV6PA);
timerV6PA = setTimeout(() => {
//ページ内に.tab-panelが存在するかチェック
const hasTabPanel = document.querySelector('.tab-panel') !== null;
if (!summonHash) {
//if(summonHashがない場合):最初のタブパネルとタブアイテムにクラスを付与
const firstTabPanel = document.querySelector('.tab-panel');
if (firstTabPanel) {
firstTabPanel.classList.add('is-summoned');
//ページTOPに移動(PC)
if (hasTabPanel && window.matchMedia('(min-width: 744px)').matches) window.scrollTo(0, 0);
}
const firstTabItem = document.querySelector('.tab-item');
if (firstTabItem) {
firstTabItem.classList.add('current_page_item');
}
} else {
//else(summonHashがある場合):一旦すべてのタブパネルから 'is-summoned'クラスを削除
let arrTabPanels = Array.prototype.slice.call(document.querySelectorAll(".tab-panel.is-summoned"));
for (let i = 0; i < arrTabPanels.length; i++) {
arrTabPanels[i].classList.remove('is-summoned');
} ///for
//summonHashに対応するタブパネルに 'is-summoned'クラスを付与
const smnTabPanel = document.getElementById(summonHash);
if (smnTabPanel) {
smnTabPanel.classList.add('is-summoned');
//ページTOPに移動(PC)
if (hasTabPanel && window.matchMedia('(min-width: 744px)').matches) window.scrollTo(0, 0);
}
//一旦すべてのタブアイテムから 'current_page_item'クラスを削除
let arrTabItems = Array.prototype.slice.call(document.querySelectorAll(".tab-item.current_page_item")); //Arr.NodeList
let lngtV6PJ = arrTabItems.length;
for (let j = 0; j < lngtV6PJ; j++) {
arrTabItems[j].classList.remove('current_page_item');
} ///for
//summonHashに対応するすべてのタブアイテムに 'current_page_item'クラスを付与
let smnTabItems = Array.prototype.slice.call(document.querySelectorAll(`.tab-item>a[href*="${summonHash}"]`)); //Arr.NodeList
if (smnTabItems) {
let lngtV6PK = smnTabItems.length;
for (let k = 0; k < lngtV6PK; k++) {
smnTabItems[k].parentElement.classList.add('current_page_item');
} ///for
}
}; ///if else (!summonHash);
}, 0); ///delayTime
};
//ウィンドウロード時のイベント呼び出し
window.addEventListener('load', fnLoadV6PA);
})(); ///function add-isSummon:JS();
(function () {
//invisibleTab:JS
let overLoad = document.querySelector(".overload");
let tabItems = Array.prototype.slice.call(document.querySelectorAll(".tab-item"));
let tabLinks = Array.prototype.slice.call(document.querySelectorAll(".tab-item>a"));
let tabPanels = Array.prototype.slice.call(document.querySelectorAll(".tab-panel"));
//URLからベースURLを取得する関数
function getBaseUrl(url) {
const parsedUrl = new URL(url);
return `${parsedUrl.protocol}//${parsedUrl.host}${parsedUrl.pathname}`.replace(/\/$/, '');
}
function fnClckTab(tabLink) {
tabLink.addEventListener('click', function (e) {
//現在とリンク先のURL, Hash(#) を取得
const currentHref = window.location.href;
const currentBurl = getBaseUrl(currentHref);
const tabHref = tabLink.getAttribute('href'); //クリックしたタブの href を取得
const targetBurl = getBaseUrl(tabHref);
const targetHash = new URL(tabHref).hash;
//リンク先の タブコンテンツを取得
let targetTabPanel = document.querySelector(targetHash);
//同じ href を持つすべてのタブアイテムを取得
let sameTabItems = Array.prototype.slice.call(document.querySelectorAll(`.tab-item>a[href*='${targetHash}']`)).map(a => a.parentElement);
//同じページ内のリンクかどうかを判定
if ((currentBurl === targetBurl) && targetTabPanel) {
//デフォルトイベント無効
e.preventDefault();
//URLのハッシュを更新
history.pushState(null, '', tabHref);
//GSAPのインスタンスを作成
let timeline = gsap.timeline();
timeline
.to(overLoad, {
duration: 0.3,
opacity: 1
})
.to(targetTabPanel, {
duration: 0,
opacity: 0
})
.add(() => {
if (window.matchMedia('(min-width: 744px)').matches) {
//ウィンドウサイズ744px以上(PC)
gsap.to('body', {
onComplete: function () {
window.scrollTo(0, 0);
}
});
}
})
.to(targetTabPanel, {
onComplete: function () {
tabPanels.forEach(function (tabPanel) {
tabPanel.classList.remove('is-summoned');
});
tabItems.forEach(function (tabItem) {
tabItem.classList.remove('current_page_item');
});
}
})
.add(() => {
targetTabPanel.classList.add('is-summoned');
sameTabItems.forEach(sameTabItem => {
sameTabItem.classList.add('current_page_item');
});
})
.to(targetTabPanel, {
opacity: 1
})
.to(overLoad, {
duration: 0.15,
opacity: 0
})
//タイムラインを再生
timeline.play();
} ///if (currentBurl === targetBurl)
});
} ///Event('click')
tabLinks.forEach((tabLink) => {
fnClckTab(tabLink);
});
})(); ///function invisibleTab:JS();