Horizontal First Scroll | 横向优先滚动

(20200409)Page elements prefer to scroll horizontally, scroll to end and then scroll vertically, suitable for SNOREAD.userscript.js | 页面元素优先横向滚动,滚动到底再进行竖向滚动,适用于雪阅插件

  1. // ==UserScript==
  2. // @name Horizontal First Scroll | 横向优先滚动
  3. // @namespace https://userscript.snomiao.com/
  4. // @version 1.0
  5. // @description (20200409)Page elements prefer to scroll horizontally, scroll to end and then scroll vertically, suitable for SNOREAD.userscript.js | 页面元素优先横向滚动,滚动到底再进行竖向滚动,适用于雪阅插件
  6. // @author snomiao@gmail.com
  7. // @match *://*/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. // 横向滚动
  12. (function () {
  13. "use strict";
  14. var 监听滚动 = (e) => {
  15. [...e.children].map(监听滚动);
  16. if (e.flag_已监听滚动) return;
  17. e.flag_已监听滚动 = 1;
  18.  
  19. var handleScroll = (事件) => {
  20. if (事件.altKey || 事件.ctrlKey || 事件.shiftKey) return;
  21. var scrollRate = (事件.detail || -事件.wheelDelta) / 120; //Y轴
  22. var scrolled_x =
  23. e.scrollLeft !=
  24. ((e.scrollLeft += scrollRate * e.clientWidth * 0.1),
  25. e.scrollLeft);
  26. if (scrolled_x) {
  27. // 若需定位则撤销滚动
  28. var 当前Y = e.getBoundingClientRect().y;
  29. e.scrollIntoViewIfNeeded();
  30. if (e.getBoundingClientRect().y != 当前Y)
  31. e.scrollLeft -= scrollRate * e.clientWidth * 0.1;
  32. //
  33. 事件.preventDefault();
  34. 事件.stopPropagation();
  35. return false;
  36. }
  37. var scrolled_y =
  38. e.scrollTop !=
  39. ((e.scrollTop += scrollRate * e.clientHeight * 0.5),
  40. e.scrollTop);
  41. if (scrolled_y) {
  42. var 当前X = e.getBoundingClientRect().x;
  43. e.scrollIntoViewIfNeeded();
  44. if (e.getBoundingClientRect().x != 当前X)
  45. e.scrollTop -= scrollRate * e.clientHeight * 0.5;
  46. //
  47. 事件.preventDefault();
  48. 事件.stopPropagation();
  49. return false;
  50. }
  51. // 横竖都滚到底了
  52. [...e.children].map(监听滚动);
  53. };
  54. e.addEventListener("mousewheel", handleScroll, {
  55. capture: false,
  56. passive: false,
  57. }); // Chrome/Edge
  58. e.addEventListener("DOMMouseScroll", handleScroll, {
  59. capture: false,
  60. passive: false,
  61. }); // FF
  62. };
  63. var 入口 = () => 监听滚动(document.body);
  64. document.addEventListener("DOMContentLoaded", 入口);
  65. window.addEventListener("load", 入口);
  66. 入口();
  67. })();