Greasy Fork 还支持 简体中文。

Back to top

scroll to top

目前為 2023-12-16 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Back to top
  3. // @namespace cyyyu
  4. // @version 0.7
  5. // @description scroll to top
  6. // @author Chuang Yu
  7. // @match https://*/*
  8. // @grant none
  9. // @run-at document-end
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. /* written in es5 */
  16.  
  17. var rootNode = document.querySelector("body")
  18. var prevLocations = new Map() // node: number
  19. var timers = new Map() // node: number
  20. var backToPrevLocationDelay = 10000 // 10s
  21.  
  22. rootNode.addEventListener("dblclick", function (evt) {
  23. var path = evt.composedPath()
  24.  
  25. if (!evt.altKey) return
  26. for (var i = 0; i < path.length; i++) {
  27. var node = path[i]
  28. if (!isScrollable(node)) continue;
  29.  
  30. evt.stopPropagation()
  31.  
  32. if (!isAtTop(node)) {
  33. clearTimeout(timers.get(node))
  34. scrollTo(node, 0)
  35. } else if (prevLocations.has(node)) {
  36. scrollTo(node, prevLocations.get(node))
  37. }
  38.  
  39. return
  40. }
  41. })
  42.  
  43. function isAtTop(node) {
  44. return node.scrollTop === 0
  45. }
  46.  
  47. function scrollTo(node, top) {
  48. var prevScrollBehavior = node.style.scrollBehavior
  49. var prevLocation = node.scrollTop
  50.  
  51. node.style.scrollBehavior = "smooth"
  52. node.scrollTop = top
  53. node.style.scrollBehavior = prevScrollBehavior
  54.  
  55. if (top === 0) {
  56. prevLocations.set(node, prevLocation)
  57. var timer = setTimeout(
  58. function () { prevLocations.delete(node) },
  59. backToPrevLocationDelay
  60. )
  61. timers.set(node, timer)
  62. }
  63. }
  64.  
  65. function isScrollable(node) {
  66. if (!(node instanceof Element)) return false
  67. var computed = window.getComputedStyle(node)
  68. return (node.tagName === "HTML" ||
  69. (computed.overflow !== "visible" &&
  70. computed.overflow !== "hidden")
  71. ) &&
  72. node.scrollHeight > node.clientHeight
  73. }
  74.  
  75. })();