Skip to content

Commit b14aac3

Browse files
shafimspmarcosmoura
authored andcommitted
fix(MdTable): make fixed header follow the horizontal scroll (#1575)
* fix(MdTable) fixed header scroll issue * code formatted * style: improve code style
1 parent 5cb9b7b commit b14aac3

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

src/components/MdTable/MdTable.vue

+47-4
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
</keep-alive>
1010

1111
<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>
1517
</div>
1618

1719
<md-content class="md-table-content md-scrollbar" :class="contentClasses" :style="contentStyles" @scroll="setScroll">
18-
<table>
20+
<table ref="contentTable">
1921
<md-table-thead :class="headerClasses" v-if="!mdFixedHeader && $scopedSlots['md-table-row']" />
2022

2123
<tbody v-if="!$scopedSlots['md-table-row']">
@@ -60,6 +62,7 @@
6062
import MdTableRow from './MdTableRow'
6163
import MdTableRowGhost from './MdTableRowGhost'
6264
import MdTableCellSelection from './MdTableCellSelection'
65+
import MdResizeObserver from 'core/utils/MdResizeObserver'
6366
6467
const getObjectAttribute = (object, key) => {
6568
let value = object
@@ -127,6 +130,8 @@
127130
},
128131
data () {
129132
return {
133+
windowResizeObserver: null,
134+
fixedHeaderTableWidth: 0,
130135
fixedHeaderPadding: 0,
131136
hasContentScroll: false,
132137
MdTable: {
@@ -190,6 +195,11 @@
190195
if (this.mdFixedHeader && this.value.length === 0) {
191196
return `md-table-empty`
192197
}
198+
},
199+
fixedHeaderTableStyles () {
200+
return {
201+
width: this.fixedHeaderTableWidth + 'px'
202+
}
193203
}
194204
},
195205
provide () {
@@ -262,9 +272,18 @@
262272
},
263273
setScroll ($event) {
264274
raf(() => {
275+
if (this.mdFixedHeader) {
276+
this.$refs.fixedHeaderContainer.scrollLeft = $event.target.scrollLeft
277+
}
278+
265279
this.hasContentScroll = $event.target.scrollTop > 0
266280
})
267281
},
282+
setHeaderScroll ($event) {
283+
raf(() => {
284+
this.MdTable.contentEl.scrollLeft = $event.target.scrollLeft
285+
})
286+
},
268287
getContentEl () {
269288
return this.$el.querySelector('.md-table-content')
270289
},
@@ -307,6 +326,11 @@
307326
} else if (this.MdTable.selectingMode === 'multiple') {
308327
this.MdTable.selectedItems = this.mdSelectedValue || []
309328
}
329+
},
330+
setWidth () {
331+
if (this.mdFixedHeader) {
332+
this.fixedHeaderTableWidth = this.$refs.contentTable.offsetWidth
333+
}
310334
}
311335
},
312336
created () {
@@ -316,9 +340,16 @@
316340
},
317341
mounted () {
318342
this.setContentEl()
343+
this.$nextTick().then(this.setWidth)
319344
320345
if (this.mdFixedHeader) {
321346
this.setHeaderPadding()
347+
this.windowResizeObserver = new MdResizeObserver(window, this.setWidth)
348+
}
349+
},
350+
beforeDestroy () {
351+
if (this.windowResizeObserver) {
352+
this.windowResizeObserver.destroy()
322353
}
323354
}
324355
}
@@ -334,6 +365,18 @@
334365
335366
.md-table-fixed-header {
336367
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+
}
337380
}
338381
339382
.md-table-fixed-header-active {

src/components/MdTable/MdTableHead.vue

+12-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
<script>
2222
import MdUpwardIcon from 'core/icons/MdUpwardIcon'
23+
import MdResizeObserver from 'core/utils/MdResizeObserver'
2324
2425
export default {
2526
name: 'MdTableHead',
@@ -35,7 +36,8 @@
3536
},
3637
inject: ['MdTable'],
3738
data: () => ({
38-
width: null
39+
width: null,
40+
windowResizeObserver: null
3941
}),
4042
computed: {
4143
hasSort () {
@@ -104,6 +106,15 @@
104106
},
105107
mounted () {
106108
this.$nextTick().then(this.setWidth)
109+
110+
if (this.MdTable.fixedHeader) {
111+
this.windowResizeObserver = new MdResizeObserver(window, this.setWidth)
112+
}
113+
},
114+
beforeDestroy () {
115+
if (this.windowResizeObserver) {
116+
this.windowResizeObserver.destroy()
117+
}
107118
}
108119
}
109120
</script>

0 commit comments

Comments
 (0)