vxe-pc-ui 3.19.7 → 3.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 (97) hide show
  1. package/es/card/src/card.js +48 -11
  2. package/es/card/style.css +42 -44
  3. package/es/card/style.min.css +1 -1
  4. package/es/icon/style.css +1 -1
  5. package/es/list/src/list.js +360 -19
  6. package/es/list/style.css +26 -0
  7. package/es/list/style.min.css +1 -1
  8. package/es/scrollbar/src/scrollbar.js +6 -0
  9. package/es/scrollbar/style.css +6 -5
  10. package/es/scrollbar/style.min.css +1 -1
  11. package/es/style.css +1 -1
  12. package/es/style.min.css +1 -1
  13. package/es/tabs/src/tabs.js +35 -8
  14. package/es/tabs/style.css +4 -2
  15. package/es/tabs/style.min.css +1 -1
  16. package/es/tree/src/tree.js +6 -2
  17. package/es/ui/index.js +1 -1
  18. package/es/ui/src/log.js +1 -1
  19. package/es/ui/src/utils.js +9 -0
  20. package/es/vxe-card/style.css +42 -44
  21. package/es/vxe-card/style.min.css +1 -1
  22. package/es/vxe-list/style.css +26 -0
  23. package/es/vxe-list/style.min.css +1 -1
  24. package/es/vxe-scrollbar/style.css +6 -5
  25. package/es/vxe-scrollbar/style.min.css +1 -1
  26. package/es/vxe-tabs/style.css +4 -2
  27. package/es/vxe-tabs/style.min.css +1 -1
  28. package/lib/card/src/card.js +55 -5
  29. package/lib/card/src/card.min.js +1 -1
  30. package/lib/card/style/style.css +42 -44
  31. package/lib/card/style/style.min.css +1 -1
  32. package/lib/icon/style/style.css +1 -1
  33. package/lib/icon/style/style.min.css +1 -1
  34. package/lib/index.umd.js +5966 -5536
  35. package/lib/index.umd.min.js +1 -1
  36. package/lib/list/src/list.js +344 -20
  37. package/lib/list/src/list.min.js +1 -1
  38. package/lib/list/style/style.css +26 -0
  39. package/lib/list/style/style.min.css +1 -1
  40. package/lib/scrollbar/src/scrollbar.js +6 -0
  41. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  42. package/lib/scrollbar/style/style.css +6 -5
  43. package/lib/scrollbar/style/style.min.css +1 -1
  44. package/lib/style.css +1 -1
  45. package/lib/style.min.css +1 -1
  46. package/lib/tabs/src/tabs.js +45 -8
  47. package/lib/tabs/src/tabs.min.js +1 -1
  48. package/lib/tabs/style/style.css +4 -2
  49. package/lib/tabs/style/style.min.css +1 -1
  50. package/lib/tree/src/tree.js +4 -0
  51. package/lib/tree/src/tree.min.js +1 -1
  52. package/lib/ui/index.js +1 -1
  53. package/lib/ui/index.min.js +1 -1
  54. package/lib/ui/src/log.js +1 -1
  55. package/lib/ui/src/log.min.js +1 -1
  56. package/lib/ui/src/utils.js +10 -0
  57. package/lib/ui/src/utils.min.js +1 -1
  58. package/lib/vxe-card/style/style.css +42 -44
  59. package/lib/vxe-card/style/style.min.css +1 -1
  60. package/lib/vxe-list/style/style.css +26 -0
  61. package/lib/vxe-list/style/style.min.css +1 -1
  62. package/lib/vxe-scrollbar/style/style.css +6 -5
  63. package/lib/vxe-scrollbar/style/style.min.css +1 -1
  64. package/lib/vxe-tabs/style/style.css +4 -2
  65. package/lib/vxe-tabs/style/style.min.css +1 -1
  66. package/package.json +1 -1
  67. package/packages/card/src/card.ts +65 -11
  68. package/packages/list/src/list.ts +388 -21
  69. package/packages/scrollbar/src/scrollbar.ts +6 -0
  70. package/packages/tabs/src/tabs.ts +40 -8
  71. package/packages/tree/src/tree.ts +6 -2
  72. package/packages/ui/src/utils.ts +10 -0
  73. package/styles/components/card.scss +44 -58
  74. package/styles/components/list.scss +51 -0
  75. package/styles/components/scrollbar.scss +18 -11
  76. package/styles/components/tabs.scss +2 -1
  77. package/types/components/card.d.ts +11 -0
  78. package/types/components/grid.d.ts +37 -0
  79. package/types/components/layout-aside.d.ts +7 -1
  80. package/types/components/layout-body.d.ts +7 -1
  81. package/types/components/list.d.ts +24 -2
  82. package/types/components/menu.d.ts +6 -0
  83. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  84. package/types/components/table.d.ts +27 -4
  85. package/types/components/tabs.d.ts +11 -0
  86. /package/es/icon/{iconfont.1791794439953.ttf → iconfont.1791880407207.ttf} +0 -0
  87. /package/es/icon/{iconfont.1791794439953.woff → iconfont.1791880407207.woff} +0 -0
  88. /package/es/icon/{iconfont.1791794439953.woff2 → iconfont.1791880407207.woff2} +0 -0
  89. /package/es/{iconfont.1791794439953.ttf → iconfont.1791880407207.ttf} +0 -0
  90. /package/es/{iconfont.1791794439953.woff → iconfont.1791880407207.woff} +0 -0
  91. /package/es/{iconfont.1791794439953.woff2 → iconfont.1791880407207.woff2} +0 -0
  92. /package/lib/icon/style/{iconfont.1791794439953.ttf → iconfont.1791880407207.ttf} +0 -0
  93. /package/lib/icon/style/{iconfont.1791794439953.woff → iconfont.1791880407207.woff} +0 -0
  94. /package/lib/icon/style/{iconfont.1791794439953.woff2 → iconfont.1791880407207.woff2} +0 -0
  95. /package/lib/{iconfont.1791794439953.ttf → iconfont.1791880407207.ttf} +0 -0
  96. /package/lib/{iconfont.1791794439953.woff → iconfont.1791880407207.woff} +0 -0
  97. /package/lib/{iconfont.1791794439953.woff2 → iconfont.1791880407207.woff2} +0 -0
