zoukankan      html  css  js  c++  java
  • 纯CSS实现table表头固定(自创备忘)

      因为之前约定时候产品没说要表头固定,这次迭代测试突然提出这个需求,而且不知道因为什么未知原因非要这样不可……因为之前用了table标签做表单,而且也没用插件,这下就难了点,找另外一个前端前辈妹子商量了下,她意思是用js来控制,我则是一直觉得js来计算可能性能上有点不太好,所以我推荐还是css来搞定得了。

      先来看别人的经验吧:

    -------------------------------------------------------------以下是引用别人的文章-------------------------------------------------------------

    最近一直在搞前台琐碎的东西,也学习了一下linux,没有时间对新的东西进行深入的研究和学习,没有写博客,不过归咎其原因还是在于自己的惰怠。

    废话不多说,今天想将一个前台页面设计的一个小东西分享一下,那就是平时我们设计表格的时候,通常都想将表格的头部进行固定,而表格的body部分能够进行滚动的效果,其实这个实现起来很简单的,但是对于初学div+css布局的同学来说,还是有些帮助的。

    先体验一下操作感受:

    马上上代码,首先看html

    复制代码
     1 <div style=" 800px;">
     2     <div class="table-head">
     3     <table>
     4         <colgroup>
     5             <col style=" 80px;" />
     6             <col />
     7         </colgroup>
     8         <thead>
     9             <tr><th>序号</th><th>内容</th></tr>
    10         </thead>
    11     </table>
    12     </div>
    13     <div class="table-body">
    14     <table>
    15         <colgroup><col style=" 80px;" /><col /></colgroup>
    16         <tbody>
    17             <tr><td>1</td><td>我只是用来测试的</td></tr>
    18             <tr><td>2</td><td>我只是用来测试的</td></tr>
    19             <tr><td>3</td><td>我只是用来测试的</td></tr>
    20             <tr><td>4</td><td>我只是用来测试的</td></tr>
    21             <tr><td>5</td><td>我只是用来测试的</td></tr>
    22             <tr><td>6</td><td>我只是用来测试的</td></tr>
    23             <tr><td>7</td><td>我只是用来测试的</td></tr>
    24             <tr><td>8</td><td>我只是用来测试的</td></tr>
    25             <tr><td>9</td><td>我只是用来测试的</td></tr>
    26             <tr><td>10</td><td>我只是用来测试的</td></tr>
    27             <tr><td>11</td><td>我只是用来测试的</td></tr>
    28             <tr><td>12</td><td>我只是用来测试的</td></tr>
    29             <tr><td>13</td><td>我只是用来测试的</td></tr>
    30             <tr><td>14</td><td>我只是用来测试的</td></tr>
    31             <tr><td>15</td><td>我只是用来测试的</td></tr>
    32         </tbody>
    33     </table>
    34     </div>
    35 </div>
    复制代码

    再看css如下

    1 .table-head{padding-right:17px;background-color:#999;color:#000;}
    2 .table-body{100%; height:300px;overflow-y:scroll;}
    3 .table-head table,.table-body table{100%;}
    4 .table-body table tr:nth-child(2n+1){background-color:#f2f2f2;}

    其实关键之处在于

    1、使用了colgroup标签,来对上下两个表格的列宽进行了定义,让他们保持一致。

    2、上边的div .table-head添加了样式padding-right:17px,这个宽度是为了保证跟下边的div .table-body的滚动条保持一致,同时下边的表格.table-body添加了样式overflow-y:scroll;

    只要保证上述两点的话,你也可以做出固定表头的表格来,同时不会发生上下的列不对齐的问题,屡试不爽!

    文章作者:文飞

    文章出处:文飞的博客

    版权说明:本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面中给出原文连接。

    -------------------------------------------------------------以上是引用别人的文章-------------------------------------------------------------

    BUT,估计是我打开方式不对还是咋回事,就是成功不了,各种表头和表身的border对不齐,无奈的很。周六大晚上23点半,凌乱中我乱试了自己想到的方法:

    <div class="table-responsive article_tab" id="scrollTable">
      <div class="dbTable" style="padding-right: 17px;">
        <table class="table table-bordered theadUnScoll">
          <colgroup>
            <col width="4%"><col width="5%"><col width="40%"><col width="10%"><col width="10%"><col width="15%"><col>
          </colgroup>
          <thead>
            <tr>
              <th class="tableHeadTh">
                <div class="checkbox my_checkbox">
                  <label class="checkbox-inline">
                    <!--全选-->
                    <input type="checkbox" ng-model="select_all" ng-change="selectAll()">
                  </label>
                </div>
              </th>
              <th class="tableHeadTh">编号</th>
              <th class="tableHeadTh">文章标题</th>
              <th class="tableHeadTh">文章类型</th>
              <th class="tableHeadTh">文章状态</th>
              <th class="tableHeadTh">录入时间</th>
              <th class="tableHeadTh noRborder">操作</th>
              <th class="noLborder"></th>
            </tr>
          </thead>
        </table>
      </div>
      <div class="divTbody dbTable">
        <table class="tbodyUnScoll">
          <colgroup>
            <col width="4%"><col width="5%"><col width="40%"><col width="10%"><col width="10%"><col width="15%"><col>
          </colgroup>
          <tbody>
            <tr ng-repeat="text in textList | orderBy:'createTime':true">
              <td>
                <div class="checkbox my_checkbox">
                  <label class="checkbox-inline">
                    <!--勾选-->
                    <input type="checkbox" ng-model="text.checked" ng-change="selectOne()">
                  </label>
                </div>
              </td>
              <td>{{text.id}}</td>
    
              <td>{{text.title}}</td>
    
              <td ng-if="text.type == 2">自定义链接</td>
              <td ng-if="text.type == 1">外部链接</td>
              <td ng-if="text.publishStatus == 1">已发布</td>
              <td ng-if="text.publishStatus == 2">定时发布</td>
              <td>{{text.createTime | date:'yyyy-MM-dd HH:mm:ss'}}</td>
              <td class="linkWrap">
                <a ng-href="{{text.htmlUrl || text.linkUrl}}" target="view_window">查看</a>
                <a ui-sref="dashboard.article-Edit({articleId:text.id})" ng-if="showArticleModify" ng-class="{Gray:disArticleModify}">编辑</a>
                <a data-toggle="modal" data-target="#myModal-delete" role="button" ng-click="trigger_del_text(text.id)" ng-if="showArticleRemove" ng-class="{Gray:disArticleRemove}">删除</a>
                <a ui-sref="dashboard.article-reviews({articleId:text.id})" ng-if="showCommentGet" ng-class="{Gray:disCommentGet}">评论管理</a>
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
    table.theadUnScoll {
        width: 100%;
      margin-bottom: 0px;
    }
    
    table.theadUnScoll th{
      font-size: 12px;
      color:#444444;
      background: #F5F5F5;
    }
    
    .divTbody{
      position: absolute;
      top: 35px;
      width: 100%;
      //height: 100px;
      bottom: 0px;
      overflow-y: scroll;
    }
    
    table.tbodyUnScoll {
      width:100%;
      border: 1px solid #ddd;
      border-right:#B74;
      color:#666666;
      background: #fff;
    }
    
    table.tbodyUnScoll td{
      border:1px solid #ddd;
      padding: 8px;
    }
    
    table.theadUnScoll th.noRborder{
      border-right: 0px;
    }
    table.theadUnScoll th.noLborder{
      border-left: 0px;
    }

    这个方法竟然成!功!了!!!

    上图:

      好了,我要总结一下,尽管这个方法我是成功了,但是可能别的情况下不知道怎么直接切入这种操作。要点就是:

      1、表头和表身首先必须由<div>包裹且表头的<div>一定要有padding-right: 17px;(这个是重点一);

      2、如果有7个纵列,那么<colgroup>中的<col>也要有7个且最后一个<col>不要给规定宽度(这个是重点二);

      3、如果有7个纵列,表头的table中的<th>要多加一个空的<th>;下面的表身则不用加(这个是重点三);也可能是样式布局的关系,导致我不加这个空的<th>总是会错位。

      综上,这个表格不用强行规定宽度,可以自适应窗口大小;缺点是如果窗口太小了,很可能把有些表头的字搞换行导致纵列的border错位。目前能想到就这么多,暂且记下,也希望帮助到遇到此问题的朋友!

    文章作者:Edison

    文章出处:Edison的备忘录

    版权说明:本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面中给出原文连接。

  • 相关阅读:
    蓝桥杯基础练习 杨辉三角形
    蓝桥杯基础练习 回文数 特殊的数字
    普及图论三题 P1807 P1113 P 4017
    P3916 图的遍历
    [转载][总结]图论入门:建图,DFS,BFS,拓扑排序
    如何转载博客园的文章
    P1892 [BOI2003]团伙
    P1621 集合
    [模板]线性筛素数(欧拉筛)
    P5076 普通二叉树(简化版)
  • 原文地址:https://www.cnblogs.com/edison1412/p/7382393.html
Copyright © 2011-2022 走看看