vxe-pc-ui 3.19.8 → 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 (57) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/list/src/list.js +354 -17
  3. package/es/list/style.css +26 -0
  4. package/es/list/style.min.css +1 -1
  5. package/es/scrollbar/style.css +1 -0
  6. package/es/style.css +1 -1
  7. package/es/style.min.css +1 -1
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/es/ui/src/utils.js +9 -0
  11. package/es/vxe-list/style.css +26 -0
  12. package/es/vxe-list/style.min.css +1 -1
  13. package/es/vxe-scrollbar/style.css +1 -0
  14. package/lib/icon/style/style.css +1 -1
  15. package/lib/icon/style/style.min.css +1 -1
  16. package/lib/index.umd.js +348 -19
  17. package/lib/index.umd.min.js +1 -1
  18. package/lib/list/src/list.js +340 -20
  19. package/lib/list/src/list.min.js +1 -1
  20. package/lib/list/style/style.css +26 -0
  21. package/lib/list/style/style.min.css +1 -1
  22. package/lib/scrollbar/style/style.css +1 -0
  23. package/lib/style.css +1 -1
  24. package/lib/style.min.css +1 -1
  25. package/lib/ui/index.js +1 -1
  26. package/lib/ui/index.min.js +1 -1
  27. package/lib/ui/src/log.js +1 -1
  28. package/lib/ui/src/log.min.js +1 -1
  29. package/lib/ui/src/utils.js +10 -0
  30. package/lib/ui/src/utils.min.js +1 -1
  31. package/lib/vxe-list/style/style.css +26 -0
  32. package/lib/vxe-list/style/style.min.css +1 -1
  33. package/lib/vxe-scrollbar/style/style.css +1 -0
  34. package/package.json +1 -1
  35. package/packages/list/src/list.ts +382 -19
  36. package/packages/ui/src/utils.ts +10 -0
  37. package/styles/components/list.scss +51 -0
  38. package/styles/components/scrollbar.scss +3 -0
  39. package/types/components/card.d.ts +1 -1
  40. package/types/components/layout-aside.d.ts +1 -1
  41. package/types/components/layout-body.d.ts +1 -1
  42. package/types/components/list.d.ts +24 -2
  43. package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
  44. package/types/components/table.d.ts +24 -0
  45. package/types/components/tabs.d.ts +1 -1
  46. /package/es/icon/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
  47. /package/es/icon/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
  48. /package/es/icon/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
  49. /package/es/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
  50. /package/es/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
  51. /package/es/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
  52. /package/lib/icon/style/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
  53. /package/lib/icon/style/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
  54. /package/lib/icon/style/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
  55. /package/lib/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
  56. /package/lib/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
  57. /package/lib/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
@@ -1,17 +1,18 @@
1
1
  import { PropType, CreateElement, VNode } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils, { XEBrowse } from 'xe-utils'
