ScrollBar.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _classNames3 = _interopRequireDefault(require("../_util/classNames"));
  11. var _createRef = _interopRequireDefault(require("../_util/createRef"));
  12. var _raf = _interopRequireDefault(require("../_util/raf"));
  13. var _supportsPassive = _interopRequireDefault(require("../_util/supportsPassive"));
  14. var MIN_SIZE = 20;
  15. function getPageY(e) {
  16. return 'touches' in e ? e.touches[0].pageY : e.pageY;
  17. }
  18. var _default = (0, _vue.defineComponent)({
  19. compatConfig: {
  20. MODE: 3
  21. },
  22. name: 'ScrollBar',
  23. inheritAttrs: false,
  24. props: {
  25. prefixCls: String,
  26. scrollTop: Number,
  27. scrollHeight: Number,
  28. height: Number,
  29. count: Number,
  30. onScroll: {
  31. type: Function
  32. },
  33. onStartMove: {
  34. type: Function
  35. },
  36. onStopMove: {
  37. type: Function
  38. }
  39. },
  40. setup: function setup() {
  41. return {
  42. moveRaf: null,
  43. scrollbarRef: (0, _createRef.default)(),
  44. thumbRef: (0, _createRef.default)(),
  45. visibleTimeout: null,
  46. state: (0, _vue.reactive)({
  47. dragging: false,
  48. pageY: null,
  49. startTop: null,
  50. visible: false
  51. })
  52. };
  53. },
  54. watch: {
  55. scrollTop: {
  56. handler: function handler() {
  57. this.delayHidden();
  58. },
  59. flush: 'post'
  60. }
  61. },
  62. mounted: function mounted() {
  63. var _this$scrollbarRef$cu, _this$thumbRef$curren;
  64. (_this$scrollbarRef$cu = this.scrollbarRef.current) === null || _this$scrollbarRef$cu === void 0 ? void 0 : _this$scrollbarRef$cu.addEventListener('touchstart', this.onScrollbarTouchStart, _supportsPassive.default ? {
  65. passive: false
  66. } : false);
  67. (_this$thumbRef$curren = this.thumbRef.current) === null || _this$thumbRef$curren === void 0 ? void 0 : _this$thumbRef$curren.addEventListener('touchstart', this.onMouseDown, _supportsPassive.default ? {
  68. passive: false
  69. } : false);
  70. },
  71. beforeUnmount: function beforeUnmount() {
  72. this.removeEvents();
  73. clearTimeout(this.visibleTimeout);
  74. },
  75. methods: {
  76. delayHidden: function delayHidden() {
  77. var _this = this;
  78. clearTimeout(this.visibleTimeout);
  79. this.state.visible = true;
  80. this.visibleTimeout = setTimeout(function () {
  81. _this.state.visible = false;
  82. }, 2000);
  83. },
  84. onScrollbarTouchStart: function onScrollbarTouchStart(e) {
  85. e.preventDefault();
  86. },
  87. onContainerMouseDown: function onContainerMouseDown(e) {
  88. e.stopPropagation();
  89. e.preventDefault();
  90. },
  91. // ======================= Clean =======================
  92. patchEvents: function patchEvents() {
  93. window.addEventListener('mousemove', this.onMouseMove);
  94. window.addEventListener('mouseup', this.onMouseUp);
  95. this.thumbRef.current.addEventListener('touchmove', this.onMouseMove, _supportsPassive.default ? {
  96. passive: false
  97. } : false);
  98. this.thumbRef.current.addEventListener('touchend', this.onMouseUp);
  99. },
  100. removeEvents: function removeEvents() {
  101. window.removeEventListener('mousemove', this.onMouseMove);
  102. window.removeEventListener('mouseup', this.onMouseUp);
  103. this.scrollbarRef.current.removeEventListener('touchstart', this.onScrollbarTouchStart, _supportsPassive.default ? {
  104. passive: false
  105. } : false);
  106. this.thumbRef.current.removeEventListener('touchstart', this.onMouseDown, _supportsPassive.default ? {
  107. passive: false
  108. } : false);
  109. this.thumbRef.current.removeEventListener('touchmove', this.onMouseMove, _supportsPassive.default ? {
  110. passive: false
  111. } : false);
  112. this.thumbRef.current.removeEventListener('touchend', this.onMouseUp);
  113. _raf.default.cancel(this.moveRaf);
  114. },
  115. // ======================= Thumb =======================
  116. onMouseDown: function onMouseDown(e) {
  117. var onStartMove = this.$props.onStartMove;
  118. (0, _extends2.default)(this.state, {
  119. dragging: true,
  120. pageY: getPageY(e),
  121. startTop: this.getTop()
  122. });
  123. onStartMove();
  124. this.patchEvents();
  125. e.stopPropagation();
  126. e.preventDefault();
  127. },
  128. onMouseMove: function onMouseMove(e) {
  129. var _this$state = this.state,
  130. dragging = _this$state.dragging,
  131. pageY = _this$state.pageY,
  132. startTop = _this$state.startTop;
  133. var onScroll = this.$props.onScroll;
  134. _raf.default.cancel(this.moveRaf);
  135. if (dragging) {
  136. var offsetY = getPageY(e) - pageY;
  137. var newTop = startTop + offsetY;
  138. var enableScrollRange = this.getEnableScrollRange();
  139. var enableHeightRange = this.getEnableHeightRange();
  140. var ptg = enableHeightRange ? newTop / enableHeightRange : 0;
  141. var newScrollTop = Math.ceil(ptg * enableScrollRange);
  142. this.moveRaf = (0, _raf.default)(function () {
  143. onScroll(newScrollTop);
  144. });
  145. }
  146. },
  147. onMouseUp: function onMouseUp() {
  148. var onStopMove = this.$props.onStopMove;
  149. this.state.dragging = false;
  150. onStopMove();
  151. this.removeEvents();
  152. },
  153. // ===================== Calculate =====================
  154. getSpinHeight: function getSpinHeight() {
  155. var _this$$props = this.$props,
  156. height = _this$$props.height,
  157. count = _this$$props.count;
  158. var baseHeight = height / count * 10;
  159. baseHeight = Math.max(baseHeight, MIN_SIZE);
  160. baseHeight = Math.min(baseHeight, height / 2);
  161. return Math.floor(baseHeight);
  162. },
  163. getEnableScrollRange: function getEnableScrollRange() {
  164. var _this$$props2 = this.$props,
  165. scrollHeight = _this$$props2.scrollHeight,
  166. height = _this$$props2.height;
  167. return scrollHeight - height || 0;
  168. },
  169. getEnableHeightRange: function getEnableHeightRange() {
  170. var height = this.$props.height;
  171. var spinHeight = this.getSpinHeight();
  172. return height - spinHeight || 0;
  173. },
  174. getTop: function getTop() {
  175. var scrollTop = this.$props.scrollTop;
  176. var enableScrollRange = this.getEnableScrollRange();
  177. var enableHeightRange = this.getEnableHeightRange();
  178. if (scrollTop === 0 || enableScrollRange === 0) {
  179. return 0;
  180. }
  181. var ptg = scrollTop / enableScrollRange;
  182. return ptg * enableHeightRange;
  183. },
  184. // Not show scrollbar when height is large than scrollHeight
  185. showScroll: function showScroll() {
  186. var _this$$props3 = this.$props,
  187. height = _this$$props3.height,
  188. scrollHeight = _this$$props3.scrollHeight;
  189. return scrollHeight > height;
  190. }
  191. },
  192. render: function render() {
  193. // eslint-disable-next-line no-unused-vars
  194. var _this$state2 = this.state,
  195. dragging = _this$state2.dragging,
  196. visible = _this$state2.visible;
  197. var prefixCls = this.$props.prefixCls;
  198. var spinHeight = this.getSpinHeight() + 'px';
  199. var top = this.getTop() + 'px';
  200. var canScroll = this.showScroll();
  201. var mergedVisible = canScroll && visible;
  202. return (0, _vue.createVNode)("div", {
  203. "ref": this.scrollbarRef,
  204. "class": (0, _classNames3.default)("".concat(prefixCls, "-scrollbar"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-scrollbar-show"), canScroll)),
  205. "style": {
  206. width: '8px',
  207. top: 0,
  208. bottom: 0,
  209. right: 0,
  210. position: 'absolute',
  211. display: mergedVisible ? undefined : 'none'
  212. },
  213. "onMousedown": this.onContainerMouseDown,
  214. "onMousemove": this.delayHidden
  215. }, [(0, _vue.createVNode)("div", {
  216. "ref": this.thumbRef,
  217. "class": (0, _classNames3.default)("".concat(prefixCls, "-scrollbar-thumb"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-scrollbar-thumb-moving"), dragging)),
  218. "style": {
  219. width: '100%',
  220. height: spinHeight,
  221. top: top,
  222. left: 0,
  223. position: 'absolute',
  224. background: 'rgba(0, 0, 0, 0.5)',
  225. borderRadius: '99px',
  226. cursor: 'pointer',
  227. userSelect: 'none'
  228. },
  229. "onMousedown": this.onMouseDown
  230. }, null)]);
  231. }
  232. });
  233. exports.default = _default;