基于display:table的CSS布局

技术标签: css

CSS表格能够解决所有那些我们在使用绝对定位和浮动定位进行多列布局时所遇到的问题。例如,“display:table;”的CSS声明能够让一个HTML元素和它的子节点像table元素一样。使用基于表格的CSS布局,使我们能够轻松定义一个单元格的边界、背景等样式,而不会产生因为使用了table那样的制表标签所导致的语义化问题

这里写图片描述

这里写图片描述

这里写图片描述

我们轻松实现了三栏等高布局,而无需使用伪造背景图片之类的技巧,更不用担心定位和清除浮动的问题!

1. 它是怎样实现的?

你可以给HTML元素指定与表格相关的display属性值,使得它们像表格元素那样渲染。以下是这些可用的display属性值:

- table:使该元素按table样式渲染

- table-row:使该元素按tr样式渲染

- table-cell:使该元素按td样式渲染

- table-row-group:使该元素按tbody样式渲染

- table-header-group:使该元素按thead样式渲染

- table-footer-group:使该元素按tfoot样式渲染

- table-caption:使该元素按caption样式渲染

- table-column:使该元素按col样式渲染

- table-column-group:使该元素按colgroup样式渲染

2. 等等……难道用table布局不是错的吗?

可能你会对我们上面给出的布局实例有点不爽——毕竟,正如我自己也是一名WEB标准化的拥护者,我们不都一直坚持不应该使用table来进行布局吗?

table元素在HTML当中是一个包含语义的标签:它描述什么是数据。因此,你只能用它来标记那些需要制表的数据,例如一张财务信息表。如果数据能够以电子表格的形式保存在你的电脑中,那它在HTML文档中很可能需要用到table标签进行标记

从另一方面来看,display的table属性值只是声明了某些元素在浏览器中的样式——它不包含语义。如果使用table元素来进行布局,它将会告诉客户端:这些数据是制表的。使用一些display属性被设置为table和table-cell之类的div标签,除了告诉客户端以某种特定的样式来渲染它们以外,不会告诉客户端任何语义,只要客户端能够支持这些属性值

当然,我们同样还要注意,当我们真的需要制表数据的时候不要使用一大堆被声明为display:table;的div元素。我们上面的那个例子是一个简单的单行三列布局,无需费尽心思,我们就能够使用这种技术轻松实现复杂的栅格布局。

3. 匿名表格元素

CSS表格除了包含table布局的普通规则之外,同时还有着CSS table布局的超强特性:缺少的表格元素会被浏览器以匿名方式创建。CSS2.1规范中写道:

这里写图片描述

这段话的意思是,如果我们为元素使用“display:table-cell;”属性,而不将其父容器设置为“display:table-row;”属性,浏览器会默认创建出一个表格行,就好像文档中真的存在一个被声明的表格行一样。

让我们用个简单的例子来研究下它的这一特性:以下是三栏栅格布局。我们将会用三份不同的HTML样例,而它们将表现出相同的视觉效果

这里写图片描述

首先,以下是能够生成三列布局样例的其中一份:

这里写图片描述

这份嵌套的div元素看起来不是那么让人兴奋,稍等一会,我们现在来做点什么。它的CSS样式也非常简单

这里写图片描述

以上CSS给类名为container的元素定义了“display:table;”属性,类名为row的元素定义了“display:table-row;”,类名为cell的元素定义了“display:table-cell;”,同样还给它定义了边框、高度和宽度值。

以上HTML文档明确地为三个单元格定义了包含它的表格和表格行,使用到了所有我们创建的CSS类名。然而,我们可以减少这些标签,移除一行div元素试试

这里写图片描述

即使上面的代码遗漏了声明表格的那一行,浏览器仍将创建一个匿名的表格行。我们还可以移除更多的代码

这里写图片描述

以上代码遗漏了声明表格和表格行的代码,浏览器同样会创建出这些匿名的盒对象。即使缺少这些标签元素,最终的效果仍然是一样的。

