MediaWiki:Gadget-ScrollUpButton.js:修订间差异
删除的内容 添加的内容
创建页面,内容为“→* * SPDX-License-Identifier: GPL-3.0-or-later * _addText: '{{Gadget Header|license=GPL-3.0-or-later}}' * * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ScrollUpButton} * @author 安忆 <i@anyi.in> * @license GPL-3.0-or-later {@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}: /** * Copyright (C) 安忆 * * This program is free software: you can redistribute it and/or modify * it under the terms of t…” |
小无编辑摘要 标签:已被回退 |
||
第1行: | 第1行: | ||
/** |
/** |
||
* Copyright (c) 2021-present, 安忆. |
|||
* SPDX-License-Identifier: GPL-3.0-or-later |
|||
* _addText: '{{Gadget Header|license=GPL-3.0-or-later}}' |
|||
* |
* |
||
* @author 安忆 [[zh:U:安忆]] |
|||
* @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ScrollUpButton} |
|||
* @ |
* @file scrollUpButton.js |
||
* @license GPL |
* @license GPL v3 |
||
*/ |
*/ |
||
$(function scrollUpButton() { |
|||
var $window = $(window); |
|||
/** |
|||
var scrollButtonIcon = '//zybkcn.com/images/f/f0/Scroll-button.svg'; |
|||
* Copyright (C) 安忆 |
|||
if (!document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1')) { |
|||
* |
|||
scrollButtonIcon = '//zybkcn.com/images/thumb/f/f0/Scroll-button.svg/32px-Scroll-button.svg.png'; |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
*/ |
|||
/** |
|||
* +------------------------------------------------------------+ |
|||
* | === WARNING: GLOBAL GADGET FILE === | |
|||
* +------------------------------------------------------------+ |
|||
* | All changes should be made in the repository, | |
|||
* | otherwise they will be lost. | |
|||
* +------------------------------------------------------------+ |
|||
* | Changes to this page may affect many users. | |
|||
* | Please discuss changes by opening an issue before editing. | |
|||
* +------------------------------------------------------------+ |
|||
*/ |
|||
/* <nowiki> */ |
|||
(() => { |
|||
"use strict"; |
|||
// dist/ScrollUpButton/ScrollUpButton.js |
|||
function _createForOfIteratorHelper(r, e) { |
|||
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; |
|||
if (!t) { |
|||
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { |
|||
t && (r = t); |
|||
var n = 0, F = function() { |
|||
}; |
|||
return { s: F, n: function() { |
|||
return n >= r.length ? { done: true } : { done: false, value: r[n++] }; |
|||
}, e: function(r2) { |
|||
throw r2; |
|||
}, f: F }; |
|||
} |
|||
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); |
|||
} |
} |
||
var changeOpacity = function changeOpacity(event) { |
|||
var o, a = true, u = false; |
|||
event.currentTarget.style.opacity = event.type === 'mouseenter' ? '1' : '0.7'; |
|||
return { s: function() { |
|||
t = t.call(r); |
|||
}, n: function() { |
|||
var r2 = t.next(); |
|||
return a = r2.done, r2; |
|||
}, e: function(r2) { |
|||
u = true, o = r2; |
|||
}, f: function() { |
|||
try { |
|||
a || null == t.return || t.return(); |
|||
} finally { |
|||
if (u) throw o; |
|||
} |
|||
} }; |
|||
} |
|||
function _unsupportedIterableToArray(r, a) { |
|||
if (r) { |
|||
if ("string" == typeof r) return _arrayLikeToArray(r, a); |
|||
var t = {}.toString.call(r).slice(8, -1); |
|||
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; |
|||
} |
|||
} |
|||
function _arrayLikeToArray(r, a) { |
|||
(null == a || a > r.length) && (a = r.length); |
|||
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; |
|||
return n; |
|||
} |
|||
var __create = Object.create; |
|||
var __defProp = Object.defineProperty; |
|||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor; |
|||
var __getOwnPropNames = Object.getOwnPropertyNames; |
|||
var __getProtoOf = Object.getPrototypeOf; |
|||
var __hasOwnProp = Object.prototype.hasOwnProperty; |
|||
var __copyProps = (to, from, except, desc) => { |
|||
if (from && typeof from === "object" || typeof from === "function") { |
|||
var _iterator = _createForOfIteratorHelper(__getOwnPropNames(from)), _step; |
|||
try { |
|||
for (_iterator.s(); !(_step = _iterator.n()).done; ) { |
|||
let key = _step.value; |
|||
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { |
|||
get: () => from[key], |
|||
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable |
|||
}); |
|||
} |
|||
} catch (err) { |
|||
_iterator.e(err); |
|||
} finally { |
|||
_iterator.f(); |
|||
} |
|||
} |
|||
return to; |
|||
}; |
|||
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( |
|||
// If the importer is in node compatibility mode or this is not an ESM |
|||
// file that has been converted to a CommonJS file using a Babel- |
|||
// compatible transform (i.e. "__esModule" has not been set), then set |
|||
// "default" to the CommonJS "module.exports" for node compatibility. |
|||
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { |
|||
value: mod, |
|||
enumerable: true |
|||
}) : target, |
|||
mod |
|||
)); |
|||
//! src/ScrollUpButton/ScrollUpButton.ts |
|||
var import_ext_gadget6 = require("ext.gadget.Util"); |
|||
//! src/ScrollUpButton/modules/constant.ts |
|||
var CLASS_NAME = "gadget-scroll_up_button"; |
|||
var CLASS_NAME_DOWN = "".concat(CLASS_NAME, "-down"); |
|||
var CLASS_NAME_UP = "".concat(CLASS_NAME, "-up"); |
|||
//! src/ScrollUpButton/components/scrollButton.tsx |
|||
var import_ext_gadget2 = __toESM(require("ext.gadget.React"), 1); |
|||
//! src/ScrollUpButton/modules/i18n.ts |
|||
var import_ext_gadget = require("ext.gadget.i18n"); |
|||
var getI18nMessages = () => { |
|||
return { |
|||
ToBottom: (0, import_ext_gadget.localize)({ |
|||
en: "Scroll to the bottom", |
|||
"zh-hans": "滚动至页底", |
|||
"zh-hant": "滾動至頁底" |
|||
}), |
|||
ToTop: (0, import_ext_gadget.localize)({ |
|||
en: "Go back to the top", |
|||
"zh-hans": "滚动至页顶", |
|||
"zh-hant": "滾動至頁頂" |
|||
}) |
|||
}; |
}; |
||
var scrollTop = function scrollTop(height) { |
|||
}; |
|||
$('html, body').animate({ |
|||
var i18nMessages = getI18nMessages(); |
|||
scrollTop: height |
|||
var getMessage = (key) => { |
|||
}, 660); |
|||
return i18nMessages[key] || key; |
|||
}; |
}; |
||
var $scrollButton = $('<img>').addClass('noprint').attr({ |
|||
//! src/ScrollUpButton/components/scrollButton.tsx |
|||
draggable: 'false', |
|||
var import_ext_gadget3 = require("ext.gadget.Util"); |
|||
src: scrollButtonIcon |
|||
function ScrollButton(props) { |
|||
}).css({ |
|||
display: 'none', |
|||
position: 'fixed', |
|||
right: '18px', |
|||
cursor: 'pointer', |
|||
opacity: '0.7', |
|||
'-moz-user-select': 'none', |
|||
onMouseLeave |
|||
'-webkit-user-select': 'none', |
|||
} = props; |
|||
'user-select': 'none' |
|||
return /* @__PURE__ */ import_ext_gadget2.default.createElement("img", { |
|||
className: [CLASS_NAME, additionalClassName, "noprint"], |
|||
src: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='1'%3E%3C/svg%3E", |
|||
width: "32", |
|||
height: "32", |
|||
draggable: false, |
|||
alt, |
|||
"aria-label": ariaLabel, |
|||
onClick, |
|||
onMouseEnter, |
|||
onMouseLeave |
|||
}); |
}); |
||
var $scrollDownButton = $scrollButton.clone().attr('id', 'scrollDownButton-zhwiki').css('transform', 'rotate(180deg)').on('click', function () { |
|||
} |
|||
scrollTop(($(document).height() || 0) - ($window.height() || 0)); |
|||
var TO_BOTTOM = getMessage("ToBottom"); |
|||
}); |
|||
var TO_TOP = getMessage("ToTop"); |
|||
var $scrollUpButton = $scrollButton.clone().attr('id', 'scrollUpButton-zhwiki').on('click', function () { |
|||
var ScrollDownButton = (onMouseEnterMouseLeave) => /* @__PURE__ */ import_ext_gadget2.default.createElement(ScrollButton, { |
|||
scrollTop(0); |
|||
additionalClassName: CLASS_NAME_DOWN, |
|||
}); |
|||
alt: TO_BOTTOM, |
|||
var $elements = [$scrollDownButton, $scrollUpButton]; |
|||
ariaLabel: TO_BOTTOM, |
|||
$elements.forEach(function ($element) { |
|||
onClick: () => { |
|||
$element.on('mouseenter mouseleave', changeOpacity).appendTo(document.body); |
|||
var _$$height, _$$height2; |
|||
}); |
|||
(0, import_ext_gadget3.scrollTop)(((_$$height = $(document).height()) !== null && _$$height !== void 0 ? _$$height : 0) - ((_$$height2 = $(window).height()) !== null && _$$height2 !== void 0 ? _$$height2 : 0)); |
|||
var fadeIn = function fadeIn() { |
|||
}, |
|||
$elements.forEach(function ($element) { |
|||
onMouseEnter: onMouseEnterMouseLeave, |
|||
$element.fadeIn('slow'); |
|||
onMouseLeave: onMouseEnterMouseLeave |
|||
}); |
}); |
||
var ScrollUpButton = (onMouseEnterMouseLeave) => /* @__PURE__ */ import_ext_gadget2.default.createElement(ScrollButton, { |
|||
additionalClassName: CLASS_NAME_UP, |
|||
alt: TO_TOP, |
|||
ariaLabel: TO_TOP, |
|||
onClick: () => { |
|||
(0, import_ext_gadget3.scrollTop)(0); |
|||
}, |
|||
onMouseEnter: onMouseEnterMouseLeave, |
|||
onMouseLeave: onMouseEnterMouseLeave |
|||
}); |
|||
//! src/ScrollUpButton/modules/insertElementAndListener.ts |
|||
var import_ext_gadget4 = require("ext.gadget.Util"); |
|||
var import_ext_gadget5 = require("ext.gadget.Tippy"); |
|||
var insertElementandListener = ($body) => { |
|||
const onMouseEnterMouseLeave = (event) => { |
|||
(0, import_ext_gadget4.changeOpacityWhenMouseEnterOrLeave)(event); |
|||
}; |
}; |
||
var fadeOut = function fadeOut() { |
|||
const scrollDownButton = ScrollDownButton(onMouseEnterMouseLeave); |
|||
$elements.forEach(function ($element) { |
|||
const scrollUpButton2 = ScrollUpButton(onMouseEnterMouseLeave); |
|||
$element.fadeOut('slow'); |
|||
for (var _i = 0, _arr = [scrollDownButton, scrollUpButton2]; _i < _arr.length; _i++) { |
|||
const element = _arr[_i]; |
|||
$body.append(element); |
|||
(0, import_ext_gadget5.tippy)(element, { |
|||
arrow: true, |
|||
content: element.getAttribute("alt"), |
|||
placement: "left" |
|||
}); |
}); |
||
}; |
|||
var left = function left(px) { |
|||
$elements.forEach(function ($element) { |
|||
$element.css('left', px ? px + 'px' : 'unset'); |
|||
}); |
|||
}; |
|||
var right = function right(px) { |
|||
$elements.forEach(function ($element) { |
|||
$element.css('right', px ? px + 'px' : 'unset'); |
|||
}); |
|||
}; |
|||
var mediaQueryList = window.matchMedia('(min-width: 1400px)'); |
|||
var isVector2022Match = false; |
|||
if (mw.config.get('skin') === 'vector-2022') { |
|||
var mediaQueryHandler = function mediaQueryHandler(event) { |
|||
if (event.matches) { |
|||
isVector2022Match = true; |
|||
right(8); |
|||
} else { |
|||
isVector2022Match = false; |
|||
right(18); |
|||
} |
|||
}; |
|||
// Check mediaQueryList as Safari doesn't have support for mediaQueryList.addEventListener |
|||
try { |
|||
mediaQueryList.addEventListener('change', mediaQueryHandler); |
|||
} catch (e) { |
|||
mediaQueryList.addListener(mediaQueryHandler); |
|||
} |
|||
if (mediaQueryList.matches) { |
|||
isVector2022Match = true; |
|||
right(8); |
|||
} |
|||
} |
} |
||
var scrollButtonTimer; |
|||
const scrollListener = () => { |
|||
$window.on('scroll selectionchange', function () { |
|||
let downButtonButtom; |
|||
var dingHeight = $('#bluedeck_ding>div').height() || 0; |
|||
let upButtonButtom; |
|||
var vector2022Height = isVector2022Match ? 24 : 0; |
|||
if (document.querySelector("#proveit") || document.querySelector(".gadget-cat_a_lot-container") || document.querySelector("#gadget-word_count-tip")) { |
|||
$scrollDownButton.css('bottom', dingHeight + vector2022Height + 24 + 'px'); |
|||
downButtonButtom = "85px"; |
|||
$scrollUpButton.css('bottom', dingHeight + vector2022Height + 65 + 'px'); |
|||
upButtonButtom = "127px"; |
|||
if (mw.config.get('wgGEHelpPanelEnabled') && $('#mw-ge-help-panel-cta-button').length || $('#cat_a_lot').length || $('#proveit').length || $('.wordcount').length) { |
|||
left(10); |
|||
} else { |
} else { |
||
left(); |
|||
upButtonButtom = "85px"; |
|||
} |
} |
||
var windowScrollTop = $window.scrollTop() || 0; |
|||
scrollDownButton.style.bottom = downButtonButtom; |
|||
if (windowScrollTop > 60) { |
|||
scrollUpButton2.style.bottom = upButtonButtom; |
|||
fadeIn(); |
|||
}; |
|||
} else { |
|||
const scrollListenerWithThrottle = mw.util.throttle(scrollListener, 200); |
|||
fadeOut(); |
|||
$(window).on("scroll selectionchange", scrollListenerWithThrottle); |
|||
} |
|||
}; |
|||
clearTimeout(scrollButtonTimer); |
|||
//! src/ScrollUpButton/ScrollUpButton.ts |
|||
scrollButtonTimer = setTimeout(fadeOut, 2000); |
|||
void (0, import_ext_gadget6.getBody)().then(function scrollUpButton($body) { |
|||
}); |
|||
insertElementandListener($body); |
|||
$elements.forEach(function ($element) { |
|||
$element.on('mouseenter', function () { |
|||
clearTimeout(scrollButtonTimer); |
|||
}); |
|||
}); |
|||
}); |
}); |
||
})(); |
2024年9月10日 (二) 21:21的版本
/**
* Copyright (c) 2021-present, 安忆.
*
* @author 安忆 [[zh:U:安忆]]
* @file scrollUpButton.js
* @license GPL v3
*/
$(function scrollUpButton() {
var $window = $(window);
var scrollButtonIcon = '//zybkcn.com/images/f/f0/Scroll-button.svg';
if (!document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1')) {
scrollButtonIcon = '//zybkcn.com/images/thumb/f/f0/Scroll-button.svg/32px-Scroll-button.svg.png';
}
var changeOpacity = function changeOpacity(event) {
event.currentTarget.style.opacity = event.type === 'mouseenter' ? '1' : '0.7';
};
var scrollTop = function scrollTop(height) {
$('html, body').animate({
scrollTop: height
}, 660);
};
var $scrollButton = $('<img>').addClass('noprint').attr({
draggable: 'false',
src: scrollButtonIcon
}).css({
display: 'none',
position: 'fixed',
right: '18px',
cursor: 'pointer',
opacity: '0.7',
'-moz-user-select': 'none',
'-webkit-user-select': 'none',
'user-select': 'none'
});
var $scrollDownButton = $scrollButton.clone().attr('id', 'scrollDownButton-zhwiki').css('transform', 'rotate(180deg)').on('click', function () {
scrollTop(($(document).height() || 0) - ($window.height() || 0));
});
var $scrollUpButton = $scrollButton.clone().attr('id', 'scrollUpButton-zhwiki').on('click', function () {
scrollTop(0);
});
var $elements = [$scrollDownButton, $scrollUpButton];
$elements.forEach(function ($element) {
$element.on('mouseenter mouseleave', changeOpacity).appendTo(document.body);
});
var fadeIn = function fadeIn() {
$elements.forEach(function ($element) {
$element.fadeIn('slow');
});
};
var fadeOut = function fadeOut() {
$elements.forEach(function ($element) {
$element.fadeOut('slow');
});
};
var left = function left(px) {
$elements.forEach(function ($element) {
$element.css('left', px ? px + 'px' : 'unset');
});
};
var right = function right(px) {
$elements.forEach(function ($element) {
$element.css('right', px ? px + 'px' : 'unset');
});
};
var mediaQueryList = window.matchMedia('(min-width: 1400px)');
var isVector2022Match = false;
if (mw.config.get('skin') === 'vector-2022') {
var mediaQueryHandler = function mediaQueryHandler(event) {
if (event.matches) {
isVector2022Match = true;
right(8);
} else {
isVector2022Match = false;
right(18);
}
};
// Check mediaQueryList as Safari doesn't have support for mediaQueryList.addEventListener
try {
mediaQueryList.addEventListener('change', mediaQueryHandler);
} catch (e) {
mediaQueryList.addListener(mediaQueryHandler);
}
if (mediaQueryList.matches) {
isVector2022Match = true;
right(8);
}
}
var scrollButtonTimer;
$window.on('scroll selectionchange', function () {
var dingHeight = $('#bluedeck_ding>div').height() || 0;
var vector2022Height = isVector2022Match ? 24 : 0;
$scrollDownButton.css('bottom', dingHeight + vector2022Height + 24 + 'px');
$scrollUpButton.css('bottom', dingHeight + vector2022Height + 65 + 'px');
if (mw.config.get('wgGEHelpPanelEnabled') && $('#mw-ge-help-panel-cta-button').length || $('#cat_a_lot').length || $('#proveit').length || $('.wordcount').length) {
left(10);
} else {
left();
}
var windowScrollTop = $window.scrollTop() || 0;
if (windowScrollTop > 60) {
fadeIn();
} else {
fadeOut();
}
clearTimeout(scrollButtonTimer);
scrollButtonTimer = setTimeout(fadeOut, 2000);
});
$elements.forEach(function ($element) {
$element.on('mouseenter', function () {
clearTimeout(scrollButtonTimer);
});
});
});