CSS的 display : table 以表格形式去改变渲染(不具语义误导)

2 篇文章 0 订阅
1 篇文章 0 订阅

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

  1. display : table
    使该元素按table样式渲染 【块级表格,前后有换行符\n】
    ??? 块级默认前后都带有换行符\n ???
  2. display : inline-table
    使该元素按table样式渲染 【内联表格,前后无换行符\n】
  3. display : table-row
    使该元素按tr样式渲染 【一个表格行】【前后都带有换行符\n】
  4. display : table-row-group
    使该元素按tbody样式渲染 【一个或多个行的分组】【前后都带有换行符\n】
  5. display : table-header-group
    使该元素按thead样式渲染 【一个或多个行的分组】【前后都带有换行符\n】
  6. display : table-footer-group
    使该元素按tfoot样式渲染 【一个或多个行的分组】【前后都带有换行符\n】
  7. display : table-caption
    使该元素按caption样式渲染 【一个表格标题】
  8. table-cell
    使该元素按td样式渲染 【一个表格单元】
  9. display : table-column
    使该元素按col样式渲染 【一个表格单元】
  10. display : table-column-group
    使该元素按colgroup样式渲染 【一个表格单元或多个表格单元的分组】

…用table布局不是错的吗?

  • table元素在HTML当中是一个包含语义的标签:它描述什么是数据。
  • 因此,你只能用它来标记那些需要制表的数据,例如一张财务信息表。
  • 如果数据能够以电子表格的形式保存在你的电脑中,那它在HTML文档中很可能需要用到table标签进行标记。
  • 从另一方面来看,display的table属性值只是声明了某些元素在浏览器中的样式——它不包含语义(不是用标签形式)。
  • 如果使用table元素来进行布局,它将会告诉客户端:这些数据是制表的。

匿名表格元素=>被偷偷创建的元素

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

CSS2.1规范中写道:

  • CSS2.1表格模型中的元素,可能不会全部包含在除HTML之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table对象,使其符合table/inline-table、table-row、table-cell的三层嵌套关系。

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

创建匿名表格元素的规则

  • 这些匿名的盒对象不是用魔术变出来的,它们也不会自动往你的HTML源码中添加新的标签。为了完全发挥出匿名表格元素的优势,你最好能够对创建它们的规则有所了解。

  • 如果布局中调用了匿名元素,浏览器将会根据需要创建一个匿名的盒对象并将它的CSS
    display属性设置为table、table-row或table-cell中的一个。

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

<div class="cell">CELL A</div> 
<div class="cell">CELL B</div> 
<div class="cell">CELL C</div> 
<div>Not a cell</div> 

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

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

使用一些display属性被设置为table和table-cell之类的div标签,
除了告诉客户端以某种特定的样式来渲染它们以外,不会告诉客户端任何语义,
只要客户端能够支持这些display属性值。
我们就能够使用这种display:table-xxx 实现复杂的栅格布局。

额外扩展:

  • <center></center>虽然已经被H5标准放弃了,但今天突然感觉它很神奇。
  • 它是个block块元素
  • <center>居然内容的子节点<table>里的<tbody>居中了
  • 记忆中<center>只是让内容文本居中····
  • 搜索了下,居然还可以让<form>居中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值