4
- import { VxeUI, getConfig, getIcon, getI18n, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, getConfig, getIcon, getI18n, domUtils, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui'
5
5
  import { crossListDragRowGlobal, getCrossListDragRowInfo } from './store'
6
6
  import { addClass, getTpImg, hasClass, isScale, removeClass, toCssUnit } from '../../ui/src/dom'
7
7
  import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils'
8
8
  import { getSlotVNs } from '../../ui/src/vn'
9
9
  import { createComponentLog } from '../../ui/src/log'
10
10
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime'
11
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util'
11
12
  import { getItemCacheObj } from './util'
12
13
  import VxeLoadingComponent from '../../loading'
13
14
 
14
- import type { VxeListPropTypes, VxeListEmits, VxeComponentSizeType, ListReactData, VxeListDefines, ValueOf, ListInternalData, VxeListConstructor, VxeListPrivateMethods, VxeComponentStyleType } from '../../../types'
15
+ import type { VxeListPropTypes, VxeListEmits, VxeComponentSizeType, ListReactData, VxeListDefines, ValueOf, ListInternalData, VxeListConstructor, VxeListPrivateMethods, VxeComponentStyleType, VxeScrollbarPropTypes } from '../../../types'
15
16
 
16
17
  const { warnLog, errLog } = createComponentLog('tree')
17
18
 
@@ -52,6 +53,11 @@ function createReactData (): ListReactData {
52
53
  updateCheckboxFlag: 1,
53
54
  isAllChecked: false,
54
55
  isAllIndeterminate: false,
56
+
57
+ // 滚动条
58
+ yThumbHeight: 0,
59
+ xThumbWidth: 0,
60
+
55
61
  insertRowFlag: 1,
56
62
  removeRowFlag: 1,
57
63
  dragRow: null,
@@ -62,13 +68,20 @@ function createReactData (): ListReactData {
62
68
 
63
69
  function createInternalData (): ListInternalData {
64
70
  return {
65
- resizeObserver: undefined,
66
71
  fullData: [],
67
72
  afterList: [],
68
73
  fullKeyMaps: {},
69
74
  rowMaps: {},
70
- lastScrollLeft: 0,
75
+
76
+ // 滚动条
77
+ // resizeObserver: undefined,
78
+ // isThumbDrag: false,
79
+ thumbDragOffset: 0,
80
+ yThumbTop: 0,
81
+ xThumbLeft: 0,
71
82
  lastScrollTop: 0,
83
+ lastScrollLeft: 0,
84
+
72
85
  scrollYStore: {
73
86
  startIndex: 0,
74
87
  endIndex: 0,
@@ -125,7 +138,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
125
138
  dragConfig: Object as PropType<VxeListPropTypes.DragConfig>,
126
139
  menuConfig: Object as PropType<VxeListPropTypes.MenuConfig>,
127
140
  virtualYConfig: Object as PropType<VxeListPropTypes.VirtualYConfig>,
128
- scrollY: Object as PropType<VxeListPropTypes.ScrollY>
141
+ scrollY: Object as PropType<VxeListPropTypes.ScrollY>,
142
+ useScrollbar: {
143
+ type: Boolean as PropType<VxeListPropTypes.UseScrollbar>,
144
+ default: () => getConfig().list.useScrollbar
145
+ },
146
+ scrollbarConfig: Object as PropType<VxeListPropTypes.ScrollbarConfig>
129
147
  },
130
148
  data () {
131
149
  const xID = XEUtils.uniqueId()
@@ -208,11 +226,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
208
226
  const $xeList = this
209
227
 
210
228
  const rowHeight = $xeList.computeRowHeight
211
- const style: VxeComponentStyleType = {}
229
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
230
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
231
+ const stys: VxeComponentStyleType = {}
212
232
  if (rowHeight) {
213
- style['--vxe-ui-list-row-height'] = toCssUnit(rowHeight)
233
+ stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight)
214
234
  }
215
- return style
235
+ if (scrollbarYOpts.width) {
236
+ stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(scrollbarYOpts.width)
237
+ }
238
+ if (scrollbarXOpts.height) {
239
+ stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(scrollbarXOpts.height)
240
+ }
241
+ return stys
216
242
  },
217
243
  computeVirtualStyles () {
218
244
  const $xeList = this
@@ -229,8 +255,62 @@ export default /* define-vxe-component start */ defineVxeComponent({
229
255
  style.maxHeight = toCssUnit(Math.max(20, customMaxHeight - headHeight - footHeight))
230
256
  }
231
257
  return style
232
- }
258
+ },
259
+ computeScrollbarOpts () {
260
+ const $xeList = this
261
+ const props = $xeList
233
262
 
263
+ return Object.assign({}, getConfig().list.scrollbarConfig, props.scrollbarConfig)
264
+ },
265
+ computeScrollbarXOpts () {
266
+ const $xeList = this
267
+
268
+ const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
269
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig)
270
+ },
271
+ computeScrollbarYOpts () {
272
+ const $xeList = this
273
+
274
+ const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
275
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig)
276
+ },
277
+ computeScrollbarWrapperClss () {
278
+ const $xeList = this
279
+ const reactData = $xeList.reactData
280
+
281
+ const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
282
+ const { padding } = scrollbarOpts
283
+ const { yThumbHeight, xThumbWidth } = reactData
284
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
285
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
286
+ const scrollbarXToTop = $xeList.computeScrollbarXToTop
287
+ const scrollbarYToLeft = $xeList.computeScrollbarYToLeft
288
+ return domUtils.buildClass([
289
+ 'vxe-scrollbar is--virtual',
290
+ `ov-x--${scrollbarXOpts.visible || 'visible'}`,
291
+ `ov-y--${scrollbarYOpts.visible || 'visible'}`,
292
+ `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
293
+ `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
294
+ ], {
295
+ 'is--padding': padding,
296
+ 'ov-x--auto-hide': scrollbarXOpts.autoHide,
297
+ 'ov-y--auto-hide': scrollbarYOpts.autoHide,
298
+ 'overflow-y': yThumbHeight,
299
+ 'overflow-x': xThumbWidth
300
+ })
301
+ },
302
+ computeScrollbarXToTop () {
303
+ const $xeList = this
304
+
305
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
306
+ return scrollbarXOpts.position === 'top'
307
+ },
308
+ computeScrollbarYToLeft () {
309
+ const $xeList = this
310
+
311
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
312
+ return scrollbarYOpts.position === 'left'
313
+ }
234
314
  },
235
315
  methods: {
236
316
  //
@@ -573,6 +653,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
573
653
  }
574
654
  })
