vxe-pc-ui 3.18.20 → 3.18.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/es/components.js +3 -0
  2. package/es/icon/style.css +1 -1
  3. package/es/scrollbar/index.js +12 -0
  4. package/es/scrollbar/src/scrollbar.js +540 -0
  5. package/es/scrollbar/src/util.js +54 -0
  6. package/es/scrollbar/style.css +102 -0
  7. package/es/scrollbar/style.min.css +1 -0
  8. package/es/style.css +1 -1
  9. package/es/style.min.css +1 -1
  10. package/es/ui/index.js +10 -1
  11. package/es/ui/src/log.js +1 -1
  12. package/es/vxe-scrollbar/index.js +3 -0
  13. package/es/vxe-scrollbar/style.css +102 -0
  14. package/es/vxe-scrollbar/style.min.css +1 -0
  15. package/lib/components.js +13 -1
  16. package/lib/components.min.js +1 -1
  17. package/lib/icon/style/style.css +1 -1
  18. package/lib/icon/style/style.min.css +1 -1
  19. package/lib/index.umd.js +694 -7
  20. package/lib/index.umd.min.js +1 -1
  21. package/lib/scrollbar/index.js +19 -0
  22. package/lib/scrollbar/index.min.js +1 -0
  23. package/lib/scrollbar/src/scrollbar.js +551 -0
  24. package/lib/scrollbar/src/scrollbar.min.js +1 -0
  25. package/lib/scrollbar/src/util.js +63 -0
  26. package/lib/scrollbar/src/util.min.js +1 -0
  27. package/lib/scrollbar/style/index.js +1 -0
  28. package/lib/scrollbar/style/style.css +102 -0
  29. package/lib/scrollbar/style/style.min.css +1 -0
  30. package/lib/style.css +1 -1
  31. package/lib/style.min.css +1 -1
  32. package/lib/ui/index.js +10 -1
  33. package/lib/ui/index.min.js +1 -1
  34. package/lib/ui/src/log.js +1 -1
  35. package/lib/ui/src/log.min.js +1 -1
  36. package/lib/vxe-scrollbar/index.js +22 -0
  37. package/lib/vxe-scrollbar/index.min.js +1 -0
  38. package/lib/vxe-scrollbar/style/index.js +1 -0
  39. package/lib/vxe-scrollbar/style/style.css +102 -0
  40. package/lib/vxe-scrollbar/style/style.min.css +1 -0
  41. package/package.json +3 -3
  42. package/packages/components.ts +3 -0
  43. package/packages/scrollbar/index.ts +16 -0
  44. package/packages/scrollbar/src/scrollbar.ts +583 -0
  45. package/packages/scrollbar/src/util.ts +57 -0
  46. package/packages/ui/index.ts +9 -0
  47. package/styles/all.scss +1 -0
  48. package/styles/components/scrollbar.scss +114 -0
  49. package/styles/theme/base.scss +5 -0
  50. package/styles/theme/dark.scss +5 -0
  51. package/styles/theme/light.scss +5 -0
  52. package/styles/variable.scss +5 -0
  53. package/types/all.d.ts +3 -0
  54. package/types/components/gantt.d.ts +3 -3
  55. package/types/components/grid.d.ts +5 -1
  56. package/types/components/scrollbar.d.ts +209 -0
  57. package/types/ui/global-config.d.ts +2 -0
  58. /package/es/icon/{iconfont.1790733444866.ttf → iconfont.1791471260167.ttf} +0 -0
  59. /package/es/icon/{iconfont.1790733444866.woff → iconfont.1791471260167.woff} +0 -0
  60. /package/es/icon/{iconfont.1790733444866.woff2 → iconfont.1791471260167.woff2} +0 -0
  61. /package/es/{iconfont.1790733444866.ttf → iconfont.1791471260167.ttf} +0 -0
  62. /package/es/{iconfont.1790733444866.woff → iconfont.1791471260167.woff} +0 -0
  63. /package/es/{iconfont.1790733444866.woff2 → iconfont.1791471260167.woff2} +0 -0
  64. /package/lib/icon/style/{iconfont.1790733444866.ttf → iconfont.1791471260167.ttf} +0 -0
  65. /package/lib/icon/style/{iconfont.1790733444866.woff → iconfont.1791471260167.woff} +0 -0
  66. /package/lib/icon/style/{iconfont.1790733444866.woff2 → iconfont.1791471260167.woff2} +0 -0
  67. /package/lib/{iconfont.1790733444866.ttf → iconfont.1791471260167.ttf} +0 -0
  68. /package/lib/{iconfont.1790733444866.woff → iconfont.1791471260167.woff} +0 -0
  69. /package/lib/{iconfont.1790733444866.woff2 → iconfont.1791471260167.woff2} +0 -0