@@ -1,12 +1,13 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
- import { VxeUI, getConfig, getIcon, getI18n, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui';
3
+ import { VxeUI, getConfig, getIcon, getI18n, domUtils, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui';
4
4
  import { crossListDragRowGlobal, getCrossListDragRowInfo } from './store';
5
- import { addClass, getTpImg, isScale, removeClass, toCssUnit } from '../../ui/src/dom';
5
+ import { addClass, getTpImg, hasClass, isScale, removeClass, toCssUnit } from '../../ui/src/dom';
6
6
  import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils';
7
7
  import { getSlotVNs } from '../../ui/src/vn';
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');
@@ -40,6 +41,9 @@ function createReactData() {
40
41
  updateCheckboxFlag: 1,
41
42
  isAllChecked: false,
42
43
  isAllIndeterminate: false,
44
+ // 滚动条
45
+ yThumbHeight: 0,
46
+ xThumbWidth: 0,
43
47
  insertRowFlag: 1,
44
48
  removeRowFlag: 1,
45
49
  dragRow: null,
@@ -49,13 +53,18 @@ function createReactData() {
49
53
  }
50
54
  function createInternalData() {
51
55
  return {
52
- resizeObserver: undefined,
53
56
  fullData: [],
54
57
  afterList: [],
55
58
  fullKeyMaps: {},
56
59
  rowMaps: {},
57
- lastScrollLeft: 0,
60
+ // 滚动条
61
+ // resizeObserver: undefined,
62
+ // isThumbDrag: false,
63
+ thumbDragOffset: 0,
64
+ yThumbTop: 0,
65
+ xThumbLeft: 0,
58
66
  lastScrollTop: 0,
67
+ lastScrollLeft: 0,
59
68
  scrollYStore: {
60
69
  startIndex: 0,
61
70
  endIndex: 0,
@@ -111,7 +120,12 @@ export default {
111
120
  dragConfig: Object,
112
121
  menuConfig: Object,
113
122
  virtualYConfig: Object,
114
- scrollY: Object
123
+ scrollY: Object,
124
+ useScrollbar: {
125
+ type: Boolean,
126
+ default: () => getConfig().list.useScrollbar
127
+ },
128
+ scrollbarConfig: Object
115
129
  },
116
130
  data() {
117
131
  const xID = XEUtils.uniqueId();
@@ -171,11 +185,19 @@ export default {
171
185
  computeWrapperStyles() {
172
186
  const $xeList = this;
173
187
  const rowHeight = $xeList.computeRowHeight;
174
- const style = {};
188
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts;
189
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts;
190
+ const stys = {};
175
191
  if (rowHeight) {
176
- style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
192
+ stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight);
177
193
  }
178
- return style;
194
+ if (scrollbarYOpts.width) {
195
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(scrollbarYOpts.width);
196
+ }
197
+ if (scrollbarXOpts.height) {
198
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(scrollbarXOpts.height);
199
+ }
200
+ return stys;
179
201
  },
180
202
  computeVirtualStyles() {
181
203
  const $xeList = this;
@@ -192,6 +214,55 @@ export default {
192
214
  style.maxHeight = toCssUnit(Math.max(20, customMaxHeight - headHeight - footHeight));
193
215
  }
194
216
  return style;
217
+ },
218
+ computeScrollbarOpts() {
219
+ const $xeList = this;
220
+ const props = $xeList;
221
+ return Object.assign({}, getConfig().list.scrollbarConfig, props.scrollbarConfig);
222
+ },
223
+ computeScrollbarXOpts() {
224
+ const $xeList = this;
225
+ const scrollbarOpts = $xeList.computeScrollbarOpts;
226
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig);
227
+ },
228
+ computeScrollbarYOpts() {
229
+ const $xeList = this;
230
+ const scrollbarOpts = $xeList.computeScrollbarOpts;
231
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
232
+ },
233
+ computeScrollbarWrapperClss() {
234
+ const $xeList = this;
235
+ const reactData = $xeList.reactData;
236
+ const scrollbarOpts = $xeList.computeScrollbarOpts;
237
+ const { padding } = scrollbarOpts;
238
+ const { yThumbHeight, xThumbWidth } = reactData;
239
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts;
240
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts;
241
+ const scrollbarXToTop = $xeList.computeScrollbarXToTop;
242
+ const scrollbarYToLeft = $xeList.computeScrollbarYToLeft;
243
+ return domUtils.buildClass([
244
+ 'vxe-scrollbar is--virtual',
245
+ `ov-x--${scrollbarXOpts.visible || 'visible'}`,
246
+ `ov-y--${scrollbarYOpts.visible || 'visible'}`,
247
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
248
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
249
+ ], {
250
+ 'is--padding': padding,
251
+ 'ov-x--auto-hide': scrollbarXOpts.autoHide,
252
+ 'ov-y--auto-hide': scrollbarYOpts.autoHide,
253
+ 'overflow-y': yThumbHeight,
254
+ 'overflow-x': xThumbWidth
255
+ });
256
+ },
257
+ computeScrollbarXToTop() {
258
+ const $xeList = this;
259
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts;
260
+ return scrollbarXOpts.position === 'top';
261
+ },
262
+ computeScrollbarYToLeft() {
263
+ const $xeList = this;
264
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts;
265
+ return scrollbarYOpts.position === 'left';
195
266
  } }),
196
267
  methods: {
197
268
  //
@@ -518,6 +589,11 @@ export default {
518
589
  }
519
590
  });
520
591
  },
592
+ updateScrollbar() {
593
+ const $xeList = this;
594
+ $xeList.updateThumbSize();
595
+ $xeList.updateThumbOffset();
596
+ },
521
597
  /**
522
598
  * 重新计算列表
523
599
  */
@@ -526,13 +602,18 @@ export default {
526
602
  const reactData = $xeList.reactData;
527
603
  const el = $xeList.$refs.refElem;
528
604
  if (el) {
529
- const parentEl = el.parentElement;
605
+ let parentEl = el.parentElement;
530
606
  let parentHeight = 0;
607
+ // 如果是虚拟滚动条
608
+ if (parentEl && hasClass(parentEl, 'vxe-scrollbar--view-inner')) {
609
+ parentEl = parentEl.parentElement;
610
+ }
531
611
  if (parentEl) {
532
612
  const parentStyle = getComputedStyle(parentEl);
533
613
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight));
534
614
  }
535
615
  reactData.parentHeight = parentHeight;
616
+ $xeList.updateScrollbar();
536
617
  $xeList.updateHeight();
537
618
  if (el.clientWidth && el.clientHeight) {
538
619
  return $xeList.computeScrollLoad();
@@ -567,6 +648,7 @@ export default {
567
648
  const scrollLeft = scrollBodyElem.scrollLeft;
568
649
  const isX = scrollLeft !== internalData.lastScrollLeft;
569
650
  const isY = scrollTop !== internalData.lastScrollTop;
651
+ $xeList.updateThumbOffset();
570
652
  internalData.lastScrollTop = scrollTop;
571
653
  internalData.lastScrollLeft = scrollLeft;
572
654
  if (reactData.scrollYLoad) {
@@ -1823,6 +1905,186 @@ export default {
1823
1905
  }
1824
1906
  $xeList.dispatchEvent('row-menu', { row }, evnt);
1825
1907
  },
1908
+ // 滚动条
1909
+ updateThumbSize() {
1910
+ const $xeList = this;
1911
+ const reactData = $xeList.reactData;
1912
+ const viewEl = $xeList.$refs.refVirtualWrapper;
1913
+ if (!viewEl) {
1914
+ return;
1915
+ }
1916
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1917
+ return;
1918
+ }
1919
+ const trackXEl = $xeList.$refs.refTrackXElem;
1920
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
1921
+ const thumbXElem = $xeList.$refs.refThumbXElem;
1922
+ if (thumbXElem) {
1923
+ thumbXElem.style.width = xThumbWidth + 'px';
1924
+ }
1925
+ reactData.xThumbWidth = xThumbWidth;
1926
+ const trackYEl = $xeList.$refs.refTrackYElem;
1927
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
1928
+ const thumbYElem = $xeList.$refs.refThumbYElem;
1929
+ if (thumbYElem) {
1930
+ thumbYElem.style.height = yThumbHeight + 'px';
1931
+ }
1932
+ reactData.yThumbHeight = yThumbHeight;
1933
+ },
1934
+ updateThumbOffset() {
1935
+ const $xeList = this;
1936
+ const reactData = $xeList.reactData;
1937
+ const internalData = $xeList.internalData;
1938
+ const viewEl = $xeList.$refs.refVirtualWrapper;
1939
+ if (!viewEl) {
1940
+ return;
1941
+ }
1942
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
1943
+ return;
1944
+ }
1945
+ const { xThumbWidth, yThumbHeight } = reactData;
1946
+ const trackXEl = $xeList.$refs.refTrackXElem;
1947
+ const thumbXElem = $xeList.$refs.refThumbXElem;
1948
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
1949
+ internalData.xThumbLeft = xThumbLeft;
1950
+ if (thumbXElem && xThumbWidth) {
1951
+ thumbXElem.style.width = xThumbWidth + 'px';
1952
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
1953
+ }
1954
+ const trackYEl = $xeList.$refs.refTrackYElem;
1955
+ const thumbYElem = $xeList.$refs.refThumbYElem;
1956
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
1957
+ internalData.yThumbTop = yThumbTop;
1958
+ if (thumbYElem && yThumbHeight) {
1959
+ thumbYElem.style.height = yThumbHeight + 'px';
1960
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
1961
+ }
1962
+ },
1963
+ clickTrackXEvent(evnt) {
1964
+ const $xeList = this;
1965
+ const reactData = $xeList.reactData;
1966
+ const trackEl = evnt.currentTarget;
1967
+ if (trackEl !== evnt.target) {
1968
+ return;
1969
+ }
1970
+ const viewEl = $xeList.$refs.refVirtualWrapper;
1971
+ if (!viewEl) {
1972
+ return;
1973
+ }
1974
+ const { xThumbWidth } = reactData;
1975
+ const trackRect = trackEl.getBoundingClientRect();
1976
+ viewEl.scrollTo({
1977
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
1978
+ behavior: 'auto'
1979
+ });
1980
+ },
1981
+ clickTrackYEvent(evnt) {
1982
+ const $xeList = this;
1983
+ const reactData = $xeList.reactData;
1984
+ const trackEl = evnt.currentTarget;
1985
+ if (trackEl !== evnt.target) {
1986
+ return;
1987
+ }
1988
+ const viewEl = $xeList.$refs.refVirtualWrapper;
1989
+ if (!viewEl) {
1990
+ return;
1991
+ }
1992
+ const { yThumbHeight } = reactData;
1993
+ const trackRect = trackEl.getBoundingClientRect();
1994
+ viewEl.scrollTo({
1995
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
1996
+ behavior: 'auto'
1997
+ });
1998
+ },
1999
+ pointerdownThumbXEvent(evnt) {
2000
+ const $xeList = this;
2001
+ const reactData = $xeList.reactData;
2002
+ const internalData = $xeList.internalData;
2003
+ const thumbEl = evnt.currentTarget;
2004
+ internalData.isThumbDrag = true;
2005
+ thumbEl.setPointerCapture(evnt.pointerId);
2006
+ const viewEl = $xeList.$refs.refVirtualWrapper;
2007
+ if (!viewEl) {
2008
+ return;
2009
+ }
2010
+ const { xThumbWidth } = reactData;
2011
+ const trackEl = thumbEl.parentElement;
2012
+ const trackRect = trackEl.getBoundingClientRect();
2013
+ const pointerPosition = evnt.clientX - trackRect.left;
2014
+ // 记录 thumb 的偏移
2015
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
2016
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
2017
+ },
2018
+ pointermoveThumbXEvent(evnt) {
2019
+ const $xeList = this;
2020
+ const reactData = $xeList.reactData;
2021
+ const internalData = $xeList.internalData;
2022
+ const thumbEl = evnt.currentTarget;
2023
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2024
+ return;
2025
+ }
2026
+ const { isThumbDrag, thumbDragOffset } = internalData;
2027
+ if (isThumbDrag) {
2028
+ const viewEl = $xeList.$refs.refVirtualWrapper;
2029
+ if (!viewEl) {
2030
+ return;
2031
+ }
2032
+ const { xThumbWidth } = reactData;
2033
+ const thumbEl = evnt.currentTarget;
2034
+ const trackEl = thumbEl.parentElement;
2035
+ const trackRect = trackEl.getBoundingClientRect();
2036
+ // 更新偏移
2037
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
2038
+ }
2039
+ },
2040
+ cleatPointerThumbEvent(evnt) {
2041
+ const $xeList = this;
2042
+ const internalData = $xeList.internalData;
2043
+ const thumbEl = evnt.currentTarget;
2044
+ thumbEl.releasePointerCapture(evnt.pointerId);
2045
+ internalData.isThumbDrag = false;
2046
+ },
2047
+ pointerdownThumbYEvent(evnt) {
2048
+ const $xeList = this;
2049
+ const reactData = $xeList.reactData;
2050
+ const internalData = $xeList.internalData;
2051
+ const thumbEl = evnt.currentTarget;
2052
+ internalData.isThumbDrag = true;
2053
+ thumbEl.setPointerCapture(evnt.pointerId);
2054
+ const viewEl = $xeList.$refs.refVirtualWrapper;
2055
+ if (!viewEl) {
2056
+ return;
2057
+ }
2058
+ const { yThumbHeight } = reactData;
2059
+ const trackEl = thumbEl.parentElement;
2060
+ const trackRect = trackEl.getBoundingClientRect();
2061
+ const pointerPosition = evnt.clientY - trackRect.top;
2062
+ // 记录 thumb 的偏移
2063
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
2064
+ internalData.thumbDragOffset = pointerPosition - thumbOffset;
2065
+ },
2066
+ pointermoveThumbYEvent(evnt) {
2067
+ const $xeList = this;
2068
+ const reactData = $xeList.reactData;
2069
+ const internalData = $xeList.internalData;
2070
+ const thumbEl = evnt.currentTarget;
2071
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2072
+ return;
2073
+ }
2074
+ const { isThumbDrag, thumbDragOffset } = internalData;
2075
+ if (isThumbDrag) {
2076
+ const viewEl = $xeList.$refs.refVirtualWrapper;
2077
+ if (!viewEl) {
2078
+ return;
2079
+ }
2080
+ const { yThumbHeight } = reactData;
2081
+ const thumbEl = evnt.currentTarget;
2082
+ const trackEl = thumbEl.parentElement;
2083
+ const trackRect = trackEl.getBoundingClientRect();
2084
+ // 更新偏移
2085
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
2086
+ }
2087
+ },
1826
2088
  //