575
655
  },
656
+ updateScrollbar () {
657
+ const $xeList = this
658
+
659
+ $xeList.updateThumbSize()
660
+ $xeList.updateThumbOffset()
661
+ },
576
662
  /**
577
663
  * 重新计算列表
578
664
  */
@@ -593,6 +679,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
593
679
  parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight))
594
680
  }
595
681
  reactData.parentHeight = parentHeight
682
+ $xeList.updateScrollbar()
596
683
  $xeList.updateHeight()
597
684
  if (el.clientWidth && el.clientHeight) {
598
685
  return $xeList.computeScrollLoad()
@@ -629,6 +716,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
629
716
  const scrollLeft = scrollBodyElem.scrollLeft
630
717
  const isX = scrollLeft !== internalData.lastScrollLeft
631
718
  const isY = scrollTop !== internalData.lastScrollTop
719
+ $xeList.updateThumbOffset()
632
720
  internalData.lastScrollTop = scrollTop
633
721
  internalData.lastScrollLeft = scrollLeft
634
722
  if (reactData.scrollYLoad) {
@@ -1951,6 +2039,200 @@ export default /* define-vxe-component start */ defineVxeComponent({
1951
2039
  }
1952
2040
  $xeList.dispatchEvent('row-menu', { row }, evnt)
1953
2041
  },
2042
+ // 滚动条
2043
+ updateThumbSize () {
2044
+ const $xeList = this
2045
+ const reactData = $xeList.reactData
2046
+
2047
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2048
+ if (!viewEl) {
2049
+ return
2050
+ }
2051
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
2052
+ return
2053
+ }
2054
+ const trackXEl = $xeList.$refs.refTrackXElem as HTMLDivElement
2055
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
2056
+ const thumbXElem = $xeList.$refs.refThumbXElem as HTMLDivElement
2057
+ if (thumbXElem) {
2058
+ thumbXElem.style.width = xThumbWidth + 'px'
2059
+ }
2060
+ reactData.xThumbWidth = xThumbWidth
2061
+
2062
+ const trackYEl = $xeList.$refs.refTrackYElem as HTMLDivElement
2063
+
2064
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
2065
+ const thumbYElem = $xeList.$refs.refThumbYElem as HTMLDivElement
2066
+ if (thumbYElem) {
2067
+ thumbYElem.style.height = yThumbHeight + 'px'
2068
+ }
2069
+ reactData.yThumbHeight = yThumbHeight
2070
+ },
2071
+ updateThumbOffset () {
2072
+ const $xeList = this
2073
+ const reactData = $xeList.reactData
2074
+ const internalData = $xeList.internalData
2075
+
2076
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2077
+ if (!viewEl) {
2078
+ return
2079
+ }
2080
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
2081
+ return
2082
+ }
2083
+ const { xThumbWidth, yThumbHeight } = reactData
2084
+ const trackXEl = $xeList.$refs.refTrackXElem as HTMLDivElement
2085
+ const thumbXElem = $xeList.$refs.refThumbXElem as HTMLDivElement
2086
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
2087
+ internalData.xThumbLeft = xThumbLeft
2088
+ if (thumbXElem && xThumbWidth) {
2089
+ thumbXElem.style.width = xThumbWidth + 'px'
2090
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
2091
+ }
2092
+
2093
+ const trackYEl = $xeList.$refs.refTrackYElem as HTMLDivElement
2094
+ const thumbYElem = $xeList.$refs.refThumbYElem as HTMLDivElement
2095
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
2096
+ internalData.yThumbTop = yThumbTop
2097
+ if (thumbYElem && yThumbHeight) {
2098
+ thumbYElem.style.height = yThumbHeight + 'px'
2099
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
2100
+ }
2101
+ },
2102
+ clickTrackXEvent (evnt: MouseEvent) {
2103
+ const $xeList = this
2104
+ const reactData = $xeList.reactData
2105
+
2106
+ const trackEl = evnt.currentTarget as HTMLDivElement
2107
+ if (trackEl !== evnt.target) {
2108
+ return
2109
+ }
2110
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2111
+ if (!viewEl) {
2112
+ return
2113
+ }
2114
+ const { xThumbWidth } = reactData
2115
+ const trackRect = trackEl.getBoundingClientRect()
2116
+ viewEl.scrollTo({
2117
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
2118
+ behavior: 'auto'
2119
+ })
2120
+ },
2121
+ clickTrackYEvent (evnt: MouseEvent) {
2122
+ const $xeList = this
2123
+ const reactData = $xeList.reactData
2124
+
2125
+ const trackEl = evnt.currentTarget as HTMLDivElement
2126
+ if (trackEl !== evnt.target) {
2127
+ return
2128
+ }
2129
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2130
+ if (!viewEl) {
2131
+ return
2132
+ }
2133
+ const { yThumbHeight } = reactData
2134
+ const trackRect = trackEl.getBoundingClientRect()
2135
+ viewEl.scrollTo({
2136
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
2137
+ behavior: 'auto'
2138
+ })
2139
+ },
2140
+ pointerdownThumbXEvent (evnt: PointerEvent) {
2141
+ const $xeList = this
2142
+ const reactData = $xeList.reactData
2143
+ const internalData = $xeList.internalData
2144
+
2145
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2146
+ internalData.isThumbDrag = true
2147
+ thumbEl.setPointerCapture(evnt.pointerId)
2148
+
2149
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2150
+ if (!viewEl) {
2151
+ return
2152
+ }
2153
+ const { xThumbWidth } = reactData
2154
+ const trackEl = thumbEl.parentElement as HTMLDivElement
2155
+ const trackRect = trackEl.getBoundingClientRect()
2156
+ const pointerPosition = evnt.clientX - trackRect.left
2157
+ // 记录 thumb 的偏移
2158
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
2159
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
2160
+ },
2161
+ pointermoveThumbXEvent (evnt: PointerEvent) {
2162
+ const $xeList = this
2163
+ const reactData = $xeList.reactData
2164
+ const internalData = $xeList.internalData
2165
+
2166
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2167
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2168
+ return
2169
+ }
2170
+ const { isThumbDrag, thumbDragOffset } = internalData
2171
+ if (isThumbDrag) {
2172
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2173
+ if (!viewEl) {
2174
+ return
2175
+ }
2176
+ const { xThumbWidth } = reactData
2177
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2178
+ const trackEl = thumbEl.parentElement as HTMLDivElement
2179
+ const trackRect = trackEl.getBoundingClientRect()
2180
+ // 更新偏移
2181
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
2182
+ }
2183
+ },
2184
+ cleatPointerThumbEvent (evnt: PointerEvent) {
2185
+ const $xeList = this
2186
+ const internalData = $xeList.internalData
2187
+
2188
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2189
+ thumbEl.releasePointerCapture(evnt.pointerId)
2190
+ internalData.isThumbDrag = false
2191
+ },
2192
+ pointerdownThumbYEvent (evnt: PointerEvent) {
2193
+ const $xeList = this
2194
+ const reactData = $xeList.reactData
2195
+ const internalData = $xeList.internalData
2196
+
2197
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2198
+ internalData.isThumbDrag = true
2199
+ thumbEl.setPointerCapture(evnt.pointerId)
2200
+
2201
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2202
+ if (!viewEl) {
2203
+ return
2204
+ }
2205
+ const { yThumbHeight } = reactData
2206
+ const trackEl = thumbEl.parentElement as HTMLDivElement
2207
+ const trackRect = trackEl.getBoundingClientRect()
2208
+ const pointerPosition = evnt.clientY - trackRect.top
2209
+ // 记录 thumb 的偏移
2210
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
2211
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
2212
+ },
2213
+ pointermoveThumbYEvent (evnt: PointerEvent) {
2214
+ const $xeList = this
2215
+ const reactData = $xeList.reactData
2216
+ const internalData = $xeList.internalData
2217
+
2218
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2219
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
2220
+ return
2221
+ }
2222
+ const { isThumbDrag, thumbDragOffset } = internalData
2223
+ if (isThumbDrag) {
2224
+ const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
2225
+ if (!viewEl) {
2226
+ return
2227
+ }
2228
+ const { yThumbHeight } = reactData
2229
+ const thumbEl = evnt.currentTarget as HTMLDivElement
2230
+ const trackEl = thumbEl.parentElement as HTMLDivElement
2231
+ const trackRect = trackEl.getBoundingClientRect()
2232
+ // 更新偏移
2233
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
2234
+ }
2235
+ },
1954
2236
 
