Table的思索(一):TD宽度与高度的分配

      利用table进行布局时,一行TD的宽度之和一定会大于等于Table设定的宽度值。

      表格的实际宽度依赖于表格的布局样式table-layout,将table-layout设置为auto时,表格会依次计算出所有表格的实际宽度,然后计算每行的表格宽度之和,最大者即为表格的宽度,同时计算出来还有每列的宽度,亦即每列表格中的最大宽度。

<!-- 对表格设置的宽度无效,会被表格计算出的宽度覆盖 -->
<table style="width:100px;" border="1px">
    <tr>
        <td>
            <!-- 第一列的最大宽度 -->
            <div style="width:200px;">TEST-A</div>
        </td>
        <td>AA</td>
    </tr>
    <tr>
        <td>TEST-A</td>
        <td>
            <!-- 第二列的最大宽度 -->
            <div style="width:100px;">TEST-B</div>
        </td>
    </tr>
</table>

      上面阐述了表格的实际内容宽度大于表格宽度,再看观察一下表格宽度大于实际内容宽度,并采用百分比计算,会有很多有意思的发现。

<table style="width:100px;" border="1px">
    <tr>
        <!-- 表格的宽度为50px,而不是20px -->
        <td style="width:20%;"><div>TA</div></td>
        <td>TB</td>
    </tr>
    <tr>
        <td>TA</td>
        <td style="width:20%;"><div>TB</div></td>
    </tr>
</table>

      在浏览器中渲染后,用WEB开发工具(Chrome Developer DevTools)观测每个对象的宽度,发现每个表格都为50px,而不是20px,这是因为表格在布局完成后,会将多余的空间按比例均匀地分布给每个表格,也就是说,如果两个表格的内容宽度完全一样,谁的预设宽度大,谁分配的剩余空间就多。

      需要指出的是,在表格布局方式table-layout为auto时,即使设置了比例,也会优先按表格的内容进行布局,所以会出现占比较小的表格反而占据了更大的宽度,如下。

<table style="width:100px;" border="1px">
    <tr>
        <!-- 20%宽度的表格实际占据的宽度大于120%的表格-->
        <td  style="width:20%">
            <div>TAAAAAAAA</div>
        </td>
        <!-- 表格内容宽度小于表格宽度时,会优先分配剩余空间 -->
        <td style="width:120%">TB</td>
    </tr>
    <tr>
        <td>TA</td>
        <td><div>TB</div></td>
    </tr>
</table>

      表格高度的分配方式与表格宽度的分配方式大体一致,都是找到表格内容宽度的最大值,然后进行高度分配,超出表格高度时与低于表格高度时,分配原则完全与宽度分配原则一致。

要实现这个功能,你可以使用JavaScript和CSS来改变tabletd元素的样式。 首先,在HTML中,你需要定义一个具有固定宽度高度table元素,并在其中添加一些td元素。例如: ```html <style> #myTable { width: 500px; height: 300px; border-collapse: collapse; } #myTable td { border: 1px solid black; width: 100px; height: 50px; } </style> <table id="myTable"> <tr> <td>Cell 1</td> <td>Cell 2</td> <td>Cell 3</td> </tr> <tr> <td>Cell 4</td> <td>Cell 5</td> <td>Cell 6</td> </tr> </table> ``` 接下来,你可以使用JavaScript来实现改变td元素的宽度。例如,你可以给每个td元素添加一个mousedown事件监听器,当用户按下鼠标时,将其宽度设置为用户拖动鼠标时的距离。然后,你可以将mousemove和mouseup事件监听器添加到整个文档中,以便在用户拖动鼠标时调整宽度,并在用户释放鼠标时停止调整。 ```javascript var table = document.getElementById("myTable"); var resizing = false; var start = undefined; var startX = undefined; table.addEventListener("mousedown", function(event) { if (event.target.tagName.toLowerCase() === "td") { resizing = true; start = event.target; startX = event.pageX; } }); document.addEventListener("mousemove", function(event) { if (resizing) { var diff = event.pageX - startX; start.style.width = start.offsetWidth + diff + "px"; startX = event.pageX; } }); document.addEventListener("mouseup", function(event) { resizing = false; start = undefined; startX = undefined; }); ``` 最后,如果你想要固定table宽度高度,并在内容超出显示范围时添加滚动条,你可以将table元素包装在一个具有固定宽度高度的div元素中,并将div元素的overflow属性设置为auto或scroll。 ```html <div style="width: 500px; height: 300px; overflow: auto;"> <table id="myTable"> ... </table> </div> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值