基于display:table的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中

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属性来定义相邻两个单元格边框间的距离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC Training Kit发布了

Scott Guthrie昨天宣布了ASP.NET MVC 按照Ms-PL协议开源发布,具体内容参见ASP.NET MVC 1.0 has been released,也可以参看Scott Hanselman的新闻稿Microsoft ASP.NET MVC 1.0 is now Open Source MS-PL。 微软同时也推出了一套ASP.NET MVC frameworke培训…

JS实现滚动监听以及滑动到顶部

效果图: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><!-- <meta name"viewport" content"widthdevice-width, initial-scale1.0" /> --><meta name"viewport" …

display:table-cell自适应布局下连续单词字符换行

1. display:table-cell自适应布局 典型的双栏布局类名使用如下&#xff1a; 这种方式实现的自适应布局&#xff0c;元素宽度无需定值&#xff0c;且margin(浮动部分)与padding自由设置&#xff0c;支持百分比宽度&#xff08;table-cell内&#xff09;&#xff0c;且可以无限制…

childnodes 兼容性问题

解答一childNodes 这个方法基本没法用&#xff0c;存在严重的浏览器兼容性问题&#xff0c;里面可能包含了很多没用的空节点&#xff0c;所以你用childNodes(索引)获取元素是不对的。table中获取tr、td等还是挺方便的像这样&#xff1a;trtbs.rows[索引]tdtbs.rows[索引].cells…

javascript学习系列(21):数组中的reduceRight法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

向高手学习--第3列数据是第2列从头到当前行的值之和

From: http://topic.csdn.net/u/20111203/13/1fb6742b-205f-4bc0-bdeb-ba26a7e174aa.html?14713 问题描述&#xff1a; 我现在有一个表&#xff0c;名字为 table1, 表里有两列&#xff0c;一列是序号ID&#xff0c;一列是数量 NUM1&#xff0c;比如ID1 NUM11 202 303 504 10…

天道

精神拯救的暴利和麻醉所获得的暴利完全等值&#xff0c;它没有象贩毒那样需要耍花招&#xff0c;没有心理成本&#xff0c;也没有法律风险&#xff01; 出卖和背叛是两个概念&#xff0c;如果你背叛邪恶&#xff0c;那么上帝都会加冕这种背叛 如果你想在侍庙…

JS滚动条位置,顶部,底部,触发事件

效果图: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv"X-UA-Compatible" c…

ArcGIS 10.0安装之 ArcSDE的安装

第三部分 SDE的安装、部署 1、 安装SDE程序&#xff0c;并进行注册 &#xff08;1&#xff09;选择注册机&#xff0c;点击server标签&#xff0c;在Feature下拉列表框选择arcsdeserver&#xff0c;Version下拉列表框选择100&#xff0c;点击ALL按钮&#xff0c;生成license文件…

自适应表格连续字符换行及单行溢出点点点显示

我们应该都知道使用 让连续的英文数字字符换行显示 让单行文字超出的时候使用点点点表示 但是&#xff0c;如果是自适应的表格中&#xff0c;我们要实现上面两个效果&#xff0c;可能就会遇到挫折&#xff0c;你会发现屡试不爽的方法现在完全被无视了&#xff01; 例如&#…

javascript学习系列(23):数组中的解构方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说解…

ULONGLONG乘法分析

From: http://blog.csdn.net/syf442/article/details/6077715 64位乘法分析&#xff1a; VC6 Console Code&#xff1a; int main(int argc, char* argv[]) { ULONGLONG a 0x87654321; ULONGLONG b 0x100000001; a*b; //::MessageBox(NULL,&…

T-SQL中REPLACE的用法_字符串替换

REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。 语法 REPLACE ( string_expression1 , string_expression2 , string_expression3 ) 参数 string_expression1 待搜索的字符串表达式。string_expression1 可以是字符数据或二进制数据。 str…

Linux字符编码转换 UTF8转GB3212

在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 一、利用iconv函数族进行编码转换 iconv函数族的头文在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用…

ULARGE_INTEGER运算

在调用GetDiskFreeSpaceEx()获取磁盘空间时&#xff0c;由于参数是ULARGE_INTEGER(64位整数)&#xff0c;所以普通的“加减乘除”并不支持(是没有实现)&#xff0c;因此我们采用其他办法来实现&#xff0c;先来看下ULARGE_INTEGER的结构定义&#xff1a; typedef union _ULARG…

IMG图片和文字同一行显示,图片和文字居中显示

问题其实很好解决&#xff0c;只要设定img标签的vertical-align CSS属性就好了&#xff0c;代码如下&#xff1a;

Leetcode刷题(6)有效的括号

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0…

eclipe安装中文语言包 CDT Pydev

一、中文语言包eclipse的国际化项目已经交由Eclipse宝贝项目来进行[url]https://babel.eclipse.org[/url]在线安装&#xff1a;&#xff08;1&#xff09;打开eclipse&#xff0c;菜单 Help -> Software Update …&#xff1b;&#xff08;2&#xff09;打开Software Update…

vue-环境变量和模式

vue项目使用.env文件配置全局环境变量 模式是 Vue CLI 项目中一个重要的概念。默认情况下&#xff0c;一个 Vue CLI 项目有三个模式&#xff1a; development 模式用于 vue-cli-service serve production 模式用于 vue-cli-service build 和 vue-cli-service test:e2e test 模…

printf的两个需要注意的问题:无符号整数和64位整数

From: http://www.cnblogs.com/lidp/articles/1696079.html 1) %d和%u的区别unsigned int dwValue;printf("%d", dwValue);在dwValue的值大于0x7FFFFFFF时&#xff0c;输出的结果会变成负数。正确的程序应该为&#xff1a;printf("%u", dwValue); 2) 使用…