1955
2237
  //
1956
2238
  // Render
@@ -2215,7 +2497,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
2215
2497
  const reactData = $xeList.reactData
2216
2498
  const slots = $xeList.$scopedSlots
2217
2499
 
2218
- const { showCheckbox, className, loading } = props
2500
+ const { showCheckbox, className, loading, useScrollbar } = props
2219
2501
  const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData
2220
2502
  const defaultSlot = slots.default
2221
2503
  const headerSlot = slots.header
@@ -2229,6 +2511,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
2229
2511
  const { trigger, isCrossListDrag } = dragOpts
2230
2512
  const rowOpts = $xeList.computeRowOpts
2231
2513
  const { isHover, padding } = rowOpts
2514
+ const isDrag = $xeList.computeIsDrag
2515
+ const scrollbarXOpts = $xeList.computeScrollbarXOpts
2516
+ const scrollbarYOpts = $xeList.computeScrollbarYOpts
2517
+ const scrollbarWrapperClss = $xeList.computeScrollbarWrapperClss
2232
2518
  const showDefChekboxHead = showCheckbox && checkboxOpts.showHeader !== false
2233
2519
 
2234
2520
  const leOns: {
@@ -2241,6 +2527,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
2241
2527
  ref: 'refElem',
2242
2528
  class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
2243
2529
  [`size--${vSize}`]: vSize,
2530
+ 'is--virtual-scrollbar': useScrollbar,
2531
+ 'ov-x--auto-hide': useScrollbar && scrollbarXOpts.autoHide,
2532
+ 'ov-y--auto-hide': useScrollbar && scrollbarYOpts.autoHide,
2533
+ 'is--drag': isDrag,
2244
2534
  'is--loading': loading
2245
2535
  }],
