function toggleDropdown(iconElement, event) { event.preventDefault(); // ここでリンク遷移を防ぐ // クリックされたアイコンのクラスから `drop-◯◯` を取得 const classList = Array.from(iconElement.classList); const targetClass = classList.find(cls => cls.startsWith('drop-')); if (!targetClass) return; // 対応するドロップダウン要素を取得 const dropdown = document.querySelector(`.dropdown-content.${targetClass}`); if (!dropdown) return; // 表示状態を事前に取得(トグルのため) const isCurrentlyVisible = dropdown.style.display === 'block'; // すべてのドロップダウンを非表示にし、アイコン回転を戻す document.querySelectorAll('.dropdown-content').forEach(el => { el.style.display = 'none'; }); document.querySelectorAll('.plus-icon').forEach(icon => { icon.style.setProperty('--rotation', '0deg'); }); // 表示されていなかった場合のみ表示&回転(表示中なら何もしない=閉じたまま) if (!isCurrentlyVisible) { // 位置計算 const rect = iconElement.getBoundingClientRect(); let topPosition = rect.bottom + window.scrollY - 360; let leftPosition = rect.left + window.scrollX - 550; // 左がはみ出す場合に修正 if (leftPosition < 0) { leftPosition = 0; topPosition = topPosition + 50; } // 明細の高さを取得(まだ非表示の場合は一時的に表示して測定) let dropdownHeight = dropdown.offsetHeight; let restoreDisplay = false; if (dropdown.style.display === 'none' || dropdown.style.display === '') { dropdown.style.visibility = 'hidden'; dropdown.style.display = 'block'; dropdownHeight = dropdown.offsetHeight; restoreDisplay = true; } const dropdownBottom = topPosition + dropdownHeight; const footer = document.querySelector('footer'); const footerHeight = footer ? footer.offsetHeight : 0; const bodyHeight = document.body.offsetHeight; const visibleMaxHeight = bodyHeight - footerHeight; // 明細がフッターに被る場合、上にずらす if (dropdownBottom > visibleMaxHeight) { const overflowAmount = dropdownBottom - visibleMaxHeight; topPosition = topPosition - overflowAmount - 10; // 少し余白つけて上にずらす if (topPosition < 0) topPosition = 0; // はみ出さないように } if (restoreDisplay) { dropdown.style.display = 'none'; dropdown.style.visibility = ''; } // ドロップダウンの位置を設定 dropdown.style.position = 'absolute'; dropdown.style.top = `${topPosition}px`; dropdown.style.top = `${topPosition}px`; dropdown.style.left = `${leftPosition}px`; // 表示&回転 dropdown.style.display = 'block'; iconElement.style.setProperty('--rotation', '90deg'); } }