微件:Card:修订间差异
跳转到导航
跳转到搜索
功能测试 |
功能测试 |
||
| 第1行: | 第1行: | ||
<noinclude> | <noinclude> | ||
此Widget用于为卡牌添加交互功能。 | |||
使用方法:在页面底部添加 {{#widget:Card}} | |||
[[分类:Widget]] | [[分类:Widget]] | ||
</noinclude><includeonly> | </noinclude><includeonly> | ||
| 第11行: | 第12行: | ||
.card-deck-trans:hover { | .card-deck-trans:hover { | ||
transform: | transform: scale(1.05); | ||
z-index: 10; | |||
} | } | ||
.card-deck-trans:active { | .card-deck-trans:active { | ||
transform: | transform: scale(0.98); | ||
} | } | ||
/* | /* 模态框样式 */ | ||
.card-modal-overlay { | .card-modal-overlay { | ||
display: none; | display: none; | ||
| 第27行: | 第28行: | ||
width: 100%; | width: 100%; | ||
height: 100%; | height: 100%; | ||
background-color: rgba(0, 0, 0, 0. | background-color: rgba(0, 0, 0, 0.8); | ||
z-index: 9999; | z-index: 9999; | ||
justify-content: center; | justify-content: center; | ||
| 第47行: | 第48行: | ||
cursor: pointer; | cursor: pointer; | ||
z-index: 10001; | z-index: 10001; | ||
line-height: 1; | line-height: 1; | ||
transition: color 0.2s ease; | |||
} | } | ||
.card-modal-close:hover { | .card-modal-close:hover { | ||
color: #ff6b6b; | color: #ff6b6b; | ||
} | } | ||
| 第63行: | 第62行: | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
} | } | ||
| 第84行: | 第82行: | ||
/* 闪光按钮 */ | /* 闪光按钮 */ | ||
.card-spark-button { | .card-spark-button { | ||
margin-top: 20px; | |||
padding: 10px 30px; | |||
background-color: #4a4a4a; | |||
color: #ffd700; | |||
border: 1px solid #ffd700; | |||
border: | border-radius: 4px; | ||
border-radius: | |||
cursor: pointer; | cursor: pointer; | ||
font-size: 16px; | |||
} | } | ||
.card-spark-button:hover { | .card-spark-button:hover { | ||
background-color: #5a5a5a; | |||
} | } | ||
| 第115行: | 第105行: | ||
height: 100%; | height: 100%; | ||
background-color: rgba(0, 0, 0, 0.9); | background-color: rgba(0, 0, 0, 0.9); | ||
z-index: | z-index: 10000; | ||
justify-content: center; | justify-content: center; | ||
align-items: flex-start; | align-items: flex-start; | ||
overflow-y: auto; | overflow-y: auto; | ||
padding: 60px 20px 20px; | padding: 60px 20px 20px 20px; | ||
box-sizing: border-box; | |||
} | } | ||
| 第133行: | 第124行: | ||
color: #fff; | color: #fff; | ||
cursor: pointer; | cursor: pointer; | ||
z-index: | z-index: 10002; | ||
line-height: 1; | line-height: 1; | ||
transition: color 0.2s ease; | |||
} | } | ||
.spark-modal-close:hover { | .spark-modal-close:hover { | ||
color: #ff6b6b; | color: #ff6b6b; | ||
} | } | ||
.spark-modal-content { | .spark-modal-content { | ||
display: flex; | display: flex; | ||
| 第151行: | 第139行: | ||
gap: 20px; | gap: 20px; | ||
max-width: 1200px; | max-width: 1200px; | ||
} | } | ||
.spark-modal-content .card-deck-trans { | |||
cursor: default; | |||
} | |||
.spark-modal-content .card-deck-trans:hover { | |||
transform: none; | |||
} | |||
/* 闪光模态框标题 */ | |||
.spark-modal-title { | .spark-modal-title { | ||
width: 100%; | width: 100%; | ||
text-align: center; | text-align: center; | ||
color: # | color: #ffd700; | ||
font-size: | font-size: 24px; | ||
margin-bottom: 20px; | margin-bottom: 20px; | ||
} | } | ||
/* | /* 加载提示 */ | ||
.spark-loading { | .spark-loading { | ||
color: #fff; | color: #fff; | ||
font-size: | font-size: 18px; | ||
} | } | ||
</style> | |||
<div id="card-modal-overlay" class="card-modal-overlay"> | |||
content | <span class="card-modal-close" id="card-modal-close">×</span> | ||
<div class="card-modal-content" id="card-modal-content"> | |||
</div> | |||
</div> | |||
<div id="spark-modal-overlay" class="spark-modal-overlay"> | |||
<span class="spark-modal-close" id="spark-modal-close">×</span> | |||
<div class="spark-modal-content" id="spark-modal-content"> | |||
</div> | |||
</div> | |||
</ | |||
<script> | <script> | ||
| 第206行: | 第182行: | ||
// 等待DOM加载完成 | // 等待DOM加载完成 | ||
function init() { | |||
document. | var cardModal = document.getElementById('card-modal-overlay'); | ||
var cardModalContent = document.getElementById('card-modal-content'); | |||
var cardModalClose = document.getElementById('card-modal-close'); | |||
var sparkModal = document.getElementById('spark-modal-overlay'); | |||
var sparkModalContent = document.getElementById('spark-modal-content'); | |||
var sparkModalClose = document.getElementById('spark-modal-close'); | |||
var | |||
document. | |||
// | // 为所有卡牌添加点击事件 | ||
var | function bindCardEvents() { | ||
var cards = document.querySelectorAll('.card-deck-trans'); | |||
cards.forEach(function(card) { | |||
// 跳过已绑定事件的卡牌和模态框内的卡牌 | |||
if (card.dataset.bound || card.closest('.spark-modal-content')) { | |||
return; | |||
} | |||
card.dataset.bound = 'true'; | |||
card.addEventListener('click', function(e) { | |||
e.preventDefault(); | |||
e.stopPropagation(); | |||
// 获取卡牌信息 | |||
var cardDeck = this.querySelector('.card-deck'); | |||
if (!cardDeck) return; | |||
// 克隆卡牌 | |||
var clonedCard = this.cloneNode(true); | |||
clonedCard.classList.add('card-modal-card'); | |||
clonedCard.classList.remove('card-deck-trans'); | |||
clonedCard.style.width = '270px'; | |||
clonedCard.style.height = '384px'; | |||
clonedCard.style.cursor = 'default'; | |||
var clonedDeck = clonedCard.querySelector('.card-deck'); | |||
if (clonedDeck) { | |||
clonedDeck.style.transform = 'scale(0.6)'; | |||
} | |||
// 清空并添加内容 | |||
cardModalContent.innerHTML = ''; | |||
var cardContainer = document.createElement('div'); | |||
cardContainer.className = 'card-modal-card-container'; | |||
cardContainer.appendChild(clonedCard); | |||
cardModalContent.appendChild(cardContainer); | |||
// 检查是否显示闪光按钮 | |||
var sparkEnable = this.dataset.sparkEnable; | |||
var sort = this.dataset.sort; | |||
var cardId = this.dataset.cardId; | |||
// 判断条件:spark_enable=1 且 sort不是中立卡牌/怪物卡牌 | |||
if (sparkEnable === '1' && sort !== '中立卡牌' && sort !== '怪物卡牌') { | |||
var sparkButton = document.createElement('button'); | |||
sparkButton.className = 'card-spark-button'; | |||
sparkButton.textContent = '闪光'; | |||
sparkButton.addEventListener('click', function(e) { | |||
e.stopPropagation(); | |||
openSparkModal(cardId); | |||
}); | |||
cardModalContent.appendChild(sparkButton); | |||
} | |||
// 显示模态框 | |||
cardModal.classList.add('active'); | |||
document.body.style.overflow = 'hidden'; | |||
}); | |||
}); | |||
} | |||
// | // 打开闪光卡牌模态框 | ||
var | function openSparkModal(cardId) { | ||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div><div class="spark-loading">加载中...</div>'; | |||
sparkModal.classList.add('active'); | |||
// 使用MediaWiki API加载闪光卡牌 | |||
var apiUrl = mw.config.get('wgScriptPath') + '/api.php'; | |||
var params = { | |||
action: 'parse', | |||
text: '{{Card/display/spark|' + cardId + '}}', | |||
prop: 'text', | |||
format: 'json', | |||
contentmodel: 'wikitext' | |||
}; | |||
var url = apiUrl + '?' + Object.keys(params).map(function(key) { | |||
return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]); | |||
}).join('&'); | |||
fetch(url) | |||
.then(function(response) { | |||
return response.json(); | |||
}) | |||
.then(function(data) { | |||
if (data.parse && data.parse.text) { | |||
var html = data.parse.text['*']; | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div>' + html; | |||
// 为新加载的卡牌禁用点击事件 | |||
var sparkCards = sparkModalContent.querySelectorAll('.card-deck-trans'); | |||
sparkCards.forEach(function(card) { | |||
card.style.cursor = 'default'; | |||
card.addEventListener('click', function(e) { | |||
e.preventDefault(); | |||
e.stopPropagation(); | |||
}); | |||
}); | |||
} else { | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div><div style="color: #fff;">暂无闪光卡牌</div>'; | |||
} | |||
}) | |||
.catch(function(error) { | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div><div style="color: #ff6b6b;">加载失败,请重试</div>'; | |||
console.error('Error loading spark cards:', error); | |||
}); | |||
} | |||
// 关闭卡牌模态框 | |||
cardModalClose.addEventListener('click', function() { | |||
cardModal.classList.remove('active'); | |||
sparkModal.classList.remove('active'); | |||
document.body.style.overflow = ''; | |||
}); | }); | ||
// | // 关闭闪光模态框 | ||
sparkModalClose.addEventListener('click', function() { | |||
sparkModal.classList.remove('active'); | |||
}); | }); | ||
// 点击模态框背景关闭 | |||
if (e.target === | cardModal.addEventListener('click', function(e) { | ||
if (e.target === cardModal) { | |||
cardModal.classList.remove('active'); | |||
sparkModal.classList.remove('active'); | |||
document.body.style.overflow = ''; | |||
} | } | ||
}); | }); | ||
sparkModal.addEventListener('click', function(e) { | sparkModal.addEventListener('click', function(e) { | ||
if (e.target === sparkModal) { | if (e.target === sparkModal) { | ||
sparkModal.classList.remove('active'); | |||
} | } | ||
}); | }); | ||
// | // ESC键关闭模态框 | ||
document.addEventListener('keydown', function(e) { | document.addEventListener('keydown', function(e) { | ||
if (e.key === 'Escape') { | if (e.key === 'Escape') { | ||
if (sparkModal.classList.contains('active')) { | if (sparkModal.classList.contains('active')) { | ||
sparkModal.classList.remove('active'); | |||
} else if ( | } else if (cardModal.classList.contains('active')) { | ||
cardModal.classList.remove('active'); | |||
document.body.style.overflow = ''; | |||
} | } | ||
} | } | ||
}); | }); | ||
// | // 初始化绑定事件 | ||
bindCardEvents(); | |||
// | // 监听DOM变化,为动态加载的卡牌绑定事件 | ||
var | var observer = new MutationObserver(function(mutations) { | ||
bindCardEvents(); | |||
}); | |||
observer.observe(document.body, { | |||
childList: true, | |||
subtree: true | |||
}); | |||
} | |||
} | } | ||
// 页面加载完成后初始化 | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', init); | |||
} else { | |||
init(); | |||
} | } | ||
})(); | })(); | ||
</script> | </script> | ||
</includeonly> | </includeonly> | ||
2026年1月17日 (六) 16:52的版本
此Widget用于为卡牌添加交互功能。 使用方法:在页面底部添加