“MediaWiki:Common.js”的版本间的差异

来自个人维基
跳转至: 导航搜索
(重构 Template:Hidebox 动画效果代码)
第24行: 第24行:
 
} )
 
} )
  
/* Template: Hidebox */
+
/* Template:Hidebox 增加动画效果 */
 +
$( "#bodyContent" ).on( "click", ".lnnblog-hidebox-heading", function ( event ) {
 +
  event.preventDefault()
  
var animationDuration = 250
+
  /** 折叠框的 <summary> 元素。 */
 
+
$( "#bodyContent" ).on( "click", ".lnnblog-hidebox-heading", function ( event ) {
+
 
   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 state = $parent.attr( "data-lnnblog-hidebox-state" )
+
  /** 当前正在执行的动画动作(expand 或 shrink)。若不在执行动画则为空。 */
 
+
   var oldState = $parent.attr( "data-lnnblog-hidebox-state" )
   if ( !open || state === "shrink" ) {
+
  /** 现在要执行的动画动作。 */
    event.preventDefault()
+
   var state = !open || oldState === "shrink" ? "expand" : "shrink"
    var currentWidth = $parent.width()
+
    var currentHeight = $parent.height()
+
    $parent.stop( true, true ).prop( "open", true )
+
    var targetWidth = $parent.width()
+
    var targetHeight = $parent.height()
+
  
    $body.outerWidth( targetWidth + 1 )
+
  // 计算当前的宽高
    $parent
+
  // 取得的宽度是四舍五入过的;增加 0.5 以避免内容折行
      .attr( "data-lnnblog-hidebox-state", "expand" )
+
  var currentWidth = $parent.width() + 0.5
      .width( currentWidth )
+
  var currentHeight = $parent.height()
      .height( currentHeight )
+
  // 打断可能正在进行的动画,然后计算一下动画目标状态的宽高
 +
  $parent.stop( true, true ).prop( "open", state === "expand" )
 +
  var targetWidth = $parent.width() + 0.5
 +
  var targetHeight = $parent.height()
  
    $parent.animate( {
+
  // 锁定内容框宽度为完全展开状态的宽度,以避免内容折行
        width: targetWidth,
+
   if (state === "expand")
        height: targetHeight
+
     $body.outerWidth( targetWidth )
      }, {
+
  else if (oldState !== "expand") // 从完全展开状态折叠
        duration: animationDuration,
+
     $body.outerWidth( currentWidth )
        done: function () {
+
  // 如果不是从完全展开状态折叠,即在展开的半途中折叠,
          $body.css( "width", "" )
+
  // 则内容框的宽度还没有清除,无需再次设置。
          $parent
+
            .css( {
+
              width: "",
+
              height: ""
+
            } )
+
            .removeAttr( "data-lnnblog-hidebox-state" )
+
        }
+
      } )
+
   } else if ( open || state === "expand" ) {
+
     event.preventDefault()
+
    var currentWidth = $parent.width()
+
    var currentHeight = $parent.height()
+
    $parent.stop( true, true ).prop( "open", false )
+
     var targetWidth = $parent.width()
+
    var targetHeight = $parent.height()
+
  
    state === "expand" || $body.outerWidth( currentWidth + 1 )
+
  $parent
     $parent
+
     .attr( "data-lnnblog-hidebox-state", state )
      .attr( "data-lnnblog-hidebox-state", "shrink" )
+
    .width( currentWidth )
      .width( currentWidth )
+
    .height( currentHeight )
      .height( currentHeight )
+
    // 必须在 open 状态下才能显示出内容框,所以不管展开还是折叠都需要设置成 open
      .prop( "open", true )
+
    .prop( "open", true )
      .animate( {
+
    .animate( {
        width: targetWidth,
+
      width: targetWidth,
        height: targetHeight
+
      height: targetHeight
      }, {
+
    }, {
        duration: animationDuration,
+
      duration: 250,
        done: function () {
+
      done: function () {
          $body.css( "width", "" )
+
        if (state === "shrink") $parent.prop( "open", false )
          $parent
+
        // 清除手动设置的宽高
            .css( {
+
        $body.css( "width", "" )
              width: "",
+
        $parent
              height: ""
+
          .css( { width: "", height: "" } )
            } )
+
          .removeAttr( "data-lnnblog-hidebox-state" )
            .removeAttr( "data-lnnblog-hidebox-state" )
+
      }
            .prop( "open", false )
+
    } )
        }
+
      } )
+
  }
+
 
} )
 
} )
  
 
} );
 
} );

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" )
      }
    } )
} )
 
} );