Firefox Hide Scrollbars

Hide Scrollbars in Firefox

目前为 2018-06-02 提交的版本。查看 最新版本

// ==UserScript==
// @name         Firefox Hide Scrollbars
// @namespace    http://tampermonkey.net/
// @version      1.0.2
// @description  Hide Scrollbars in Firefox
// @author       qashto
// @match        *://*/*
// @grant        none
// @require      https://code.jquery.com/jquery-3.3.1.min.js
// ==/UserScript==

/*!
 * jQuery Mousewheel 3.1.13
 * https://github.com/jquery/jquery-mousewheel/edit/master/jquery.mousewheel.min.js
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 */
! function(a) {
  'function' == typeof define && define.amd ? define(['jquery'], a) : 'object' == typeof exports ? module.exports = a : a(jQuery)
}(function(a) {
  function b(b) {
    var g = b || window.event,
      h = i.call(arguments, 1),
      j = 0,
      l = 0,
      m = 0,
      n = 0,
      o = 0,
      p = 0;
    if (b = a.event.fix(g), b.type = 'mousewheel', 'detail' in g && (m = -1 * g.detail), 'wheelDelta' in g && (m = g.wheelDelta), 'wheelDeltaY' in g && (m = g.wheelDeltaY), 'wheelDeltaX' in g && (l = -1 * g.wheelDeltaX), 'axis' in g && g.axis === g.HORIZONTAL_AXIS && (l = -1 * m, m = 0), j = 0 === m ? l : m, 'deltaY' in g && (m = -1 * g.deltaY, j = m), 'deltaX' in g && (l = g.deltaX, 0 === m && (j = -1 * l)), 0 !== m || 0 !== l) {
      if (1 === g.deltaMode) {
        var q = a.data(this, 'mousewheel-line-height');
        j *= q, m *= q, l *= q
      } else if (2 === g.deltaMode) {
        var r = a.data(this, 'mousewheel-page-height');
        j *= r, m *= r, l *= r
      }
      if (n = Math.max(Math.abs(m), Math.abs(l)), (!f || f > n) && (f = n, d(g, n) && (f /= 40)), d(g, n) && (j /= 40, l /= 40, m /= 40), j = Math[j >= 1 ? 'floor' : 'ceil'](j / f), l = Math[l >= 1 ? 'floor' : 'ceil'](l / f), m = Math[m >= 1 ? 'floor' : 'ceil'](m / f), k.settings.normalizeOffset && this.getBoundingClientRect) {
        var s = this.getBoundingClientRect();
        o = b.clientX - s.left, p = b.clientY - s.top
      }
      return b.deltaX = l, b.deltaY = m, b.deltaFactor = f, b.offsetX = o, b.offsetY = p, b.deltaMode = 0, h.unshift(b, j, l, m), e && clearTimeout(e), e = setTimeout(c, 200), (a.event.dispatch || a.event.handle).apply(this, h)
    }
  }

  function c() {
    f = null
  }

  function d(a, b) {
    return k.settings.adjustOldDeltas && 'mousewheel' === a.type && b % 120 === 0
  }
  var e, f, g = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
    h = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
    i = Array.prototype.slice;
  if (a.event.fixHooks)
    for (var j = g.length; j;) a.event.fixHooks[g[--j]] = a.event.mouseHooks;
  var k = a.event.special.mousewheel = {
    version: '3.1.12',
    setup: function() {
      if (this.addEventListener)
        for (var c = h.length; c;) this.addEventListener(h[--c], b, !1);
      else this.onmousewheel = b;
      a.data(this, 'mousewheel-line-height', k.getLineHeight(this)), a.data(this, 'mousewheel-page-height', k.getPageHeight(this))
    },
    teardown: function() {
      if (this.removeEventListener)
        for (var c = h.length; c;) this.removeEventListener(h[--c], b, !1);
      else this.onmousewheel = null;
      a.removeData(this, 'mousewheel-line-height'), a.removeData(this, 'mousewheel-page-height')
    },
    getLineHeight: function(b) {
      var c = a(b),
        d = c['offsetParent' in a.fn ? 'offsetParent' : 'parent']();
      return d.length || (d = a('body')), parseInt(d.css('fontSize'), 10) || parseInt(c.css('fontSize'), 10) || 16
    },
    getPageHeight: function(b) {
      return a(b).height()
    },
    settings: {
      adjustOldDeltas: !0,
      normalizeOffset: !0
    }
  };
  a.fn.extend({
    mousewheel: function(a) {
      return a ? this.bind('mousewheel', a) : this.trigger('mousewheel')
    },
    unmousewheel: function(a) {
      return this.unbind('mousewheel', a)
    }
  })
});

$(function() {
  if (window.hasRun) {
    return;
  }
  window.hasRun = true;

  const er = console.error;
  const log = console.log;
  log('hide-scrollbars');

  $('head').append(`
<style>
@-moz-document url-prefix() {
  html,body{
    overflow: hidden !important;
  }
}
</style>
`);

  // https://stackoverflow.com/a/29956714/3792062
  $.fn.isHScrollable = function() {
    return this[0].scrollWidth > this[0].clientWidth;
  };

  $.fn.isVScrollable = function() {
    return this[0].scrollHeight > this[0].clientHeight;
  };

  $.fn.isScrollable = function() {
    return this[0].scrollWidth > this[0].clientWidth || this[0].scrollHeight > this[0].clientHeight;
  };

  let scrollPageX = true;
  let scrollPageY = true;

  $('html, body').mousewheel(function(event) {
    if (scrollPageX && scrollPageY) {
      event.preventDefault();
    }
    if (scrollPageX && scrollPageY && Math.abs(event.deltaX) > Math.abs(event.deltaY)) {
      this.scrollLeft += event.deltaX * event.deltaFactor;
    }
    if (scrollPageY && Math.abs(event.deltaX) < Math.abs(event.deltaY)) {
      this.scrollTop -= event.deltaY * event.deltaFactor;
    }
    log(
      event.deltaX,
      event.deltaY,
      event.deltaFactor,
      event.originalEvent.deltaMode,
      event.originalEvent.wheelDelta
    );
  });

  $('textarea, pre').mouseover(function() {
    log($(this).css('overflow-x'));
    if ($(this).isHScrollable()) {
      scrollPageX = false;
      log('false X');
    }
    if ($(this).isVScrollable()) {
      scrollPageY = false;
      log('false Y');
    }
  }).mouseout(function() {
    scrollPageX = scrollPageY = true;
    log('true');
  });
});