"use strict"; /* ------------------------------ スクロールバーの幅をカスタムプロパティ--scrollbar-widthに格納 ------------------------------ */ // スクロールバーの幅をCSSに格納する関数 var updateScrollBarWidth = function updateScrollBarWidth() { var scrollBarWidth = window.innerWidth - document.documentElement.clientWidth; document.documentElement.style.setProperty("--scrollbar-width", "".concat(scrollBarWidth, "px")); }; // debounce関数(指定された時間内に何度も呼び出された場合に、最後の呼び出しのみを実行) function debounce(callback, delay) { var timeout = null; return function () { var _this = this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (timeout !== null) { cancelAnimationFrame(timeout); } timeout = requestAnimationFrame(function () { callback.apply(_this, args); }); }; } window.addEventListener("resize", debounce(updateScrollBarWidth)); window.addEventListener("load", updateScrollBarWidth); /* ------------------------------ ドロワーメニュー ------------------------------ */ var menuButton = document.getElementById("js-menu"); var drawerMenu = document.getElementById("js-drawer"); var body = document.body; function openDrawerMenu() { menuButton.setAttribute("aria-expanded", "true"); drawerMenu.setAttribute("aria-hidden", "false"); body.classList.add("is-drawerActive"); body.style.overflow = "hidden"; } function closeDrawerMenu() { menuButton.setAttribute("aria-expanded", "false"); drawerMenu.setAttribute("aria-hidden", "true"); body.classList.remove("is-drawerActive"); body.style.overflow = "visible"; } menuButton.addEventListener("click", function () { if (menuButton.getAttribute("aria-expanded") === "true") { closeDrawerMenu(); } else { openDrawerMenu(); } }); document.querySelectorAll('#js-drawer a').forEach(function (link) { link.addEventListener('click', function () { closeDrawerMenu(); }); }); // 念のため、URLのハッシュが変わったときも閉じる(同一ページ内スクロール時の保険) window.addEventListener('hashchange', closeDrawerMenu); document.addEventListener("click", function (event) { if ((!drawerMenu || drawerMenu && !drawerMenu.contains(event.target)) && (!menuButton || menuButton && !menuButton.contains(event.target))) { closeDrawerMenu(); } }); window.addEventListener("resize", function () { if (window.innerWidth >= 950) { closeDrawerMenu(); } }); /* ------------------------------ モーダル(複数) ------------------------------ */ var modalBtns = document.querySelectorAll("[data-target]"); modalBtns.forEach(function (btn) { btn.onclick = function () { var modal = btn.getAttribute("data-target"); document.getElementById(modal).classList.add("is-show"); }; }); var closeBtns = document.querySelectorAll("[data-modal-close]"); closeBtns.forEach(function (btn) { console.log(closeBtns); btn.onclick = function () { var modal = btn.closest("[data-modal]"); modal.classList.remove("is-show"); }; }); window.onclick = function (event) { if (event.target.getAttribute("data-modal") !== null) { event.target.classList.remove("is-show"); } }; /* ------------------------------ スライダー 共通管理(トップページ用) ------------------------------ */ (function () { var swiperInstances = { conciergeSwiper: null, ambassadorSwiper: null, snsSwiper: null }; var swiperSettings = { conciergeSwiper: { selector: ".conciergeSwiper", navigation: { nextEl: ".p-top-concierge__swiper-button-next", prevEl: ".p-top-concierge__swiper-button-prev" }, breakpoints: { 0: { slidesPerView: 2.2, spaceBetween: 10 }, 450: { slidesPerView: 2.8, spaceBetween: 15 }, 550: { slidesPerView: 3.4, spaceBetween: 20 }, 650: { slidesPerView: 4, spaceBetween: 25 } } }, ambassadorSwiper: { selector: ".ambassadorSwiper", navigation: { nextEl: ".p-top-ambassador__swiper-button-next", prevEl: ".p-top-ambassador__swiper-button-prev" }, breakpoints: { 0: { slidesPerView: 1.1, spaceBetween: 20 }, 450: { slidesPerView: 1.4, spaceBetween: 20 }, 550: { slidesPerView: 1.8, spaceBetween: 25 }, 650: { slidesPerView: 2.2, spaceBetween: 30 } } }, snsSwiper: { selector: ".snsSwiper", navigation: { nextEl: ".p-top-sns__swiper-button-next", prevEl: ".p-top-sns__swiper-button-prev" }, breakpoints: { 0: { slidesPerView: 1.1, spaceBetween: 20 }, 450: { slidesPerView: 1.4, spaceBetween: 20 }, 550: { slidesPerView: 1.8, spaceBetween: 25 }, 650: { slidesPerView: 2.2, spaceBetween: 30 } } } }; function duplicateSlides(selector) { var wrapper = document.querySelector("".concat(selector, " .swiper-wrapper")); if (!wrapper) return; var originals = Array.from(wrapper.querySelectorAll('.swiper-slide:not(.is-clone)')); originals.forEach(function (slide) { var clone = slide.cloneNode(true); clone.classList.add('is-clone'); wrapper.appendChild(clone); }); } function resetSlides(selector) { document.querySelectorAll("".concat(selector, " .swiper-slide.is-clone")).forEach(function (el) { return el.remove(); }); } function initializeSwiper(instanceKey) { if (!swiperInstances[instanceKey]) { var settings = swiperSettings[instanceKey]; swiperInstances[instanceKey] = new Swiper(settings.selector, { loop: true, centeredSlides: true, navigation: settings.navigation, breakpoints: settings.breakpoints }); } } function destroySwiper(instanceKey) { if (swiperInstances[instanceKey]) { swiperInstances[instanceKey].destroy(true, true); var selector = swiperSettings[instanceKey].selector; var swiperEl = document.querySelector(selector); if (swiperEl) swiperEl.style.removeProperty("transform"); swiperInstances[instanceKey] = null; } } function handleSwiperMediaQuery(instanceKey, mediaQuery) { var selector = swiperSettings[instanceKey].selector; if (mediaQuery.matches) { if (instanceKey === "conciergeSwiper") duplicateSlides(selector); initializeSwiper(instanceKey); } else { if (instanceKey === "conciergeSwiper") resetSlides(selector); destroySwiper(instanceKey); } } var mediaQuery = window.matchMedia("(max-width: 767px)"); mediaQuery.addEventListener("change", function () { handleSwiperMediaQuery("conciergeSwiper", mediaQuery); handleSwiperMediaQuery("ambassadorSwiper", mediaQuery); handleSwiperMediaQuery("snsSwiper", mediaQuery); }); if (mediaQuery.matches) { initializeSwiper("conciergeSwiper"); initializeSwiper("ambassadorSwiper"); initializeSwiper("snsSwiper"); duplicateSlides(swiperSettings.conciergeSwiper.selector); } })(); /* ------------------------------ Instagram・YouTube Swiper管理(スマホのみ) Instagramのスライダーを2倍にする ------------------------------ */ // Instagramスライド用 - スマホ時はスライドを2倍に、PCに戻ったらリセット (function () { var mediaQuery = window.matchMedia("(max-width: 767px)"); var instagramList = document.querySelector(".p-single-ambassador-instagram__list"); var cloned = false; // クローンしたかどうか記録 if (!instagramList) return; function cloneSlides() { if (cloned) return; var slides = Array.from(instagramList.children); slides.forEach(function (slide) { var clone = slide.cloneNode(true); instagramList.appendChild(clone); }); cloned = true; } function resetSlides() { if (!cloned) return; var originalSlidesCount = instagramList.children.length / 2; for (var i = instagramList.children.length - 1; i >= originalSlidesCount; i--) { instagramList.removeChild(instagramList.children[i]); } cloned = false; } function handleResize(e) { if (e.matches) { cloneSlides(); } else { resetSlides(); } } // 初回 handleResize(mediaQuery); // リサイズ(画面幅が変わったとき) mediaQuery.addEventListener("change", handleResize); })(); (function () { // Swiperインスタンス管理 var swiperInstances = { instagramSwiper: null, youtubeSwiper: null }; // Swiper設定 var swiperSettings = { instagramSwiper: { selector: ".instagramSwiper", navigation: { nextEl: ".p-single-ambassador-instagram .swiper-button-next", prevEl: ".p-single-ambassador-instagram .swiper-button-prev" }, loop: true, breakpoints: { 0: { slidesPerView: 1.6, spaceBetween: 16 } } }, youtubeSwiper: { selector: ".youtubeSwiper", navigation: { nextEl: ".p-single-ambassador-youtube .swiper-button-next", prevEl: ".p-single-ambassador-youtube .swiper-button-prev" }, loop: true, breakpoints: { 0: { slidesPerView: 1, spaceBetween: 16 } } } }; function initializeSwiper(instanceKey) { if (!swiperInstances[instanceKey]) { var settings = swiperSettings[instanceKey]; var swiperOptions = { loop: settings.loop || false, centeredSlides: settings.loop || false, navigation: settings.navigation, breakpoints: settings.breakpoints }; // Instagram専用の再描画対応 if (instanceKey === "instagramSwiper") { swiperOptions.on = { slideChangeTransitionEnd: function slideChangeTransitionEnd() { if (window.instgrm && window.instgrm.Embeds) { window.instgrm.Embeds.process(); } } }; } swiperInstances[instanceKey] = new Swiper(settings.selector, swiperOptions); } } function destroySwiper(instanceKey) { if (swiperInstances[instanceKey]) { swiperInstances[instanceKey].destroy(true, true); var selector = swiperSettings[instanceKey].selector; var swiperEl = document.querySelector(selector); if (swiperEl) swiperEl.style.removeProperty("transform"); swiperInstances[instanceKey] = null; } } function handleSwiperMediaQuery(instanceKey, mediaQuery) { if (mediaQuery.matches) { initializeSwiper(instanceKey); } else { destroySwiper(instanceKey); } } // メディアクエリ定義(スマホのみ) var mediaQuery = window.matchMedia("(max-width: 767px)"); var swiperKeys = Object.keys(swiperInstances); // 初回ロード時 if (mediaQuery.matches) { swiperKeys.forEach(function (key) { return initializeSwiper(key); }); } // リサイズ時の対応 mediaQuery.addEventListener("change", function () { swiperKeys.forEach(function (key) { return handleSwiperMediaQuery(key, mediaQuery); }); }); // Instagram初回描画 document.addEventListener("DOMContentLoaded", function () { if (window.instgrm && window.instgrm.Embeds) { window.instgrm.Embeds.process(); } }); })(); /* ------------------------------ バナーを消す ------------------------------ */ // document.addEventListener("DOMContentLoaded", () => { // const closeButton = document.querySelector(".js-close"); // const floatingBanner = document.querySelector(".js-floating"); // const image = document.querySelector(".c-cta-banner__image"); // const subImage = document.querySelector(".c-cta-banner__sub-image"); // // 初期表示:メイン画像と閉じるボタンを表示、サブ画像は非表示 // if (image && subImage && closeButton) { // subImage.style.display = "none"; // サブ画像を非表示 // // 「閉じる」ボタンを押したとき // closeButton.addEventListener("click", (e) => { // e.preventDefault(); // デフォルトのボタン動作を防止 // image.style.display = "none"; // メイン画像を非表示 // closeButton.style.display = "none"; // 閉じるボタンを非表示 // subImage.style.display = "block"; // サブ画像を表示 // }); // // サブ画像をクリックしたとき // subImage.addEventListener("click", (e) => { // e.preventDefault(); // リンクの発火を防止 // e.stopPropagation(); // イベントの伝播を停止 // image.style.display = "block"; // メイン画像を再表示 // closeButton.style.display = "block"; // 閉じるボタンを再表示 // subImage.style.display = "none"; // サブ画像を非表示 // }); // } // }); /* ------------------------------ 追従バナーのリンク処理を変更 ------------------------------ */ document.addEventListener("DOMContentLoaded", function () { // PC用とスマホ用の画像を個別に取得 var pcImage = document.querySelector(".c-cta-banner__image.u-pc"); var spImage = document.querySelector(".c-cta-banner__image.u-sp"); //var closeButton = document.querySelector(".js-close"); var subImage = document.querySelector(".c-cta-banner__sub-image"); // 初期表示:画面サイズに応じて、適切なメイン画像のみを表示 if (window.matchMedia("(max-width: 767px)").matches) { // スマホの場合 if (pcImage) pcImage.style.display = "none"; if (spImage) spImage.style.display = "block"; } else { // PCの場合 if (spImage) spImage.style.display = "none"; if (pcImage) pcImage.style.display = "block"; } // サブ画像は初期状態で非表示 subImage.style.display = "none"; // 「閉じる」ボタン押下時の処理 /*closeButton.addEventListener("click", function (e) { e.preventDefault(); if (pcImage) pcImage.style.display = "none"; if (spImage) spImage.style.display = "none"; closeButton.style.display = "none"; subImage.style.display = "block"; });*/ // サブ画像クリック時の処理 subImage.addEventListener("click", function (e) { e.preventDefault(); // デバイスごとに適切なメイン画像を再表示 if (window.matchMedia("(max-width: 767px)").matches) { if (spImage) spImage.style.display = "block"; } else { if (pcImage) pcImage.style.display = "block"; } closeButton.style.display = "block"; subImage.style.display = "none"; }); }); /* ------------------------------ ヘッダーの追従表示 ------------------------------ */ var header = document.querySelector(".js-header"); var topMv = document.querySelector(".js-mv"); var topMvHeight = topMv.offsetHeight; var headerHeight = window.innerWidth >= 768 ? 80 : 60; var isFixed = false; var isAboveMv = false; window.addEventListener("scroll", function () { var currentScrollY = window.scrollY; var isPC = window.innerWidth >= 768; if (currentScrollY > topMvHeight) { if (!isFixed) { header.style.transform = "translateY(0)"; header.style.position = "fixed"; header.style.animation = "none"; header.style.backgroundColor = "rgba(255, 255, 255, 1)"; isFixed = true; isAboveMv = false; } } else if (currentScrollY > 200 && currentScrollY <= topMvHeight) { if (!isAboveMv) { header.style.transform = "translateY(-".concat(headerHeight, "px)"); header.style.backgroundColor = "rgba(255, 255, 255, 0.9)"; setTimeout(function () { header.style.position = "absolute"; isFixed = false; }, 300); isAboveMv = true; } } else if (currentScrollY <= 200) { if (isFixed || isAboveMv) { header.style.transform = "translateY(0)"; header.style.position = "absolute"; isFixed = false; isAboveMv = false; } } }); window.addEventListener("resize", function () { topMvHeight = topMv.offsetHeight; headerHeight = window.innerWidth >= 768 ? 80 : 60; }); /* ------------------------------ フローティング 旅行相談バナー ------------------------------ */ window.addEventListener("scroll", function () { var documentHeight = document.documentElement.scrollHeight; var scrollPosition = window.innerHeight + window.scrollY; var footer = document.querySelector(".js-footer"); var floating = document.querySelector(".js-floating"); var mv = document.querySelector(".js-mv"); if (!footer || !floating || !mv) return; var footerHeight = footer.offsetHeight; var mvBottom = mv.getBoundingClientRect().bottom + window.scrollY; if (window.scrollY > mvBottom) { floating.style.opacity = "1"; floating.style.visibility = "visible"; } else { floating.style.opacity = "0"; floating.style.visibility = "hidden"; } if (documentHeight - scrollPosition <= footerHeight) { floating.style.position = "absolute"; floating.style.bottom = "".concat(footerHeight + 17, "px"); } else { floating.style.position = "fixed"; floating.style.bottom = "17px"; } }); /* ------------------------------ フローティング お問い合わせバナー ------------------------------ */ function handleFloatingBanner() { var footer = document.querySelector(".js-footer"); var floating = document.querySelector(".js-floating-contact"); var mv = document.querySelector(".js-mv"); if (!footer || !floating || !mv) return; var windowWidth = window.innerWidth; var documentHeight = document.documentElement.scrollHeight; var scrollPosition = window.innerHeight + window.scrollY; var footerHeight = footer.offsetHeight; var mvBottom = mv.getBoundingClientRect().bottom + window.scrollY; if (windowWidth <= 767) { // スマホ:従来通り if (window.scrollY > mvBottom) { floating.style.opacity = "1"; floating.style.visibility = "visible"; } else { floating.style.opacity = "0"; floating.style.visibility = "hidden"; } if (documentHeight - scrollPosition <= footerHeight) { floating.style.position = "absolute"; floating.style.bottom = "".concat(footerHeight, "px"); } else { floating.style.position = "fixed"; floating.style.bottom = "0px"; } } else { // PC:MVを過ぎたら表示、それ以外は非表示 if (window.scrollY > mvBottom) { floating.style.opacity = "1"; floating.style.visibility = "visible"; } else { floating.style.opacity = "0"; floating.style.visibility = "hidden"; } // PCは位置制御しない(CSSで固定) floating.style.position = ""; floating.style.bottom = ""; } } // スクロール時に実行 window.addEventListener("scroll", handleFloatingBanner); // リサイズ時に実行 window.addEventListener("resize", handleFloatingBanner); // 初回ロード時にも実行 window.addEventListener("DOMContentLoaded", handleFloatingBanner); /* ------------------------------ 無限ループ ------------------------------ */ document.addEventListener("DOMContentLoaded", function () { var loopSliders = document.querySelectorAll(".js-loop-slider"); if (!loopSliders.length) return; loopSliders.forEach(function (sliderWrapper) { var _window$splide; var splideElement = sliderWrapper.querySelector(".splide"); if (!splideElement) return; var options = { type: "loop", arrows: false, pagination: false, gap: "3%", perPage: 8, breakpoints: { 400: { perPage: 2, gap: 30 }, 600: { perPage: 3, gap: "5%" }, 1000: { perPage: 5, gap: "3%" }, 1200: { perPage: 6, gap: "3%" } }, autoScroll: { speed: 1, pauseOnHover: true, pauseOnFocus: false } }; var splide = new Splide(splideElement, options); splide.mount(((_window$splide = window.splide) === null || _window$splide === void 0 ? void 0 : _window$splide.Extensions) || {}); }); }); /* ------------------------------ スクロールフェードイン ------------------------------ */ gsap.registerPlugin(ScrollTrigger); var mm = gsap.matchMedia(); // フェードイン・ボトムから var slideUp = document.getElementsByClassName("js-slideUp"); var _loop = function _loop(i) { mm.add("(max-width: 767px)", function () { gsap.fromTo(slideUp[i], { y: 20, opacity: 0 }, { y: 0, opacity: 1, duration: 1, scrollTrigger: { trigger: slideUp[i], start: "top 85%", end: "top top" // markers: true, } }); }); mm.add("(min-width: 768px)", function () { gsap.fromTo(slideUp[i], { y: 30, opacity: 0 }, { y: 0, opacity: 1, duration: 1, scrollTrigger: { trigger: slideUp[i], start: "top 85%", end: "top top" // markers: true, } }); }); }; for (var i = 0; i < slideUp.length; i++) { _loop(i); } // 連続したフェードイン mm.add("(max-width: 767px)", function () { var cards = document.querySelectorAll(".js-card"); cards.forEach(function (card) { gsap.fromTo(card, { y: 20, autoAlpha: 0 }, { y: 0, autoAlpha: 1, scrollTrigger: { trigger: card, start: "top 90%" } }); }); }); mm.add("(min-width: 768px)", function () { gsap.utils.toArray(".js-cards").forEach(function (target) { gsap.fromTo(target.querySelectorAll(".js-delayFadeUp"), { y: 30, autoAlpha: 0 }, { y: 0, autoAlpha: 1, stagger: 0.3, scrollTrigger: { trigger: target, start: "top 90%" } }); }); }); // スマホのみフェードイン mm.add("(max-width: 767px)", function () { gsap.utils.toArray(".js-mobileOnly").forEach(function (element) { gsap.fromTo(element, { y: 20, opacity: 0 }, { y: 0, opacity: 1, duration: 1, scrollTrigger: { trigger: element, start: "top 85%", end: "top top" } }); }); }); // PCのみフェードイン mm.add("(min-width: 768px)", function () { gsap.utils.toArray(".js-pcOnly").forEach(function (target) { gsap.fromTo(target.querySelectorAll(".js-delayFadeUp"), { y: 30, autoAlpha: 0 }, { y: 0, autoAlpha: 1, stagger: 0.3, scrollTrigger: { trigger: target, start: "top 90%" } }); }); }); //companyページ スクロールアニメーション document.addEventListener("DOMContentLoaded", function () { // 画面幅が768px以上のときのみ処理を実行 if (window.innerWidth >= 768) { document.querySelectorAll(".js-Prallax").forEach(function (item, index) { gsap.to(item, { scale: 0.9, opacity: 0, ease: "power1.easeInOut", scrollTrigger: { trigger: item, start: "center center", end: "bottom top", scrub: 0.5, toggleActions: "play reverse play reverse" } }, 0.5 * index * 2); }); } }); /* ------------------------------ ScrollHint ------------------------------ */ var scrollHintInstance = null; // ScrollHint のインスタンスを保持 function initScrollHint() { var isMobile = window.innerWidth <= 767; var element = document.querySelector(".js-scroll-hint"); if (isMobile) { // 767px以下なら ScrollHint を適用(すでに適用済みならスキップ) if (!scrollHintInstance) { scrollHintInstance = new ScrollHint(".js-scroll-hint", { i18n: { scrollable: "スクロールできます" } }); } } else { // 768px以上になったら ScrollHint を削除 if (scrollHintInstance) { scrollHintInstance = null; // インスタンスを削除 removeScrollHintEffects(element); // ScrollHint の影響を完全削除 } } } // ScrollHint の影響を完全に削除する function removeScrollHintEffects(element) { if (!element) return; // ScrollHint が追加したスタイルを削除 element.classList.remove("scroll-hint", "scroll-hint--visible"); // ScrollHint が追加したインラインスタイルを削除 element.removeAttribute("style"); // ScrollHint 内のすべての子要素のスタイルをリセット element.querySelectorAll("*").forEach(function (child) { child.removeAttribute("style"); }); } // 初回実行 initScrollHint(); // 画面サイズ変更時に適用・削除を実行 window.addEventListener("resize", initScrollHint); // スクロールのドラッグ有効化 jQuery.prototype.mousedragscrollable = function () { var target; $(this).each(function (i, e) { $(e).mousedown(function (event) { event.preventDefault(); target = $(e); $(e).data({ down: true, move: false, x: event.clientX, y: event.clientY, scrollleft: $(e).scrollLeft(), scrolltop: $(e).scrollTop() }); return false; }); $(e).click(function (event) { if ($(e).data("move")) { return false; } }); }); $(document).mousemove(function (event) { if ($(target).data("down")) { event.preventDefault(); var move_x = $(target).data("x") - event.clientX; var move_y = $(target).data("y") - event.clientY; if (move_x !== 0 || move_y !== 0) { $(target).data("move", true); } else { return; } $(target).scrollLeft($(target).data("scrollleft") + move_x); $(target).scrollTop($(target).data("scrolltop") + move_y); return false; } }).mouseup(function (event) { $(target).data("down", false); return false; }); }; $(".js-scroll-hint").mousedragscrollable(); // お問い合わせフォーム jQuery(document).ready(function ($) { var $select = $(".js-select-color"); // 初期状態チェック $select.each(function () { var val = $(this).val(); if (val === "" || val === "選択する") { $(this).addClass("select-default").removeClass("select-active"); } else { $(this).addClass("select-active").removeClass("select-default"); } }); // 選択時の処理 $select.on("change", function () { var val = $(this).val(); if (val === "" || val === "選択する") { $(this).addClass("select-default").removeClass("select-active"); } else { $(this).addClass("select-active").removeClass("select-default"); } }); }); // 検索フォームでエリアと国を連動させる document.addEventListener("DOMContentLoaded", function () { var areaSelect = document.getElementById("area"); var countrySelect = document.getElementById("country"); var postTypeInput = document.querySelector('input[name="post_type"]'); if (!areaSelect || !countrySelect || !postTypeInput) return; var postType = postTypeInput.value; var isInitialLoad = true; var fetchCountries = function fetchCountries() { var parentId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; countrySelect.innerHTML = ''; fetch("".concat(myAjax.ajaxurl, "?action=get_child_terms&parent_id=").concat(parentId, "&post_type=").concat(postType)).then(function (res) { return res.json(); }).then(function (terms) { terms.forEach(function (term) { var option = document.createElement("option"); option.value = term.term_id; option.textContent = term.name; countrySelect.appendChild(option); }); if (isInitialLoad) { var selected = countrySelect.dataset.selected; if (selected && parentId !== 0) { countrySelect.value = selected; } isInitialLoad = false; } })["catch"](function (err) { console.error("エリア詳細の取得に失敗しました:", err); }); }; fetchCountries(areaSelect.value || 0); areaSelect.addEventListener("change", function () { countrySelect.value = ""; countrySelect.dataset.selected = ""; fetchCountries(areaSelect.value || 0); }); }); /* ------------------------------ アコーディオン ------------------------------ */ /** * ブラウザの標準機能(Web Animations API)を使ってアコーディオンのアニメーションを制御します */ document.addEventListener("DOMContentLoaded", function () { setUpAccordion(); }); var setUpAccordion = function setUpAccordion() { var details = document.querySelectorAll(".js-details"); var RUNNING_VALUE = "running"; var IS_OPENED_CLASS = "is-opened"; details.forEach(function (element) { var summary = element.querySelector(".js-summary"); var content = element.querySelector(".js-content"); summary.addEventListener("click", function (event) { event.preventDefault(); if (element.dataset.animStatus === RUNNING_VALUE) { return; } if (element.open) { element.classList.toggle(IS_OPENED_CLASS); var closingAnim = content.animate(closingAnimKeyframes(content), animTiming); element.dataset.animStatus = RUNNING_VALUE; closingAnim.onfinish = function () { element.removeAttribute("open"); element.dataset.animStatus = ""; }; } else { element.setAttribute("open", "true"); element.classList.toggle(IS_OPENED_CLASS); var openingAnim = content.animate(openingAnimKeyframes(content), animTiming); element.dataset.animStatus = RUNNING_VALUE; openingAnim.onfinish = function () { element.dataset.animStatus = ""; }; } }); }); }; var animTiming = { duration: 400, easing: "ease-out" }; var closingAnimKeyframes = function closingAnimKeyframes(content) { return [{ height: content.offsetHeight + "px", opacity: 1 }, { height: 0, opacity: 0 }]; }; var openingAnimKeyframes = function openingAnimKeyframes(content) { return [{ height: 0, opacity: 0 }, { height: content.offsetHeight + "px", opacity: 1 }]; }; /* ------------------------------ アンバサダー旅行プランをウェブトラベルアンバサダーに変更 ------------------------------ */ document.addEventListener("DOMContentLoaded", function () { var breadcrumbItems = document.querySelectorAll('[typeof="ListItem"] span[property="name"]'); breadcrumbItems.forEach(function (el) { if (el.textContent.trim() === "アンバサダー旅行プラン") { el.textContent = "ウェブトラベルアンバサダー"; } }); }); /* ------------------------------ アレンジ紹介スライダー ------------------------------ */ document.addEventListener("DOMContentLoaded", function () { var arrangeSliders = document.querySelectorAll(".js-arrange-slider"); if (!arrangeSliders.length) return; arrangeSliders.forEach(function (slider) { var options = { type: "loop", autoplay: true, interval: 4000, pauseOnHover: false, pauseOnFocus: false, perPage: 1, perMove: 1, gap: 0, arrows: false, pagination: true, speed: 600 }; var splide = new Splide(slider, options); splide.mount(); }); }); /* ------------------------------   国別一覧 アコーディオン ------------------------------ */ document.addEventListener('DOMContentLoaded', function () { var items = document.querySelectorAll('.p-archive-ordermade-trip__accordion-item'); function closeAllAccordions() { items.forEach(function (item) { var btn = item.querySelector('.js-accordion-toggle'); var panel = item.querySelector('.p-archive-ordermade-trip__accordion-panel'); item.classList.remove('is-open'); if (btn) btn.setAttribute('aria-expanded', 'false'); if (panel) panel.style.display = 'none'; }); } function openAccordionByHash(opts) { var doScroll = !opts || opts.doScroll !== false; var hash = location.hash.replace(/^#/, ''); if (!hash) return; var target = document.getElementById(hash); if (!target || !target.classList.contains('p-archive-ordermade-trip__accordion-item')) return; // いったん全部閉じてから対象だけ開く closeAllAccordions(); var btn = target.querySelector('.js-accordion-toggle'); var panel = target.querySelector('.p-archive-ordermade-trip__accordion-panel'); target.classList.add('is-open'); if (btn) btn.setAttribute('aria-expanded', 'true'); if (panel) panel.style.display = ''; if (doScroll) { // ヘッダー高を考慮してアコーディオン直上にスクロール setTimeout(function () { var headerH = (window.innerWidth >= 768) ? 80 : 60; // あなたのコードに合わせる var top = target.getBoundingClientRect().top + window.pageYOffset - headerH; window.scrollTo({ top: top, behavior: 'smooth' }); }, 50); } } // ---- 初期ロード(アンカージャンプ抑止 → 開く → 位置合わせ) // アンカー付きで直アクセス時の瞬間ジャンプを抑止 window.scrollTo(0, 0); // 初期は全閉 → ハッシュがあれば対象を開く closeAllAccordions(); openAccordionByHash({ doScroll: true }); // ---- クリック開閉(既存動作は維持) items.forEach(function (item) { var btn = item.querySelector('.js-accordion-toggle'); var panel = item.querySelector('.p-archive-ordermade-trip__accordion-panel'); if (!btn || !panel) return; btn.addEventListener('click', function () { var isOpen = item.classList.toggle('is-open'); btn.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); panel.style.display = isOpen ? '' : 'none'; }); }); // ---- ハッシュ変更時(同一ページ内 #japan クリック等) window.addEventListener('hashchange', function () { // ドロワーを閉じる(あなたの既存関数があれば併用) try { if (typeof closeDrawerMenu === 'function') closeDrawerMenu(); } catch (e) {} // ハッシュに応じて開く openAccordionByHash({ doScroll: true }); }); });