MediaWiki:Gadget-stickyToc.js:修订间差异
跳转到导航
跳转到搜索
MJ Hamster(留言 | 贡献) 小无编辑摘要 |
MJ Hamster(留言 | 贡献) 小无编辑摘要 |
||
(未显示同一用户的1个中间版本) | |||
第4行: | 第4行: | ||
} | } | ||
var i18n = { | var i18n = { | ||
header: ' | header: '目录', | ||
top: ' | top: '返回顶部' | ||
}; | }; | ||
new ResizeObserver(function(entries) { | new ResizeObserver(function(entries) { |
2025年7月19日 (六) 10:05的最新版本
$(function(){ if (!$('#toc').length) { return; } var i18n = { header: '目录', top: '返回顶部' }; new ResizeObserver(function(entries) { if (window.innerWidth <= 720) { $('#mw-panel').css('height', ''); } else { $('#mw-panel').css('height', document.body.scrollHeight - 10); } }).observe($('#content')[0]); var tocCollapsed = false; $('<nav id="p-toc" class="vector-menu mw-portlet mw-portlet-toc vector-menu-portal portal" aria-labelledby="p-toc-label" role="navigation">').append( $('<h3 id="p-toc-label" class="vector-menu-heading" tabindex="0">').append( $('<span class="vector-menu-heading-label">').text(i18n.header) ).on("keypress", function(event) { if (event.which == 13) { $(this).trigger("click"); event.stopImmediatePropagation() } }).on("click", function(event) { var $el = $(this).parent(); event.stopPropagation(); //$el.toggleClass("collapsed"); if($el.hasClass("collapsed")){ localStorage.setItem("sidebar_vector_c_p-toc", "y"); $el.find(".vector-menu-content").slideUp("fast"); $el.css({'margin-right': '', 'margin-left': ''}); } else{ localStorage.setItem("sidebar_vector_c_p-toc", "n"); $el.find(".vector-menu-content").slideDown("fast"); var $toc = $el.find(".vector-menu-content-list")[0]; if ($toc.clientWidth < $toc.scrollWidth) { $el.css({'margin-right': '0', 'margin-left': '0'}); } if (window.innerWidth >= 982 && $toc.clientWidth < $toc.scrollWidth) { $el.css({'margin-right': '-0.5em', 'margin-left': '-0.5em'}); } } }), $('<div class="vector-menu-content">').append( $('<ul class="vector-menu-content-list">').append( $('<li class="toclevel-1 tocsection-0">').append($('<a href="#">').append( $('<span class="toctext">').text(i18n.top) )), $('#toc > ul').children().clone() ) ).addClass($('#toc').parent().prop('class').split(/\s+/).filter(function(classname) { return classname.startsWith('toc-'); }).join(' ')).css('display', tocCollapsed ? 'none' : '') ).addClass(tocCollapsed ? 'collapsed' : '').appendTo('#mw-panel'); mw.loader.using( ['ext.gadget.sectionObserver'], function(require) { var initSectionObserver = require('ext.gadget.sectionObserver'); var allSections = document.querySelectorAll('#firstHeading, .mw-headline'); var sectionObserver = initSectionObserver({topMargin: 20, onIntersection: onIntersection}) sectionObserver.setElements(allSections); sectionObserver.calcIntersection(); allSections = Array.from(allSections); var tocList = $('#p-toc .vector-menu-content-list')[0]; var tocSections = $('#p-toc .vector-menu-content-list li'); var baseOffset = $('#p-toc .tocsection-0 .toctext')[0].offsetTop; function onIntersection(section) { var index = allSections.indexOf(section); $('#p-toc .tocsection-current').removeClass('tocsection-current'); var tocSection = tocSections.eq(index).addClass('tocsection-current'); if ( tocSection.is(':hidden') && index > 0 ) return onIntersection(allSections[index - 1]); var tocSectionPos = tocSection[0].offsetTop - baseOffset; if ( tocSectionPos < tocList.scrollTop + (tocList.clientHeight * 0.15) ) { tocList.scrollTo({top: tocSectionPos - (tocList.clientHeight * 0.3)}); } else if ( tocSectionPos > tocList.scrollTop + (tocList.clientHeight * 0.85) ) { tocList.scrollTo({top: tocSectionPos - (tocList.clientHeight * 0.7)}); } } } ); }); // [[Category:Scripts]]