1827
2089
  // Render
1828
2090
  //
@@ -2052,7 +2314,7 @@ export default {
2052
2314
  const props = $xeList;
2053
2315
  const reactData = $xeList.reactData;
2054
2316
  const slots = $xeList.$scopedSlots;
2055
- const { showCheckbox, className, loading } = props;
2317
+ const { showCheckbox, className, loading, useScrollbar } = props;
2056
2318
  const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData;
2057
2319
  const defaultSlot = slots.default;
2058
2320
  const headerSlot = slots.header;
@@ -2066,6 +2328,10 @@ export default {
2066
2328
  const { trigger, isCrossListDrag } = dragOpts;
2067
2329
  const rowOpts = $xeList.computeRowOpts;
2068
2330
  const { isHover, padding } = rowOpts;
2331
+ const isDrag = $xeList.computeIsDrag;
2332
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts;
2333
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts;
2334
+ const scrollbarWrapperClss = $xeList.computeScrollbarWrapperClss;
2069
2335
  const showDefChekboxHead = showCheckbox && checkboxOpts.showHeader !== false;
2070
2336
  const leOns = {};
2071
2337
  if (isCrossListDrag && !rowList.length) {
@@ -2075,6 +2341,10 @@ export default {
2075
2341
  ref: 'refElem',
2076
2342
  class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
2077
2343
  [`size--${vSize}`]: vSize,
2344
+ 'is--virtual-scrollbar': useScrollbar,
2345
+ 'ov-x--auto-hide': useScrollbar && scrollbarXOpts.autoHide,
2346
+ 'ov-y--auto-hide': useScrollbar && scrollbarYOpts.autoHide,
2347
+ 'is--drag': isDrag,
2078
2348
  'is--loading': loading
2079
2349
  }],
2080
2350
  on: leOns,
@@ -2137,7 +2407,15 @@ export default {
2137
2407
  style: {
2138
2408
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
2139
2409
  }
2140
- }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
2410
+ }, useScrollbar
2411
+ ? (defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
2412
+ : [
2413
+ h('div', {
2414
+ key: 'vi',
2415
+ ref: 'refViewInnerElem',
2416
+ class: 'vxe-scrollbar--view-inner'
2417
+ }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
2418
+ ])
2141
2419
  ]),
