每列表頭右側顯示 2px 紅色分隔條,拖拽分隔條調整列寬。展示兩種文字保護策略:font 內聯元素(文字不被覆蓋)vs 直接置於 td(文字會被邊框壓蓋),直觀對比佈局差異。
cursor:e-resize)作為唯一拖拽手柄<font class="resizeDivClass">,相對定位,拖拽後文字隨單元格擴展不被遮蓋<td>,邊框覆蓋導致文字部分隱藏<style>
.resizeDivClass {
position: relative;
background-color: red;
width: 2px;
z-index: 1;
left: expression(this.parentElement.offsetWidth - 1); /* IE 動態定位到右邊緣 */
cursor: e-resize;
}
</style>
<script language="javascript">
function MouseDownToResize(obj) {
obj.mouseDownX = event.clientX;
obj.pareneTdW = obj.parentElement.offsetWidth;
obj.pareneTableW = theObjTable.offsetWidth;
obj.setCapture();
}
function MouseMoveToResize(obj) {
if (!obj.mouseDownX) return;
var newW = obj.pareneTdW + event.clientX - obj.mouseDownX;
if (newW > 0) {
obj.parentElement.style.width = newW;
theObjTable.style.width = obj.pareneTableW + event.clientX - obj.mouseDownX;
}
}
function MouseUpToResize(obj) {
obj.releaseCapture();
obj.mouseDownX = 0;
}
</script>
<table id="theObjTable" STYLE="table-layout:fixed">
<tr bgcolor=cccccc>
<td valign=top>
<font class="resizeDivClass"
onmousedown="MouseDownToResize(this);"
onmousemove="MouseMoveToResize(this);"
onmouseup="MouseUpToResize(this);"></font>
aaa <!-- 方案A:文字在font外,不被覆蓋 -->
</td>
<td valign=top>
<font class="resizeDivClass" ...></font>
ddd <!-- 方案B:文字在td內,會被邊框壓蓋 -->
</td>
<td valign=top><font class="resizeDivClass" ...></font> ddd </td>
</tr>
<tr>
<td>快樂不是因為擁有的多,而是計較的少。</td>
<td>bbbb</td><td>dddd</td>
</tr>
</table>
| 方案 | 文字位置 | 拖拽後表現 | 原理 |
|---|---|---|---|
| A(推薦) | <font> 之後(同級) | 文字隨單元格擴展完整顯示 | font 絕對定位在右邊緣,不佔據文字流空間 |
| B | <td> 內容流中 | 右側文字被紅條/邊框遮蓋 | 單元格寬度變小,內容流被擠壓 |
<div class="resize-handle"> 替代 <font>,語義更清晰left: calc(100% - 2px) 替代 expressionaddEventListener,setPointerCapture 替代 setCapturetable-layout: fixed 保持列佈局穩定