У меня есть гибкая прокручиваемая таблица HTML, в которую я пытаюсь добавить функцию изменения размера столбцов (изменение ширины) при перетаскивании. Хотя мой код работает нормально, за исключением некоторых проблем CSS / jQuery, которые объясняются ниже:
- Если я применю 100% ширину к таблице, а столбцы таблицы будут меньше, тогда столбцы не изменят размер должным образом - они расширяются с обеих сторон. (См. DEMO 1)
- Если я не применяю 100% ширины к таблице, и столбцов таблицы достаточно, то размер столбцов даже не изменяется. (См. DEMO 2)
- В окне предупреждения не отображается правильная измененная ширина заголовка таблицы.
Поскольку моя таблица динамическая c - не знаю в укажите, сколько столбцов будет в таблице, поэтому НЕ МОЖЕТЕ применять или НЕ МОГУТ удалять ширину таблицы.
DEMO 1
Когда у нас меньше столбцов
$(document).ready(function(){
var pressed = false;
var tb_header;
var startX, startWidth;
var th_id, th_width;
$(document).on("mousedown", ".column_heading_resize", function(e){
tb_header = $(this).parents("th");
pressed = true;
startX = e.pageX;
startWidth = $(tb_header).width();
$(tb_header).addClass("resizing");
$(tb_header).addClass("noSelect");
});
$(document).mousemove(function(e){
if(pressed)
{
$(tb_header).width(startWidth + (e.pageX - startX));
}
});
$(document).mouseup(function(){
if(pressed)
{
$(tb_header).removeClass("resizing");
$(tb_header).removeClass("noSelect");
pressed = false;
th_id = $(tb_header).data("id");
th_width = $(tb_header).width();
var dataString = "th_id="+th_id+"&th_width="+th_width;
alert("th id = " + th_id + "\ndata width = " + th_width);
}
});
});
#tb_wrapper {
border:1px solid #cccccc;
max-width:960px;
margin:50px auto;
padding:10px;
}
#tb_responsive {
overflow-x:auto;
overflow-y:hidden;
}
.tb_records {
border-collapse:collapse;
text-align:left;
width:100%;
table-layout:fixed;
}
.tb_records th {
font-weight:bold;
position:relative;
min-width:50px;
max-width:350px;
background-color:#4c4c4c;
color:#ffffff;
}
.tb_records th, .tb_records td {
padding:10px;
border:1px solid #000000;
font-size:15px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.tb_records tr:nth-child(even) {
background-color:#F2F2F2;
}
.column_heading_resize {
cursor:col-resize;
position:absolute;
top:0;
bottom:0;
right:0px;
width:3px;
}
.noSelect {
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
<link rel="stylesheet" type="text/css" href="https://meyerweb.com/eric/tools/css/reset/reset.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="tb_wrapper">
<div id="tb_responsive">
<table class="tb_records">
<thead>
<tr>
<th style="width:75px;">Row ID</th>
<th data-id="1" data-width="100" style='width:100px;'>Column 1<span class='column_heading_resize'> </span></th>
<th data-id="2" data-width="100" style='width:100px;'>Column 2<span class='column_heading_resize'> </span></th>
<th data-id="3" data-width="100" style='width:100px;'>Column 3<span class='column_heading_resize'> </span></th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>2</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>3</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>4</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>5</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>6</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>7</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>8</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>9</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>10</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
</tbody>
</table>
</div>
</div>
DEMO 2
Когда у нас будет больше столбцов
$(document).ready(function(){
var pressed = false;
var tb_header;
var startX, startWidth;
var th_id, th_width;
$(document).on("mousedown", ".column_heading_resize", function(e){
tb_header = $(this).parents("th");
pressed = true;
startX = e.pageX;
startWidth = $(tb_header).width();
$(tb_header).addClass("resizing");
$(tb_header).addClass("noSelect");
});
$(document).mousemove(function(e){
if(pressed)
{
$(tb_header).width(startWidth + (e.pageX - startX));
}
});
$(document).mouseup(function(){
if(pressed)
{
$(tb_header).removeClass("resizing");
$(tb_header).removeClass("noSelect");
pressed = false;
th_id = $(tb_header).data("id");
th_width = $(tb_header).width();
var dataString = "th_id="+th_id+"&th_width="+th_width;
alert("th id = " + th_id + "\ndata width = " + th_width);
}
});
});
#tb_wrapper {
border:1px solid #cccccc;
max-width:960px;
margin:50px auto;
padding:10px;
}
#tb_responsive {
overflow-x:auto;
overflow-y:hidden;
}
.tb_records {
border-collapse:collapse;
text-align:left;
table-layout:fixed;
}
.tb_records th {
font-weight:bold;
position:relative;
min-width:50px;
max-width:350px;
background-color:#4c4c4c;
color:#ffffff;
}
.tb_records th, .tb_records td {
padding:10px;
border:1px solid #000000;
font-size:15px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.tb_records tr:nth-child(even) {
background-color:#F2F2F2;
}
.column_heading_resize {
cursor:col-resize;
position:absolute;
top:0;
bottom:0;
right:0px;
width:3px;
}
.noSelect {
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
<link rel="stylesheet" type="text/css" href="https://meyerweb.com/eric/tools/css/reset/reset.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="tb_wrapper">
<div id="tb_responsive">
<table class="tb_records">
<thead>
<tr>
<th style="width:75px;">Row ID</th>
<th data-id="1" data-width="100" style='width:100px;'>Column 1<span class='column_heading_resize'> </span></th>
<th data-id="2" data-width="100" style='width:100px;'>Column 2<span class='column_heading_resize'> </span></th>
<th data-id="3" data-width="100" style='width:100px;'>Column 3<span class='column_heading_resize'> </span></th>
<th data-id="4" data-width="100" style='width:100px;'>Column 4<span class='column_heading_resize'> </span></th>
<th data-id="5" data-width="100" style='width:100px;'>Column 5<span class='column_heading_resize'> </span></th>
<th data-id="6" data-width="100" style='width:100px;'>Column 6<span class='column_heading_resize'> </span></th>
<th data-id="7" data-width="100" style='width:100px;'>Column 7<span class='column_heading_resize'> </span></th>
<th data-id="8" data-width="100" style='width:100px;'>Column 8<span class='column_heading_resize'> </span></th>
<th data-id="9" data-width="100" style='width:100px;'>Column 9<span class='column_heading_resize'> </span></th>
<th data-id="10" data-width="100" style='width:100px;'>Column 10<span class='column_heading_resize'> </span></th>
<th data-id="11" data-width="100" style='width:100px;'>Column 11<span class='column_heading_resize'> </span></th>
<th data-id="12" data-width="100" style='width:100px;'>Column 12<span class='column_heading_resize'> </span></th>
<th data-id="13" data-width="100" style='width:100px;'>Column 13<span class='column_heading_resize'> </span></th>
<th data-id="14" data-width="100" style='width:100px;'>Column 14<span class='column_heading_resize'> </span></th>
<th data-id="15" data-width="100" style='width:100px;'>Column 15<span class='column_heading_resize'> </span></th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>2</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>3</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>4</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>5</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>6</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>7</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>8</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>9</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
<tr>
<td>10</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
<td>Some Value</td>
</tr>
</tbody>
</table>
</div>
</div>
Какими должны быть идеальные решения моих вышеуказанных проблем? Есть идеи?