Blame view

天文台pc/tianwentai-ui/node_modules/react-remove-scroll-bar/dist/es2015/component.js 3.32 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  import * as React from 'react';
  import { styleSingleton } from 'react-style-singleton';
  import { fullWidthClassName, zeroRightClassName, noScrollbarsClassName, removedBarSizeVariable } from './constants';
  import { getGapWidth } from './utils';
  var Style = styleSingleton();
  export var lockAttribute = 'data-scroll-locked';
  // important tip - once we measure scrollBar width and remove them
  // we could not repeat this operation
  // thus we are using style-singleton - only the first "yet correct" style will be applied.
  var getStyles = function (_a, allowRelative, gapMode, important) {
      var left = _a.left, top = _a.top, right = _a.right, gap = _a.gap;
      if (gapMode === void 0) { gapMode = 'margin'; }
      return "\n  .".concat(noScrollbarsClassName, " {\n   overflow: hidden ").concat(important, ";\n   padding-right: ").concat(gap, "px ").concat(important, ";\n  }\n  body[").concat(lockAttribute, "] {\n    overflow: hidden ").concat(important, ";\n    overscroll-behavior: contain;\n    ").concat([
          allowRelative && "position: relative ".concat(important, ";"),
          gapMode === 'margin' &&
              "\n    padding-left: ".concat(left, "px;\n    padding-top: ").concat(top, "px;\n    padding-right: ").concat(right, "px;\n    margin-left:0;\n    margin-top:0;\n    margin-right: ").concat(gap, "px ").concat(important, ";\n    "),
          gapMode === 'padding' && "padding-right: ".concat(gap, "px ").concat(important, ";"),
      ]
          .filter(Boolean)
          .join(''), "\n  }\n  \n  .").concat(zeroRightClassName, " {\n    right: ").concat(gap, "px ").concat(important, ";\n  }\n  \n  .").concat(fullWidthClassName, " {\n    margin-right: ").concat(gap, "px ").concat(important, ";\n  }\n  \n  .").concat(zeroRightClassName, " .").concat(zeroRightClassName, " {\n    right: 0 ").concat(important, ";\n  }\n  \n  .").concat(fullWidthClassName, " .").concat(fullWidthClassName, " {\n    margin-right: 0 ").concat(important, ";\n  }\n  \n  body[").concat(lockAttribute, "] {\n    ").concat(removedBarSizeVariable, ": ").concat(gap, "px;\n  }\n");
  };
  var getCurrentUseCounter = function () {
      var counter = parseInt(document.body.getAttribute(lockAttribute) || '0', 10);
      return isFinite(counter) ? counter : 0;
  };
  export var useLockAttribute = function () {
      React.useEffect(function () {
          document.body.setAttribute(lockAttribute, (getCurrentUseCounter() + 1).toString());
          return function () {
              var newCounter = getCurrentUseCounter() - 1;
              if (newCounter <= 0) {
                  document.body.removeAttribute(lockAttribute);
              }
              else {
                  document.body.setAttribute(lockAttribute, newCounter.toString());
              }
          };
      }, []);
  };
  /**
   * Removes page scrollbar and blocks page scroll when mounted
   */
  export var RemoveScrollBar = function (_a) {
      var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? 'margin' : _b;
      useLockAttribute();
      /*
       gap will be measured on every component mount
       however it will be used only by the "first" invocation
       due to singleton nature of <Style
       */
      var gap = React.useMemo(function () { return getGapWidth(gapMode); }, [gapMode]);
      return React.createElement(Style, { styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') });
  };