表格花式效果

简介: 对于table的一些基础信息不了解的,可以参考我以前写过的一篇《关于table的一些记录》。下面演示的代码,具体的源码可以参考此处。

对于table的一些基础信息不了解的,可以参考我以前写过的一篇《关于table的一些记录》。下面演示的代码,具体的源码可以参考此处


一、表格固定左边与顶部


公司最近要做个排期系统,当滚动表格的时候,需要将顶部和左边的分别固定起来。

1)固定顶部

0.gif

原理就是用标签模拟出顶部的样式,通过脚本计算出高度,以及各个块的宽度,再将table中的thead的内容覆盖掉。

1. 样式:通过绝对定位,将ul中的内容覆盖中顶部。


<ul class="calendar-table-top-header">
  <li></li>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
</ul>


2. 计算尺寸:通过获取到th标签的宽和高,赋给对应的li标签。涉及到了元素的offsetHeight、offsetWidth属性,更多关于尺寸的信息可以参考《JavaScript中尺寸、坐标


function fixedTopHeader($table) {
  $table.siblings('.calendar-table-top-header').remove();//移除原先的模拟顶部
  var $ul = $('<ul>').addClass('calendar-table-top-header'),
    $ths = $table.find('thead th');
  $ul.width($table.find('thead')[0].offsetWidth + 1);
  $.each($ths, function(key, value) {//遍历th标签,设置li的宽高
    var $th = $(value);
    var $child = $('<li>').css({
      height: $th[0].offsetHeight,
      width: $th[0].offsetWidth
    }).html($th.html());
    $ul.append($child);
  });
  $table.before($ul);
}


2)固定左边

固定左边与固定顶部的原理是一样的,代码也很类似。


0.gif


1. 节流:创建元素的代码已经实现,接下来要实现执行上述代码的事件“scroll”,这里涉及到一个节流的概念,节流是一种代码优化。

如果不做节流,那么将会损耗性能,导致在滚定的时候,展示的固定元素一卡一卡的,很不流畅,在《JavaScript优化以及开发小技巧》中曾经解释过节流的概念。

 

二、表格中嵌套表格


嵌套的表格每一行的高度要与外面的表格一致,并且最后一行需要将滚动条的高度去除,否则会影响整个高度的展示。


1.gif


1. 头部元素:头部“2016年11月”,如果用跨列colspan来做的话,每次都要计算列的个数,所以这里用了“caption”标签,不过在上下对齐方面没有th标签方便。


<table class="table table-bordered">
  <caption>2016年11月</caption>
  <tbody>
    <tr>...</tr>
  </tbody>
</table>


2. tr高度:这里的tr获取的是外面的table,不是嵌套的table。tr的高度有两个比较特殊,第一个和最后一个,分别要减去1和18,上边框与滚动条的高度。


$schedule.children('tbody').children('tr').each(function() {
    heights.push(this.getBoundingClientRect().height);
});
if (heights.length == 0)
    return;
heights[0] -= 1; //去除下边框
heights[heights.length - 1] -= 18;//去除滚动条的高度


3. 尺寸赋值:分别计算嵌套表格的宽度,算出总宽度,给包裹的div赋总宽度,再给嵌套表格的每个tr赋值。给包裹的div赋了个默认值“width: 2000px;”。




<div class="schedule-hidden">
  <div class="day-table" style="width: 2000px;">
    <table class="table table-bordered">
      <caption>2016年11月</caption>
      <tbody>
        <tr>...</tr>
      </tbody>
    </table>
    <table class="table table-bordered">
      <caption>2016年12月</caption>
      <tbody>
        <tr>...</tr>
      </tbody>
    </table>
  </div>
</div>


用的jQuery踩到了一个“height()”方法的小坑。


$tables.each(function() {
    var $this = $(this);
    width += this.offsetWidth;
    $this.children('caption').css('height', heights[0]); //如果用height 会将padding也算在内
    $this.find('tr').each(function(index) {
      $(this).height(heights[index + 1]);
    });
});
$dayContainer.find('.day-table').width(width);//嵌套表格的外包裹div的宽度,宽度小的话会让表格换行


4. 初始化隐藏:上面HTML代码中用到了“schedule-hidden”,做初始化隐藏,就会向下图那样,拉伸,影响体验。


1.gif


但是如果用普通的“display:none”做隐藏,就会出现包裹的div宽度“width:0”,这是因为“none”内的元素没有物理尺寸,占据的空间位置不存在。


.table-schedule .schedule-hidden {
    display: none;
}


2.png


所以就用变通的方法,“height:0”来做隐藏。或者用“position和left”组合,或用“visibility”,或者用“opacity”。


.table-schedule .schedule-hidden {
    height: 0;
    /*position: absolute;
    left:-10000px;*/
    /*opacity: 0;*/
    /*visibility: hidden;*/
}
相关文章
|
存储 数据建模 数据库
初探多维表格
最近调研学习了一些多维表格产品,记录一下自己收获的基础认知。在线表格的基础结构是单元格,横向纵向拓展的单元格的集合,就构成了一张工作表。单元格之间可以任意关联,非常灵活。在线表格的适用面很广,能够在数据收集和分析、财会统计等场景发挥重要的作用。在我试图寻找国外的多维表格产品时,发现很少有用「表格」来描述自己的。比如 Airtable 对自己的介绍是:一个构建协同应用的低代码平台。目前国内处于前沿的
1018 0
初探多维表格
|
Web App开发 Python
直接保存“DataFrame表格”到本地,这个“骚操作”90%以上的人不知道!
直接保存“DataFrame表格”到本地,这个“骚操作”90%以上的人不知道!
直接保存“DataFrame表格”到本地,这个“骚操作”90%以上的人不知道!
|
3月前
Axure 中继器 实现选取表格行、列交互
Axure 中继器 实现选取表格行、列交互
47 5
|
5月前
|
存储 数据处理 计算机视觉
Python中的列表处理:获取与设置缩略图的艺术
Python中的列表处理:获取与设置缩略图的艺术
33 1
|
6月前
|
数据采集
分面中添加不同表格
分面中添加不同表格
62 0
【Axure教程】中继器表格集合(增删改查筛选移动排序等效果)
【Axure教程】中继器表格集合(增删改查筛选移动排序等效果)
【Axure教程】中继器表格集合(增删改查筛选移动排序等效果)
成功解决在excel表格中仅在某列内插入一个空白单元格,使其下部的数据整体下移一格
成功解决在excel表格中仅在某列内插入一个空白单元格,使其下部的数据整体下移一格
成功解决在excel表格中仅在某列内插入一个空白单元格,使其下部的数据整体下移一格
|
前端开发
表格破事多
为啥要写这篇文章呢,就是因为最近项目遇到了很多使用表格的功能。要是说只要表格看看,那还有啥要整理的啊,little case!
224 0
|
UED iOS开发 数据可视化
移动用户体验设计之列表视图与网格视图
尽管大屏幕手机已逐渐成为当下主流趋势,但是小尺寸的手机更加方便和便携。不过与台式机和笔记本电脑屏幕相比,手机屏幕(无论屏幕大小)所能呈现的内容要少得多。
948 0