2246
2536
  on: leOns,
@@ -2303,7 +2593,17 @@ export default /* define-vxe-component start */ defineVxeComponent({
2303
2593
  style: {
2304
2594
  marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
2305
2595
  }
2306
- }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
2596
+ }, useScrollbar
2597
+ ? (
2598
+ defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i))
2599
+ )
2600
+ : [
2601
+ h('div', {
2602
+ key: 'vi',
2603
+ ref: 'refViewInnerElem',
2604
+ class: 'vxe-scrollbar--view-inner'
2605
+ }, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
2606
+ ])
2307
2607
  ]),
2308
2608
  footerSlot
2309
2609
  ? h('div', {
@@ -2311,6 +2611,57 @@ export default /* define-vxe-component start */ defineVxeComponent({
2311
2611
  class: 'vxe-list--footer-wrapper'
2312
2612
  }, footerSlot({ items: rowList, $list: $xeList }))
2313
2613
  : renderEmptyElement($xeList),
2614
+ /**
2615
+ * 滚动条
2616
+ */
2617
+ useScrollbar
2618
+ ? h('div', {
2619
+ class: scrollbarWrapperClss
2620
+ }, [
2621
+ scrollbarXOpts.visible === 'hidden'
2622
+ ? renderEmptyElement($xeList)
2623
+ : h('div', {
2624
+ ref: 'refTrackXElem',
2625
+ class: 'vxe-scrollbar--track-x',
2626
+ on: {
2627
+ click: $xeList.clickTrackXEvent
2628
+ }
2629
+ }, [
2630
+ h('div', {
2631
+ ref: 'refThumbXElem',
2632
+ class: 'vxe-scrollbar--thumb-x',
2633
+ on: {
2634
+ pointerdown: $xeList.pointerdownThumbXEvent,
2635
+ pointermove: $xeList.pointermoveThumbXEvent,
2636
+ pointerup: $xeList.cleatPointerThumbEvent,
2637
+ pointercancel: $xeList.cleatPointerThumbEvent,
2638
+ lostpointercapture: $xeList.cleatPointerThumbEvent
2639
+ }
2640
+ })
2641
+ ]),
2642
+ scrollbarYOpts.visible === 'hidden'
2643
+ ? renderEmptyElement($xeList)
2644
+ : h('div', {
2645
+ ref: 'refTrackYElem',
2646
+ class: 'vxe-scrollbar--track-y',
2647
+ on: {
2648
+ click: $xeList.clickTrackYEvent
2649
+ }
2650
+ }, [
2651
+ h('div', {
2652
+ ref: 'refThumbYElem',
2653
+ class: 'vxe-scrollbar--thumb-y',
2654
+ on: {
2655
+ pointerdown: $xeList.pointerdownThumbYEvent,
2656
+ pointermove: $xeList.pointermoveThumbYEvent,
2657
+ pointerup: $xeList.cleatPointerThumbEvent,
2658
+ pointercancel: $xeList.cleatPointerThumbEvent,
2659
+ lostpointercapture: $xeList.cleatPointerThumbEvent
2660
+ }
2661
+ })
2662
+ ])
2663
+ ])
2664
+ : renderEmptyElement($xeList),
2314
2665
  /**
2315
2666
  * 拖拽提示
2316
2667
  */
@@ -2386,7 +2737,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
2386
2737
  const props = $xeList
2387
2738
  const internalData = $xeList.internalData
2388
2739
 
2389
- const { showSeq, showRadio, showCheckbox } = props
2740
+ const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props
2390
2741
  const rowOpts = $xeList.computeRowOpts
2391
2742
  const { useKey, keyField } = rowOpts
2392
2743
  const isDrag = $xeList.computeIsDrag
@@ -2407,22 +2758,34 @@ export default /* define-vxe-component start */ defineVxeComponent({
2407
2758
  if (useKey && !keyField) {
2408
2759
  errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField'])
2409
2760
  }
2410
- if (props.autoResize) {
2761
+ if (useScrollbar || autoResize) {
2411
2762
  const el = $xeList.$refs.refElem as HTMLDivElement
2412
- const resizeObserver = globalResize.create(() => $xeList.recalculate())
2763
+ const viewInnerEl = $xeList.$refs.refViewInnerElem as HTMLDivElement
2764
+ const resizeObserver = globalResize.create(() => {
2765
+ $xeList.reFlag++
2766
+ })
2413
2767
  resizeObserver.observe(el)
2414
- if (el) {
2415
- resizeObserver.observe(el.parentElement as HTMLDivElement)
2768
+ if (autoResize) {
2769
+ if (el) {
2770
+ resizeObserver.observe(el.parentElement as HTMLDivElement)
2771
+ }
2772
+ }
2773
+ if (viewInnerEl) {
2774
+ resizeObserver.observe(viewInnerEl)
2416
2775
  }
2417
2776
  internalData.resizeObserver = resizeObserver
2418
2777
  }
2419
- $xeList.recalculate()
2420
- globalEvents.on($xeList, 'resize', $xeList.recalculate)
2778
+ $xeList.reFlag++
2779
+ globalEvents.on($xeList, 'resize', () => {
2780
+ $xeList.reFlag++
2781
+ })
2421
2782
  },
2422
2783
  activated () {
2423
2784
  const $xeList = this
2424
2785
 
2425
- $xeList.recalculate().then(() => $xeList.refreshScroll())
2786
+ $xeList.recalculate().then(() => {
2787
+ $xeList.refreshScroll()
2788
+ })
2426
2789
  },
2427
2790
  beforeDestroy () {
2428
2791
  const $xeList = this
@@ -6,6 +6,16 @@ export function isEnableConf (conf: any): boolean {
6
6
  return conf && conf.enabled !== false
7
7
  }
8
8
 
9
+ /**
10
+ * 用于开关类型的配置项
11
+ * 局部启用规则:conf={}
12
+ * 局部禁用规则:conf={enabled:false}
13
+ * 全局默认启用规则:conf.enabled=true
14
+ */
15
+ export function hasEnableConf (conf: any, opts: any): boolean {
16
+ return opts && (conf ? opts.enabled !== false : opts.enabled)
17
+ }
18
+
9
19
  export function nextZIndex () {
10
20
  return DomZIndex.getNext()
11
21
  }
@@ -287,3 +287,54 @@
287
287
  padding-right: var(--vxe-ui-list-current-padding);
288
288
  @include baseMixin.createRadioIcon();
289
289
  }
290
+
291
+ // 滚动条
292
+ .vxe-list {
293
+ & > .vxe-scrollbar {
294
+ position: unset;
295
+ }
296
+ &.is--virtual-scrollbar {
297
+ & > .vxe-list--virtual-wrapper {
298
+ scrollbar-width: none;
299
+ -ms-overflow-style: none;
300
+ }
301
+ & > .vxe-list--virtual-wrapper::-webkit-scrollbar {
302
+ display: none;
303
+ }
304
+ }
305
+ }
306
+
307
+ .vxe-list {
308
+ &.is--virtual-scrollbar {
309
+ &.ov-x--auto-hide {
310
+ &:hover {
311
+ & > .vxe-scrollbar {
312
+ & > .vxe-scrollbar--track-x {
313
+ opacity: 1;
314
+ }
315
+ }
316
+ }
317
+ & > .vxe-scrollbar {
318
+ & > .vxe-scrollbar--track-x {
319
+ opacity: 0;
320
+ @include baseMixin.createAnimationTransition(opacity, 0.8s);
321
+ }
322
+ }
323
+ }
324
+ &.ov-y--auto-hide {
325
+ &:hover {
326
+ & > .vxe-scrollbar {
327
+ & > .vxe-scrollbar--track-y {
328
+ opacity: 1;
329
+ }
330
+ }
331
+ }
332
+ & > .vxe-scrollbar {
333
+ & > .vxe-scrollbar--track-y {
334
+ opacity: 0;
335
+ @include baseMixin.createAnimationTransition(opacity, 0.8s);
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
@@ -49,6 +49,9 @@
49
49
  background-color: var(--vxe-ui-scrollbar-thumb-active-background-color);
50
50
  }
51
51
  }
52
+ }
53
+
54
+ .vxe-scrollbar {
52
55
  &.ov-x--hidden {
53
56
  & > .vxe-scrollbar--view {
54
57
  overflow-x: hidden;
@@ -27,7 +27,7 @@ export namespace VxeCardPropTypes {
27
27
  export type Padding = boolean
28
28
  export type Size = VxeComponentSizeType
29
29
  export type UseScrollbar = boolean
30
- export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
30
+ export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
31
31
  }
32
32
 
33
33
  export type VxeCardProps = {
@@ -30,7 +30,7 @@ export namespace VxeLayoutAsidePropTypes {
30
30
  animation?: boolean
31
31
  }
32
32
  export type UseScrollbar = boolean
33
- export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
33
+ export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
34
34
  }
35
35
 
36
36
  export interface VxeLayoutAsideProps {
@@ -25,7 +25,7 @@ export namespace VxeLayoutBodyPropTypes {
25
25
  export type ShowBacktop = boolean
26
26
  export interface BacktopConfig extends Omit<VxeBacktopProps, 'target'> {}
27
27
  export type UseScrollbar = boolean
28
- export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
28
+ export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
29
29
  }
30
30
  export interface VxeLayoutBodyProps {
31
31
  size?: VxeLayoutBodyPropTypes.Size