grid和ol元素响应表格设计方案

弹性表格布局不是新主题,并且已经提出了许多解决方案。 “响应表数据综述”由Chris Coyier于2012年首次发布,事情总结得很整齐(包括2018年的更新)。原文连接:https://css-tricks.com/responsive-data-table-roundup/
还有以下一篇文章
Really Responsive Tables using CSS3 Flexbox”

前文提要:

这里还有一个可选项就是网格响应布局。这不是网格的基础教程,是一个实际的演示案例,对网格布局不熟悉的可以参考国内沅一峰的相关网格文章,本文最后有传送门...谢谢。

HTML表格

HTML中的传统的table是一种布局格式,用于通过行和列矩阵显示项目集合。 项按行布局,在相同列中具有相同的数据属性,行通常按一个或多个可排序属性排序。使用table时,数据的布局生硬地编码为行和列(例如<tr>和<td>)。通常这种布局方式在桌面浏览器中可以正常地陈列数据,但实际上,当你需要在手机浏览器上容纳相同行数的数据表时,往往和发生各行单元格的宽度和列标题单元格宽度不一致的情况,尤其当你的表格是表头固定,表体可以上下滚动的flex表格布局。在手机端浏览器更是如此

各行单元格的宽度和列标题单元格宽度不一致的情况

造成这种原因主要是来自单元格的字符串长度不确定性而导致的。你可能会做的是固定每个flex单元格的宽度或者对超出单元格宽度的字符串进行类似overflow:hidden的样式设置,或者字体换行等。但那些是非常不好的设置体现。

改善问题

先见一组预览图,在本文中,我使用CSS网格布局模块和CSS属性在没有Javascript的情况下根据屏幕的宽度来模拟一个表格,并且在小屏幕下的行记录切换为卡片模式。主要是规避手机端的宽度过小的问题,充分利用好手机屏幕的高度,容乃足够的信息。如下图效果。


Kapture-2019-08-04-at-22.02.06.gif

重新定义的表

让我们首先重新定义表格数据应该如何用HTML表示。这里为什么不用回table元素的flex方案呢?我不想废话,如果你要实现flex的布局方案并且有些数据列是多个单元格复合的话,使用table的flex方案写出的html模版会比单纯的ol和div的网格方案会异常的复杂的多。

如前所述,由于表数据本质上是一个有序的项集合,因此使用有序列表似ol元素是顺其自然。 此外,由于表通常用于补充文本描述,因此<div>用于表示单元格的属性,因为HTML5没有为此定义适当的标记。 这里的关键是将语义相似的属性表示为<div>的层次结构。 在定义数据表的grid布局方式时将使用此结构。

<ol class="table-container">
        <!--第一个li是模拟thead-->
        <li class="table-header row">
            <div class="cell sn">#</div>
            <div class="cell username">用户名</div>
            <div class="cell depart">部门</div>
            <div class="cell title">职务</div>
            <div class="cell contact">联系方式</div>
            <div class="cell avatar">照片</div>
        </li>
       <!--第二个li是模拟tbody,并且内部在嵌套一个与外层一样的
            ol有序列表结构,主要实现数据表的上下滚动效果-->
        <li class="table-body">
            <ol class="table-container">
                <li class="row">
                    <div class="cell sn" data-title="#">1</div>
                    <div class="cell username" data-title="用户名">Jack</div>
                    <div class="cell depart" data-title="部门">品质</div>
                    <div class="cell title" data-title="职务">主任</div>
                    <div class="cell contact" data-title="联系方式">137-1341-0192</div>
                    <div class="cell avatar" data-title="">
                        <img src="/static/images/male.png">
                    </div>
                    .......
                </li>
             </ol>
        </li>
    </ol>

如上数据类tbody里的所有<div>元素内的实际数据都是实际数据。

使用ol有序列表+grid布局方案的优点

  1. 网格模拟的表格的样式轮廓很简洁,对列宽度的定制相对比较灵活,得益于网格的grid-template-columns的属性。
  2. 只需在不同的media screen语句中,在相邻的两个li元素之间的,可以实现非常复杂的多列复合报表结构。样式控制相对简单。即便无javascript的参与都能实现。


    多列复合的响应布局,主要用一个同一个css 的class样式的div子列包裹在同样class样式的父div中

