<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E5%BE%AE%E4%BB%B6%3ASaltCardEffect</id>
	<title>微件:SaltCardEffect - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E5%BE%AE%E4%BB%B6%3ASaltCardEffect"/>
	<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:SaltCardEffect&amp;action=history"/>
	<updated>2026-06-19T09:34:37Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.3</generator>
	<entry>
		<id>https://mcbbs.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:SaltCardEffect&amp;diff=34818&amp;oldid=prev</id>
		<title>Salt lovely：​仿照蒸汽平台的集换式卡牌效果制作的</title>
		<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:SaltCardEffect&amp;diff=34818&amp;oldid=prev"/>
		<updated>2022-06-25T08:03:01Z</updated>

		<summary type="html">&lt;p&gt;仿照蒸汽平台的集换式卡牌效果制作的&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
* 代码开源于[https://github.com/Salt-lovely/card-effect GitHub]。&lt;br /&gt;
* 这个卡片效果脚本并不自带CSS，请自行调用&amp;lt;code&amp;gt;Widget:SaltCardEffect/CSS&amp;lt;/code&amp;gt;或者自己写{{tl|CSS}}。&lt;br /&gt;
** 这个默认样式&amp;#039;&amp;#039;&amp;#039;需要各个图片高度一致&amp;#039;&amp;#039;&amp;#039;才能达到正常的视觉效果。&lt;br /&gt;
&amp;lt;div class=&amp;quot;salt-card-effect-detail&amp;quot;&amp;gt;&lt;br /&gt;
[[file:青苹果勋章.png]]&lt;br /&gt;
[[file:红苹果勋章.png]]&lt;br /&gt;
[[file:金苹果勋章.png]]&lt;br /&gt;
[[file:附魔金苹果勋章.gif]]&lt;br /&gt;
&amp;lt;/div&amp;gt;{{#Widget:SaltCardEffect/CSS}}{{#Widget:SaltCardEffect}}&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
  // src/utils/h.ts&lt;br /&gt;
  function handleChildren(children = []) {&lt;br /&gt;
    const res = [];&lt;br /&gt;
    const flattedChildren = children.flat(Infinity);&lt;br /&gt;
    flattedChildren.forEach((child) =&amp;gt; {&lt;br /&gt;
      if (child instanceof Node)&lt;br /&gt;
        res.push(child);&lt;br /&gt;
      else if (typeof child === &amp;quot;string&amp;quot;)&lt;br /&gt;
        res.push(document.createTextNode(child));&lt;br /&gt;
      else if (typeof child === &amp;quot;number&amp;quot;)&lt;br /&gt;
        res.push(document.createTextNode(`${child}`));&lt;br /&gt;
    });&lt;br /&gt;
    return res;&lt;br /&gt;
  }&lt;br /&gt;
  var h = (cmd, props, ...children) =&amp;gt; {&lt;br /&gt;
    if (typeof cmd === &amp;quot;string&amp;quot;) {&lt;br /&gt;
      const tag = cmd;&lt;br /&gt;
      const el = document.createElement(tag);&lt;br /&gt;
      if (props) {&lt;br /&gt;
        for (const _attr in props) {&lt;br /&gt;
          const attr = _attr.toLowerCase();&lt;br /&gt;
          const value = props[_attr];&lt;br /&gt;
          if (attr === &amp;quot;data&amp;quot; || attr === &amp;quot;dataset&amp;quot;) {&lt;br /&gt;
            if (value &amp;amp;&amp;amp; typeof value === &amp;quot;object&amp;quot;) {&lt;br /&gt;
              for (const styleAttr in value) {&lt;br /&gt;
                el.dataset[styleAttr] = value[styleAttr];&lt;br /&gt;
              }&lt;br /&gt;
            } else if (typeof value === &amp;quot;string&amp;quot;) {&lt;br /&gt;
              el.setAttribute(attr, value);&lt;br /&gt;
            }&lt;br /&gt;
          } else if (attr === &amp;quot;style&amp;quot;) {&lt;br /&gt;
            if (value &amp;amp;&amp;amp; typeof value === &amp;quot;object&amp;quot;) {&lt;br /&gt;
              for (const styleAttr in value) {&lt;br /&gt;
                el.style[styleAttr] = value[styleAttr];&lt;br /&gt;
              }&lt;br /&gt;
            } else if (typeof value === &amp;quot;string&amp;quot;) {&lt;br /&gt;
              el.setAttribute(&amp;quot;style&amp;quot;, value);&lt;br /&gt;
            }&lt;br /&gt;
          } else {&lt;br /&gt;
            el[_attr] = value;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (children == null ? void 0 : children.length)&lt;br /&gt;
        handleChildren(children).forEach((child) =&amp;gt; el.appendChild(child));&lt;br /&gt;
      return el;&lt;br /&gt;
    } else if (typeof cmd === &amp;quot;function&amp;quot;) {&lt;br /&gt;
      return cmd(props || {}, ...handleChildren(children));&lt;br /&gt;
    } else {&lt;br /&gt;
      throw new Error(&amp;quot;请输入正确的标签名或生成方法&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
  var h_default = h;&lt;br /&gt;
&lt;br /&gt;
  // src/utils/utils.ts&lt;br /&gt;
  function docReady(fn) {&lt;br /&gt;
    if (document.readyState === &amp;quot;loading&amp;quot;) {&lt;br /&gt;
      window.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, () =&amp;gt; {&lt;br /&gt;
        if (document.readyState === &amp;quot;interactive&amp;quot;)&lt;br /&gt;
          fn();&lt;br /&gt;
      });&lt;br /&gt;
    } else {&lt;br /&gt;
      fn();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  function handleChildren2(props) {&lt;br /&gt;
    const { queryContainer, queryElement, callback } = props;&lt;br /&gt;
    const containers = Array.from(document.body.querySelectorAll(queryContainer));&lt;br /&gt;
    containers.forEach((container) =&amp;gt; {&lt;br /&gt;
      container.classList.add(&amp;quot;salt-done&amp;quot;);&lt;br /&gt;
      const elems = Array.from(container.querySelectorAll(queryElement)).filter((el) =&amp;gt; el instanceof HTMLElement);&lt;br /&gt;
      const res = elems.map((elem) =&amp;gt; callback(elem));&lt;br /&gt;
      container.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
      res.forEach((item) =&amp;gt; container.appendChild(item));&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // src/mouseEvent.ts&lt;br /&gt;
  function mouseMoveDetailHandler(ev) {&lt;br /&gt;
    console.log(&amp;quot;mouseMove&amp;quot;);&lt;br /&gt;
    const { offsetWidth, offsetHeight } = this;&lt;br /&gt;
    const { offsetX, offsetY } = ev;&lt;br /&gt;
    const posX = offsetX / offsetWidth * 2 - 1;&lt;br /&gt;
    const posY = offsetY / offsetHeight * 2 - 1;&lt;br /&gt;
    const bright = 1 - posY * 0.18 - posX * 0.02;&lt;br /&gt;
    const rotateX = 15 * posX;&lt;br /&gt;
    const rotateY = 15 * posY;&lt;br /&gt;
    this.style.transform = `rotateX(${-rotateY}deg) rotateY(${rotateX}deg)`;&lt;br /&gt;
    this.style.filter = `brightness(${bright})`;&lt;br /&gt;
  }&lt;br /&gt;
  function mouseLeaveDetailHandler() {&lt;br /&gt;
    this.style.transform = `rotateX(0deg) rotateY(0deg)`;&lt;br /&gt;
    this.style.filter = `brightness(1)`;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // src/index.ts&lt;br /&gt;
  if (window.parent !== window) {&lt;br /&gt;
    console.error(&amp;quot;这个脚本不允许在 iframe 等嵌入页面中运行！&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    docReady(() =&amp;gt; {&lt;br /&gt;
      handleChildren2({&lt;br /&gt;
        queryContainer: &amp;quot;.salt-card-effect-detail:not(.salt-done)&amp;quot;,&lt;br /&gt;
        queryElement: &amp;quot;img&amp;quot;,&lt;br /&gt;
        callback: (img) =&amp;gt; {&lt;br /&gt;
          img.classList.add(&amp;quot;salt-card-img&amp;quot;);&lt;br /&gt;
          const container = h_default(&amp;quot;div&amp;quot;, {&lt;br /&gt;
            className: &amp;quot;salt-card-container salt-card-container-detail&amp;quot;&lt;br /&gt;
          });&lt;br /&gt;
          const layer = h_default(&amp;quot;div&amp;quot;, { className: &amp;quot;salt-card-layer&amp;quot; });&lt;br /&gt;
          container.appendChild(layer);&lt;br /&gt;
          layer.appendChild(img);&lt;br /&gt;
          img.addEventListener(&amp;quot;mousemove&amp;quot;, mouseMoveDetailHandler);&lt;br /&gt;
          container.addEventListener(&amp;quot;mouseleave&amp;quot;, mouseLeaveDetailHandler.bind(img));&lt;br /&gt;
          return container;&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      handleChildren2({&lt;br /&gt;
        queryContainer: &amp;quot;.salt-card-effect-overview:not(.salt-done)&amp;quot;,&lt;br /&gt;
        queryElement: &amp;quot;img&amp;quot;,&lt;br /&gt;
        callback: (img) =&amp;gt; {&lt;br /&gt;
          img.classList.add(&amp;quot;salt-card-img&amp;quot;);&lt;br /&gt;
          const container = h_default(&amp;quot;div&amp;quot;, {&lt;br /&gt;
            className: &amp;quot;salt-card-container salt-card-container-overview&amp;quot;&lt;br /&gt;
          });&lt;br /&gt;
          const layer = h_default(&amp;quot;div&amp;quot;, { className: &amp;quot;salt-card-layer&amp;quot; });&lt;br /&gt;
          container.appendChild(layer);&lt;br /&gt;
          layer.appendChild(img);&lt;br /&gt;
          return container;&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Salt lovely</name></author>
	</entry>
</feed>