{# 自動表示モーダルブロック #}
<div id="ecAutoModal" class="ec-modal-overlay">
<div class="ec-modal-content">
<button class="ec-modal-close" onclick="ECAutoModal.close()" aria-label="モーダルを閉じる"></button>
<a href="https://www.instagram.com/iseyabread/" target="_blank" rel="noopener noreferrer">
<img src="{{ asset('/html/user_data/ContentImg/instagram-mordal.png') }}"
alt="キャンペーン画像"
class="ec-modal-image" />
</a>
</div>
</div>
<script>
// EC-CUBE 自動モーダルブロック
(function() {
'use strict';
// 設定
const CONFIG = {
MODAL_ID: 'ecAutoModal',
AUTO_SHOW_DELAY: 2500, // 2.5秒
STORAGE_KEY: 'ecAutoModalLastClosed',
SUPPRESS_DURATION: 5 * 60 * 1000 // 5分(ミリ秒)
};
// モーダル要素とフラグ
const modal = document.getElementById(CONFIG.MODAL_ID);
let isModalOpen = false;
let autoShowTimer = null;
// 最後に閉じた時刻を取得
function getLastClosedTime() {
try {
const timestamp = localStorage.getItem(CONFIG.STORAGE_KEY);
return timestamp ? parseInt(timestamp, 10) : 0;
} catch (e) {
// localStorageが使えない場合はcookieで代用
const match = document.cookie.match(new RegExp(CONFIG.STORAGE_KEY + '=([^;]+)'));
return match ? parseInt(match[1], 10) : 0;
}
}
// 最後に閉じた時刻を保存
function setLastClosedTime() {
const now = Date.now();
try {
localStorage.setItem(CONFIG.STORAGE_KEY, now.toString());
} catch (e) {
// localStorageが使えない場合はcookieで代用(5分有効)
const expireTime = new Date(now + CONFIG.SUPPRESS_DURATION);
document.cookie = `${CONFIG.STORAGE_KEY}=${now}; expires=${expireTime.toUTCString()}; path=/`;
}
}
// モーダル表示を抑制するかチェック
function shouldSuppressModal() {
const lastClosed = getLastClosedTime();
if (lastClosed === 0) return false;
const now = Date.now();
const timeSinceLastClosed = now - lastClosed;
return timeSinceLastClosed < CONFIG.SUPPRESS_DURATION;
}
/**
* モーダルを開く関数
*/
function openModal() {
if (!modal || shouldSuppressModal()) return;
modal.classList.add('active');
isModalOpen = true;
// カスタムイベント発火
dispatchModalEvent('Open');
}
/**
* モーダルを閉じる関数
*/
function closeModal() {
if (!modal) return;
modal.classList.remove('active');
isModalOpen = false;
// 閉じた時刻を保存
setLastClosedTime();
// タイマーをクリア
if (autoShowTimer) {
clearTimeout(autoShowTimer);
autoShowTimer = null;
}
// カスタムイベント発火
dispatchModalEvent('Close');
}
/**
* カスタムイベント発火
*/
function dispatchModalEvent(eventType) {
const event = new CustomEvent('ecAutoModal' + eventType, {
detail: {
isOpen: isModalOpen,
modalId: CONFIG.MODAL_ID
}
});
document.dispatchEvent(event);
}
/**
* 自動表示タイマーの開始
*/
function startAutoShowTimer() {
// 抑制期間中の場合は何もしない
if (shouldSuppressModal()) {
console.log('EC Auto Modal: Suppressed due to recent closure');
return;
}
// 自動表示タイマー
autoShowTimer = setTimeout(function() {
openModal();
}, CONFIG.AUTO_SHOW_DELAY);
}
/**
* モーダル外クリックの処理(閉じない設定)
*/
if (modal) {
modal.addEventListener('click', function(event) {
// モーダル外をクリックしても閉じない
// 必要に応じてコメントアウトを外す
// if (event.target === modal) {
// closeModal();
// }
});
}
/**
* 初期化関数
*/
function init() {
if (!modal) {
console.warn('EC Auto Modal: Modal element not found');
return;
}
// ページが完全に読み込まれてからタイマー開始
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', startAutoShowTimer);
} else {
startAutoShowTimer();
}
}
// グローバルオブジェクトとして公開
window.ECAutoModal = {
open: openModal,
close: closeModal,
isOpen: function() {
return isModalOpen;
},
reset: function() {
// 抑制状態をリセット(デバッグ用)
try {
localStorage.removeItem(CONFIG.STORAGE_KEY);
} catch (e) {
document.cookie = `${CONFIG.STORAGE_KEY}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
}
},
// 残り抑制時間を取得(デバッグ用)
getRemainingSuppressionTime: function() {
const lastClosed = getLastClosedTime();
if (lastClosed === 0) return 0;
const now = Date.now();
const elapsed = now - lastClosed;
const remaining = CONFIG.SUPPRESS_DURATION - elapsed;
return Math.max(0, remaining);
},
config: CONFIG
};
// 初期化実行
init();
})();
/**
* EC-CUBE Twig用の初期化関数
* 使用例: initECAutoModal('{{ asset("assets/img/campaign.jpg") }}')
*/
function initECAutoModal(imageUrl, customDelay) {
const modalImage = document.querySelector('#ecAutoModal .ec-modal-image');
if (modalImage && imageUrl) {
modalImage.src = imageUrl;
modalImage.alt = 'キャンペーン画像';
}
// カスタム遅延時間の設定
if (customDelay && typeof customDelay === 'number') {
ECAutoModal.config.AUTO_SHOW_DELAY = customDelay;
}
}
// イベントリスナーの例
document.addEventListener('ecAutoModalOpen', function(e) {
console.log('EC Auto Modal opened:', e.detail);
});
document.addEventListener('ecAutoModalClose', function(e) {
console.log('EC Auto Modal closed:', e.detail);
});
</script>
<style>
/* モーダルのベーススタイル */
.ec-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
opacity: 0;
visibility: hidden;
transition: all 0.3s ease;
}
.ec-modal-overlay.active {
opacity: 1;
visibility: visible;
}
.ec-modal-content {
position: relative;
max-width: 500px;
max-height: auto;
background: transparent;
border-radius: 15px;
overflow: hidden;
transform: scale(0.8);
transition: transform 0.3s ease;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
}
.ec-modal-overlay.active .ec-modal-content {
transform: scale(1);
}
.ec-modal-image {
width: 100%;
height: auto;
display: block;
border-radius: 15px;
}
/* 閉じるボタン */
.ec-modal-close {
position: absolute;
top: 15px;
right: 15px;
width: 40px;
height: 40px;
background-color: rgba(0, 0, 0, 0.8);
border: none;
border-radius: 50%;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
transition: all 0.3s ease;
z-index: 10001;
color: white;
font-size: 20px;
font-weight: bold;
}
.ec-modal-close:hover {
background-color: rgba(255, 0, 0, 0.8);
transform: scale(1.1);
}
.ec-modal-close:before {
content: "×";
line-height: 1;
}
/* レスポンシブ対応 */
@media (max-width: 768px) {
.ec-modal-content {
max-width: 75%;
max-height: 75%;
}
.ec-modal-close {
width: 35px;
height: 35px;
top: 10px;
right: 10px;
font-size: 18px;
}
}
@media (max-width: 480px) {
.ec-modal-content {
max-width: 85%;
max-height: 85%;
}
}
</style>