table 使用的一些常用技巧

使用 html 标签 table 时,布局的方式很容易忘记,很多新手在调整表格的样式时浪费了不少的时间,其他只要记住一些常用的技巧,就可以应付大部分的表格使用场景。

1、表格常用的范式,该模式也适用于直接应用 div + css 进行表格布局

html 代码

 <table class="table">
    <tr class="row">
      <td class="cell">张三</td>
      <td class="cell">李四</td>
      <td class="cell">王五</td>
    </tr>
    <tr class="row">
      <td class="cell">张三</td>
      <td class="cell">李四</td>
      <td class="cell">王五</td>
    </tr>
</table>
<!-- 与上面的效果是一样的 -->
<div class="table">
    <div class="row">
        <div class="cell">张三</div>
        <div class="cell">李四</div>
        <div class="cell">王五</div>
    </div>
    <div class="row">
        <div class="cell">张三</div>
        <div class="cell">李四</div>
        <div class="cell">王五</div>
    </div>
</div>

css 样式代码

    .table {
        border-collapse: collapse; /* 表格的边框合并为一个单一的边框 */
        border-spacing: 0; /* 设置相邻单元格的边框间的距离为 0 */
        display: table;
        border: 1px solid #ccc;
        margin: 5px;
        /* display: table 时 padding 会失效 */
    }
    .row {
        display: table-row;
        border: 1px solid #ccc;
        /* display: table-row 时 margin、padding 同时失效 */
    }
    .cell {
        display: table-cell;
        border: 1px solid #ccc;
        padding: 10px;
        width: 100px;
        text-align: center;
        /* display: table-cell 时 margin 会失效 */
    }

2、使用 col 对各的列宽进行单独控制

html 代码如下

    <table width="100%" border="1">
        <colgroup>
            <col width="100" /> <!--  width 规定列的宽度 pixels / % / relative_length -->
            <col width="200" />
            <col width="100" />
        </colgroup>
        <thead>
            <tr>
                <th>ISBN</th>
                <th>Title</th>
                <th>Price</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>3476896</td>
                <td>My first HTML</td>
                <td>$53</td>
            </tr>
            <tr>
                <td>2489604</td>
                <td>My first CSS</td>
                <td>$47</td>
            </tr>
        </tbody>
    </table>

3、table 表头分组

效果如下:

源码:

<table>
  <thead>
    <tr>
      <td></td>
      <th colspan="4">部门情况</th>
      <th colspan="4">外包情况</th>
    </tr>
    <tr>
      <td></td>
      <th>人数</th>
      <th>计划饱和度</th>
      <th>绝对饱和度</th>
      <th>相对饱和度</th>
      <th>人数</th>
      <th>计划饱和度</th>
      <th>绝对饱和度</th>
      <th>相对饱和度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>
        <a href="#">信息系统开发</a>
      </th>
      <td>30</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
      <td>5</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
    </tr>
    <tr>
      <th> 
        <a href="#">业务系统开发</a> 
      </th>
      <td>30</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
      <td>5</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
    </tr>
    <tr>
      <th> 
        <a href="#">支撑系统开发</a> 
      </th>
      <td>30</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
      <td>5</td>
      <td>100%</td>
      <td>100%</td>
      <td>100%</td>
    </tr>
  </tbody>
</table>

4、table 固定头部、固定左则的列、固定右边的列如何实现?

实现思路:
可以参考归 element-UI 中的 table 组件,主要是通过创建几个相同的 col 控制的表格然后使用绝对定位 / 使用 css3 到原始表格上作为遮罩来实现看上去固定表头、固定左列或者固定右列的效果。(注意:如果想只通过固定 thead 来实现表头固定,滚动时会有 bug
下面实现一个固定标题的表格:

源码如下:

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <title>修改代码,右边会自动显示结果</title>
    <!--适应移动端-->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!--css样式-->
    <style>
        table {
            border: 1px solid #ccc;
            border-collapse: collapse;
            width: 800px;
        }

        table td,
        table th {
            border: 1px solid #ccc;
            padding: 10px;
        }

        .content {
            width: 400px;
            overflow: auto;
            background: #fff;
        }

        .title {
            font-size: 20px;
            padding: 10px 0;
            width: 400px;
            background-color: #efefef;
        }

        .sub-title {
            font-size: 18px;
            width: 380px;
            background-color: #efefef;
        }
    </style>
    <!--引用jquery库-->
    <script src="https://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
</head>
<body>
    <div class="container">
        <div class="content">
            <legend class="title">
                <span class="title__no">1、</span>
                <span class="title__text">我是固定的大标题,滚动滚动条我也不变</span>
            </legend>
            <table cellpadding="0">
                <thead>
                    <tr>

                        <th align="left">列1 列1列1列1列1列1列1列1列1列1</th>

                        <th align="left">列2 列2列2列2列2列2列2列2列2列2</th>

                        <th align="left">列3 列3列3列3列3列3列3列3列3列3</th>

                        <th align="left">列4 列4列4列4列4列4列4列4列4列4</th>

                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td align="left" colspan="4">
                            <div class="sub-title">1.1 我是固定的子标题,滚动滚动条我也不变</div>
                        </td>
                    </tr>
                    <tr>
                        <td align="left">
                            <div>1.1 内容</div>
                        </td>

                        <td align="left">
                            <div>1.1 内容</div>
                        </td>

                        <td align="left">
                            <div>1.1 内容</div>
                        </td>

                        <td align="left">
                            <div>1.1 内容</div>
                        </td>
                    </tr>
                    <tr>
                        <td align="left" colspan="4">
                            <div class="sub-title">1.2 我是固定的子标题,滚动滚动条我也不变</div>
                        </td>
                    </tr>
                    <tr>
                        <td align="left">
                            <div>内容内容内容内容内容内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容内容内容内容内容内容</div>
                        </td>
                    </tr>
                    <tr>
                        <td align="left" colspan="4">
                            <div class="sub-title">1.3 我是固定的子标题,滚动滚动条我也不变</div>
                        </td>
                    </tr>
                    <tr>
                        <td align="left">
                            <div>内容内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容内容</div>
                        </td>

                        <td align="left">
                            <div>内容内容内容内容内容内容内容内容</div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <script type="text/javascript">
            $(document).ready(function() {
                var $els = $('.content');
                $els.each(function() {
                    var This = $(this);
                    var $titles = This.find('.title, .sub-title');
                    This.parent().css('position', 'relative');
                    $titles.each(function() {
                        var _this = $(this);
                        var offset = _this.position();
                        var width = _this.width();
                        var newEl = _this.clone();
                        _this.css('opacity', '0');
                        newEl.attr('style', 'display: block !important;width: ' + width + 'px;word-break: break-all;white-space: normal;position:absolute;');
                        newEl.offset({
                            top: offset.top,
                            left: offset.left
                        });
                        This.parent().append(newEl);
                    });
                });
            });
        </script>

</body>

</html>

5、关于 thead、tbody、tfoot

如果您使用 thead、tfoot 以及 tbody 元素,您就必须使用全部的元素。它们的出现次序是:thead、tfoot、tbody,这样浏览器就可以在收到所有数据前呈现页脚了

6、table 列等宽样式设置


table {
table-layout: fixed;
display: table;
}

参考引用:
https://www.cnblogs.com/cowboybusy/p/10530547.html
https://www.w3school.com.cn/tags/tag_colgroup.asp