vxe-pc-ui 4.19.7 → 4.20.0

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 (100) hide show
  1. package/dist/all.esm.js +2206 -1851
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/card/src/card.js +35 -12
  5. package/es/card/style.css +42 -44
  6. package/es/card/style.min.css +1 -1
  7. package/es/icon/style.css +1 -1
  8. package/es/list/src/list.js +323 -19
  9. package/es/list/style.css +26 -0
  10. package/es/list/style.min.css +1 -1
  11. package/es/scrollbar/src/scrollbar.js +9 -1
  12. package/es/scrollbar/style.css +6 -5
  13. package/es/scrollbar/style.min.css +1 -1
  14. package/es/style.css +1 -1
  15. package/es/style.min.css +1 -1
  16. package/es/tabs/src/tabs.js +27 -8
  17. package/es/tabs/style.css +4 -2
  18. package/es/tabs/style.min.css +1 -1
  19. package/es/tree/src/tree.js +6 -2
  20. package/es/ui/index.js +1 -1
  21. package/es/ui/src/log.js +1 -1
  22. package/es/ui/src/utils.js +9 -0
  23. package/es/vxe-card/style.css +42 -44
  24. package/es/vxe-card/style.min.css +1 -1
  25. package/es/vxe-list/style.css +26 -0
  26. package/es/vxe-list/style.min.css +1 -1
  27. package/es/vxe-scrollbar/style.css +6 -5
  28. package/es/vxe-scrollbar/style.min.css +1 -1
  29. package/es/vxe-tabs/style.css +4 -2
  30. package/es/vxe-tabs/style.min.css +1 -1
  31. package/lib/card/src/card.js +42 -6
  32. package/lib/card/src/card.min.js +1 -1
  33. package/lib/card/style/style.css +42 -44
  34. package/lib/card/style/style.min.css +1 -1
  35. package/lib/icon/style/style.css +1 -1
  36. package/lib/icon/style/style.min.css +1 -1
  37. package/lib/index.umd.js +2785 -2383
  38. package/lib/index.umd.min.js +1 -1
  39. package/lib/list/src/list.js +333 -20
  40. package/lib/list/src/list.min.js +1 -1
  41. package/lib/list/style/style.css +26 -0
  42. package/lib/list/style/style.min.css +1 -1
  43. package/lib/scrollbar/src/scrollbar.js +9 -1
  44. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  45. package/lib/scrollbar/style/style.css +6 -5
  46. package/lib/scrollbar/style/style.min.css +1 -1
  47. package/lib/style.css +1 -1
  48. package/lib/style.min.css +1 -1
  49. package/lib/tabs/src/tabs.js +40 -8
  50. package/lib/tabs/src/tabs.min.js +1 -1
  51. package/lib/tabs/style/style.css +4 -2
  52. package/lib/tabs/style/style.min.css +1 -1
  53. package/lib/tree/src/tree.js +5 -1
  54. package/lib/tree/src/tree.min.js +1 -1
  55. package/lib/ui/index.js +1 -1
  56. package/lib/ui/index.min.js +1 -1
  57. package/lib/ui/src/log.js +1 -1
  58. package/lib/ui/src/log.min.js +1 -1
  59. package/lib/ui/src/utils.js +10 -0
  60. package/lib/ui/src/utils.min.js +1 -1
  61. package/lib/vxe-card/style/style.css +42 -44
  62. package/lib/vxe-card/style/style.min.css +1 -1
  63. package/lib/vxe-list/style/style.css +26 -0
  64. package/lib/vxe-list/style/style.min.css +1 -1
  65. package/lib/vxe-scrollbar/style/style.css +6 -5
  66. package/lib/vxe-scrollbar/style/style.min.css +1 -1
  67. package/lib/vxe-tabs/style/style.css +4 -2
  68. package/lib/vxe-tabs/style/style.min.css +1 -1
  69. package/package.json +1 -1
  70. package/packages/card/src/card.ts +55 -12
  71. package/packages/list/src/list.ts +351 -19
  72. package/packages/scrollbar/src/scrollbar.ts +10 -1
  73. package/packages/tabs/src/tabs.ts +34 -8
  74. package/packages/tree/src/tree.ts +6 -2
  75. package/packages/ui/src/utils.ts +10 -0
  76. package/styles/components/card.scss +44 -58
  77. package/styles/components/list.scss +51 -0
  78. package/styles/components/scrollbar.scss +18 -11
  79. package/styles/components/tabs.scss +2 -1
  80. package/types/components/card.d.ts +11 -0
  81. package/types/components/grid.d.ts +37 -0
  82. package/types/components/layout-aside.d.ts +7 -1
  83. package/types/components/layout-body.d.ts +7 -1
  84. package/types/components/list.d.ts +24 -2
  85. package/types/components/menu.d.ts +6 -0
  86. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  87. package/types/components/table.d.ts +25 -2
  88. package/types/components/tabs.d.ts +11 -0
  89. /package/es/icon/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  90. /package/es/icon/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  91. /package/es/icon/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  92. /package/es/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  93. /package/es/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  94. /package/es/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  95. /package/lib/icon/style/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  96. /package/lib/icon/style/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  97. /package/lib/icon/style/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
  98. /package/lib/{iconfont.1791794447472.ttf → iconfont.1791880413927.ttf} +0 -0
  99. /package/lib/{iconfont.1791794447472.woff → iconfont.1791880413927.woff} +0 -0
  100. /package/lib/{iconfont.1791794447472.woff2 → iconfont.1791880413927.woff2} +0 -0
@@ -1,12 +1,13 @@
1
1
  import { h, ref, computed, onBeforeUnmount, watch, reactive, nextTick, onActivated, onMounted } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import XEUtils from 'xe-utils';
4
- import { VxeUI, getConfig, getIcon, getI18n, menus, globalEvents, globalResize, createEvent, useSize, renderEmptyElement } from '../../ui';
4
+ import { VxeUI, getConfig, getIcon, getI18n, domUtils, menus, globalEvents, globalResize, useSize, createEvent, renderEmptyElement } from '../../ui';
5
5
  import { getCrossListDragRowInfo } from './store';
6
- import { isScale, removeClass, addClass, getTpImg, toCssUnit } from '../../ui/src/dom';
6
+ import { isScale, removeClass, addClass, getTpImg, toCssUnit, hasClass } from '../../ui/src/dom';
7
7
  import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils';
8
8
  import { createComponentLog } from '../../ui/src/log';
9
9
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
10
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util';
10
11
  import { getItemCacheObj } from './util';
11
12
  import VxeLoadingComponent from '../../loading';
12
13
  const { warnLog, errLog } = createComponentLog('tree');
