gpt4 book ai didi

javascript - 调整表格的列宽

转载 作者:行者123 更新时间:2023-11-27 23:07:53 28 4
gpt4 key购买 nike

目前,如果表格的宽度不大于容器的宽度,我可以调整表格列的大小。

我希望在调整列大小时使表格的宽度增加,以便在表格下方出现滚动条。基本上允许我在不受容器宽度限制的情况下调整大小。

这是一个 fiddle :https://jsfiddle.net/thatOneGuy/u5bvwh8m/7/

代码片段

//var tables = document.getElementsByClassName('flexiCol');
var tables = document.getElementsByClassName('resizable');
for (var i = 0; i < tables.length; i++) {
resizableGrid(tables[i]);
}

function resizableGrid(table) {
var row = table.getElementsByTagName('tr')[0],
cols = row ? row.children : undefined;
if (!cols) return;

table.style.overflow = 'hidden';

var tableHeight = table.offsetHeight;

for (var i = 0; i < cols.length; i++) {
var div = createDiv(tableHeight);
cols[i].appendChild(div);
cols[i].style.position = 'relative';
setListeners(div);
}

function setListeners(div) {
var pageX, curCol, nxtCol, curColWidth, nxtColWidth;

div.addEventListener('mousedown', function(e) {
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
pageX = e.pageX;

var padding = paddingDiff(curCol);

curColWidth = curCol.offsetWidth - padding;
if (nxtCol)
nxtColWidth = nxtCol.offsetWidth - padding;
});

div.addEventListener('mouseover', function(e) {
e.target.style.borderRight = '2px solid #0000ff';
})

div.addEventListener('mouseout', function(e) {
e.target.style.borderRight = '';
})

document.addEventListener('mousemove', function(e) {
if (curCol) {
var diffX = e.pageX - pageX;

if (nxtCol)
nxtCol.style.width = (nxtColWidth - (diffX)) + 'px';

curCol.style.width = (curColWidth + diffX) + 'px';
}
});

document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
pageX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}

function createDiv(height) {
var div = document.createElement('div');
div.style.top = 0;
div.style.right = 0;
div.style.width = '5px';
div.style.position = 'absolute';
div.style.cursor = 'col-resize';
div.style.userSelect = 'none';
div.style.height = height + 'px';
return div;
}

function paddingDiff(col) {

if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}

var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));

}

function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
};
<style>
* {
box-sizing: border-box;
}

table {
border-collapse: collapse;
}

td,
th {
padding: 5px 15px;
text-align: left;
}

table,
th,
td {
border: 1px solid #000;
}

</style>

<table id="tableId" class="resizable">
<thead>
<tr>
<th><input type="checkbox" /></th>
<th>Size</th>
<th>File</th>
<th>File2</th>
<th>File3</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" /></td>
<td>10Mb</td>
<td>C:\Users\BrainBell\Desktop\Empty\abc.txt</td>
<td>C:\Users\BrainBell\Desktop\Empty\abc.txt</td>
<td>C:\Users\BrainBell\Desktop\Empty\abc.txt</td>
</tr>
</tbody>
</table>

最佳答案

设法通过在 mousemove 上更新表格宽度来解决此问题:https://jsfiddle.net/thatOneGuy/u5bvwh8m/16/

document.getElementById('tableId').style.width = tableWidth + diffX + "px"

完整代码:

//var tables = document.getElementsByClassName('flexiCol');
var tables = document.getElementsByClassName('resizable');
for (var i = 0; i < tables.length; i++) {
resizableGrid(tables[i]);
}

function resizableGrid(table) {
var row = table.getElementsByTagName('tr')[0],
cols = row ? row.children : undefined;
if (!cols) return;

table.style.overflow = 'hidden';

var tableHeight = table.offsetHeight;

for (var i = 0; i < cols.length; i++) {
var div = createDiv(tableHeight);
cols[i].appendChild(div);
cols[i].style.position = 'relative';
setListeners(div);
}

function setListeners(div) {
var pageX, curCol, nxtCol, curColWidth, nxtColWidth, tableWidth;

div.addEventListener('mousedown', function(e) {

tableWidth = document.getElementById('tableId').offsetWidth;
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
pageX = e.pageX;

var padding = paddingDiff(curCol);

curColWidth = curCol.offsetWidth - padding;
// if (nxtCol)
//nxtColWidth = nxtCol.offsetWidth - padding;
});

div.addEventListener('mouseover', function(e) {
e.target.style.borderRight = '2px solid #0000ff';
})

div.addEventListener('mouseout', function(e) {
e.target.style.borderRight = '';
})

document.addEventListener('mousemove', function(e) {
if (curCol) {
var diffX = e.pageX - pageX;

// if (nxtCol)
//nxtCol.style.width = (nxtColWidth - (diffX)) + 'px';

curCol.style.width = (curColWidth + diffX) + 'px';
document.getElementById('tableId').style.width = tableWidth + diffX + "px"
}
});

document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
pageX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}

function createDiv(height) {
var div = document.createElement('div');
div.style.top = 0;
div.style.right = 0;
div.style.width = '5px';
div.style.position = 'absolute';
div.style.cursor = 'col-resize';
div.style.userSelect = 'none';
div.style.height = height + 'px';
return div;
}

function paddingDiff(col) {

if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}

var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));

}

function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
};
<style>
* {
box-sizing: border-box;
}

table {
border-collapse: collapse;
}

td,
th {
padding: 5px 15px;
text-align: left;
}

table,
th,
td {
border: 1px solid #000;
}

</style>

<table id="tableId" class="resizable">
<thead>
<tr>
<th><input type="checkbox" /></th>
<th>Size</th>
<th>File</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" /></td>
<td>10Mb</td>
<td>C:\Usabc.txt</td>
</tr>
</tbody>
</table>

关于javascript - 调整表格的列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58660470/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com