4. 创建匿名表格元素的规则

这些匿名的盒对象不是用魔术变出来的,它们也不会自动往你的HTML源码中添加新的标签。为了完全发挥出匿名表格元素的优势,你最好能够对创建它们的规则有所了解。如果布局中调用了匿名元素,浏览器将会根据需要创建一个匿名的盒对象并将它的CSS display属性设置为table、table-row或table-cell中的一个

如果某个元素已经被设置为“display:table-cell;”,而它的父节点(包含它的容器)没有被设置为“display:table-row;”属性,那么浏览器将会创建一个被设置为“display:table-row;”的匿名盒对象来嵌套它。并且与之相邻的属性为“display: table-cell;”的兄弟节点也都会被这个匿名盒对象所包含,直到碰到一个没有被设置为“display: table-cell;”的元素而结束这一行。

这里写图片描述

上面的三个类名为“cell”的div元素均被设置为“display:table-cell;”,它们将会像一个单行表格的三个单元格一样并列排布。最后一个div元素则不会被包含在这一表格行当中,因为它没有被设置成“display:table-cell;

如果某个元素被设置为“display:table-row;”,而它的父节点没有被设置为“display:table;”(或者“display:table-row-group;”),浏览器将会创建一个被设置为“display:table;”的匿名盒对象来嵌套它,与之相邻的属性为“display: table-row;”的兄弟节点也都会被包含其中。同样,如果某个元素被设置为“display:table-row;”,但它的内部却缺少“display:table-cell;”的元素,那么一个匿名的table-cell将会被创建,用来包含该table-row中的所有元素

这里写图片描述

上面两排类名为“row”的div元素被设置了“display:table-row;”属性,它们将会像单列表格中的两行一样依次排列。最后一个div元素则不会包含在这个匿名的table中

以此类推,如果某个元素的display属性值被设置为与表格相关的值,如table-row-group、table-header-group、 table-footer-group、table-column、table-column-group以及table-caption,但同时又没有一个被设置为“display:table;”的父元素,那么一个匿名的盒对象将会被创建用来包含该元素和它的某些兄弟节点。

5. 其他有用的表格属性

当使用CSS表格时,因为这些表格内的元素遵从table布局的普通规则,所以你还可以给它们应用其它表格相关的CSS属性。下面是一些派得上用场的属性:

table-layout

将table-layout属性设置为fixed后,则列宽由固定的表格宽度和列宽度设定。这在固定宽度布局中非常有用,例如我们最上面的那段布局代码

这里写图片描述

5.1 table-layout:fixed是采用固定表格布局,固定表格布局与自动表格布局相比,允许浏览器更快地对表格进行布局。在固定表格布局中,水平布局仅取决于表格宽度、列宽度、表格边框宽度、单元格间距,而与单元格的内容无关。通过使用固定表格布局,用户代理在接收到第一行后就可以显示表格。

5.2 table-layout:automatic是采用自动表格布局,在自动表格布局中,列的宽度是由列单元格中没有折行的最宽的内容设定的。此算法有时会较慢,这是由于它需要在确定最终的布局之前访问表格中所有的内容。

Border-collapse

和普通的HTML表格一样,你可以使用border-collapse属性来定义你的table布局元素之间使用何种形式的边框,是共用边框(赋值为collapse)还是使用各自独立的边框(赋值为separate)

Border-spacing

如果你声明了“border-collapse:separate;”,那么你就可以使用border-spacing属性来定义相邻两个单元格边框间的距离

来源:网络


智能推荐

css布局

常用页面布局方式:浮动(float),负边距(margin);定位(positon); 双飞翼布局: 这里考虑浏览器解析页面时,应该让主列优先于其他列加载; 首先我们用float+负边距的形式来搞 实现效果(正常+小化浏览框) 这种方式兼容性很强,就只有在IE6下通过_zoom:1触发haslayout而已;还有就是在浮动情况下通过设置边距负值,可使DIV上移,但一定要大于或者等于其宽度; 这里我...

