Commit 9d304dd63574fb8d0036aa3e6cdafa409e7301ba
1 parent
b1262a3d
fixed safari scroll bar
Showing
3 changed files
with
123 additions
and
92 deletions
Show diff stats
build/webpack.dev.config.js
| @@ -41,5 +41,8 @@ module.exports = merge(webpackBaseConfig, { | @@ -41,5 +41,8 @@ module.exports = merge(webpackBaseConfig, { | ||
| 41 | template: path.join(__dirname, '../examples/index.html') | 41 | template: path.join(__dirname, '../examples/index.html') |
| 42 | }), | 42 | }), |
| 43 | new FriendlyErrorsPlugin() | 43 | new FriendlyErrorsPlugin() |
| 44 | - ] | 44 | + ], |
| 45 | + devServer:{ | ||
| 46 | + host: '0.0.0.0' | ||
| 47 | + } | ||
| 45 | }); | 48 | }); |
examples/routers/table.vue
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | <div> | 2 | <div> |
| 3 | <br><br><br><br><br> | 3 | <br><br><br><br><br> |
| 4 | <Table border :columns="columns1" height="500" :data="data1"></Table> | 4 | <Table border :columns="columns1" height="500" :data="data1"></Table> |
| 5 | - <Table border :columns="columns1" height='300'></Table> | 5 | + <!-- <Table border :columns="columns1" height='300'></Table> --> |
| 6 | <!-- <br><br><br><br><br> --> | 6 | <!-- <br><br><br><br><br> --> |
| 7 | <!-- <Table width="550" height="200" border :columns="columns2" :data="data4"></Table> --> | 7 | <!-- <Table width="550" height="200" border :columns="columns2" :data="data4"></Table> --> |
| 8 | <!--<br><br><br><br><br>--> | 8 | <!--<br><br><br><br><br>--> |
| @@ -12,8 +12,8 @@ | @@ -12,8 +12,8 @@ | ||
| 12 | <!-- <br><br><br><br><br> --> | 12 | <!-- <br><br><br><br><br> --> |
| 13 | <Table border :columns="columns7" height="240" :data="data7"></Table> | 13 | <Table border :columns="columns7" height="240" :data="data7"></Table> |
| 14 | <!-- <br><br><br><br><br> --> | 14 | <!-- <br><br><br><br><br> --> |
| 15 | - <Table border :columns="columns8" :data="data7" height="200"></Table> | ||
| 16 | - <Table border :columns="columns8" height="200"></Table> | 15 | + <!-- <Table border :columns="columns8" :data="data7" height="200"></Table> --> |
| 16 | + <!-- <Table border :columns="columns8" height="200"></Table> --> | ||
| 17 | <br><br><br><br><br> | 17 | <br><br><br><br><br> |
| 18 | </div> | 18 | </div> |
| 19 | </template> | 19 | </template> |
| @@ -372,6 +372,7 @@ | @@ -372,6 +372,7 @@ | ||
| 372 | { | 372 | { |
| 373 | title: 'Age', | 373 | title: 'Age', |
| 374 | key: 'age', | 374 | key: 'age', |
| 375 | + width:200, | ||
| 375 | }, | 376 | }, |
| 376 | { | 377 | { |
| 377 | title: 'Address', | 378 | title: 'Address', |
src/components/table/table.vue
| @@ -187,6 +187,8 @@ | @@ -187,6 +187,8 @@ | ||
| 187 | objData: this.makeObjData(), // checkbox or highlight-row | 187 | objData: this.makeObjData(), // checkbox or highlight-row |
| 188 | rebuildData: [], // for sort or filter | 188 | rebuildData: [], // for sort or filter |
| 189 | cloneColumns: this.makeColumns(), | 189 | cloneColumns: this.makeColumns(), |
| 190 | + minWidthColumns:[], | ||
| 191 | + maxWidthColumns:[], | ||
| 190 | columnRows: this.makeColumnRows(false), | 192 | columnRows: this.makeColumnRows(false), |
| 191 | leftFixedColumnRows: this.makeColumnRows('left'), | 193 | leftFixedColumnRows: this.makeColumnRows('left'), |
| 192 | rightFixedColumnRows: this.makeColumnRows('right'), | 194 | rightFixedColumnRows: this.makeColumnRows('right'), |
| @@ -194,7 +196,6 @@ | @@ -194,7 +196,6 @@ | ||
| 194 | showSlotHeader: true, | 196 | showSlotHeader: true, |
| 195 | showSlotFooter: true, | 197 | showSlotFooter: true, |
| 196 | bodyHeight: 0, | 198 | bodyHeight: 0, |
| 197 | - bodyRealHeight: 0, | ||
| 198 | scrollBarWidth: getScrollBarSize(), | 199 | scrollBarWidth: getScrollBarSize(), |
| 199 | currentContext: this.context, | 200 | currentContext: this.context, |
| 200 | cloneData: deepCopy(this.data), // when Cell has a button to delete row data, clickCurrentRow will throw an error, so clone a data | 201 | cloneData: deepCopy(this.data), // when Cell has a button to delete row data, clickCurrentRow will throw an error, so clone a data |
| @@ -264,11 +265,7 @@ | @@ -264,11 +265,7 @@ | ||
| 264 | if (this.bodyHeight === 0) { | 265 | if (this.bodyHeight === 0) { |
| 265 | width = this.tableWidth; | 266 | width = this.tableWidth; |
| 266 | } else { | 267 | } else { |
| 267 | - if (this.bodyHeight > this.bodyRealHeight) { | ||
| 268 | - width = this.tableWidth; | ||
| 269 | - } else { | ||
| 270 | - width = this.tableWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0); | ||
| 271 | - } | 268 | + width = this.tableWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0); |
| 272 | } | 269 | } |
| 273 | // const width = this.bodyHeight === 0 ? this.tableWidth : this.tableWidth - this.scrollBarWidth; | 270 | // const width = this.bodyHeight === 0 ? this.tableWidth : this.tableWidth - this.scrollBarWidth; |
| 274 | style.width = `${width}px`; | 271 | style.width = `${width}px`; |
| @@ -349,109 +346,118 @@ | @@ -349,109 +346,118 @@ | ||
| 349 | return this.rowClassName(this.data[index], index); | 346 | return this.rowClassName(this.data[index], index); |
| 350 | }, | 347 | }, |
| 351 | handleResize () { | 348 | handleResize () { |
| 352 | - this.$nextTick(() => { | ||
| 353 | - const allWidth = !this.allColumns.some(cell => !cell.width); // each column set a width | ||
| 354 | - if (allWidth) { | ||
| 355 | - this.tableWidth = this.allColumns.map(cell => cell.width).reduce((a, b) => a + b, 0); | ||
| 356 | - } else { | ||
| 357 | - this.tableWidth = parseInt(getStyle(this.$el, 'width')) - 1; | 349 | + //let tableWidth = parseInt(getStyle(this.$el, 'width')) - 1; |
| 350 | + let tableWidth = this.$el.offsetWidth - 1; | ||
| 351 | + let columnsWidth = {}; | ||
| 352 | + | ||
| 353 | + let hasWidthColumns = []; | ||
| 354 | + let noWidthColumns = []; | ||
| 355 | + let minWidthColumns = this.minWidthColumns; | ||
| 356 | + let maxWidthColumns = this.maxWidthColumns; | ||
| 357 | + this.cloneColumns.forEach((col) => { | ||
| 358 | + if (col.width) { | ||
| 359 | + hasWidthColumns.push(col); | ||
| 360 | + } | ||
| 361 | + else{ | ||
| 362 | + noWidthColumns.push(col); | ||
| 363 | + } | ||
| 364 | + col._width = null; | ||
| 365 | + }); | ||
| 366 | + | ||
| 367 | + | ||
| 368 | + let unUsableWidth = hasWidthColumns.map(cell => cell.width).reduce((a, b) => a + b, 0); | ||
| 369 | + let usableWidth = tableWidth - unUsableWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0); | ||
| 370 | + let usableLength = noWidthColumns.length; | ||
| 371 | + let columnWidth = 0; | ||
| 372 | + if(usableWidth > 0 && usableLength > 0){ | ||
| 373 | + columnWidth = parseInt(usableWidth / usableLength); | ||
| 358 | } | 374 | } |
| 359 | - this.columnsWidth = {}; | ||
| 360 | - this.$nextTick(() => { | ||
| 361 | - let columnsWidth = {}; | ||
| 362 | - | ||
| 363 | - let hasWidthColumns = []; | ||
| 364 | - let noWidthColumns = []; | ||
| 365 | - let minWidthColumns = []; | ||
| 366 | - let maxWidthColumns = []; | ||
| 367 | - this.cloneColumns.forEach((col) => { | ||
| 368 | - if (col.width) { | ||
| 369 | - hasWidthColumns.push(col); | ||
| 370 | - } | ||
| 371 | - else{ | ||
| 372 | - noWidthColumns.push(col); | ||
| 373 | - if(col.minWidth){ | ||
| 374 | - minWidthColumns.push(col); | 375 | + for (let i = 0; i < maxWidthColumns.length; i++) { |
| 376 | + if(columnWidth > maxWidthColumns[i].maxWidth){ | ||
| 377 | + maxWidthColumns[i]._width = maxWidthColumns[i].maxWidth; | ||
| 378 | + usableWidth -= maxWidthColumns[i].maxWidth; | ||
| 379 | + usableLength--; | ||
| 380 | + if (usableWidth>0) { | ||
| 381 | + if (usableLength === 0) { | ||
| 382 | + columnWidth = 0; | ||
| 375 | } | 383 | } |
| 376 | - if(col.maxWidth){ | ||
| 377 | - maxWidthColumns.push(col); | 384 | + else { |
| 385 | + columnWidth = parseInt(usableWidth / usableLength); | ||
| 378 | } | 386 | } |
| 379 | } | 387 | } |
| 380 | - col._width = null; | ||
| 381 | - }); | ||
| 382 | - | ||
| 383 | - minWidthColumns.sort((a,b)=>a.minWidth > b.minWidth); | ||
| 384 | - maxWidthColumns.sort((a,b)=>a.maxWidth < b.maxWidth); | ||
| 385 | - | ||
| 386 | - let unUsableWidth = hasWidthColumns.map(cell => cell.width).reduce((a, b) => a + b, 0); | ||
| 387 | - let usableWidth = this.tableWidth - unUsableWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0); | ||
| 388 | - let usableLength = noWidthColumns.length; | ||
| 389 | - let columnWidth = parseInt(usableWidth / usableLength); | ||
| 390 | - | ||
| 391 | - for (let i = 0; i < maxWidthColumns.length; i++) { | ||
| 392 | - if(columnWidth > maxWidthColumns[i].maxWidth){ | ||
| 393 | - maxWidthColumns[i]._width = maxWidthColumns[i].maxWidth; | ||
| 394 | - usableWidth -= maxWidthColumns[i].maxWidth; | ||
| 395 | - usableLength--; | ||
| 396 | - columnWidth = parseInt(usableWidth / usableLength); | 388 | + else{ |
| 389 | + columnWidth = 0; | ||
| 397 | } | 390 | } |
| 398 | } | 391 | } |
| 392 | + } | ||
| 399 | 393 | ||
| 400 | - for (let i = 0; i < minWidthColumns.length; i++) { | ||
| 401 | - if(columnWidth < minWidthColumns[i].minWidth && !minWidthColumns[i].width){ | 394 | + for (let i = 0; i < minWidthColumns.length; i++) { |
| 395 | + if(columnWidth < minWidthColumns[i].minWidth && !minWidthColumns[i].width){ | ||
| 396 | + if(!minWidthColumns[i]._width){ | ||
| 402 | minWidthColumns[i]._width = minWidthColumns[i].minWidth; | 397 | minWidthColumns[i]._width = minWidthColumns[i].minWidth; |
| 403 | usableWidth -= minWidthColumns[i].minWidth; | 398 | usableWidth -= minWidthColumns[i].minWidth; |
| 404 | usableLength--; | 399 | usableLength--; |
| 405 | - columnWidth = parseInt(usableWidth / usableLength); | 400 | + if (usableWidth>0) { |
| 401 | + if (usableLength === 0) { | ||
| 402 | + columnWidth = 0; | ||
| 403 | + } | ||
| 404 | + else { | ||
| 405 | + columnWidth = parseInt(usableWidth / usableLength); | ||
| 406 | + } | ||
| 407 | + } | ||
| 408 | + else{ | ||
| 409 | + columnWidth = 0; | ||
| 410 | + } | ||
| 406 | } | 411 | } |
| 412 | + | ||
| 407 | } | 413 | } |
| 414 | + } | ||
| 408 | 415 | ||
| 409 | - if (usableLength===0){ | ||
| 410 | - columnWidth = 0; | 416 | + |
| 417 | + for (let i = 0; i < this.cloneColumns.length; i++) { | ||
| 418 | + const column = this.cloneColumns[i]; | ||
| 419 | + let width = columnWidth; | ||
| 420 | + if(column.width){ | ||
| 421 | + width = column.width; | ||
| 411 | } | 422 | } |
| 412 | - | ||
| 413 | - for (let i = 0; i < this.cloneColumns.length; i++) { | ||
| 414 | - const column = this.cloneColumns[i]; | ||
| 415 | - let width = columnWidth; | ||
| 416 | - if(column.width){ | ||
| 417 | - width = column.width; | 423 | + else{ |
| 424 | + if (column._width) { | ||
| 425 | + width = column._width; | ||
| 418 | } | 426 | } |
| 419 | - else{ | ||
| 420 | - if(column._width){ | ||
| 421 | - width = column._width; | ||
| 422 | - } | ||
| 423 | - else if (column.minWidth > width){ | ||
| 424 | - width = column.minWidth; | ||
| 425 | - } | ||
| 426 | - else if (column.maxWidth < width){ | ||
| 427 | - width = column.maxWidth; | ||
| 428 | - } | ||
| 429 | - else{ | 427 | + else if (column.minWidth > width){ |
| 428 | + width = column.minWidth; | ||
| 429 | + } | ||
| 430 | + else if (column.maxWidth < width){ | ||
| 431 | + width = column.maxWidth; | ||
| 432 | + } | ||
| 433 | + else { | ||
| 434 | + if (usableWidth>0) { | ||
| 430 | if (usableLength > 1) { | 435 | if (usableLength > 1) { |
| 431 | usableLength--; | 436 | usableLength--; |
| 432 | usableWidth -= width; | 437 | usableWidth -= width; |
| 433 | columnWidth = parseInt(usableWidth / usableLength); | 438 | columnWidth = parseInt(usableWidth / usableLength); |
| 434 | } | 439 | } |
| 440 | + else { | ||
| 441 | + columnWidth = 0; | ||
| 442 | + } | ||
| 443 | + } | ||
| 444 | + else{ | ||
| 445 | + columnWidth = 0; | ||
| 435 | } | 446 | } |
| 436 | } | 447 | } |
| 448 | + } | ||
| 437 | 449 | ||
| 438 | - this.cloneColumns[i]._width = width; | 450 | + this.cloneColumns[i]._width = width; |
| 439 | 451 | ||
| 440 | - columnsWidth[column._index] = { | ||
| 441 | - width: width | ||
| 442 | - }; | 452 | + columnsWidth[column._index] = { |
| 453 | + width: width | ||
| 454 | + }; | ||
| 443 | 455 | ||
| 444 | - } | ||
| 445 | - //this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0); | ||
| 446 | - this.columnsWidth = columnsWidth; | ||
| 447 | - this.$nextTick(()=>{ | ||
| 448 | - this.fixedHeader(); | ||
| 449 | - | ||
| 450 | - }); | ||
| 451 | - }); | ||
| 452 | - // get table real height,for fixed when set height prop,but height < table's height,show scrollBarWidth | ||
| 453 | - this.bodyRealHeight = parseInt(getStyle(this.$refs.tbody.$el, 'height')); | ||
| 454 | - }); | 456 | + } |
| 457 | + //this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0); | ||
| 458 | + this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0) + (this.showVerticalScrollBar?this.scrollBarWidth:0); | ||
| 459 | + this.columnsWidth = columnsWidth; | ||
| 460 | + this.fixedHeader(); | ||
| 455 | }, | 461 | }, |
| 456 | handleMouseIn (_index) { | 462 | handleMouseIn (_index) { |
| 457 | if (this.disabledHover) return; | 463 | if (this.disabledHover) return; |
| @@ -567,9 +573,9 @@ | @@ -567,9 +573,9 @@ | ||
| 567 | } | 573 | } |
| 568 | }, | 574 | }, |
| 569 | fixedBody (){ | 575 | fixedBody (){ |
| 570 | - this.headerWidth = this.$refs.header.childNodes[0].offsetWidth; | ||
| 571 | - this.headerHeight = this.$refs.header.childNodes[0].offsetHeight; | ||
| 572 | - this.showHorizontalScrollBar = this.headerWidth>this.$refs.header.parentElement.offsetWidth; | 576 | + this.headerWidth = this.$refs.header.children[0].offsetWidth; |
| 577 | + this.headerHeight = this.$refs.header.children[0].offsetHeight; | ||
| 578 | + this.showHorizontalScrollBar = this.headerWidth>this.$refs.header.offsetWidth; | ||
| 573 | if (!this.$refs.tbody || !this.data || this.data.length === 0) { | 579 | if (!this.$refs.tbody || !this.data || this.data.length === 0) { |
| 574 | this.showVerticalScrollBar = false; | 580 | this.showVerticalScrollBar = false; |
| 575 | } | 581 | } |
| @@ -592,7 +598,6 @@ | @@ -592,7 +598,6 @@ | ||
| 592 | bodyEl.classList.remove(this.prefixCls +'-overflowX'); | 598 | bodyEl.classList.remove(this.prefixCls +'-overflowX'); |
| 593 | } | 599 | } |
| 594 | } | 600 | } |
| 595 | - this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0) + (this.showVerticalScrollBar?this.scrollBarWidth:0); | ||
| 596 | }, | 601 | }, |
| 597 | 602 | ||
| 598 | hideColumnFilter () { | 603 | hideColumnFilter () { |
| @@ -859,6 +864,25 @@ | @@ -859,6 +864,25 @@ | ||
| 859 | makeColumnRows (fixedType) { | 864 | makeColumnRows (fixedType) { |
| 860 | return convertToRows(this.columns, fixedType); | 865 | return convertToRows(this.columns, fixedType); |
| 861 | }, | 866 | }, |
| 867 | + setMinMaxColumnRows (){ | ||
| 868 | + let minWidthColumns=[]; | ||
| 869 | + let maxWidthColumns=[]; | ||
| 870 | + this.cloneColumns.forEach((col) => { | ||
| 871 | + if (!col.width) { | ||
| 872 | + if(col.minWidth){ | ||
| 873 | + minWidthColumns.push(col); | ||
| 874 | + } | ||
| 875 | + if(col.maxWidth){ | ||
| 876 | + maxWidthColumns.push(col); | ||
| 877 | + } | ||
| 878 | + } | ||
| 879 | + }); | ||
| 880 | + | ||
| 881 | + minWidthColumns.sort((a,b)=>a.minWidth > b.minWidth); | ||
| 882 | + maxWidthColumns.sort((a,b)=>a.maxWidth < b.maxWidth); | ||
| 883 | + this.minWidthColumns = minWidthColumns; | ||
| 884 | + this.maxWidthColumns = maxWidthColumns; | ||
| 885 | + }, | ||
| 862 | exportCsv (params) { | 886 | exportCsv (params) { |
| 863 | if (params.filename) { | 887 | if (params.filename) { |
| 864 | if (params.filename.indexOf('.csv') === -1) { | 888 | if (params.filename.indexOf('.csv') === -1) { |
| @@ -895,6 +919,7 @@ | @@ -895,6 +919,7 @@ | ||
| 895 | }, | 919 | }, |
| 896 | mounted () { | 920 | mounted () { |
| 897 | this.handleResize(); | 921 | this.handleResize(); |
| 922 | + this.setMinMaxColumnRows(); | ||
| 898 | this.$nextTick(() => this.ready = true); | 923 | this.$nextTick(() => this.ready = true); |
| 899 | 924 | ||
| 900 | on(window, 'resize', this.handleResize); | 925 | on(window, 'resize', this.handleResize); |
| @@ -933,6 +958,8 @@ | @@ -933,6 +958,8 @@ | ||
| 933 | // todo 这里有性能问题,可能是左右固定计算属性影响的 | 958 | // todo 这里有性能问题,可能是左右固定计算属性影响的 |
| 934 | this.allColumns = getAllColumns(this.columns); | 959 | this.allColumns = getAllColumns(this.columns); |
| 935 | this.cloneColumns = this.makeColumns(); | 960 | this.cloneColumns = this.makeColumns(); |
| 961 | + this.setMinMaxColumnRows(); | ||
| 962 | + | ||
| 936 | this.columnRows = this.makeColumnRows(false); | 963 | this.columnRows = this.makeColumnRows(false); |
| 937 | this.leftFixedColumnRows = this.makeColumnRows('left'); | 964 | this.leftFixedColumnRows = this.makeColumnRows('left'); |
| 938 | this.rightFixedColumnRows = this.makeColumnRows('right'); | 965 | this.rightFixedColumnRows = this.makeColumnRows('right'); |