和装小物

並び替え
361件中 141-160件表示
1 … 7 8 9 … 19

三毛猫 帯留 帯留め 女性

販売開始前です。
販売期間
〜
在庫切れ
(0)
メーカー希望小売価格 ¥ 6,600 のところ
なごみや価格 ¥ 5,480 税込

羽子板 帯留 帯留め 女性

販売開始前です。
販売期間
〜
在庫切れ
(0)
メーカー希望小売価格 ¥ 8,030 のところ
なごみや価格 ¥ 6,480 税込
並び替え
361件中 141-160件表示
1 … 7 8 9 … 19
// Splide共通の矢印パス(シェブロン) var SPLIDE_ARROW_PATH = 'M29.09 1.82L10.91 20L29.09 38.18'; // 関数定義 - 商品スライダー(SPのみスライダー化。PCはCSSグリッド) function initItemSlider() { if (typeof Splide === 'undefined') return; document.querySelectorAll('.g-column__pickupSlider').forEach(function (el) { if (el.dataset.pickupSliderInitialized === 'true') return; el.dataset.pickupSliderInitialized = 'true'; new Splide(el, { mediaQuery: 'min', type: 'loop', autoplay: true, interval: 4000, speed: 800, pauseOnHover: true, pauseOnFocus: true, fixedWidth: '37%', gap: '20px', padding: { left: '20px', right: 0 }, pagination: false, arrows: true, breakpoints: { 768: { destroy: true } }, arrowPath: SPLIDE_ARROW_PATH, classes: { arrow: 'splide__arrow', prev: 'splide__arrow--prev g-splideArrow g-splideArrow--prev', next: 'splide__arrow--next g-splideArrow g-splideArrow--next', } }).mount(); }); } // コラム内の itemdock 商品を SP だけ Splide 化 function initColumnPickupWidget() { document.querySelectorAll('.g-column__pickup > .fs-search-widget').forEach(function (host) { if (host._columnPickupReady) return; host._columnPickupReady = true; host.dataset.columnPickup = 'true'; var grid, sliderElement, splide; var mq = window.matchMedia('(max-width: 767px)'); function update() { var root = host.shadowRoot; if (!root) return; if (!root.querySelector('link[data-column-pickup-style]')) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.href = '/asset2026/css/group.css'; link.dataset.columnPickupStyle = 'true'; root.appendChild(link); } var nextGrid = root.querySelector('.fs-grid.fs-pickup'); if (!nextGrid) return; if (grid !== nextGrid) { if (splide) splide.destroy(true); splide = null; grid = nextGrid; sliderElement = document.createElement('div'); sliderElement.className = 'splide g-column__widgetSlider'; var track = document.createElement('div'); track.className = 'splide__track'; grid.before(sliderElement); sliderElement.appendChild(track); track.appendChild(grid); } if (!mq.matches && splide) { splide.destroy(true); splide = null; } if (mq.matches && !splide && typeof Splide !== 'undefined' && grid.children.length > 1) { grid.classList.add('splide__list'); grid.querySelectorAll(':scope > .fs-pickup-item').forEach(function (item) { item.classList.add('splide__slide'); }); splide = new Splide(sliderElement, { type: 'loop', autoplay: true, interval: 4000, speed: 800, fixedWidth: '37%', gap: '20px', padding: { left: '20px', right: 0 }, arrows: false, pagination: false }).mount(); } } function attach() { if (!host.isConnected) return; if (!host.shadowRoot) return window.setTimeout(attach, 200); update(); new MutationObserver(function () { requestAnimationFrame(update); }) .observe(host.shadowRoot, { childList: true, subtree: true }); mq.addEventListener('change', update); window.addEventListener('load', update, { once: true }); } attach(); }); } // 関数定義 - フッター営業日カレンダー(SPのみSplide) function initFooterCalendarSlider() { if (typeof Splide === 'undefined') return; document.querySelectorAll('.ft-calendar').forEach(function (calendar) { var hasCurrentTrack = calendar.querySelector(':scope > .splide__track'); if (calendar.dataset.footerCalendarInitialized === 'true' && hasCurrentTrack) return; if (calendar._footerCalendarSplide) { calendar._footerCalendarSplide.destroy(true); calendar._footerCalendarSplide = null; } var months = Array.prototype.filter.call(calendar.children, function (child) { return !child.classList.contains('splide__track'); }); if (months.length < 2) return; calendar.dataset.footerCalendarInitialized = 'true'; calendar.classList.add('g-footerCalendarSlider', 'splide'); var track = document.createElement('div'); var list = document.createElement('div'); track.className = 'splide__track'; list.className = 'splide__list'; months.forEach(function (month) { month.classList.add('splide__slide'); list.appendChild(month); }); track.appendChild(list); calendar.appendChild(track); calendar._footerCalendarSplide = new Splide(calendar, { mediaQuery: 'min', type: 'slide', perPage: 1, perMove: 1, gap: '20px', padding: 0, pagination: false, arrows: true, rewind: false, drag: true, breakpoints: { 768: { destroy: true } }, arrowPath: SPLIDE_ARROW_PATH, classes: { arrow: 'splide__arrow g-splideArrow g-footerCalendarArrow', prev: 'splide__arrow--prev g-splideArrow--prev g-footerCalendarArrow--prev', next: 'splide__arrow--next g-splideArrow--next g-footerCalendarArrow--next' } }); calendar._footerCalendarSplide.mount(); }); } window.initFooterCalendarSlider = initFooterCalendarSlider; // ユーティリティ - fadeIn function fadeIn(el, duration, callback) { el.style.display = 'block'; el.style.opacity = '0'; el.style.transition = 'opacity ' + duration + 'ms'; requestAnimationFrame(function () { requestAnimationFrame(function () { el.style.opacity = '1'; if (callback) { el.addEventListener('transitionend', function handler() { el.removeEventListener('transitionend', handler); callback.call(el); }); } }); }); } // ユーティリティ - fadeOut function fadeOut(el, duration, callback) { el.style.transition = 'opacity ' + duration + 'ms'; el.style.opacity = '0'; el.addEventListener('transitionend', function handler() { el.removeEventListener('transitionend', handler); el.style.display = 'none'; el.style.transition = ''; el.style.opacity = ''; if (callback) callback.call(el); }); } // 関数定義 - ハンバーガー (function (window, document) { var desktopMedia = window.matchMedia('(min-width: 951px)'); var defaults = { navSelector: '.fat-nav', activeClass: 'active', animationDuration: 200 }; function FatNav(hamburger, options) { this.settings = Object.assign({}, defaults, options); this.hamburger = hamburger; this._isOpen = false; this.init(); } FatNav.instances = []; FatNav.prototype = { init: function () { var self = this; self.navSelector = self.hamburger.dataset.nav || self.settings.navSelector; self.resolveNav(); self._bodyOverflow = document.body.style.overflow || ''; self.hamburger.addEventListener('click', function (e) { e.preventDefault(); self.resolveNav(); self.toggleNav(); }); FatNav.instances.push(self); }, resolveNav: function () { this.nav = document.querySelector(this.navSelector); }, toggleNav: function () { var self = this; FatNav.instances.forEach(function (instance) { if (instance !== self && instance._isOpen) { instance.closeNav(); } }); if (self._isOpen) { self.closeNav(); } else { self.openNav(); } }, openNav: function () { var self = this; if (desktopMedia.matches) { self.closeNav(true); return; } self.resolveNav(); if (!self.nav) return; self._isOpen = true; self.hamburger.classList.add(self.settings.activeClass); // 開いた位置からウィンドウ下端までの高さを実測してCSSに渡す // (ヘッダーが途中まで隠れている状態でも下端まで伸ばすため) self.nav.style.display = 'block'; var navTop = self.nav.getBoundingClientRect().top; self.nav.style.setProperty('--this-navH', window.innerHeight - navTop + 'px'); // フェードと同時に開かせるため、activeは待たずに付ける self.nav.classList.add(self.settings.activeClass); fadeIn(self.nav, self.settings.animationDuration, function () { if (!self._isOpen || desktopMedia.matches) return; self.toggleBodyOverflow(true); }); }, closeNav: function (forceReset) { var self = this; self._isOpen = false; self.hamburger.classList.remove(self.settings.activeClass); if (self.nav) { self.nav.classList.remove(self.settings.activeClass); if (forceReset) { self.nav.style.display = ''; self.nav.style.opacity = ''; self.nav.style.transition = ''; self.nav.style.removeProperty('--this-navH'); } self.toggleBodyOverflow(false); } }, toggleBodyOverflow: function (isOpening) { var self = this; if (isOpening) { document.body.classList.add('no-scroll'); document.body.style.overflow = 'hidden'; } else { var anyOpen = FatNav.instances.some(function (instance) { return instance._isOpen; }); if (!anyOpen) { document.body.classList.remove('no-scroll'); document.body.style.overflow = self._bodyOverflow; } } } }; window.initFatNav = function (selector) { document.querySelectorAll(selector).forEach(function (el) { if (el.closest('.fat-nav')) return; // fat-nav内の閉じるボタンはスキップ if (!el._fatNavInstance) { el._fatNavInstance = new FatNav(el); } }); disableFatNavOnDesktop(desktopMedia); }; function disableFatNavOnDesktop(mediaQuery) { if (!mediaQuery.matches) return; FatNav.instances.forEach(function (instance) { instance.closeNav(true); }); } if (desktopMedia.addEventListener) { desktopMedia.addEventListener('change', disableFatNavOnDesktop); } else { desktopMedia.addListener(disableFatNavOnDesktop); } // 外側クリックでナビを閉じる document.addEventListener('click', function (e) { var fatNavLink = e.target.closest('.fat-nav a'); if (fatNavLink) { var accordionHeading = fatNavLink.closest('.spAccordionNav .fs-pt-menu__heading--lv1'); if (accordionHeading) { var accordionItem = accordionHeading.closest('.fs-pt-menu__item--lv1'); var headingRect = accordionHeading.getBoundingClientRect(); var isAccordionTriggerClick = accordionItem && accordionItem.classList.contains('has-submenu') && e.clientX >= headingRect.right - 38; if (isAccordionTriggerClick) return; } FatNav.instances.forEach(function (instance) { if (instance._isOpen) instance.closeNav(); }); return; } if (e.target.closest('.hamburger--menu, .hamburger--search, .fat-nav--menu, .fat-nav--search')) { return; } FatNav.instances.forEach(function (instance) { if (instance._isOpen) { instance.closeNav(); } }); }); }(window, document)); // 関数定義 - SPでヘッダー下端だけを残してstickyさせる function initStickyHeader() { var header = document.querySelector('.g-header'); if (!header || header.dataset.stickyHeaderInitialized === 'true') return; header.dataset.stickyHeaderInitialized = 'true'; var STICKY_H = 48; // 固定時に見せる高さ(ヘッダー140pxのときtop:-92px) var mq = window.matchMedia('(max-width: 950px)'); var offset = 0; var update = function () { offset = header.offsetHeight - STICKY_H; header.style.setProperty('--this-sticky-top', -offset + 'px'); }; var onScroll = function () { // PCは固定ヘッダーの表示に合わせる(initFixedHeaderが切り替える) if (!mq.matches) return; header.classList.toggle('is-stuck', window.pageYOffset >= offset); }; var refresh = function () { update(); if (mq.matches) { onScroll(); } else { var fixed = document.querySelector('.g-headerFixed'); header.classList.toggle('is-stuck', !!(fixed && fixed.classList.contains('is-show'))); } }; refresh(); if ('ResizeObserver' in window) new ResizeObserver(refresh).observe(header); else window.addEventListener('resize', refresh); if (mq.addEventListener) mq.addEventListener('change', refresh); else mq.addListener(refresh); window.addEventListener('scroll', onScroll, { passive: true }); } // 関数定義 - スクロール後に出現する固定ヘッダー function initFixedHeader() { var normal = document.querySelector('.g-headerContent'); var fixed = document.querySelector('.g-headerFixed'); if (!normal || !fixed || fixed.dataset.fixedHeaderInitialized === 'true') return; fixed.dataset.fixedHeaderInitialized = 'true'; // 通常ヘッダーの下端がウィンドウ上端を越えたら固定ヘッダーを表示する var header = normal.closest('.g-header') || normal.parentNode; // IntersectionObserver 非対応ブラウザ向けフォールバック var mqPc = window.matchMedia('(min-width: 951px)'); // 固定ヘッダーの表示状態をヘッダー側にも持たせる(SPはinitStickyHeaderが付ける) var syncStuck = function (isPassed) { if (mqPc.matches) header.classList.toggle('is-stuck', isPassed); }; var updateFixedState = function () { if (!mqPc.matches) { fixed.classList.remove('is-show'); return; } var isPassed = header.getBoundingClientRect().bottom < 0; fixed.classList.toggle('is-show', isPassed); syncStuck(isPassed); }; if (mqPc.addEventListener) mqPc.addEventListener('change', updateFixedState); else mqPc.addListener(updateFixedState); if (!('IntersectionObserver' in window)) { window.addEventListener('scroll', updateFixedState, { passive: true }); updateFixedState(); return; } var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { // ヘッダー全体がウィンドウ上端より上に出た場合だけ表示する var isPassed = mqPc.matches && !entry.isIntersecting && entry.boundingClientRect.bottom < 0; fixed.classList.toggle('is-show', isPassed); syncStuck(isPassed); }); }, { threshold: 0 }); observer.observe(header); updateFixedState(); } // 関数定義 - アンカーズレ防止 function scrollToIdFromUrl() { const root = document.documentElement; let stopCurrentCorrection = null; const getTarget = (id) => { if (!id) return null; try { return document.getElementById(decodeURIComponent(id.replace(/^#/, ''))); } catch (e) { return document.getElementById(id.replace(/^#/, '')); } }; const alignTarget = (target, behavior) => { const scrollPaddingTop = parseFloat(getComputedStyle(root).scrollPaddingTop) || 0; const targetTop = target.getBoundingClientRect().top + window.scrollY - scrollPaddingTop; window.scrollTo({ top: Math.max(0, targetTop), behavior: behavior }); }; const keepTargetAligned = (target, behavior) => { if (stopCurrentCorrection) stopCurrentCorrection(); let active = true; let onLoad = null; const cleanup = () => { if (!active) return; active = false; if (onLoad) window.removeEventListener('load', onLoad); if (stopCurrentCorrection === cleanup) stopCurrentCorrection = null; }; stopCurrentCorrection = cleanup; const execute = () => { const fontsReady = document.fonts ? document.fonts.ready : Promise.resolve(); fontsReady.then(() => { requestAnimationFrame(() => requestAnimationFrame(() => { if (!active) return; if (behavior === 'auto') root.classList.add('no-smooth-scroll'); alignTarget(target, behavior); if (behavior === 'auto') root.classList.remove('no-smooth-scroll'); cleanup(); })); }); }; // 読み込み途中ならレイアウト確定を待ち、確定後に一度だけ移動する。 if (document.readyState === 'complete') { execute(); } else { onLoad = execute; window.addEventListener('load', onLoad, { once: true }); } }; document.addEventListener('click', (event) => { const link = event.target.closest('a[href*="#"]'); if (!link) return; const url = new URL(link.href, location.href); if (url.origin !== location.origin || url.pathname !== location.pathname || !url.hash) return; const target = getTarget(url.hash); if (!target) return; event.preventDefault(); history.pushState(null, '', url.hash); keepTargetAligned(target, 'smooth'); }); const queryId = new URLSearchParams(location.search).get('id'); const initialTarget = getTarget(queryId || location.hash); if (initialTarget) keepTargetAligned(initialTarget, 'auto'); } // 関数定義 - タブ切り替え function initializeTabs() { document.querySelectorAll('.tab-btn').forEach(function (btn) { btn.addEventListener('click', function () { var tabWrap = btn.closest('.tab-wrap'); if (!tabWrap) return; var tabNav = tabWrap.querySelector('.tab-nav'); if (!tabNav) return; var tabBtns = Array.from(tabNav.querySelectorAll('.tab-btn')); var tabContents = Array.from(tabWrap.children).filter(function (el) { return el.classList.contains('tab-contents'); }); tabBtns.forEach(function (b) { b.classList.remove('show'); }); btn.classList.add('show'); var elmIndex = tabBtns.indexOf(btn); tabContents.forEach(function (c) { c.classList.remove('show'); }); if (tabContents[elmIndex]) { tabContents[elmIndex].classList.add('show'); } }); }); } // 関数定義 - スクロール中にclass付与とポップアップ function initializePopup() { var isPopupOpen = false; var scrollPosition = 0; window.addEventListener('scroll', function () { if (!isPopupOpen) { var scrollPos = window.scrollY; var width = window.innerWidth; var addClassAt = width > 767 ? 400 : 200; var removeClassAt = width > 767 ? 250 : 150; var body = document.body; if (scrollPos > addClassAt) { body.classList.add('scroll'); body.classList.remove('returnTop'); } else if (scrollPos < removeClassAt) { if (body.classList.contains('scroll')) { body.classList.add('returnTop'); setTimeout(function () { body.classList.remove('scroll'); body.classList.remove('returnTop'); }, 300); } } } }); document.querySelectorAll('.openPopup').forEach(function (trigger) { trigger.addEventListener('click', function () { // 開いているポップアップを閉じる document.querySelectorAll('.popup-overlay.fixed').forEach(function (popup) { fadeOut(popup, 300, function () { this.classList.remove('fixed'); }); }); document.body.classList.remove('fixed'); document.body.style.top = '0'; window.scrollTo(0, scrollPosition); scrollPosition = window.scrollY; document.body.classList.add('fixed'); document.body.style.top = '-' + scrollPosition + 'px'; var targetId = trigger.dataset.popupTarget; if (targetId) { var targetPopup = document.querySelector(targetId); if (targetPopup) { fadeIn(targetPopup, 300); targetPopup.classList.add('fixed'); } } document.documentElement.style.scrollBehavior = 'auto'; isPopupOpen = true; // ポップアップ内アンカーリンク var scrollTarget = trigger.dataset.scrollTarget; if (scrollTarget && targetId) { setTimeout(function () { var targetPopup = document.querySelector(targetId); if (!targetPopup) return; var targetElement = targetPopup.querySelector(scrollTarget); if (targetElement) { var popupBox = targetPopup.querySelector('.popup-box'); if (popupBox) { var containerRect = popupBox.getBoundingClientRect(); var elementRect = targetElement.getBoundingClientRect(); var targetPosition = elementRect.top - containerRect.top + popupBox.scrollTop; popupBox.scrollTo({ top: targetPosition, behavior: 'smooth' }); } } }, 300); } }); }); document.querySelectorAll('button.closePopup, .popup-overlay').forEach(function (el) { el.addEventListener('click', function (e) { if (e.target !== el) return; var overlay = el.closest('.popup-overlay'); if (overlay) { fadeOut(overlay, 300, function () { this.classList.remove('fixed'); }); } document.body.classList.remove('fixed'); document.body.style.top = '0'; window.scrollTo(0, scrollPosition); document.documentElement.style.scrollBehavior = 'smooth'; isPopupOpen = false; }); }); } // 読み込みコンテンツ用のポップアップ関数 function initializePopupWithoutScroll() { document.addEventListener('click', function (e) { // 閉じるボタン var closeBtn = e.target.closest('button.closePopup'); if (closeBtn) { var popup = closeBtn.closest('.popup-overlay'); if (popup) { fadeOut(popup, 300, function () { this.classList.remove('fixed'); }); document.documentElement.style.scrollBehavior = 'smooth'; } return; } // オーバーレイ直接クリック if (e.target.classList.contains('popup-overlay')) { fadeOut(e.target, 300, function () { this.classList.remove('fixed'); }); document.documentElement.style.scrollBehavior = 'smooth'; return; } // 開くトリガー var trigger = e.target.closest('.openPopup'); if (trigger) { var targetId = trigger.dataset.popupTarget; if (targetId) { var targetPopup = document.querySelector(targetId); if (targetPopup) { fadeIn(targetPopup, 300); targetPopup.classList.add('fixed'); document.documentElement.style.scrollBehavior = 'auto'; } } } }); } // 関数定義 - サイドバー・SPメニューのカテゴリーアコーディオン function initSidebarSearchCategory() { document.querySelectorAll('.g-sidebarSearchCategory, .spAccordionNavSearch.-category').forEach(function (menu, menuIndex) { menu.querySelectorAll('.fs-pt-menu__item--lv1').forEach(function (item, itemIndex) { var heading = Array.prototype.find.call(item.children, function (child) { return child.classList.contains('fs-pt-menu__heading--lv1'); }); var submenu = Array.prototype.find.call(item.children, function (child) { return child.classList.contains('fs-pt-menu__submenu'); }); if (!heading || !submenu || heading.dataset.sidebarAccordionReady === 'true') return; var submenuId = submenu.id || 'sidebar-category-submenu-' + menuIndex + '-' + itemIndex; var hasCurrentItem = item.classList.contains('is-active') || item.classList.contains('is-current') || Boolean(submenu.querySelector('.is-active, .is-current, [aria-current="page"]')); var updateSubmenuHeight = function () { var styles = window.getComputedStyle(submenu); var currentPadding = parseFloat(styles.paddingBottom) || 0; var openPadding = parseFloat(styles.getPropertyValue('--this-open-padding-block-end')) || 0; var contentHeight = submenu.scrollHeight - currentPadding; submenu.style.setProperty('--this-submenu-height', contentHeight + openPadding + 'px'); }; submenu.id = submenuId; submenu.hidden = false; submenu.setAttribute('aria-hidden', String(!hasCurrentItem)); submenu.toggleAttribute('inert', !hasCurrentItem); heading.dataset.sidebarAccordionReady = 'true'; heading.setAttribute('aria-controls', submenuId); heading.setAttribute('aria-expanded', String(hasCurrentItem)); item.classList.add('has-submenu'); item.classList.toggle('is-open', hasCurrentItem); updateSubmenuHeight(); heading.addEventListener('pointermove', function (e) { if (e.pointerType === 'touch') return; var headingRect = heading.getBoundingClientRect(); heading.classList.toggle('is-chevron-hover', e.clientX >= headingRect.right - 38); }); heading.addEventListener('pointerleave', function () { heading.classList.remove('is-chevron-hover'); }); heading.addEventListener('click', function (e) { var headingRect = heading.getBoundingClientRect(); var isChevronClick = e.clientX >= headingRect.right - 38; if (!isChevronClick) return; e.preventDefault(); e.stopPropagation(); var willOpen = heading.getAttribute('aria-expanded') !== 'true'; updateSubmenuHeight(); heading.setAttribute('aria-expanded', String(willOpen)); item.classList.toggle('is-open', willOpen); submenu.setAttribute('aria-hidden', String(!willOpen)); submenu.toggleAttribute('inert', !willOpen); }, true); }); }); } // 商品検索ウィジェットの Shadow DOM に共通商品カードスタイルを適用 function initCategorySearchCardStyles() { var host = document.querySelector('#fs-search-root'); if (!host) return; var root = host.shadowRoot; if (!root) { if (host.dataset.groupCardStylesWaiting === 'true') return; host.dataset.groupCardStylesWaiting = 'true'; var attempts = 0; var timer = window.setInterval(function () { attempts += 1; if (host.shadowRoot || attempts >= 50 || !host.isConnected) { window.clearInterval(timer); delete host.dataset.groupCardStylesWaiting; if (host.shadowRoot) initCategorySearchCardStyles(); } }, 200); return; } function ensureStylesheet() { if (root.querySelector('link[data-group-card-style]')) return; var link = document.createElement('link'); link.rel = 'stylesheet'; link.href = '/asset2026/css/group.css'; link.dataset.groupCardStyle = 'true'; root.appendChild(link); } ensureStylesheet(); if (!root.groupCardStylesObserver && 'MutationObserver' in window) { root.groupCardStylesObserver = new MutationObserver(ensureStylesheet); root.groupCardStylesObserver.observe(root, { childList: true }); } } // style.css 内の閲覧履歴ルールだけを Shadow DOM に適用 var historyWidgetCssPromise; function loadHistoryWidgetCss() { if (!historyWidgetCssPromise) { var stylesheet = document.querySelector('link[rel="stylesheet"][href*="asset2026/css/style.css"]'); var href = stylesheet ? stylesheet.href : '/asset2026/css/style.css'; historyWidgetCssPromise = fetch(href).then(function (response) { if (!response.ok) throw new Error('style.css could not be loaded'); return response.text(); }).then(function (css) { var start = css.indexOf('/* HISTORY_WIDGET_SHADOW_START'); var firstRule = css.indexOf('*/', start) + 2; var end = css.indexOf('/* HISTORY_WIDGET_SHADOW_END */', firstRule); if (start < 0 || firstRule < 2 || end < 0) throw new Error('History widget styles are missing from style.css'); return css.slice(firstRule, end); }); } return historyWidgetCssPromise; } function initHistoryWidgetStyles() { document.querySelectorAll('.g-history > .fs-search-widget').forEach(function (host) { host.toggleAttribute('data-history-nav', Boolean(host.closest('.spAccordionNav'))); var root = host.shadowRoot; if (!root) { if (host.dataset.historyStylesWaiting === 'true') return; host.dataset.historyStylesWaiting = 'true'; var attempts = 0; var timer = window.setInterval(function () { attempts += 1; if (host.shadowRoot || attempts >= 50 || !host.isConnected) { window.clearInterval(timer); delete host.dataset.historyStylesWaiting; if (host.shadowRoot) initHistoryWidgetStyles(); } }, 200); return; } function ensureStylesheet() { if (root.querySelector('style[data-history-style]')) return; loadHistoryWidgetCss().then(function (css) { if (root.querySelector('style[data-history-style]')) return; var style = document.createElement('style'); style.dataset.historyStyle = 'true'; style.textContent = css; root.appendChild(style); }).catch(function (error) { console.error('Failed to apply history widget styles:', error); }); } ensureStylesheet(); if (!root.historyStylesObserver && 'MutationObserver' in window) { root.historyStylesObserver = new MutationObserver(ensureStylesheet); root.historyStylesObserver.observe(root, { childList: true }); } }); } // 共通処理の初期化 var commonInitialized = false; function initializeCommon() { initCategorySearchCardStyles(); initHistoryWidgetStyles(); initColumnPickupWidget(); if (commonInitialized) { // 後から追加されたヘッダーやカテゴリーだけを追加初期化する initFatNav('.hamburger--menu, .hamburger--search'); initStickyHeader(); initFixedHeader(); initSidebarSearchCategory(); initFooterCalendarSlider(); return; } commonInitialized = true; // 発火 - 商品スライダー initItemSlider(); // 発火 - SPフッター営業日カレンダー initFooterCalendarSlider(); // 発火 - ハンバーガー initFatNav('.hamburger--menu, .hamburger--search'); // 発火 - SPのstickyヘッダー initStickyHeader(); // 発火 - スクロール後に出現する固定ヘッダー initFixedHeader(); // 発火 - アンカーズレ防止 scrollToIdFromUrl(); // 発火 - タブ切り替え initializeTabs(); // 発火 - サイドバー・SPメニューのカテゴリーアコーディオン initSidebarSearchCategory(); // 発火 - スクロール中にclass付与とポップアップ initializePopup(); // 発火 - PC/SP分岐(プレースホルダー文言など) checkBreakpoint(); } // scriptの実行位置に関係なく初期化する if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeCommon, { once: true }); } else { initializeCommon(); } // ページ側でヘッダーやメニューが後から追加された場合も初期化する if ('MutationObserver' in window) { var commonDomObserver = new MutationObserver(function (mutations) { var hasCommonContent = mutations.some(function (mutation) { return Array.prototype.some.call(mutation.addedNodes, function (node) { if (node.nodeType !== 1) return false; return node.matches('.g-header, .g-headerContent, .g-headerFixed, .hamburger--menu, .hamburger--search, .spAccordionNavSearch.-category, .ft-calendar, .ft-calendar > div, #fs-search-root, .g-history, .g-history > .fs-search-widget, .g-column, .g-column__pickup > .fs-search-widget') || Boolean(node.querySelector('.g-header, .g-headerContent, .g-headerFixed, .hamburger--menu, .hamburger--search, .spAccordionNavSearch.-category, .ft-calendar, .ft-calendar > div, #fs-search-root, .g-history, .g-history > .fs-search-widget, .g-column, .g-column__pickup > .fs-search-widget')); }); }); if (hasCommonContent) initializeCommon(); }); var observeCommonDom = function () { if (!document.body) return; commonDomObserver.observe(document.body, { childList: true, subtree: true }); }; if (document.body) { observeCommonDom(); } else { document.addEventListener('DOMContentLoaded', observeCommonDom, { once: true }); } } // 分岐 window.addEventListener('load', function () { checkBreakpoint(); initFooterCalendarSlider(); }); window.addEventListener('resize', function () { checkBreakpoint(); }); function checkBreakpoint() { if (window.innerWidth < 768) { // SPのみの処理 setSearchPlaceholder('お探しの商品を入力'); } else { // PCのみの処理 setSearchPlaceholder('お探しの商品を入力'); } } // 関数定義 - 検索フォームのプレースホルダー切り替え(PC/SPで文言が違う) function setSearchPlaceholder(text) { document.querySelectorAll('.g-searchForm input[type="text"]').forEach(function (el) { var placeholder = el.closest('.g-sidebar') ? 'キーワードを入力' : text; if (el.placeholder !== placeholder) el.placeholder = placeholder; }); }