CSS布局:

CSS布局: 文章目录 CSS布局: 前提条件: 指南 介绍 CSS 布局 正常布局流 弹性盒 网格 浮动 定位 多列布局 响应式布局 媒体查询入门指南 传统布局方法 支持旧浏览器 前提条件: 在开始前,你应该已经具备: 对HTML的基础了解,在Introduction to HTML部分讨论过的。 一定的CSS基础,在Introduction to CSS部分讨论过的。 了解如何样式化盒子模型....

css布局

一、单列布局  (一)、水平居中     1、通过父级设计text-align:center,子级设置为行内块元素   display:inline-block 效果图: 2、通过margin:0 auto 代码图: 效果图: 3、通过display:table 和margin: 0 auto 效果图:   4、通过定位来实现  ...

【23种设计模式】之 代理模式(Representative Pattern)

代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。   使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。 代理控制访问:就好比客户端不知如何和远程对象沟通,通过远程代理控制访问,直接处理网络上的戏剧节。 RMI访问图...

猜你喜欢

Girls and Boys(HDU-1068)

Problem Description In the second year of the university somebody started a study on the romantic relations between the students. The relation "romantically involved" is defined between one ...

有趣的8个IT冷知识

阅读本文大概需要 2.8 分钟。 想要成为一名成功的程序员,我们除了了解不同编程语言的设计思路,也应当了解编程的发展历史,从而判断未来的编程技术将走向何方。接下就为大家普及下计算机发展历程中的8个冷门小知识!   01 第一台电脑为蒸汽驱动 作为公认的编程之父,Charles Babbage发明了世界上首批计算机之一。他将这台新设备称为分析引擎。其体积超过一栋房屋,由六台蒸汽机驱动并使用...

顶篷11秒开启 迈凯伦720S Spider正式发布

近日,我们从相关渠道获悉,迈凯伦720S Spider正式发布,这也是迈凯伦Track25商业计划下的第二款新车型。相比硬顶版本,新车拥有一套可在11秒内完成开启/闭合的硬顶敞篷结构。 迈凯伦720S Spider基于其硬顶Coupe版本打造而来,由于迈凯伦的全碳纤维座舱Monocage II集成有翻滚保护结构,所以敞篷版没有在硬顶版的基础上进行额外加强。外观设计上,新车将配备全新的前19寸后20...

SpringBoot从0到实战1:10分钟配置环境及HelloWorld项目

什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 学 springboot 需...

2021-07-15

基于Openstack的云计算IaaS部署实战 云计算部署实战Part1 - 制作CentOS 模板镜像 【实验目的】 掌握搭建 CentOS 模板镜像 熟练掌握Linux命令的使用 掌握VMWare、XShell等客户端的使用 【实验环境】 内存:至少4G 硬盘:至少空余50G 操作系统: 64位 Windows系统。 资源百度云 链接:https://pan.baidu.com/s/1gwed...

问答精选

ArrayAdapter add method casting Illegal state exception

I have a problem adding items to my array adapter. Here is the code If the code is put in the onCreate method, it works! If i comment the line it works! I've tried almost everything but with no result...

Can I read iBeacon data using AS3/Air?

I am wanting to develop a simple micro location app using iBeacons (just arrived today...how exciting). I have zero experience coding native in iOS and Android however have developed several apps usin...

How do I know if an embedded systems project is using an embedded operating system?

I followed these instructions and was successfully transmitting IEEE 802.15.4 frames on a GINA Mote. I know it was working because I have a packet sniffer that captured transmitted packets. Here is th...

After closing the modal dialog refresh the base view

suggestion and code sample I am new to Backbone marionette, I have a view ("JoinCommunityNonmemberWidgetview.js") which opens a modal dialog ("JoinCommunityDetailWidgetview.js").On...

c++ how to read a file and split it's lines

I'm trying to read a file and split each line (so instead of the line "I walk my dog every day" I would have "I", "walk", "my", "dog", "every&quo...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答