然后是核心的多列复合的网格css样式代码(关于多列复合的响应布局可能需要另外独立写一文)

    .cell-container{
        display: grid;
        grid-template-columns: repeat(auto-fit,minmax(var(--column-width-min),1fr));
    }
这是一种多列复合响应布局的示例
  1. 多浏览器支持,目前ie11之后和基于webkit内核的主流浏览器都支持。

缺点:

模拟单元格 div需要过多相同的自定义属性,有些冗余的感觉。

表头固定,表体上下滚动的通用样式

这样的样式还不算简洁的,当然可以进一步简写,当然鉴于这遍是教程。这里写的css略有冗余。

ol.table-container{
    list-style: none;
    padding:0;
    margin: 0;
    width:450px;
}

ol.table-container * {
    box-sizing: border-box;
}

.table-container >.row{
    display: grid;
    grid-template-columns: 3em 5em 4em 4em 9em 3em;
    border-top:1px solid #ccc;
    border-right: 1px solid #ccc;
}

.contact{
    grid-column: span 2;
}

.table-header{
    background-color: blanchedalmond;
    border-bottom: 1px solid #ccc;
}
.table-header >.cell{
/*     border-top:1px solid #ccc; */
    border-left:1px solid #ccc;
    text-align: center;
}


.table-body{
    height: 200px;
    overflow-y:auto;
    border-bottom:1px solid #ccc;
}
.table-body > ol > li >.cell{
    text-align: center;
    border-left: 1px solid #ccc;
}

.table-header >.cell:last-child,
.table-body > .table-container >.row >.cell:last-child{
    display: none;
}


@media screen and (max-width:460px){
    
    ol.table-container{
        width: 95%;
        height: 450px;
        overflow-y: auto;
    }
    
    .table-header.row{
        display: none;
    }
    
    .table-body{
        height: 100%;
        overflow:hidden;
    }
    
    
    .table-body >.table-container > .row {
        display: grid;
        grid-template-columns: 1fr;
        background-color: blanchedalmond;
        border:1px solid #ccc;
        margin-bottom: 15px;
        border-radius: 15px;
        padding:15px;
        box-shadow: 10px 10px 10px -5px #ccc;
        transition: all .5s ease-in;
        line-height: 1.2em;
    }
    
    .row{
        width:95%;
        min-width: 326px;
    }
    
    .table-header >.cell:last-child,
        .table-body > .table-container >.row >.cell:last-child{
        display: inline-flex;
    }
    
    
    .contact{
        grid-column: span 1;
    }
    
    .table-body > .table-container > .row > .cell:before{
        content: attr(data-title);
        text-align: left;
    }

    .table-body > .table-container > .row >.cell{
        display: grid;
        grid-template-columns:4em 9em .8fr;
        padding-left:8px;
        grid-gap: 5px;
        justify-items: left;
        border:1px s÷olid #ccc;
    }
    
    .table-body >.table-container > .row > .avatar{
        grid-row:1 / 6;
        grid-column: 2 / 3;
        align-items: center;
    }
    
    .table-body > .table-container >.row:hover{
        background-color: #ffe066;
        box-shadow: 10px 10px 10px -2px #999;
    }   
}

这里的基本思想是将项目的所有属性显示为普通表,显示宽度允许。 这种布局可以看到尽可能多的项目(行)。table-body里的ol的class样式是二次嵌套使用,虽然略有冗余,但整体来说非常简洁。

卡片样式主要通过隐藏表头,和重置二层嵌套的ol有序表的网格结构实现。

网格参考文章:
http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 简介CSS网格布局(又称“网格”),是一种二维网格布局系统。CSS在处理网页布局方面一直做的不是很好。一开始我们用...
    _leonlee阅读 64,924评论 25 173
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,828评论 0 0
  • 简介 CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,旨在改变我们基于网格设计的用户界面方式...
    咕咚咚bells阅读 2,481评论 0 4
  • Bootstrap是什么? 一套易用、优雅、灵活、可扩展的前端工具集--BootStrap。GitHub上介绍 的...
    凛0_0阅读 10,848评论 3 184