Scroll mode for touchpad/mouse without/missing scroll/middle button

Enable scroll mode for touchpad/mouse without/missing scroll/middle button when Ctrl + Space or Ctrl + Shift and touchpad/left touchpad button/left mouse button are pressed. Text selection is enabled for Ctrl + Shift.

目前为 2024-07-26 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Scroll mode for touchpad/mouse without/missing scroll/middle button
  3. // @author NWP
  4. // @description Enable scroll mode for touchpad/mouse without/missing scroll/middle button when Ctrl + Space or Ctrl + Shift and touchpad/left touchpad button/left mouse button are pressed. Text selection is enabled for Ctrl + Shift.
  5. // @namespace https://greasyfork.org/users/877912
  6. // @version 0.1
  7. // @license MIT
  8. // @match *://*/*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Sensitivity factor determines the scroll speed relative to mouse movement.
  16. // A higher value results in faster scrolling, while a lower value makes the scrolling slower.
  17. // Example:
  18. // - If sensitivity = 1.0, moving the mouse 100 pixels will scroll 100 pixels.
  19. // - If sensitivity = 0.5, moving the mouse 100 pixels will scroll 50 pixels.
  20. const sensitivity = 0.5;
  21.  
  22.  
  23. let scrollModeEnabled = false;
  24. let selectModeEnabled = false;
  25. let initialMouseY = 0;
  26. let scrollSpeed = 0;
  27. let scrollInterval = null;
  28.  
  29. document.addEventListener('keydown', function(event) {
  30. if (event.ctrlKey && event.code === 'Space' && !scrollModeEnabled) {
  31. scrollModeEnabled = true;
  32. document.body.style.cursor = 'ns-resize'; // Indicate scroll mode is active
  33. disableTextSelection();
  34. }
  35. if (event.ctrlKey && event.shiftKey && !selectModeEnabled) {
  36. selectModeEnabled = true;
  37. document.body.style.cursor = 'ns-resize'; // Indicate select mode is active
  38. enableTextSelection();
  39. }
  40. });
  41.  
  42. document.addEventListener('keyup', function(event) {
  43. // Check specific keyup events to exit scroll mode
  44. if (event.code === 'Space' || event.code === 'ControlLeft' || event.code === 'ControlRight') {
  45. exitScrollMode();
  46. }
  47. // Check specific keyup events to exit select mode
  48. if (event.code === 'ShiftLeft' || event.code === 'ShiftRight' || event.code === 'ControlLeft' || event.code === 'ControlRight') {
  49. exitSelectMode();
  50. }
  51. });
  52.  
  53. document.addEventListener('mousedown', function(event) {
  54. if (scrollModeEnabled && event.button === 0) {
  55. initialMouseY = event.clientY; // Set initial position for scroll calculation
  56. startAutoScroll();
  57. }
  58. if (selectModeEnabled && event.button === 0) {
  59. initialMouseY = event.clientY; // Set initial position for scroll calculation
  60. startAutoScroll();
  61. }
  62. });
  63.  
  64. document.addEventListener('mouseup', function(event) {
  65. if (event.button === 0) {
  66. exitScrollMode();
  67. exitSelectMode();
  68. }
  69. });
  70.  
  71. document.addEventListener('mousemove', function(event) {
  72. if ((scrollModeEnabled || selectModeEnabled) && scrollInterval) {
  73. let currentMouseY = event.clientY;
  74. scrollSpeed = (currentMouseY - initialMouseY) * sensitivity;
  75. }
  76. });
  77.  
  78. function startAutoScroll() {
  79. if (!scrollInterval) {
  80. scrollInterval = setInterval(function() {
  81. window.scrollBy(0, scrollSpeed); // Scroll based on current calculated speed
  82. }, 50);
  83. }
  84. }
  85.  
  86. function stopAutoScroll() {
  87. if (scrollInterval) {
  88. clearInterval(scrollInterval);
  89. scrollInterval = null;
  90. }
  91. }
  92.  
  93. function exitScrollMode() {
  94. if (scrollModeEnabled) {
  95. scrollModeEnabled = false;
  96. scrollSpeed = 0;
  97. document.body.style.cursor = 'default';
  98. enableTextSelection(); // Ensure text selection is enabled again
  99. stopAutoScroll();
  100. }
  101. }
  102.  
  103. function exitSelectMode() {
  104. if (selectModeEnabled) {
  105. selectModeEnabled = false;
  106. scrollSpeed = 0;
  107. document.body.style.cursor = 'default';
  108. stopAutoScroll();
  109. }
  110. }
  111.  
  112. function disableTextSelection() {
  113. document.body.style.userSelect = 'none';
  114. document.body.style.webkitUserSelect = 'none';
  115. document.body.style.msUserSelect = 'none';
  116. document.body.style.mozUserSelect = 'none';
  117. }
  118.  
  119. function enableTextSelection() {
  120. document.body.style.userSelect = '';
  121. document.body.style.webkitUserSelect = '';
  122. document.body.style.msUserSelect = '';
  123. document.body.style.mozUserSelect = '';
  124. }
  125. })();