MediaWiki:Common.js

来自神国反恶俗
七叶​(留言 | 贡献)2026年10月11日 (日) 14:38的版本
跳到导航跳到搜索

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
( function () {

    /* ==========================================================
       一、把页面里的目录(TOC)搬到左侧栏
       ========================================================== */
    function moveTOC() {
        var toc = document.getElementById( 'toc' )
            || document.querySelector( '.mw-table-of-contents-container' )
            || document.querySelector( '.mw-table-of-contents' );
        var sidebar = document.getElementById( 'column-one' )
            || document.getElementById( 'mw-panel' );

        if ( !toc || !sidebar || document.getElementById( 'p-toc' ) ) {
            return;
        }

        var box = document.createElement( 'div' );
        box.className = 'portlet';
        box.id = 'p-toc';

        var title = document.createElement( 'h3' );
        title.textContent = '目录';

        var inner = document.createElement( 'div' );
        inner.className = 'pBody';
        inner.appendChild( toc );

        box.appendChild( title );
        box.appendChild( inner );
        sidebar.appendChild( box );
    }

    /* ==========================================================
       二、吸顶样式
       顶部一条通栏(左:编辑标签 / 右:账号)
       左侧栏吸顶并带上下滑动条
       ========================================================== */
    var STICKY_CSS = [
        '.sg-sticky-bar{',
        '  position:fixed;left:0;right:0;top:0;z-index:401;',
        '  display:flex;align-items:center;justify-content:space-between;',
        '  background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.18);',
        '  padding:3px 12px;font-size:87%;line-height:1.3;',
        '  white-space:nowrap;overflow:hidden;',
        '}',
        '.sg-bar-left{flex:0 1 auto;overflow:hidden;}',
        '.sg-bar-right{flex:0 0 auto;margin-left:auto;}',
        '.sg-sticky-bar a{',
        '  color:#36c;text-decoration:none;padding:2px 7px;',
        '  display:inline-block;',
        '}',
        '.sg-sticky-bar a:hover{text-decoration:underline;}',
        /* 左侧栏:吸顶 + 上下滑动条 */
        '#column-one{',
        '  position:sticky;top:var(--sg-top-offset,0px);',
        '  align-self:flex-start;',
        '  max-height:calc(100vh - var(--sg-top-offset,0px) - 8px);',
        '  overflow-y:auto;',
        '  overflow-x:hidden;',
        '}',
        'body.sg-sticky-on #content{',
        '  padding-top:var(--sg-top-offset,0px) !important;',
        '}'
    ].join( '\n' );

    function injectCSS() {
        if ( document.getElementById( 'sg-sticky-style' ) ) { return; }
        var s = document.createElement( 'style' );
        s.id = 'sg-sticky-style';
        s.type = 'text/css';
        s.textContent = STICKY_CSS;
        document.head.appendChild( s );
    }

    function makeSticky() {
        injectCSS();

        var personal = document.getElementById( 'p-personal' );  /* 账号那排 */
        var cactions = document.getElementById( 'p-cactions' );  /* 编辑标签那排 */

        /* 先把上一条固定栏清掉 */
        var old = document.getElementById( 'sg-topbar' );
        if ( old && old.parentNode ) { old.parentNode.removeChild( old ); }

        /* 收集链接:编辑标签在左,账号在右 */
        function pick( portlet ) {
            var out = [];
            if ( !portlet ) { return out; }
            Array.prototype.forEach.call(
                portlet.querySelectorAll( 'ul a' ),
                function ( a ) {
                    out.push( { href: a.href, text: a.textContent } );
                }
            );
            return out;
        }

        var leftLinks = pick( cactions );
        var rightLinks = pick( personal );

        /* 两边都空 → 不做固定栏,也不留白 */
        if ( !leftLinks.length && !rightLinks.length ) {
            document.body.classList.remove( 'sg-sticky-on' );
            document.documentElement.style.setProperty( '--sg-top-offset', '0px' );
            return