旧站的内容可能已过时。您可以前往“真魂”分站查看本页面,那里的内容将会定期同步。
“MediaWiki:Common.js”的版本间的差异
来自个人维基
小 |
(重构 Template:Hidebox 动画效果代码) |
||
第24行: | 第24行: | ||
} ) | } ) | ||
− | /* Template: Hidebox */ | + | /* 为 Template:Hidebox 增加动画效果 */ |
+ | $( "#bodyContent" ).on( "click", ".lnnblog-hidebox-heading", function ( event ) { | ||
+ | event.preventDefault() | ||
− | + | /** 折叠框的 <summary> 元素。 */ | |
− | + | ||
− | + | ||
var $this = $( this ) | var $this = $( this ) | ||
+ | /** 折叠框的 <details> 元素。 */ | ||
var $parent = $this.parent() | var $parent = $this.parent() | ||
+ | /** 折叠框内容元素。 */ | ||
var $body = $this.nextAll( ".lnnblog-hidebox-body" ) | var $body = $this.nextAll( ".lnnblog-hidebox-body" ) | ||
var open = $parent.prop( "open" ) | var open = $parent.prop( "open" ) | ||
− | var | + | /** 当前正在执行的动画动作(expand 或 shrink)。若不在执行动画则为空。 */ |
− | + | var oldState = $parent.attr( "data-lnnblog-hidebox-state" ) | |
− | + | /** 现在要执行的动画动作。 */ | |
− | + | var state = !open || oldState === "shrink" ? "expand" : "shrink" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | // 计算当前的宽高 | |
− | + | // 取得的宽度是四舍五入过的;增加 0.5 以避免内容折行 | |
− | + | var currentWidth = $parent.width() + 0.5 | |
− | + | var currentHeight = $parent.height() | |
− | + | // 打断可能正在进行的动画,然后计算一下动画目标状态的宽高 | |
+ | $parent.stop( true, true ).prop( "open", state === "expand" ) | ||
+ | var targetWidth = $parent.width() + 0.5 | ||
+ | var targetHeight = $parent.height() | ||
− | + | // 锁定内容框宽度为完全展开状态的宽度,以避免内容折行 | |
− | + | if (state === "expand") | |
− | + | $body.outerWidth( targetWidth ) | |
− | + | else if (oldState !== "expand") // 从完全展开状态折叠 | |
− | + | $body.outerWidth( currentWidth ) | |
− | + | // 如果不是从完全展开状态折叠,即在展开的半途中折叠, | |
− | + | // 则内容框的宽度还没有清除,无需再次设置。 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | $parent | |
− | + | .attr( "data-lnnblog-hidebox-state", state ) | |
− | + | .width( currentWidth ) | |
− | + | .height( currentHeight ) | |
− | + | // 必须在 open 状态下才能显示出内容框,所以不管展开还是折叠都需要设置成 open | |
− | + | .prop( "open", true ) | |
− | + | .animate( { | |
− | + | width: targetWidth, | |
− | + | height: targetHeight | |
− | + | }, { | |
− | + | duration: 250, | |
− | + | done: function () { | |
− | + | if (state === "shrink") $parent.prop( "open", false ) | |
− | + | // 清除手动设置的宽高 | |
− | + | $body.css( "width", "" ) | |
− | + | $parent | |
− | + | .css( { width: "", height: "" } ) | |
− | + | .removeAttr( "data-lnnblog-hidebox-state" ) | |
− | + | } | |
− | + | } ) | |
− | + | ||
− | + | ||
− | + | ||
} ) | } ) | ||
} ); | } ); |
2022年11月23日 (三) 18:49的版本
$( function () { /* 缺省将内容 lang 设置成简体中文 */ if ( !document.getElementById( "lnnblog-setlang" ) ) { $( "mw-content-text" ).attr( "lang", "zh-cmn-Hans" ); $( "firstHeading" ).attr( "lang", "zh-cmn-Hans" ); } /* 评论框内联 CSS 修正 */ $( "#addComment" ).css( "width", "" ).css( "max-width", "500px" ); $( "#addComment textarea" ).css( "width", "100%" ).css( "box-sizing", "border-box" ); $( "#addComment form .greyTiny" ).css( "padding-left", "" ); $( "#addComment textarea+div" ).css( "text-align", "right" ); /* viewport meta? */ var wide = window.outerWidth > 720 var viewportMeta = $( '<meta name="viewport" content="width=' + (wide ? "device-width" : "700") + '">' ) $( "head" ).append(viewportMeta) $( window ).on( "resize", function () { var wide_ = window.outerWidth > 720 if (wide_ === wide) return wide = wide_ viewportMeta.attr( "content", "width=" + (wide ? "device-width" : "700")) } ) /* 为 Template:Hidebox 增加动画效果 */ $( "#bodyContent" ).on( "click", ".lnnblog-hidebox-heading", function ( event ) { event.preventDefault() /** 折叠框的 <summary> 元素。 */ var $this = $( this ) /** 折叠框的 <details> 元素。 */ var $parent = $this.parent() /** 折叠框内容元素。 */ var $body = $this.nextAll( ".lnnblog-hidebox-body" ) var open = $parent.prop( "open" ) /** 当前正在执行的动画动作(expand 或 shrink)。若不在执行动画则为空。 */ var oldState = $parent.attr( "data-lnnblog-hidebox-state" ) /** 现在要执行的动画动作。 */ var state = !open || oldState === "shrink" ? "expand" : "shrink" // 计算当前的宽高 // 取得的宽度是四舍五入过的;增加 0.5 以避免内容折行 var currentWidth = $parent.width() + 0.5 var currentHeight = $parent.height() // 打断可能正在进行的动画,然后计算一下动画目标状态的宽高 $parent.stop( true, true ).prop( "open", state === "expand" ) var targetWidth = $parent.width() + 0.5 var targetHeight = $parent.height() // 锁定内容框宽度为完全展开状态的宽度,以避免内容折行 if (state === "expand") $body.outerWidth( targetWidth ) else if (oldState !== "expand") // 从完全展开状态折叠 $body.outerWidth( currentWidth ) // 如果不是从完全展开状态折叠,即在展开的半途中折叠, // 则内容框的宽度还没有清除,无需再次设置。 $parent .attr( "data-lnnblog-hidebox-state", state ) .width( currentWidth ) .height( currentHeight ) // 必须在 open 状态下才能显示出内容框,所以不管展开还是折叠都需要设置成 open .prop( "open", true ) .animate( { width: targetWidth, height: targetHeight }, { duration: 250, done: function () { if (state === "shrink") $parent.prop( "open", false ) // 清除手动设置的宽高 $body.css( "width", "" ) $parent .css( { width: "", height: "" } ) .removeAttr( "data-lnnblog-hidebox-state" ) } } ) } ) } );