@@ -0,0 +1,540 @@
1
+ import { defineVxeComponent } from '../../ui/src/comp';
2
+ import XEUtils from 'xe-utils';
3
+ import { VxeUI } from '../../ui';
4
+ import { toCssUnit } from '../../ui/src/dom';
5
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from './util';
6
+ import VxeLoadingComponent from '../../loading';
7
+ const { getConfig, createEvent, domUtils, globalResize, renderEmptyElement } = VxeUI;
8
+ function createReactData() {
9
+ return {
10
+ yThumbHeight: 0,
11
+ xThumbWidth: 0
12
+ };
13
+ }
14
+ function createInternalData() {
15
+ return {
16
+ // resizeObserver: undefined,
17
+ // isThumbDrag: false,
18
+ thumbDragOffset: 0,
19
+ yThumbTop: 0,
20
+ xThumbLeft: 0,
21
+ lastScrollTop: 0,
22
+ lastScrollLeft: 0
23
+ };
24
+ }
25
+ export default {
26
+ name: 'VxeScrollbar',
27
+ props: {
28
+ width: [String, Number],
29
+ height: [String, Number],
30
+ minWidth: [String, Number],
31
+ minHeight: [String, Number],
32
+ maxWidth: [String, Number],
33
+ maxHeight: [String, Number],
34
+ loading: Boolean,
35
+ native: {
36
+ type: Boolean,
37
+ default: () => getConfig().scrollbar.native
38
+ },
39
+ xConfig: Object,
40
+ yConfig: Object,
41
+ className: String,
42
+ viewClassName: String,
43
+ autoResize: {
44
+ type: Boolean,
45
+ default: () => getConfig().scrollbar.autoResize
46
+ },
47
+ syncResize: [Boolean, String, Number]
48
+ },
49
+ data() {
50
+ const xID = XEUtils.uniqueId();
51
+ const reactData = createReactData();
52
+ return Object.assign(Object.assign({}, {}), { xID,
53
+ reactData, reFlag: 0 });
54
+ },
55
+ computed: {
56
+ computeWrapperStyle() {
57
+ const $xeScrollbar = this;
58
+ const props = $xeScrollbar;
59
+ const { width, height, minWidth, minHeight, maxWidth, maxHeight } = props;
60
+ const xOpts = $xeScrollbar.computeXOpts;
61
+ const yOpts = $xeScrollbar.computeYOpts;
62
+ const stys = {};
63
+ if (width) {
64
+ stys.width = toCssUnit(width);
65
+ }
66
+ if (height) {
67
+ stys.height = toCssUnit(height);
68
+ }
69
+ if (minWidth) {
70
+ stys.minWidth = toCssUnit(minWidth);
71
+ }
72
+ if (minHeight) {
73
+ stys.minHeight = toCssUnit(minHeight);
74
+ }
75
+ if (maxWidth) {
76
+ stys.maxWidth = toCssUnit(maxWidth);
77
+ }
78
+ if (maxHeight) {
79
+ stys.maxHeight = toCssUnit(maxHeight);
80
+ }
81
+ if (yOpts.width) {
82
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(yOpts.width);
83
+ }
84
+ if (xOpts.height) {
85
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(xOpts.height);
86
+ }
87
+ return stys;
88
+ },
89
+ computeWrapperClss() {
90
+ const $xeScrollbar = this;
91
+ const props = $xeScrollbar;
92
+ const { native, className } = props;
93
+ const xOpts = $xeScrollbar.computeXOpts;
94
+ const yOpts = $xeScrollbar.computeYOpts;
95
+ return domUtils.buildClass([
96
+ 'vxe-scrollbar',
97
+ `ov-x--${xOpts.visible || 'visible'}`,
98
+ `ov-y--${yOpts.visible || 'visible'}`,
99
+ native ? 'is--native' : 'is--virtual',
100
+ className
101
+ ], {
102
+ 'ov-x--auto-hide': xOpts.autoHide,
103
+ 'ov-y--auto-hide': yOpts.autoHide
104
+ });
105
+ },
106
+ computeViewClss() {
107
+ const $xeScrollbar = this;
108
+ const props = $xeScrollbar;
109
+ const { viewClassName } = props;
110
+ return domUtils.buildClass([
111
+ 'vxe-scrollbar--view',
112
+ viewClassName
113
+ ]);
114
+ },
115
+ computeXOpts() {
116
+ const $xeScrollbar = this;
117
+ const props = $xeScrollbar;
118
+ return Object.assign({}, getConfig().scrollbar.xConfig, props.xConfig);
119
+ },
120
+ computeYOpts() {
121
+ const $xeScrollbar = this;
122
+ const props = $xeScrollbar;
123
+ return Object.assign({}, getConfig().scrollbar.yConfig, props.yConfig);
124
+ }
125
+ },
126
+ methods: {
127
+ //
128
+ // Method
129
+ //
130
+ dispatchEvent(type, params, evnt) {
131
+ const $xeScrollbar = this;
132
+ $xeScrollbar.$emit(type, createEvent(evnt, { $scrollbar: $xeScrollbar }, params));
133
+ },
134
+ scrollTo(left, top) {
135
+ const $xeScrollbar = this;
136
+ const viewEl = $xeScrollbar.$refs.refViewElem;
137
+ if (viewEl) {
138
+ if (XEUtils.isNumber(left)) {
139
+ viewEl.scrollTo(left, top || 0);
140
+ }
141
+ else {
142
+ viewEl.scrollTo(left);
143
+ }
144
+ }
145
+ },
146
+ scrollIntoView() {
147
+ const $xeScrollbar = this;
148
+ const viewEl = $xeScrollbar.$refs.refViewElem;
149
+ if (viewEl) {
150
+ viewEl.scrollIntoView();
151
+ }
152
+ },
153
+ recalculate() {
154
+ const $xeScrollbar = this;
155
+ $xeScrollbar.updateThumbSize();
156
+ $xeScrollbar.updateThumbOffset();
157
+ return $xeScrollbar.$nextTick();
158
+ },
159
+ updateThumbSize() {
160
+ const $xeScrollbar = this;
161
+ const reactData = $xeScrollbar.reactData;
162
+ const viewEl = $xeScrollbar.$refs.refViewElem;
163
+ if (!viewEl) {
164
+ return;
165
+ }
166
+ const trackXEl = $xeScrollbar.$refs.refTrackXElem;
167
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
168
+ const thumbXElem = $xeScrollbar.$refs.refThumbXElem;
169
+ if (thumbXElem) {
170
+ thumbXElem.style.width = xThumbWidth + 'px';
171
+ }
172
+ reactData.xThumbWidth = xThumbWidth;
173
+ const trackYEl = $xeScrollbar.$refs.refTrackYElem;
174
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
175
+ const thumbYElem = $xeScrollbar.$refs.refThumbYElem;
176
+ if (thumbYElem) {
177
+ thumbYElem.style.height = yThumbHeight + 'px';
178
+ }
179
+ reactData.yThumbHeight = yThumbHeight;
180
+ },
181
+ updateThumbOffset() {
182
+ const $xeScrollbar = this;
183
+ const reactData = $xeScrollbar.reactData;
184
+ const internalData = $xeScrollbar.internalData;
185
+ const viewEl = $xeScrollbar.$refs.refViewElem;
186
+ if (!viewEl) {
187
+ return;
188
+ }
189
+ const { xThumbWidth, yThumbHeight } = reactData;
190
+ const trackXEl = $xeScrollbar.$refs.refTrackXElem;
191
+ const thumbXElem = $xeScrollbar.$refs.refThumbXElem;
192
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
193
+ internalData.xThumbLeft = xThumbLeft;
194
+ if (thumbXElem && xThumbWidth) {
195
+ thumbXElem.style.width = xThumbWidth + 'px';
196
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
197
+ }
198
+ const trackYEl = $xeScrollbar.$refs.refTrackYElem;
199
+ const thumbYElem = $xeScrollbar.$refs.refThumbYElem;
200
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
201
+ internalData.yThumbTop = yThumbTop;
202
+ if (thumbYElem && yThumbHeight) {
203
+ thumbYElem.style.height = yThumbHeight + 'px';
204
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
205
+ }
206
+ },
207
+ scrollEvent(evnt) {
208
+ const $xeScrollbar = this;
209
+ const reactData = $xeScrollbar.reactData;
210
+ const internalData = $xeScrollbar.internalData;
211
+ const { xThumbWidth, yThumbHeight } = reactData;
212
+ const { lastScrollTop, lastScrollLeft } = internalData;
213
+ const xOpts = $xeScrollbar.computeXOpts;
214
+ const yOpts = $xeScrollbar.computeYOpts;
215
+ const viewEl = evnt.currentTarget;
216
+ const { scrollTop, scrollLeft, clientWidth, clientHeight, scrollHeight, scrollWidth } = viewEl;
217
+ let direction = '';
218
+ let isTopBoundary = false;
219
+ let isBottomBoundary = false;
220
+ let isLeftBoundary = false;
221
+ let isRightBoundary = false;
222
+ if (lastScrollTop !== scrollTop) {
223
+ const yThreshold = XEUtils.toNumber(yOpts.threshold) || 1;
224
+ if (lastScrollTop < scrollTop) {
225
+ direction = 'bottom';
226
+ if (yThumbHeight > 0 && scrollTop + clientHeight >= scrollHeight - yThreshold) {
227
+ isBottomBoundary = true;
228
+ }
229
+ }
230
+ else {
231
+ direction = 'top';
232
+ if (yThumbHeight > 0 && scrollTop <= yThreshold) {
233
+ isTopBoundary = true;
234
+ }
235
+ }
236
+ }
237
+ if (lastScrollLeft !== scrollLeft) {
238
+ const xThreshold = XEUtils.toNumber(xOpts.threshold) || 1;
239
+ if (lastScrollLeft < scrollLeft) {
240
+ direction = 'right';
241
+ if (xThumbWidth > 0 && scrollLeft + clientWidth >= scrollWidth - xThreshold) {
242
+ isRightBoundary = true;
243
+ }
244
+ }
245
+ else {
246
+ direction = 'left';
247
+ if (xThumbWidth > 0 && scrollLeft <= xThreshold) {
248
+ isLeftBoundary = true;
249
+ }
250
+ }
251
+ }
252
+ $xeScrollbar.updateThumbOffset();
253
+ internalData.lastScrollTop = scrollTop;
254
+ internalData.lastScrollLeft = scrollLeft;
255
+ if (isBottomBoundary || isTopBoundary || isRightBoundary || isLeftBoundary) {
256
+ $xeScrollbar.dispatchEvent('scroll-boundary', {
257
+ direction: direction,
258
+ isTop: isTopBoundary,
259
+ isBottom: isBottomBoundary,
260
+ isLeft: isLeftBoundary,
261
+ isRight: isRightBoundary,
262
+ scrollTop: scrollTop,
263
+ scrollLeft: scrollLeft,
264
+ clientWidth: clientWidth,
265
+ clientHeight: clientHeight,
266
+ scrollHeight: scrollHeight,
267
+ scrollWidth: scrollWidth
268
+ }, evnt);
269
+ }
270
+ $xeScrollbar.dispatchEvent('scroll', {
271
+ direction: direction,
272
+ isTop: yThumbHeight > 0 && scrollTop <= 0,
273
+ isBottom: yThumbHeight > 0 && scrollTop + clientHeight >= scrollHeight,
274
+ isLeft: xThumbWidth > 0 && scrollLeft <= 0,
275
+ isRight: xThumbWidth > 0 && scrollLeft + clientWidth >= scrollWidth,
276
+ scrollTop: scrollTop,
277
+ scrollLeft: scrollLeft,
278
+ clientWidth: clientWidth,
279
+ clientHeight: clientHeight,
280
+ scrollHeight: scrollHeight,
281
+ scrollWidth: scrollWidth
282
+ }, evnt);
283
+ },
284
+ clickTrackXEvent(evnt) {
285
+ const $xeScrollbar = this;
286
+ const reactData = $xeScrollbar.reactData;
287
+ const trackEl = evnt.currentTarget;
288
+ if (trackEl !== evnt.target) {
289
+ return;
290
+ }
291
+ const viewEl = $xeScrollbar.$refs.refViewElem;
292
+ if (!viewEl) {
293
+ return;
294
+ }
295
+ const { xThumbWidth } = reactData;
296
+ const trackRect = trackEl.getBoundingClientRect();
297
+ viewEl.scrollTo({
298
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
299
+ behavior: 'auto'
300
+ });
301
+ },
302
+ clickTrackYEvent(evnt) {
303
+ const $xeScrollbar = this;
304
+ const reactData = $xeScrollbar.reactData;
305
+ const trackEl = evnt.currentTarget;
306
+ if (trackEl !== evnt.target) {
307
+ return;
308
+ }
309
+ const viewEl = $xeScrollbar.$refs.refViewElem;
310
+ if (!viewEl) {
311
+ return;
312
+ }
313
+ const { yThumbHeight } = reactData;
314
+ const trackRect = trackEl.getBoundingClientRect();
315
+ viewEl.scrollTo({
316
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
317
+ behavior: 'auto'
318
+ });
319
+ },
320
+ pointerdownThumbXEvent(evnt) {
321
+ const $xeScrollbar = this;
322
+ const reactData = $xeScrollbar.reactData;
323
+ const internalData = $xeScrollbar.internalData;
324
+ const thumbEl = evnt.currentTarget;
325
+ internalData.isThumbDrag = true;
326
+ thumbEl.setPointerCapture(evnt.pointerId);
327
+ const viewEl = $xeScrollbar.$refs.refViewElem;
328
+ if (!viewEl) {
329
+ return;
330
+ }
331
+ const { xThumbWidth } = reactData;
332
+ const trackEl = thumbEl.parentElement;
333
+ const trackRect = trackEl.getBoundingClientRect();
334
+ const pointerPosition = evnt.clientX - trackRect.left;
335
+ // 记录 thumb 的偏移
336
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
337
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
338
+ },
339
+ pointermoveThumbXEvent(evnt) {
340
+ const $xeScrollbar = this;
341
+ const reactData = $xeScrollbar.reactData;
342
+ const internalData = $xeScrollbar.internalData;
343
+ const { isThumbDrag, thumbDragOffset } = internalData;
344
+ if (isThumbDrag) {
345
+ const viewEl = $xeScrollbar.$refs.refViewElem;
346
+ if (!viewEl) {
347
+ return;
348
+ }
349
+ const { xThumbWidth } = reactData;
350
+ const thumbEl = evnt.currentTarget;
351
+ const trackEl = thumbEl.parentElement;
352
+ const trackRect = trackEl.getBoundingClientRect();
353
+ // 更新偏移
354
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
355
+ }
356
+ },
357
+ cleatPointerThumbEvent(evnt) {
358
+ const $xeScrollbar = this;
359
+ const internalData = $xeScrollbar.internalData;
360
+ const thumbEl = evnt.currentTarget;
361
+ thumbEl.releasePointerCapture(evnt.pointerId);
362
+ internalData.isThumbDrag = false;
363
+ },
364
+ pointerdownThumbYEvent(evnt) {
365
+ const $xeScrollbar = this;
366
+ const reactData = $xeScrollbar.reactData;
367
+ const internalData = $xeScrollbar.internalData;
368
+ const thumbEl = evnt.currentTarget;
369
+ internalData.isThumbDrag = true;
370
+ thumbEl.setPointerCapture(evnt.pointerId);
371
+ const viewEl = $xeScrollbar.$refs.refViewElem;
372
+ if (!viewEl) {
373
+ return;
374
+ }
375
+ const { yThumbHeight } = reactData;
376
+ const trackEl = thumbEl.parentElement;
377
+ const trackRect = trackEl.getBoundingClientRect();
378
+ const pointerPosition = evnt.clientY - trackRect.top;
379
+ // 记录 thumb 的偏移
380
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
381
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
382
+ },
383
+ pointermoveThumbYEvent(evnt) {
384
+ const $xeScrollbar = this;
385
+ const reactData = $xeScrollbar.reactData;
386
+ const internalData = $xeScrollbar.internalData;
387
+ const { isThumbDrag, thumbDragOffset } = internalData;
388
+ if (isThumbDrag) {
389
+ const viewEl = $xeScrollbar.$refs.refViewElem;
390
+ if (!viewEl) {
391
+ return;
392
+ }
393
+ const { yThumbHeight } = reactData;
394
+ const thumbEl = evnt.currentTarget;
395
+ const trackEl = thumbEl.parentElement;
396
+ const trackRect = trackEl.getBoundingClientRect();
397
+ // 更新偏移
398
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
399
+ }
400
+ },
401
+ //
402
+ // Render
403
+ //
404
+ renderVN(h) {
405
+ const $xeScrollbar = this;
406
+ const props = $xeScrollbar;
407
+ const slots = $xeScrollbar.$scopedSlots;
408
+ const { native, loading } = props;
409
+ const wrapperStyle = $xeScrollbar.computeWrapperStyle;
410
+ const wrapperClss = $xeScrollbar.computeWrapperClss;
411
+ const viewClss = $xeScrollbar.computeViewClss;
412
+ const xOpts = $xeScrollbar.computeXOpts;
413
+ const yOpts = $xeScrollbar.computeYOpts;
414
+ const defaultSlot = slots.default;
415
+ return h('div', {
416
+ ref: 'refElem',
417
+ class: wrapperClss,
418
+ style: wrapperStyle
419
+ }, [
420
+ h('div', {
421
+ ref: 'refViewElem',
422
+ class: viewClss,
423
+ on: {
424
+ scroll: $xeScrollbar.scrollEvent
425
+ }
426
+ }, [
427
+ h('div', {
428
+ ref: 'refViewInnerElem',
429
+ class: 'vxe-scrollbar--view-inner'
430
+ }, defaultSlot ? defaultSlot({}) : [])
431
+ ]),
432
+ native || xOpts.visible === 'hidden'
433
+ ? renderEmptyElement($xeScrollbar)
434
+ : h('div', {
435
+ ref: 'refTrackXElem',
436
+ class: 'vxe-scrollbar--track-x',
437
+ on: {
438
+ click: $xeScrollbar.clickTrackXEvent
439
+ }
440
+ }, [
441
+ h('div', {
442
+ ref: 'refThumbXElem',
443
+ class: 'vxe-scrollbar--thumb-x',
444
+ on: {
445
+ pointerdown: $xeScrollbar.pointerdownThumbXEvent,
446
+ pointermove: $xeScrollbar.pointermoveThumbXEvent,
447
+ pointerup: $xeScrollbar.cleatPointerThumbEvent,
448
+ pointercancel: $xeScrollbar.cleatPointerThumbEvent,
449
+ lostpointercapture: $xeScrollbar.cleatPointerThumbEvent
450
+ }
451
+ })
452
+ ]),
453
+ native || yOpts.visible === 'hidden'
454
+ ? renderEmptyElement($xeScrollbar)
455
+ : h('div', {
456
+ ref: 'refTrackYElem',
457
+ class: 'vxe-scrollbar--track-y',
458
+ on: {
459
+ click: $xeScrollbar.clickTrackYEvent
460
+ }
461
+ }, [
462
+ h('div', {
463
+ ref: 'refThumbYElem',
464
+ class: 'vxe-scrollbar--thumb-y',
465
+ on: {
466
+ pointerdown: $xeScrollbar.pointerdownThumbYEvent,
467
+ pointermove: $xeScrollbar.pointermoveThumbYEvent,
468
+ pointerup: $xeScrollbar.cleatPointerThumbEvent,
469
+ pointercancel: $xeScrollbar.cleatPointerThumbEvent,
470
+ lostpointercapture: $xeScrollbar.cleatPointerThumbEvent
471
+ }
472
+ })
473
+ ]),
474
+ h(VxeLoadingComponent, {
475
+ class: 'vxe-scrollbar--loading',
476
+ props: {
477
+ value: loading
478
+ }
479
+ })
480
+ ]);
481
+ }
482
+ },
483
+ watch: {
484
+ native() {
485
+ const $xeScrollbar = this;
486
+ $xeScrollbar.reFlag++;
487
+ },
488
+ syncResize() {
489
+ const $xeScrollbar = this;
490
+ $xeScrollbar.reFlag++;
491
+ },
492
+ reFlag() {
493
+ const $xeScrollbar = this;
494
+ $xeScrollbar.recalculate().then(() => {
495
+ $xeScrollbar.recalculate();
496
+ });
497
+ }
498
+ },
499
+ created() {
500
+ const $xeScrollbar = this;
501
+ $xeScrollbar.internalData = createInternalData();
502
+ },
503
+ mounted() {
504
+ const $xeScrollbar = this;
505
+ const props = $xeScrollbar;
506
+ const internalData = $xeScrollbar.internalData;
507
+ const { autoResize } = props;
508
+ const viewInnerEl = $xeScrollbar.$refs.refViewInnerElem;
509
+ if (autoResize && viewInnerEl) {
510
+ const resizeObserver = globalResize.create(() => {
511
+ if (props.autoResize) {
512
+ $xeScrollbar.reFlag++;
513
+ }
514
+ });
515
+ resizeObserver.observe(viewInnerEl);
516
+ internalData.resizeObserver = resizeObserver;
517
+ }
518
+ $xeScrollbar.$nextTick(() => {
519
+ $xeScrollbar.recalculate();
520
+ });
521
+ },
522
+ beforeDestroy() {
523
+ const $xeScrollbar = this;
524
+ const internalData = $xeScrollbar.internalData;
525
+ const { resizeObserver } = internalData;
526
+ if (resizeObserver) {
527
+ resizeObserver.disconnect();
528
+ }
529
+ },
530
+ destroyed() {
531
+ const $xeScrollbar = this;
532
+ const reactData = $xeScrollbar.reactData;
533
+ const internalData = $xeScrollbar.internalData;
534
+ XEUtils.assign(reactData, createReactData());
535
+ XEUtils.assign(internalData, createInternalData());
536
+ },
537
+ render(h) {
538
+ return this.renderVN(h);
539
+ }
540
+ };
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 计算滚动条滑块的长度
3
+ */
4
+ export function getThumbSize(viewportSize, contentSize, trackSize) {
5
+ if (contentSize <= viewportSize) {
6
+ return 0;
7
+ }
8
+ const ratio = viewportSize / contentSize;
9
+ const ideal = trackSize * ratio;
10
+ return Math.max(20, Math.min(ideal, trackSize));
11
+ }
12
+ /**
13
+ * 计算滚动条滑块的偏移位置
14
+ */
15
+ export function getThumbOffsetSize(offsetSize, viewportSize, contentSize, trackSize, thumbSize) {
16
+ const maxScroll = contentSize - viewportSize;
17
+ if (maxScroll <= 0) {
18
+ return 0;
19
+ }
20
+ const maxThumbOffset = trackSize - thumbSize;
21
+ if (maxThumbOffset <= 0) {
22
+ return 0;
23
+ }
24
+ const clamped = Math.min(Math.max(offsetSize, 0), maxScroll);
25
+ const ratio = clamped / maxScroll;
26
+ return ratio * maxThumbOffset;
27
+ }
28
+ /**
29
+ * 根据点击轨道的位置,计算滑块的偏移位置
30
+ */
31
+ export function getScrollFromClick(clickPosition, viewportSize, contentSize, trackSize, thumbSize) {
32
+ const maxThumbOffset = trackSize - thumbSize;
33
+ const maxScroll = contentSize - viewportSize;
34
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
35
+ return 0;
36
+ }
37
+ let thumbOffset = clickPosition - thumbSize / 2;
38
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
39
+ const scrollOffset = (thumbOffset / maxThumbOffset) * maxScroll;
40
+ return scrollOffset;
41
+ }
42
+ /**
43
+ * 拖拽 thumb 时,根据鼠标位置计算滑块的偏移位置
44
+ */
45
+ export function getScrollFromDrag(pointerPosition, dragOffset, viewportSize, contentSize, trackSize, thumbSize) {
46
+ const maxScroll = contentSize - viewportSize;
47
+ const maxThumbOffset = trackSize - thumbSize;
48
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
49
+ return 0;
50
+ }
51
+ let thumbOffset = pointerPosition - dragOffset;
52
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset);
53
+ return (thumbOffset / maxThumbOffset) * maxScroll;
54
+ }
@@ -0,0 +1,102 @@
1
+ .vxe-scrollbar {
2
+ width: 100%;
3
+ position: relative;
4
+ }
5
+ .vxe-scrollbar.is--virtual > .vxe-scrollbar--view {
6
+ scrollbar-width: none;
7
+ -ms-overflow-style: none;
8
+ overflow-x: auto;
9
+ overflow-y: auto;
10
+ }
11
+ .vxe-scrollbar.is--virtual > .vxe-scrollbar--view::-webkit-scrollbar {
12
+ display: none;
13
+ }
14
+ .vxe-scrollbar.is--virtual.ov-x--auto-hide:hover > .vxe-scrollbar--track-x {
15
+ opacity: 1;
16
+ }
17
+ .vxe-scrollbar.is--virtual.ov-x--auto-hide > .vxe-scrollbar--track-x {
18
+ opacity: 0;
19
+ transition: opacity 0.3s ease-in-out;
20
+ }
21
+ .vxe-scrollbar.is--virtual.ov-y--auto-hide:hover > .vxe-scrollbar--track-y {
22
+ opacity: 1;
23
+ }
24
+ .vxe-scrollbar.is--virtual.ov-y--auto-hide > .vxe-scrollbar--track-y {
25
+ opacity: 0;
26
+ transition: opacity 0.3s ease-in-out;
27
+ }
28
+ .vxe-scrollbar.is--native > .vxe-scrollbar--view {
29
+ overflow-x: auto;
30
+ overflow-y: auto;
31
+ }
32
+ .vxe-scrollbar.is--native.ov-x--hidden > .vxe-scrollbar--view {
33
+ overflow-x: hidden;
34
+ }
35
+ .vxe-scrollbar.is--native.ov-y--hidden > .vxe-scrollbar--view {
36
+ overflow-y: hidden;
37
+ }
38
+ .vxe-scrollbar.is--native > .vxe-scrollbar--view::-webkit-scrollbar {
39
+ width: var(--vxe-ui-scrollbar-y-width);
40
+ height: var(--vxe-ui-scrollbar-x-height);
41
+ }
42
+ .vxe-scrollbar.is--native > .vxe-scrollbar--view::-webkit-scrollbar-thumb {
43
+ border-radius: var(--vxe-ui-base-border-radius);
44
+ background-color: var(--vxe-ui-scrollbar-thumb-background-color);
45
+ }
46
+ .vxe-scrollbar.is--native > .vxe-scrollbar--view::-webkit-scrollbar-thumb:hover {
47
+ background-color: var(--vxe-ui-scrollbar-thumb-hover-background-color);
48
+ }
49
+ .vxe-scrollbar.is--native > .vxe-scrollbar--view::-webkit-scrollbar-thumb:active {
50
+ background-color: var(--vxe-ui-scrollbar-thumb-active-background-color);
51
+ }
52
+
53
+ .vxe-scrollbar--view {
54
+ height: 100%;
55
+ width: 100%;
56
+ }
57
+
58
+ .vxe-scrollbar--track-x,
59
+ .vxe-scrollbar--track-y {
60
+ position: absolute;
61
+ background-color: var(--vxe-ui-scrollbar-track-background-color);
62
+ -webkit-user-select: none;
63
+ -moz-user-select: none;
64
+ -ms-user-select: none;
65
+ user-select: none;
66
+ }
67
+
68
+ .vxe-scrollbar--track-x {
69
+ width: 100%;
70
+ bottom: 0;
71
+ left: 0;
72
+ height: var(--vxe-ui-scrollbar-x-height);
73
+ }
74
+
75
+ .vxe-scrollbar--track-y {
76
+ height: 100%;
77
+ right: 0;
78
+ top: 0;
79
+ width: var(--vxe-ui-scrollbar-y-width);
80
+ }
81
+
82
+ .vxe-scrollbar--thumb-y {
83
+ width: 100%;
84
+ }
85
+
86
+ .vxe-scrollbar--thumb-x {
87
+ height: 100%;
88
+ }
89
+
90
+ .vxe-scrollbar--thumb-x,
91
+ .vxe-scrollbar--thumb-y {
92
+ border-radius: var(--vxe-ui-base-border-radius);
93
+ background-color: var(--vxe-ui-scrollbar-thumb-background-color);
94
+ }
95
+ .vxe-scrollbar--thumb-x:hover,
96
+ .vxe-scrollbar--thumb-y:hover {
97
+ background-color: var(--vxe-ui-scrollbar-thumb-hover-background-color);
98
+ }
99
+ .vxe-scrollbar--thumb-x:active,
100
+ .vxe-scrollbar--thumb-y:active {
101
+ background-color: var(--vxe-ui-scrollbar-thumb-active-background-color);
102
+ }