2142
2420
  footerSlot
2143
2421
  ? h('div', {
@@ -2145,6 +2423,57 @@ export default {
2145
2423
  class: 'vxe-list--footer-wrapper'
2146
2424
  }, footerSlot({ items: rowList, $list: $xeList }))
2147
2425
  : renderEmptyElement($xeList),
2426
+ /**
2427
+ * 滚动条
2428
+ */
2429
+ useScrollbar
2430
+ ? h('div', {
2431
+ class: scrollbarWrapperClss
2432
+ }, [
2433
+ scrollbarXOpts.visible === 'hidden'
2434
+ ? renderEmptyElement($xeList)
2435
+ : h('div', {
2436
+ ref: 'refTrackXElem',
2437
+ class: 'vxe-scrollbar--track-x',
2438
+ on: {
2439
+ click: $xeList.clickTrackXEvent
2440
+ }
2441
+ }, [
2442
+ h('div', {
2443
+ ref: 'refThumbXElem',
2444
+ class: 'vxe-scrollbar--thumb-x',
2445
+ on: {
2446
+ pointerdown: $xeList.pointerdownThumbXEvent,
2447
+ pointermove: $xeList.pointermoveThumbXEvent,
2448
+ pointerup: $xeList.cleatPointerThumbEvent,
2449
+ pointercancel: $xeList.cleatPointerThumbEvent,
2450
+ lostpointercapture: $xeList.cleatPointerThumbEvent
2451
+ }
2452
+ })
2453
+ ]),
2454
+ scrollbarYOpts.visible === 'hidden'
2455
+ ? renderEmptyElement($xeList)
2456
+ : h('div', {
2457
+ ref: 'refTrackYElem',
2458
+ class: 'vxe-scrollbar--track-y',
2459
+ on: {
2460
+ click: $xeList.clickTrackYEvent
2461
+ }
2462
+ }, [
2463
+ h('div', {
2464
+ ref: 'refThumbYElem',
2465
+ class: 'vxe-scrollbar--thumb-y',
2466
+ on: {
2467
+ pointerdown: $xeList.pointerdownThumbYEvent,
2468
+ pointermove: $xeList.pointermoveThumbYEvent,
2469
+ pointerup: $xeList.cleatPointerThumbEvent,
2470
+ pointercancel: $xeList.cleatPointerThumbEvent,
2471
+ lostpointercapture: $xeList.cleatPointerThumbEvent
2472
+ }
2473
+ })
2474
+ ])
2475
+ ])
2476
+ : renderEmptyElement($xeList),
2148
2477
  /**
2149
2478
  * 拖拽提示
2150
2479
  */
@@ -2209,7 +2538,7 @@ export default {
2209
2538
  const $xeList = this;
2210
2539
  const props = $xeList;
2211
2540
  const internalData = $xeList.internalData;
2212
- const { showSeq, showRadio, showCheckbox } = props;
2541
+ const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props;
2213
2542
  const rowOpts = $xeList.computeRowOpts;
2214
2543
  const { useKey, keyField } = rowOpts;
2215
2544
  const isDrag = $xeList.computeIsDrag;
@@ -2230,21 +2559,33 @@ export default {
2230
2559
  if (useKey && !keyField) {
2231
2560
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField']);
2232
2561
  }
2233
- if (props.autoResize) {
2562
+ if (useScrollbar || autoResize) {
2234
2563
  const el = $xeList.$refs.refElem;
2235
- const resizeObserver = globalResize.create(() => $xeList.recalculate());
2564
+ const viewInnerEl = $xeList.$refs.refViewInnerElem;
2565
+ const resizeObserver = globalResize.create(() => {
2566
+ $xeList.reFlag++;
2567
+ });
2236
2568
  resizeObserver.observe(el);
2237
- if (el) {
2238
- resizeObserver.observe(el.parentElement);
2569
+ if (autoResize) {
2570
+ if (el) {
2571
+ resizeObserver.observe(el.parentElement);
2572
+ }
2573
+ }
2574
+ if (viewInnerEl) {
2575
+ resizeObserver.observe(viewInnerEl);
2239
2576
  }
2240
2577
  internalData.resizeObserver = resizeObserver;
2241
2578
  }
2242
- $xeList.recalculate();
2243
- globalEvents.on($xeList, 'resize', $xeList.recalculate);
2579
+ $xeList.reFlag++;
2580
+ globalEvents.on($xeList, 'resize', () => {
2581
+ $xeList.reFlag++;
2582
+ });
2244
2583
  },
2245
2584
  activated() {
2246
2585
  const $xeList = this;
2247
- $xeList.recalculate().then(() => $xeList.refreshScroll());
2586
+ $xeList.recalculate().then(() => {
2587
+ $xeList.refreshScroll();
2588
+ });
2248
2589
  },
2249
2590
  beforeDestroy() {
2250
2591
  const $xeList = this;
package/es/list/style.css CHANGED
@@ -379,4 +379,30 @@
379
379
  .vxe-list--radio-option .vxe-radio--label {
380
380
  padding-left: 0.4em;
381
381
  vertical-align: middle;
382
+ }
383
+
384
+ .vxe-list > .vxe-scrollbar {
385
+ position: unset;
386
+ }
387
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper {
388
+ scrollbar-width: none;
389
+ -ms-overflow-style: none;
390
+ }
391
+ .vxe-list.is--virtual-scrollbar > .vxe-list--virtual-wrapper::-webkit-scrollbar {
392
+ display: none;
393
+ }
394
+
395
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-x {
396
+ opacity: 1;
397
+ }
398
+ .vxe-list.is--virtual-scrollbar.ov-x--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-x {
399
+ opacity: 0;
400
+ transition: opacity 0.8s ease-in-out;
401
+ }
402
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide:hover > .vxe-scrollbar > .vxe-scrollbar--track-y {
403
+ opacity: 1;
404
+ }
405
+ .vxe-list.is--virtual-scrollbar.ov-y--auto-hide > .vxe-scrollbar > .vxe-scrollbar--track-y {
406
+ opacity: 0;
407
+ transition: opacity 0.8s ease-in-out;
382
408
  }
@@ -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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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;-ms-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}
@@ -248,6 +248,9 @@ export default {
248
248
  if (!viewEl) {
249
249
  return;
250
250
  }
251
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
252
+ return;
253
+ }
251
254
  const trackXEl = $xeScrollbar.$refs.refTrackXElem;
252
255
  const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
253
256
  const thumbXElem = $xeScrollbar.$refs.refThumbXElem;
@@ -270,6 +273,9 @@ export default {
270
273
  const viewEl = $xeScrollbar.$refs.refViewElem;
271
274
  if (!viewEl) {
272
275
  return;
276
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
277
+ return;
278
+ }
273
279
  }
274
280
  const { xThumbWidth, yThumbHeight } = reactData;
275
281
  const trackXEl = $xeScrollbar.$refs.refTrackXElem;
@@ -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
  -ms-user-select: none;
@@ -108,16 +109,16 @@
108
109
  left: var(--vxe-ui-scrollbar-y-width);
109
110
  }
110
111
 
111
- .vxe-scrollbar.is--padding.sx-pos--top {
112
+ .vxe-scrollbar.is--padding.overflow-x.sx-pos--top {
112
113
  padding-top: var(--vxe-ui-scrollbar-x-height);
113
114
  }
114
- .vxe-scrollbar.is--padding.sx-pos--bottom {
115
+ .vxe-scrollbar.is--padding.overflow-x.sx-pos--bottom {
115
116
  padding-bottom: var(--vxe-ui-scrollbar-x-height);
116
117
  }
117
- .vxe-scrollbar.is--padding.sy-pos--left {
118
+ .vxe-scrollbar.is--padding.overflow-y.sy-pos--left {
118
119
  padding-left: var(--vxe-ui-scrollbar-y-width);
119
120
  }
120
- .vxe-scrollbar.is--padding.sy-pos--right {
121
+ .vxe-scrollbar.is--padding.overflow-y.sy-pos--right {
121
122
  padding-right: var(--vxe-ui-scrollbar-y-width);
122
123
  }
123
124