@@ -36,6 +37,9 @@ function createReactData() {
36
37
  updateCheckboxFlag: 1,
37
38
  isAllChecked: false,
38
39
  isAllIndeterminate: false,
40
+ // 滚动条
41
+ yThumbHeight: 0,
42
+ xThumbWidth: 0,
39
43
  insertRowFlag: 1,
40
44
  removeRowFlag: 1,
41
45
  dragRow: null,
@@ -45,13 +49,18 @@ function createReactData() {
45
49
  }
46
50
  function createInternalData() {
47
51
  return {
48
- resizeObserver: undefined,
49
52
  fullData: [],
50
53
  afterList: [],
51
54
  fullKeyMaps: {},
52
55
  rowMaps: {},
53
- lastScrollLeft: 0,
56
+ // 滚动条
57
+ // resizeObserver: undefined,
58
+ // isThumbDrag: false,
59
+ thumbDragOffset: 0,
60
+ yThumbTop: 0,
61
+ xThumbLeft: 0,
54
62
  lastScrollTop: 0,
63
+ lastScrollLeft: 0,
55
64
  scrollYStore: {
56
65
  startIndex: 0,
57
66
  endIndex: 0,
@@ -105,7 +114,12 @@ export default defineVxeComponent({
105
114
  dragConfig: Object,
106
115
  menuConfig: Object,
107
116
  virtualYConfig: Object,
108
- scrollY: Object
117
+ scrollY: Object,
118
+ useScrollbar: {
119
+ type: Boolean,
120
+ default: () => getConfig().list.useScrollbar
121
+ },
122
+ scrollbarConfig: Object
109
123
  },
110
124
  emits: [
111
125
  'update:checkRowKey',
@@ -138,6 +152,11 @@ export default defineVxeComponent({
138
152
  const refFooterElem = ref();
139
153
  const refVirtualWrapper = ref();
140
154
  const refVirtualBody = ref();
155
+ const refViewInnerElem = ref();
156
+ const refTrackXElem = ref();
157
+ const refTrackYElem = ref();
158
+ const refThumbXElem = ref();
159
+ const refThumbYElem = ref();
141
160
  const refDragRowLineElem = ref();
142
161
  const refDragTipElem = ref();
143
162
  const refMaps = {
@@ -186,11 +205,19 @@ export default defineVxeComponent({
186
205
  });
187
206
  const computeWrapperStyles = computed(() => {
188
207
  const rowHeight = computeRowHeight.value;
189
- const style = {};
208
+ const scrollbarXOpts = computeScrollbarXOpts.value;
209
+ const scrollbarYOpts = computeScrollbarYOpts.value;
210
+ const stys = {};
190
211
  if (rowHeight) {
191
- style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
212
+ stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
192
213
  }
193
- return style;
214
+ if (scrollbarYOpts.width) {
215
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(scrollbarYOpts.width);
216
+ }
217
+ if (scrollbarXOpts.height) {
218
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(scrollbarXOpts.height);
219
+ }
220
+ return stys;
194
221
  });
195
222
  const computeVirtualStyles = computed(() => {
196
223
  const { height, maxHeight } = props;
@@ -205,6 +232,47 @@ export default defineVxeComponent({
205
232
  }
206
233
  return style;
207
234
  });
235
+ const computeScrollbarOpts = computed(() => {
236
+ return Object.assign({}, getConfig().list.scrollbarConfig, props.scrollbarConfig);
237
+ });
238
+ const computeScrollbarXOpts = computed(() => {
239
+ const scrollbarOpts = computeScrollbarOpts.value;
240
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig);
241
+ });
242
+ const computeScrollbarYOpts = computed(() => {
243
+ const scrollbarOpts = computeScrollbarOpts.value;
244
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
245
+ });
246
+ const computeScrollbarWrapperClss = computed(() => {
247
+ const scrollbarOpts = computeScrollbarOpts.value;
248
+ const { padding } = scrollbarOpts;
249
+ const { yThumbHeight, xThumbWidth } = reactData;
250
+ const scrollbarXOpts = computeScrollbarXOpts.value;
251
+ const scrollbarYOpts = computeScrollbarYOpts.value;
252
+ const scrollbarXToTop = computeScrollbarXToTop.value;
253
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
254
+ return domUtils.buildClass([
255
+ 'vxe-scrollbar is--virtual',
256
+ `ov-x--${scrollbarXOpts.visible || 'visible'}`,
257
+ `ov-y--${scrollbarYOpts.visible || 'visible'}`,
258
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
259
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
260
+ ], {
261
+ 'is--padding': padding,
262
+ 'ov-x--auto-hide': scrollbarXOpts.autoHide,
263
+ 'ov-y--auto-hide': scrollbarYOpts.autoHide,
264
+ 'overflow-y': yThumbHeight,
265
+ 'overflow-x': xThumbWidth
266
+ });
267
+ });
268
+ const computeScrollbarXToTop = computed(() => {
269
+ const scrollbarXOpts = computeScrollbarXOpts.value;
270
+ return scrollbarXOpts.position === 'top';
271
+ });
272
+ const computeScrollbarYToLeft = computed(() => {
273
+ const scrollbarYOpts = computeScrollbarYOpts.value;
274
+ return scrollbarYOpts.position === 'left';
275
+ });
208
276
  const dispatchEvent = (type, params, evnt) => {
209
277
  emit(type, createEvent(evnt, { $list: $xeList }, params));
210
278
  };
@@ -361,6 +429,7 @@ export default defineVxeComponent({
361
429
  */
362
430
  const refreshScroll = () => {
363
431
  const { lastScrollLeft, lastScrollTop } = internalData;
432
+ updateScrollbar();
364
433
  return clearScroll().then(() => {
365
434
  if (lastScrollLeft || lastScrollTop) {
366
435
  internalData.lastScrollLeft = 0;
@@ -369,19 +438,28 @@ export default defineVxeComponent({
369
438
  }
370
439
  });
371
440
  };
441
+ const updateScrollbar = () => {
442
+ updateThumbSize();
443
+ updateThumbOffset();
444
+ };
372
445
  /**
373
446
  * 重新计算列表
374
447
  */
375
448
  const recalculate = () => {
376
449
  const el = refElem.value;
377
450
  if (el) {
378
- const parentEl = el.parentElement;
451
+ let parentEl = el.parentElement;
379
452
  let parentHeight = 0;
453
+ // 如果是虚拟滚动条
454
+ if (parentEl && hasClass(parentEl, 'vxe-scrollbar--view-inner')) {
455
+ parentEl = parentEl.parentElement;
456
+ }
380
457
  if (parentEl) {
381
458
  const parentStyle = getComputedStyle(parentEl);
382
459
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight));
383
460
  }
384
461
  reactData.parentHeight = parentHeight;
462
+ updateScrollbar();
385
463
  updateHeight();
386
464
  if (el.clientWidth && el.clientHeight) {
387
465
  return computeScrollLoad();
@@ -411,6 +489,7 @@ export default defineVxeComponent({
411
489
  const scrollLeft = scrollBodyElem.scrollLeft;
412
490
  const isX = scrollLeft !== internalData.lastScrollLeft;
413
491
  const isY = scrollTop !== internalData.lastScrollTop;
492
+ updateThumbOffset();
414
493
  internalData.lastScrollTop = scrollTop;
415
494
  internalData.lastScrollLeft = scrollLeft;
416
495
  if (reactData.scrollYLoad) {
@@ -1707,6 +1786,162 @@ export default defineVxeComponent({
1707
1786
  hideDropTip();
1708
1787
  }
1709
1788
  };
1789
+ const updateThumbSize = () => {
1790
+ const viewEl = refVirtualWrapper.value;
1791
+ if (!viewEl) {
1792
+ return;
1793
+ }
1794
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1795
+ return;
1796
+ }
1797
+ const trackXEl = refTrackXElem.value;
1798
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
1799
+ const thumbXElem = refThumbXElem.value;
1800
+ if (thumbXElem) {
1801
+ thumbXElem.style.width = xThumbWidth + 'px';
1802
+ }
1803
+ reactData.xThumbWidth = xThumbWidth;
1804
+ const trackYEl = refTrackYElem.value;
1805
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
1806
+ const thumbYElem = refThumbYElem.value;
1807
+ if (thumbYElem) {
1808
+ thumbYElem.style.height = yThumbHeight + 'px';
1809
+ }
1810
+ reactData.yThumbHeight = yThumbHeight;
1811
+ };
1812
+ const updateThumbOffset = () => {
1813
+ const viewEl = refVirtualWrapper.value;
1814
+ if (!viewEl) {
1815
+ return;
1816
+ }
1817
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1818
+ return;
1819
+ }
1820
+ const { xThumbWidth, yThumbHeight } = reactData;
1821
+ const trackXEl = refTrackXElem.value;
1822
+ const thumbXElem = refThumbXElem.value;
1823
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
1824
+ internalData.xThumbLeft = xThumbLeft;
1825
+ if (thumbXElem && xThumbWidth) {
1826
+ thumbXElem.style.width = xThumbWidth + 'px';
1827
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
1828
+ }
1829
+ const trackYEl = refTrackYElem.value;
1830
+ const thumbYElem = refThumbYElem.value;
1831
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
1832
+ internalData.yThumbTop = yThumbTop;
1833
+ if (thumbYElem && yThumbHeight) {
1834
+ thumbYElem.style.height = yThumbHeight + 'px';
1835
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
1836
+ }
1837
+ };
1838
+ const clickTrackXEvent = (evnt) => {
1839
+ const trackEl = evnt.currentTarget;
1840
+ if (trackEl !== evnt.target) {
1841
+ return;
1842
+ }
1843
+ const viewEl = refVirtualWrapper.value;
1844
+ if (!viewEl) {
1845
+ return;
1846
+ }
1847
+ const { xThumbWidth } = reactData;
1848
+ const trackRect = trackEl.getBoundingClientRect();
1849
+ viewEl.scrollTo({
1850
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
1851
+ behavior: 'auto'
1852
+ });
1853
+ };
1854
+ const clickTrackYEvent = (evnt) => {
1855
+ const trackEl = evnt.currentTarget;
1856
+ if (trackEl !== evnt.target) {
1857
+ return;
1858
+ }
1859
+ const viewEl = refVirtualWrapper.value;
1860
+ if (!viewEl) {
1861
+ return;
1862
+ }
1863
+ const { yThumbHeight } = reactData;
1864
+ const trackRect = trackEl.getBoundingClientRect();
1865
+ viewEl.scrollTo({
1866
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
1867
+ behavior: 'auto'
1868
+ });
1869
+ };
1870
+ const pointerdownThumbXEvent = (evnt) => {
1871
+ const thumbEl = evnt.currentTarget;
1872
+ internalData.isThumbDrag = true;
1873
+ thumbEl.setPointerCapture(evnt.pointerId);
1874
+ const viewEl = refVirtualWrapper.value;
1875
+ if (!viewEl) {
1876
+ return;
1877
+ }
1878
+ const { xThumbWidth } = reactData;
1879
+ const trackEl = thumbEl.parentElement;
1880
+ const trackRect = trackEl.getBoundingClientRect();
1881
+ const pointerPosition = evnt.clientX - trackRect.left;
1882
+ // 记录 thumb 的偏移
1883
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
1884
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
1885
+ };
1886
+ const pointermoveThumbXEvent = (evnt) => {
1887
+ const thumbEl = evnt.currentTarget;
1888
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
1889
+ return;
1890
+ }
1891
+ const { isThumbDrag, thumbDragOffset } = internalData;
1892
+ if (isThumbDrag) {
1893
+ const viewEl = refVirtualWrapper.value;
1894
+ if (!viewEl) {
1895
+ return;
1896
+ }
1897
+ const { xThumbWidth } = reactData;
1898
+ const thumbEl = evnt.currentTarget;
1899
+ const trackEl = thumbEl.parentElement;
1900
+ const trackRect = trackEl.getBoundingClientRect();
1901
+ // 更新偏移
1902
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
1903
+ }
1904
+ };
1905
+ const cleatPointerThumbEvent = (evnt) => {
1906
+ const thumbEl = evnt.currentTarget;
1907
+ thumbEl.releasePointerCapture(evnt.pointerId);
1908
+ internalData.isThumbDrag = false;
1909
+ };
1910
+ const pointerdownThumbYEvent = (evnt) => {
1911
+ const thumbEl = evnt.currentTarget;
1912
+ internalData.isThumbDrag = true;
1913
+ thumbEl.setPointerCapture(evnt.pointerId);
1914
+ const viewEl = refVirtualWrapper.value;
1915
+ if (!viewEl) {
1916
+ return;
1917
+ }
1918
+ const { yThumbHeight } = reactData;
1919
+ const trackEl = thumbEl.parentElement;
1920
+ const trackRect = trackEl.getBoundingClientRect();
1921
+ const pointerPosition = evnt.clientY - trackRect.top;
1922
+ // 记录 thumb 的偏移
1923
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
1924
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
1925
+ };
1926
+ const pointermoveThumbYEvent = (evnt) => {
1927
+ const thumbEl = evnt.currentTarget;
1928
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
1929
+ return;
1930
+ }
1931
+ const { isThumbDrag, thumbDragOffset } = internalData;
1932
+ if (isThumbDrag) {
1933
+ const viewEl = refVirtualWrapper.value;
1934
+ if (!viewEl) {
1935
+ return;
1936
+ }
1937
+ const { yThumbHeight } = reactData;
1938
+ const thumbEl = evnt.currentTarget;
1939
+ const trackEl = thumbEl.parentElement;
1940
+ const trackRect = trackEl.getBoundingClientRect();
1941
+ // 更新偏移
1942
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
1943
+ }
1944
+ };
1710
1945
  Object.assign($xeList, listMethods, listPrivateMethods);
1711
1946
  const renderDragTip = () => {
1712
1947
  const { dragRow, dragTipText } = reactData;
@@ -1903,7 +2138,7 @@ export default defineVxeComponent({
1903
2138
  }], rowid: hasKey && keyField ? rowid : undefined }, rowOns), ctVNs);
1904
2139
  };
1905
2140
  const renderVN = () => {
1906
- const { showCheckbox, className, loading } = props;
2141
+ const { showCheckbox, className, loading, useScrollbar } = props;
1907
2142
  const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
1908
2143
  const defaultSlot = slots.default;
1909
2144
  const headerSlot = slots.header;
@@ -1919,6 +2154,9 @@ export default defineVxeComponent({
1919
2154
  const rowOpts = computeRowOpts.value;
1920
2155
  const { isHover, padding } = rowOpts;
1921
2156
  const isDrag = computeIsDrag.value;
2157
+ const scrollbarXOpts = computeScrollbarXOpts.value;
2158
+ const scrollbarYOpts = computeScrollbarYOpts.value;
2159
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
1922
2160
  const showDefChekboxHead = showCheckbox && showHeader !== false;
1923
2161
  const leOns = {};
1924
2162
  if (isCrossListDrag && !rowList.length) {
@@ -1926,6 +2164,9 @@ export default defineVxeComponent({
1926
2164
  }
1927
2165
  return h('div', Object.assign({ ref: refElem, class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
1928
2166
  [`size--${vSize}`]: vSize,
2167
+ 'is--virtual-scrollbar': useScrollbar,
2168
+ 'ov-x--auto-hide': useScrollbar && scrollbarXOpts.autoHide,
2169
+ 'ov-y--auto-hide': useScrollbar && scrollbarYOpts.autoHide,
1929
2170
  'is--drag': isDrag,
1930
2171
  'is--loading': loading
1931
2172
  }], style: wrapperStyles }, leOns), [
@@ -1985,7 +2226,15 @@ export default defineVxeComponent({
1985
2226
  style: {
1986
2227
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
1987
2228
  }
1988
- }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => renderRow(row, i)))
2229
+ }, useScrollbar
2230
+ ? (defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => renderRow(row, i)))
2231
+ : [
2232
+ h('div', {
2233
+ key: 'vi',
2234
+ ref: refViewInnerElem,
2235
+ class: 'vxe-scrollbar--view-inner'
2236
+ }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => renderRow(row, i)))
2237
+ ])
1989
2238
  ]),
1990
2239
  footerSlot
1991
2240
  ? h('div', {
@@ -1993,6 +2242,49 @@ export default defineVxeComponent({
1993
2242
  class: 'vxe-list--footer-wrapper'
1994
2243
  }, footerSlot({ items: rowList, $list: $xeList }))
1995
2244
  : renderEmptyElement($xeList),
2245
+ /**
2246
+ * 滚动条
2247
+ */
2248
+ useScrollbar
2249
+ ? h('div', {
2250
+ class: scrollbarWrapperClss
2251
+ }, [
2252
+ scrollbarXOpts.visible === 'hidden'
2253
+ ? renderEmptyElement($xeList)
2254
+ : h('div', {
2255
+ ref: refTrackXElem,
2256
+ class: 'vxe-scrollbar--track-x',
2257
+ onClick: clickTrackXEvent
2258
+ }, [
2259
+ h('div', {
2260
+ ref: refThumbXElem,
2261
+ class: 'vxe-scrollbar--thumb-x',
2262
+ onPointerdown: pointerdownThumbXEvent,
2263
+ onPointermove: pointermoveThumbXEvent,
2264
+ onPointerup: cleatPointerThumbEvent,
2265
+ onPointercancel: cleatPointerThumbEvent,
2266
+ onLostpointercapture: cleatPointerThumbEvent
2267
+ })
2268
+ ]),
2269
+ scrollbarYOpts.visible === 'hidden'
2270
+ ? renderEmptyElement($xeList)
2271
+ : h('div', {
2272
+ ref: refTrackYElem,
2273
+ class: 'vxe-scrollbar--track-y',
2274
+ onClick: clickTrackYEvent
2275
+ }, [
2276
+ h('div', {
2277
+ ref: refThumbYElem,
2278
+ class: 'vxe-scrollbar--thumb-y',
2279
+ onPointerdown: pointerdownThumbYEvent,
2280
+ onPointermove: pointermoveThumbYEvent,
2281
+ onPointerup: cleatPointerThumbEvent,
2282
+ onPointercancel: cleatPointerThumbEvent,
2283
+ onLostpointercapture: cleatPointerThumbEvent
2284
+ })
2285
+ ])
2286
+ ])
2287
+ : renderEmptyElement($xeList),
1996
2288
  /**
1997
2289
  * 拖拽提示
1998
2290
  */
@@ -2048,13 +2340,15 @@ export default defineVxeComponent({
2048
2340
  updateCheckboxModeValue();
2049
2341
  });
2050
2342
  onActivated(() => {
2051
- recalculate().then(() => refreshScroll());
2343
+ recalculate().then(() => {
2344
+ refreshScroll();
2345
+ });
2052
2346
  });
2053
2347
  nextTick(() => {
2054
2348
  loadData(props.data || []);
2055
2349
  });
2056
2350
  onMounted(() => {
2057
- const { showSeq, showRadio, showCheckbox } = props;
2351
+ const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props;
2058
2352
  const rowOpts = computeRowOpts.value;
2059
2353
  const { useKey } = rowOpts;
2060
2354
  const isDrag = computeIsDrag.value;
@@ -2076,17 +2370,27 @@ export default defineVxeComponent({
2076
2370
  if (useKey && !keyField) {
2077
2371
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
2078
2372
  }
2079
- if (props.autoResize) {
2373
+ if (useScrollbar || autoResize) {
2080
2374
  const el = refElem.value;
2081
- const resizeObserver = globalResize.create(() => recalculate());
2375
+ const viewInnerEl = refViewInnerElem.value;
2376
+ const resizeObserver = globalResize.create(() => {
2377
+ reFlag.value++;
2378
+ });
2082
2379
  resizeObserver.observe(el);
2083
- if (el) {
2084
- resizeObserver.observe(el.parentElement);
2380
+ if (autoResize) {
2381
+ if (el) {
2382
+ resizeObserver.observe(el.parentElement);
2383
+ }
2384
+ }
2385
+ if (viewInnerEl) {
2386
+ resizeObserver.observe(viewInnerEl);
2085
2387
  }
2086
2388
  internalData.resizeObserver = resizeObserver;
2087
2389
  }
2088
- recalculate();
2089
- globalEvents.on($xeList, 'resize', recalculate);
2390
+ reFlag.value++;
2391
+ globalEvents.on($xeList, 'resize', () => {
2392
+ reFlag.value++;
2393
+ });
2090
2394
  });
2091
2395
  onBeforeUnmount(() => {
2092
2396
  const { resizeObserver } = internalData;
package/es/list/style.css CHANGED
@@ -374,4 +374,30 @@
374
374
  .vxe-list--radio-option .vxe-radio--label {
375
375
  padding-left: 0.4em;
376
376
  vertical-align: middle;
377
+ }
378
+
379
+ .vxe-list > .vxe-scrollbar {
380
+ position: unset;
381
+ }
382
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper {
383
+ scrollbar-width: none;
384
+ -ms-overflow-style: none;
385
+ }
386
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper::-webkit-scrollbar {
387
+ display: none;
388
+ }
389
+
390
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-x {
391
+ opacity: 1;
392
+ }
393
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-x {
394
+ opacity: 0;
395
+ transition: opacity 0.8s ease-in-out;
396
+ }
397
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-y {
398
+ opacity: 1;
399
+ }
400
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-y {
401
+ opacity: 0;
402
+ transition: opacity 0.8s ease-in-out;
377
403
  }
@@ -1 +1 @@
1
- @charset "UTF-8";.vxe-list{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-default);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-default)}.vxe-list.size--medium{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-medium);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-medium)}.vxe-list.size--small{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-small);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-small)}.vxe-list.size--mini{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-mini);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-mini)}.vxe-list{position:relative;display:block;padding:0;font-size:var(--vxe-ui-list-current-font-size);color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family);direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow-x:auto;overflow-y:auto;outline:0}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--header-wrapper{display:flex;flex-direction:row;align-items:center;min-height:var(--vxe-ui-list-row-height)}.vxe-list--header-left{display:flex;flex-direction:row;align-items:center;flex-shrink:0}.vxe-list--header-content{flex-grow:1;overflow:auto}.vxe-list--body.trigger--row>.vxe-list--row:not(.is--drag-disabled):active{cursor:grabbing}.vxe-list--body.is--padding>.vxe-list--row{padding:0 var(--vxe-ui-list-current-padding)}.vxe-list--body.checkbox--highlight .vxe-list--row.is-checkbox--checked{background-color:var(--vxe-ui-list-row-checkbox-checked-background-color)}.vxe-list--body.radio--highlight .vxe-list--row.is-radio--checked{background-color:var(--vxe-ui-list-row-radio-checked-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover{background-color:var(--vxe-ui-list-row-hover-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover.is--current{background-color:var(--vxe-ui-list-row-hover-current-background-color)}.vxe-list--body.row--hover.radio--highlight .vxe-list--row.is-radio--checked:hover{background-color:var(--vxe-ui-list-row-hover-radio-checked-background-color)}.vxe-list--body.row--hover.checkbox--highlight .vxe-list--row.is-checkbox--checked:hover{background-color:var(--vxe-ui-list-row-hover-checkbox-checked-background-color)}.vxe-list--row.is--current{background-color:var(--vxe-ui-list-row-current-background-color)}.vxe-list--virtual-wrapper{height:100px}.vxe-list--row{display:flex;flex-direction:row;align-items:center}.vxe-list--row-content,.vxe-list--row-drag,.vxe-list--row-extra{display:flex;flex-direction:row;align-items:center}.vxe-list--row-drag{flex-shrink:0;padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--row-content{flex-grow:1;height:var(--vxe-ui-list-row-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--row-extra{flex-shrink:0}.vxe-list--drag-handle:not(.is--disabled){cursor:grab}.vxe-list--drag-handle:not(.is--disabled):active{cursor:grabbing}.vxe-list--drag-handle:not(.is--disabled):hover{color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-handle.is--disabled{color:var(--vxe-ui-input-disabled-color);cursor:not-allowed}.vxe-list--row.row--drag-move{transition:transform .5s ease}.vxe-list--row.row--drag-origin{opacity:.3}.vxe-list--drag-row-line{display:none;position:absolute;top:0;left:0;z-index:11;pointer-events:none}.vxe-list--drag-row-line{width:100%;height:1px;border:2px solid transparent}.vxe-list--drag-row-line[drag-pos=top]{border-top-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-pos=bottom]{border-bottom-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-to-child=y]{border-top-color:transparent;border-bottom-color:transparent;border-left-color:var(--vxe-ui-status-success-color)}.vxe-list--drag-row-line.is--guides{background-color:var(--vxe-ui-list-drag-over-background-color)}.vxe-body--row-list-move{transition-property:transform;transition-duration:.35s}.vxe-list--drag-sort-tip{display:none;position:absolute;top:0;left:0;padding:.6em 1.4em;max-width:50%;min-width:100px;border-radius:var(--vxe-ui-border-radius);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;background-color:var(--vxe-ui-layout-background-color);box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:33}.vxe-list--drag-sort-tip[drag-status=normal] .vxe-list--drag-sort-tip-normal-status{display:block}.vxe-list--drag-sort-tip[drag-status=sub] .vxe-list--drag-sort-tip-sub-status{display:block}.vxe-list--drag-sort-tip[drag-status=disabled] .vxe-list--drag-sort-tip-disabled-status{display:block}.vxe-list--drag-sort-tip-wrapper{display:flex;flex-direction:row;align-items:center}.vxe-list--drag-sort-tip-status{padding-right:.4em}.vxe-list--drag-sort-tip-disabled-status{display:none;flex-shrink:0;color:var(--vxe-ui-status-error-color)}.vxe-list--drag-sort-tip-normal-status,.vxe-list--drag-sort-tip-sub-status{display:none}.vxe-list--drag-sort-tip-content{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--checkbox-header{padding-right:var(--vxe-ui-list-current-padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header{cursor:pointer}.vxe-list--checkbox-header .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-header .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header.is--checked,.vxe-list--checkbox-header.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-header.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--hidden{cursor:default}.vxe-list--checkbox-header.is--readonly{cursor:auto}.vxe-list--checkbox-header.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-header.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-header .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--checkbox-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--checkbox-option{cursor:pointer}.vxe-list--checkbox-option .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-option .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-option.is--checked,.vxe-list--checkbox-option.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-option.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--hidden{cursor:default}.vxe-list--checkbox-option.is--readonly{cursor:auto}.vxe-list--checkbox-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-option.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-option .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--radio-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--radio-option{cursor:pointer}.vxe-list--radio-option .vxe-radio--icon{font-size:1.26em;transition:all .2s ease-in-out}.vxe-list--radio-option .vxe-radio--icon{color:var(--vxe-ui-input-border-color);border-radius:50%;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--radio-option.is--checked{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--checked .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option:not(.is--disabled):hover .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--readonly{cursor:auto}.vxe-list--radio-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--radio-option.is--disabled .vxe-radio--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--radio-option .vxe-radio--label{padding-left:.4em;vertical-align:middle}
1
+ @charset "UTF-8";.vxe-list{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-default);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-default)}.vxe-list.size--medium{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-medium);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-medium)}.vxe-list.size--small{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-small);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-small)}.vxe-list.size--mini{--vxe-ui-list-current-font-size:var(--vxe-ui-font-size-mini);--vxe-ui-list-current-padding:var(--vxe-ui-layout-padding-mini)}.vxe-list{position:relative;display:block;padding:0;font-size:var(--vxe-ui-list-current-font-size);color:var(--vxe-ui-font-color);font-family:var(--vxe-ui-font-family);direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow-x:auto;overflow-y:auto;outline:0}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--header-wrapper{display:flex;flex-direction:row;align-items:center;min-height:var(--vxe-ui-list-row-height)}.vxe-list--header-left{display:flex;flex-direction:row;align-items:center;flex-shrink:0}.vxe-list--header-content{flex-grow:1;overflow:auto}.vxe-list--body.trigger--row>.vxe-list--row:not(.is--drag-disabled):active{cursor:grabbing}.vxe-list--body.is--padding>.vxe-list--row{padding:0 var(--vxe-ui-list-current-padding)}.vxe-list--body.checkbox--highlight .vxe-list--row.is-checkbox--checked{background-color:var(--vxe-ui-list-row-checkbox-checked-background-color)}.vxe-list--body.radio--highlight .vxe-list--row.is-radio--checked{background-color:var(--vxe-ui-list-row-radio-checked-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover{background-color:var(--vxe-ui-list-row-hover-background-color)}.vxe-list--body.row--hover .vxe-list--row:hover.is--current{background-color:var(--vxe-ui-list-row-hover-current-background-color)}.vxe-list--body.row--hover.radio--highlight .vxe-list--row.is-radio--checked:hover{background-color:var(--vxe-ui-list-row-hover-radio-checked-background-color)}.vxe-list--body.row--hover.checkbox--highlight .vxe-list--row.is-checkbox--checked:hover{background-color:var(--vxe-ui-list-row-hover-checkbox-checked-background-color)}.vxe-list--row.is--current{background-color:var(--vxe-ui-list-row-current-background-color)}.vxe-list--virtual-wrapper{height:100px}.vxe-list--row{display:flex;flex-direction:row;align-items:center}.vxe-list--row-content,.vxe-list--row-drag,.vxe-list--row-extra{display:flex;flex-direction:row;align-items:center}.vxe-list--row-drag{flex-shrink:0;padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--row-content{flex-grow:1;height:var(--vxe-ui-list-row-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--row-extra{flex-shrink:0}.vxe-list--drag-handle:not(.is--disabled){cursor:grab}.vxe-list--drag-handle:not(.is--disabled):active{cursor:grabbing}.vxe-list--drag-handle:not(.is--disabled):hover{color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-handle.is--disabled{color:var(--vxe-ui-input-disabled-color);cursor:not-allowed}.vxe-list--row.row--drag-move{transition:transform .5s ease}.vxe-list--row.row--drag-origin{opacity:.3}.vxe-list--drag-row-line{display:none;position:absolute;top:0;left:0;z-index:11;pointer-events:none}.vxe-list--drag-row-line{width:100%;height:1px;border:2px solid transparent}.vxe-list--drag-row-line[drag-pos=top]{border-top-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-pos=bottom]{border-bottom-color:var(--vxe-ui-font-primary-color)}.vxe-list--drag-row-line[drag-to-child=y]{border-top-color:transparent;border-bottom-color:transparent;border-left-color:var(--vxe-ui-status-success-color)}.vxe-list--drag-row-line.is--guides{background-color:var(--vxe-ui-list-drag-over-background-color)}.vxe-body--row-list-move{transition-property:transform;transition-duration:.35s}.vxe-list--drag-sort-tip{display:none;position:absolute;top:0;left:0;padding:.6em 1.4em;max-width:50%;min-width:100px;border-radius:var(--vxe-ui-border-radius);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;background-color:var(--vxe-ui-layout-background-color);box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:33}.vxe-list--drag-sort-tip[drag-status=normal] .vxe-list--drag-sort-tip-normal-status{display:block}.vxe-list--drag-sort-tip[drag-status=sub] .vxe-list--drag-sort-tip-sub-status{display:block}.vxe-list--drag-sort-tip[drag-status=disabled] .vxe-list--drag-sort-tip-disabled-status{display:block}.vxe-list--drag-sort-tip-wrapper{display:flex;flex-direction:row;align-items:center}.vxe-list--drag-sort-tip-status{padding-right:.4em}.vxe-list--drag-sort-tip-disabled-status{display:none;flex-shrink:0;color:var(--vxe-ui-status-error-color)}.vxe-list--drag-sort-tip-normal-status,.vxe-list--drag-sort-tip-sub-status{display:none}.vxe-list--drag-sort-tip-content{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-list--checkbox-header{padding-right:var(--vxe-ui-list-current-padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header{cursor:pointer}.vxe-list--checkbox-header .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-header .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-header.is--checked,.vxe-list--checkbox-header.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-header.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-header.is--hidden{cursor:default}.vxe-list--checkbox-header.is--readonly{cursor:auto}.vxe-list--checkbox-header.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-header.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-header .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--checkbox-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--checkbox-option{cursor:pointer}.vxe-list--checkbox-option .vxe-checkbox--icon{font-size:1.22em;transition:all .2s ease-in-out}.vxe-list--checkbox-option .vxe-checkbox--icon{color:var(--vxe-ui-input-border-color);vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--checkbox-option.is--checked,.vxe-list--checkbox-option.is--indeterminate{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--checked .vxe-checkbox--icon,.vxe-list--checkbox-option.is--indeterminate .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option:not(.is--disabled):hover .vxe-checkbox--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--checkbox-option.is--hidden{cursor:default}.vxe-list--checkbox-option.is--readonly{cursor:auto}.vxe-list--checkbox-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--checkbox-option.is--disabled .vxe-checkbox--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--checkbox-option .vxe-checkbox--label{padding-left:.4em;vertical-align:middle}.vxe-list--radio-option{padding-right:var(--vxe-ui-list-current-padding)}.vxe-list--radio-option{cursor:pointer}.vxe-list--radio-option .vxe-radio--icon{font-size:1.26em;transition:all .2s ease-in-out}.vxe-list--radio-option .vxe-radio--icon{color:var(--vxe-ui-input-border-color);border-radius:50%;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-list--radio-option.is--checked{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--checked .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option:not(.is--disabled):hover .vxe-radio--icon{color:var(--vxe-ui-font-primary-color)}.vxe-list--radio-option.is--readonly{cursor:auto}.vxe-list--radio-option.is--disabled{color:var(--vxe-ui-font-disabled-color);cursor:not-allowed}.vxe-list--radio-option.is--disabled .vxe-radio--icon{color:var(--vxe-ui-input-disabled-color)}.vxe-list--radio-option .vxe-radio--label{padding-left:.4em;vertical-align:middle}.vxe-list>.vxe-scrollbar{position:unset}.vxe-list.is--virtual-scrollbar>.vxe-list--virtual-wrapper{scrollbar-width:none;-ms-overflow-style:none}.vxe-list.is--virtual-scrollbar>.vxe-list--virtual-wrapper::-webkit-scrollbar{display:none}.vxe-list.is--virtual-scrollbar.ov-x--auto-hide:hover>.vxe-scrollbar>.vxe-scrollbar--track-x{opacity:1}.vxe-list.is--virtual-scrollbar.ov-x--auto-hide>.vxe-scrollbar>.vxe-scrollbar--track-x{opacity:0;transition:opacity .8s ease-in-out}.vxe-list.is--virtual-scrollbar.ov-y--auto-hide:hover>.vxe-scrollbar>.vxe-scrollbar--track-y{opacity:1}.vxe-list.is--virtual-scrollbar.ov-y--auto-hide>.vxe-scrollbar>.vxe-scrollbar--track-y{opacity:0;transition:opacity .8s ease-in-out}
@@ -243,6 +243,9 @@ export default defineVxeComponent({
243
243
  if (!viewEl) {
244
244
  return;
245
245
  }
246
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
247
+ return;
248
+ }
246
249
  const trackXEl = refTrackXElem.value;
247
250
  const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
248
251
  const thumbXElem = refThumbXElem.value;
@@ -263,6 +266,9 @@ export default defineVxeComponent({
263
266
  if (!viewEl) {
264
267
  return;
265
268
  }
269
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
270
+ return;
271
+ }
266
272
  const { xThumbWidth, yThumbHeight } = reactData;
267
273
  const trackXEl = refTrackXElem.value;
268
274
  const thumbXElem = refThumbXElem.value;
@@ -552,7 +558,9 @@ export default defineVxeComponent({
552
558
  reFlag.value++;
553
559
  });
554
560
  watch(reFlag, () => {
555
- $xeScrollbar.recalculate();
561
+ $xeScrollbar.recalculate().then(() => {
562
+ $xeScrollbar.recalculate();
563
+ });
556
564
  });
557
565
  onMounted(() => {
558
566
  const { autoResize } = props;
@@ -1,5 +1,4 @@
1
1
  .vxe-scrollbar {
2
- width: 100%;
3
2
  position: relative;
4
3
  }
5
4
  .vxe-scrollbar.is--virtual > .vxe-scrollbar--view {
@@ -37,6 +36,7 @@
37
36
  .vxe-scrollbar.is--native > .vxe-scrollbar--view::-webkit-scrollbar-thumb:active {
38
37
  background-color: var(--vxe-ui-scrollbar-thumb-active-background-color);
39
38
  }
39
+
40
40
  .vxe-scrollbar.ov-x--hidden > .vxe-scrollbar--view {
41
41
  overflow-x: hidden;
42
42
  }
@@ -56,6 +56,7 @@
56
56
  display: none;
57
57
  position: absolute;
58
58
  background-color: var(--vxe-ui-scrollbar-track-background-color);
59
+ overflow: hidden;
59
60
  -webkit-user-select: none;
60
61
  -moz-user-select: none;
61
62
  user-select: none;
@@ -107,16 +108,16 @@
107
108
  left: var(--vxe-ui-scrollbar-y-width);
108
109
  }
109
110
 
110
- .vxe-scrollbar.is--padding.sx-pos--top {
111
+ .vxe-scrollbar.is--padding.overflow-x.sx-pos--top {
111
112
  padding-top: var(--vxe-ui-scrollbar-x-height);
112
113
  }
113
- .vxe-scrollbar.is--padding.sx-pos--bottom {
114
+ .vxe-scrollbar.is--padding.overflow-x.sx-pos--bottom {
114
115
  padding-bottom: var(--vxe-ui-scrollbar-x-height);
115
116
  }
116
- .vxe-scrollbar.is--padding.sy-pos--left {
117
+ .vxe-scrollbar.is--padding.overflow-y.sy-pos--left {
117
118
  padding-left: var(--vxe-ui-scrollbar-y-width);
118
119
  }
119
- .vxe-scrollbar.is--padding.sy-pos--right {
120
+ .vxe-scrollbar.is--padding.overflow-y.sy-pos--right {
120
121
  padding-right: var(--vxe-ui-scrollbar-y-width);
121
122
  }
122
123
 
@@ -1 +1 @@
1
- .vxe-scrollbar{width:100%;position:relative}.vxe-scrollbar.is--virtual>.vxe-scrollbar--view{scrollbar-width:none;-ms-overflow-style:none}.vxe-scrollbar.is--virtual>.vxe-scrollbar--view::-webkit-scrollbar{display:none}.vxe-scrollbar.is--virtual.ov-x--auto-hide:hover>.vxe-scrollbar--track-x{opacity:1}.vxe-scrollbar.is--virtual.ov-x--auto-hide>.vxe-scrollbar--track-x{opacity:0;transition:opacity .8s ease-in-out}.vxe-scrollbar.is--virtual.ov-y--auto-hide:hover>.vxe-scrollbar--track-y{opacity:1}.vxe-scrollbar.is--virtual.ov-y--auto-hide>.vxe-scrollbar--track-y{opacity:0;transition:opacity .8s ease-in-out}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar{width:var(--vxe-ui-scrollbar-y-width);height:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb{border-radius:var(--vxe-ui-base-border-radius);background-color:var(--vxe-ui-scrollbar-thumb-background-color)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb:hover{background-color:var(--vxe-ui-scrollbar-thumb-hover-background-color)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb:active{background-color:var(--vxe-ui-scrollbar-thumb-active-background-color)}.vxe-scrollbar.ov-x--hidden>.vxe-scrollbar--view{overflow-x:hidden}.vxe-scrollbar.ov-y--hidden>.vxe-scrollbar--view{overflow-y:hidden}.vxe-scrollbar--view{height:100%;width:100%;overflow-x:auto;overflow-y:auto}.vxe-scrollbar--track-x,.vxe-scrollbar--track-y{display:none;position:absolute;background-color:var(--vxe-ui-scrollbar-track-background-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-scrollbar.overflow-x>.vxe-scrollbar--track-x{display:block}.vxe-scrollbar.overflow-y>.vxe-scrollbar--track-y{display:block}.vxe-scrollbar--track-x{width:100%;left:0;height:var(--vxe-ui-scrollbar-x-height);padding:var(--vxe-ui-scrollbar-track-padding) 0}.vxe-scrollbar--track-y{height:100%;top:0;width:var(--vxe-ui-scrollbar-y-width);padding:0 var(--vxe-ui-scrollbar-track-padding)}.vxe-scrollbar.sx-pos--top>.vxe-scrollbar--track-x{top:0}.vxe-scrollbar.sx-pos--bottom>.vxe-scrollbar--track-x{bottom:0}.vxe-scrollbar.sy-pos--left>.vxe-scrollbar--track-y{left:0}.vxe-scrollbar.sy-pos--right>.vxe-scrollbar--track-y{right:0}.vxe-scrollbar.overflow-x.overflow-y>.vxe-scrollbar--track-x{width:calc(100% - var(--vxe-ui-scrollbar-x-height))}.vxe-scrollbar.overflow-x.overflow-y>.vxe-scrollbar--track-y{height:calc(100% - var(--vxe-ui-scrollbar-y-width))}.vxe-scrollbar.overflow-x.overflow-y.sx-pos--top.sy-pos--left>.vxe-scrollbar--track-y,.vxe-scrollbar.overflow-x.overflow-y.sx-pos--top.sy-pos--right>.vxe-scrollbar--track-y{top:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.overflow-x.overflow-y.sy-pos--left.sx-pos--bottom>.vxe-scrollbar--track-x,.vxe-scrollbar.overflow-x.overflow-y.sy-pos--left.sx-pos--top>.vxe-scrollbar--track-x{left:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar.is--padding.sx-pos--top{padding-top:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--padding.sx-pos--bottom{padding-bottom:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--padding.sy-pos--left{padding-left:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar.is--padding.sy-pos--right{padding-right:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar--thumb-y{width:100%}.vxe-scrollbar--thumb-x{height:100%}.vxe-scrollbar--thumb-x,.vxe-scrollbar--thumb-y{border-radius:var(--vxe-ui-scrollbar-thumb-border-radius);background-color:var(--vxe-ui-scrollbar-thumb-background-color)}.vxe-scrollbar--thumb-x:hover,.vxe-scrollbar--thumb-y:hover{background-color:var(--vxe-ui-scrollbar-thumb-hover-background-color)}.vxe-scrollbar--thumb-x:active,.vxe-scrollbar--thumb-y:active{background-color:var(--vxe-ui-scrollbar-thumb-active-background-color)}
1
+ .vxe-scrollbar{position:relative}.vxe-scrollbar.is--virtual>.vxe-scrollbar--view{scrollbar-width:none;-ms-overflow-style:none}.vxe-scrollbar.is--virtual>.vxe-scrollbar--view::-webkit-scrollbar{display:none}.vxe-scrollbar.is--virtual.ov-x--auto-hide:hover>.vxe-scrollbar--track-x{opacity:1}.vxe-scrollbar.is--virtual.ov-x--auto-hide>.vxe-scrollbar--track-x{opacity:0;transition:opacity .8s ease-in-out}.vxe-scrollbar.is--virtual.ov-y--auto-hide:hover>.vxe-scrollbar--track-y{opacity:1}.vxe-scrollbar.is--virtual.ov-y--auto-hide>.vxe-scrollbar--track-y{opacity:0;transition:opacity .8s ease-in-out}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar{width:var(--vxe-ui-scrollbar-y-width);height:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb{border-radius:var(--vxe-ui-base-border-radius);background-color:var(--vxe-ui-scrollbar-thumb-background-color)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb:hover{background-color:var(--vxe-ui-scrollbar-thumb-hover-background-color)}.vxe-scrollbar.is--native>.vxe-scrollbar--view::-webkit-scrollbar-thumb:active{background-color:var(--vxe-ui-scrollbar-thumb-active-background-color)}.vxe-scrollbar.ov-x--hidden>.vxe-scrollbar--view{overflow-x:hidden}.vxe-scrollbar.ov-y--hidden>.vxe-scrollbar--view{overflow-y:hidden}.vxe-scrollbar--view{height:100%;width:100%;overflow-x:auto;overflow-y:auto}.vxe-scrollbar--track-x,.vxe-scrollbar--track-y{display:none;position:absolute;background-color:var(--vxe-ui-scrollbar-track-background-color);overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vxe-scrollbar.overflow-x>.vxe-scrollbar--track-x{display:block}.vxe-scrollbar.overflow-y>.vxe-scrollbar--track-y{display:block}.vxe-scrollbar--track-x{width:100%;left:0;height:var(--vxe-ui-scrollbar-x-height);padding:var(--vxe-ui-scrollbar-track-padding) 0}.vxe-scrollbar--track-y{height:100%;top:0;width:var(--vxe-ui-scrollbar-y-width);padding:0 var(--vxe-ui-scrollbar-track-padding)}.vxe-scrollbar.sx-pos--top>.vxe-scrollbar--track-x{top:0}.vxe-scrollbar.sx-pos--bottom>.vxe-scrollbar--track-x{bottom:0}.vxe-scrollbar.sy-pos--left>.vxe-scrollbar--track-y{left:0}.vxe-scrollbar.sy-pos--right>.vxe-scrollbar--track-y{right:0}.vxe-scrollbar.overflow-x.overflow-y>.vxe-scrollbar--track-x{width:calc(100% - var(--vxe-ui-scrollbar-x-height))}.vxe-scrollbar.overflow-x.overflow-y>.vxe-scrollbar--track-y{height:calc(100% - var(--vxe-ui-scrollbar-y-width))}.vxe-scrollbar.overflow-x.overflow-y.sx-pos--top.sy-pos--left>.vxe-scrollbar--track-y,.vxe-scrollbar.overflow-x.overflow-y.sx-pos--top.sy-pos--right>.vxe-scrollbar--track-y{top:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.overflow-x.overflow-y.sy-pos--left.sx-pos--bottom>.vxe-scrollbar--track-x,.vxe-scrollbar.overflow-x.overflow-y.sy-pos--left.sx-pos--top>.vxe-scrollbar--track-x{left:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar.is--padding.overflow-x.sx-pos--top{padding-top:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--padding.overflow-x.sx-pos--bottom{padding-bottom:var(--vxe-ui-scrollbar-x-height)}.vxe-scrollbar.is--padding.overflow-y.sy-pos--left{padding-left:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar.is--padding.overflow-y.sy-pos--right{padding-right:var(--vxe-ui-scrollbar-y-width)}.vxe-scrollbar--thumb-y{width:100%}.vxe-scrollbar--thumb-x{height:100%}.vxe-scrollbar--thumb-x,.vxe-scrollbar--thumb-y{border-radius:var(--vxe-ui-scrollbar-thumb-border-radius);background-color:var(--vxe-ui-scrollbar-thumb-background-color)}.vxe-scrollbar--thumb-x:hover,.vxe-scrollbar--thumb-y:hover{background-color:var(--vxe-ui-scrollbar-thumb-hover-background-color)}.vxe-scrollbar--thumb-x:active,.vxe-scrollbar--thumb-y:active{background-color:var(--vxe-ui-scrollbar-thumb-active-background-color)}