|
9 | 9 | </keep-alive>
|
10 | 10 |
|
11 | 11 | <div class="md-table-fixed-header" :class="headerClasses" :style="headerStyles" v-if="mdFixedHeader">
|
12 |
| - <table> |
13 |
| - <md-table-thead /> |
14 |
| - </table> |
| 12 | + <div class="md-table-fixed-header-container" ref="fixedHeaderContainer" @scroll="setHeaderScroll"> |
| 13 | + <table :style="fixedHeaderTableStyles"> |
| 14 | + <md-table-thead /> |
| 15 | + </table> |
| 16 | + </div> |
15 | 17 | </div>
|
16 | 18 |
|
17 | 19 | <md-content class="md-table-content md-scrollbar" :class="contentClasses" :style="contentStyles" @scroll="setScroll">
|
18 |
| - <table> |
| 20 | + <table ref="contentTable"> |
19 | 21 | <md-table-thead :class="headerClasses" v-if="!mdFixedHeader && $scopedSlots['md-table-row']" />
|
20 | 22 |
|
21 | 23 | <tbody v-if="!$scopedSlots['md-table-row']">
|
|
60 | 62 | import MdTableRow from './MdTableRow'
|
61 | 63 | import MdTableRowGhost from './MdTableRowGhost'
|
62 | 64 | import MdTableCellSelection from './MdTableCellSelection'
|
| 65 | + import MdResizeObserver from 'core/utils/MdResizeObserver' |
63 | 66 |
|
64 | 67 | const getObjectAttribute = (object, key) => {
|
65 | 68 | let value = object
|
|
127 | 130 | },
|
128 | 131 | data () {
|
129 | 132 | return {
|
| 133 | + windowResizeObserver: null, |
| 134 | + fixedHeaderTableWidth: 0, |
130 | 135 | fixedHeaderPadding: 0,
|
131 | 136 | hasContentScroll: false,
|
132 | 137 | MdTable: {
|
|
190 | 195 | if (this.mdFixedHeader && this.value.length === 0) {
|
191 | 196 | return `md-table-empty`
|
192 | 197 | }
|
| 198 | + }, |
| 199 | + fixedHeaderTableStyles () { |
| 200 | + return { |
| 201 | + width: this.fixedHeaderTableWidth + 'px' |
| 202 | + } |
193 | 203 | }
|
194 | 204 | },
|
195 | 205 | provide () {
|
|
262 | 272 | },
|
263 | 273 | setScroll ($event) {
|
264 | 274 | raf(() => {
|
| 275 | + if (this.mdFixedHeader) { |
| 276 | + this.$refs.fixedHeaderContainer.scrollLeft = $event.target.scrollLeft |
| 277 | + } |
| 278 | +
|
265 | 279 | this.hasContentScroll = $event.target.scrollTop > 0
|
266 | 280 | })
|
267 | 281 | },
|
| 282 | + setHeaderScroll ($event) { |
| 283 | + raf(() => { |
| 284 | + this.MdTable.contentEl.scrollLeft = $event.target.scrollLeft |
| 285 | + }) |
| 286 | + }, |
268 | 287 | getContentEl () {
|
269 | 288 | return this.$el.querySelector('.md-table-content')
|
270 | 289 | },
|
|
307 | 326 | } else if (this.MdTable.selectingMode === 'multiple') {
|
308 | 327 | this.MdTable.selectedItems = this.mdSelectedValue || []
|
309 | 328 | }
|
| 329 | + }, |
| 330 | + setWidth () { |
| 331 | + if (this.mdFixedHeader) { |
| 332 | + this.fixedHeaderTableWidth = this.$refs.contentTable.offsetWidth |
| 333 | + } |
310 | 334 | }
|
311 | 335 | },
|
312 | 336 | created () {
|
|
316 | 340 | },
|
317 | 341 | mounted () {
|
318 | 342 | this.setContentEl()
|
| 343 | + this.$nextTick().then(this.setWidth) |
319 | 344 |
|
320 | 345 | if (this.mdFixedHeader) {
|
321 | 346 | this.setHeaderPadding()
|
| 347 | + this.windowResizeObserver = new MdResizeObserver(window, this.setWidth) |
| 348 | + } |
| 349 | + }, |
| 350 | + beforeDestroy () { |
| 351 | + if (this.windowResizeObserver) { |
| 352 | + this.windowResizeObserver.destroy() |
322 | 353 | }
|
323 | 354 | }
|
324 | 355 | }
|
|
334 | 365 |
|
335 | 366 | .md-table-fixed-header {
|
336 | 367 | position: relative;
|
| 368 | +
|
| 369 | + .md-table-fixed-header-container { |
| 370 | + -webkit-box-flex: 1; |
| 371 | + flex: 1; |
| 372 | + overflow-x: auto; |
| 373 | +
|
| 374 | + &::-webkit-scrollbar, |
| 375 | + &::-webkit-scrollbar-thumb, |
| 376 | + &::-webkit-scrollbar-button { |
| 377 | + display: none; |
| 378 | + } |
| 379 | + } |
337 | 380 | }
|
338 | 381 |
|
339 | 382 | .md-table-fixed-header-active {
|
|
0 commit comments