微件:Card:修订间差异
跳转到导航
跳转到搜索
功能测试 |
功能测试 |
||
| (未显示同一用户的1个中间版本) | |||
| 第1行: | 第1行: | ||
<noinclude> | <noinclude> | ||
此Widget用于为卡牌添加交互功能。 | |||
使用方法:在页面底部添加 {{#widget:Card}} | |||
[[分类:Widget]] | [[分类:Widget]] | ||
</noinclude><includeonly> | </noinclude><includeonly> | ||
| 第7行: | 第8行: | ||
.card-deck-trans { | .card-deck-trans { | ||
cursor: pointer; | cursor: pointer; | ||
transition: transform | transition: transform 0.2s ease; | ||
} | } | ||
.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; | ||
} | } | ||
| 第54行: | 第53行: | ||
.card-modal-close:hover { | .card-modal-close:hover { | ||
color: #ff6b6b; | color: #ff6b6b; | ||
} | } | ||
| 第63行: | 第61行: | ||
align-items: center; | align-items: center; | ||
justify-content: center; | justify-content: center; | ||
} | } | ||
| 第84行: | 第81行: | ||
/* 闪光按钮 */ | /* 闪光按钮 */ | ||
.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行: | 第104行: | ||
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行: | 第123行: | ||
color: #fff; | color: #fff; | ||
cursor: pointer; | cursor: pointer; | ||
z-index: | z-index: 10002; | ||
line-height: 1; | line-height: 1; | ||
} | } | ||
| 第141行: | 第129行: | ||
.spark-modal-close:hover { | .spark-modal-close:hover { | ||
color: #ff6b6b; | color: #ff6b6b; | ||
} | } | ||
.spark-modal-content { | .spark-modal-content { | ||
display: flex; | display: flex; | ||
| 第151行: | 第137行: | ||
gap: 20px; | gap: 20px; | ||
max-width: 1200px; | max-width: 1200px; | ||
} | |||
.spark-modal-content .card-deck-trans { | |||
cursor: default; | |||
pointer-events: none; | |||
} | |||
.spark-modal-content .card-deck-trans:hover { | |||
transform: none; | |||
} | } | ||
| 第157行: | 第151行: | ||
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"> | |||
<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> | ||
| 第205行: | 第176行: | ||
'use strict'; | 'use strict'; | ||
function init() { | |||
var cardModal = document.getElementById('card-modal-overlay'); | |||
document. | 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. | |||
function bindCardEvents() { | |||
var cards = document.querySelectorAll('.card-deck-trans'); | |||
cards.forEach(function(card) { | |||
if (card.dataset.bound || card.closest('.spark-modal-content') || card.closest('.card-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 = document.createElement('div'); | |||
clonedCard.className = 'card-modal-card'; | |||
clonedCard.innerHTML = '<div class="card-deck">' + cardDeck.innerHTML + '</div>'; | |||
cardModalContent.innerHTML = ''; | |||
cardModalContent.appendChild(clonedCard); | |||
var sparkEnable = this.dataset.sparkEnable; | |||
var sort = this.dataset.sort; | |||
var cardId = this.dataset.cardId; | |||
if (sparkEnable === '1' && sort !== '中立卡牌' && sort !== '怪物卡牌' && cardId) { | |||
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'; | |||
}); | |||
}); | |||
} | |||
function openSparkModal(cardId) { | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div><div class="spark-loading">加载中...</div>'; | |||
sparkModal.classList.add('active'); | |||
var apiUrl = mw.config.get('wgScriptPath') + '/api.php'; | |||
var params = new URLSearchParams({ | |||
action: 'parse', | |||
text: '{{Card/display/spark|' + cardId + '}}', | |||
prop: 'text', | |||
format: 'json', | |||
contentmodel: 'wikitext' | |||
}); | }); | ||
fetch(apiUrl + '?' + params.toString()) | |||
.then(function(response) { | |||
return response.json(); | |||
}) | |||
.then(function(data) { | |||
if (data.parse && data.parse.text) { | |||
var html = data.parse.text['*']; | |||
if (html.trim() === '' || html.indexOf('card-deck-trans') === -1) { | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div><div style="color: #fff;">暂无闪光卡牌</div>'; | |||
} else { | |||
sparkModalContent.innerHTML = '<div class="spark-modal-title">闪光卡牌</div>' + html; | |||
} | |||
} 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'); | |||
}); | }); | ||
cardModal.addEventListener('click', function(e) { | |||
if (e.target === | 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'); | |||
} | } | ||
}); | }); | ||
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(); | |||
var observer = new MutationObserver(function() { | |||
var | 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日 (六) 17:01的最新版本
此Widget用于为卡牌添加交互功能。 使用方法:在页面底部添加