CSS世界(张鑫旭)系列学习总结 (二) 流、元素与基本尺寸

HTML标签种类繁多,通常分为两类,块级元素(block-level element)和内联元素(inline-level element)。

2.1 块级元素   

块级元素,如<div>、<p>、<li>、<table>等,特点是在一个水平流上只能单独显示一个元素,多个块级元素自动换行显示。

块级元素和display属性为block的元素不是一个概念,如<li>的display值是list-item,<table>的display值是table,但是他们都是块级元素,具有块级元素的特点。

根据块级元素的换行特性,清除浮动影响的其中一个方案就是:

.clear:after{
content:"";
display: table; // block、list-item 也可以
clear:both;
}

 2.2 盒子概念

最初,只有两类盒子,块级盒子(block-level box)和内联盒子(inline-level box),分工明确,块级盒子负责结构,内联盒子负责内容。

但现实世界是复杂的,很多时候想要一行展示多个块级元素,于是inline-block就来了,为此css重新解释了盒子概念。

一个元素的盒子模型是这样的,从内外结构上来看,每个元素都具有一个外在盒子和一个容器盒子(内在盒子),外在盒子负责元素是一行显示,还是换行显示,容器盒子负责宽高、内容呈现等。

外在盒子、容器盒子是个逻辑概念,具体来看,外在盒子可以是块级盒子和内联盒子,内在盒子也可以是块级容器盒子和内联容器盒子。

所以,display理论上会有几种组合,block-block、block-inline、inline-block、inline-inline,其实不然,block-inline并不存在,因为内外盒子是为了解决问题提出的设计思想,而种种组合是根据设计思想拼凑的可能性,实际中并不存在这样的需求,并且还有一些inline-table、inline-flex等。

其实容器盒子才是重中之重,外在盒子只是负责是否换行。

可以这样理解,元素的容器盒子很丰富,如block、inline、table、item等,可能将来还有更多,但从元素自身上,由于块级元素和内联元素的默认分类,使得他们的外在盒子特性具有了默认值,如果默认值是块级换行特性,就限制了布局的灵活性,所以才出现了inline-xx的属性值,如果元素本身是内联特性,想改变默认特性比较容易,因此不存在此需求就没有block-inline属性值。

 2.3 内联盒模型

是否理解此模型,是css开发人员和熟练css开发人员之间的分水岭。

1.内联盒模型包含很多术语和概念,或者说包含很多种盒子,比块级元素盒模型复杂的多。

1.1 内容区域

   内容区域指一种围绕文字看不见的盒子,其大小仅受字符本身特性控制,本质上是一个字符盒子;但对于图片等替换元素,不存在字符,可以看成元素自身。

 如:

<p>这是一段普通的文字,这里有个<em>em</em>标签。</p> 

    p标签内,紧紧挨着内容的范围就是内容区域,和文本选中时的区域差不多。

    内容区域可以等同于基本盒模型中的content box,我们同样可以给内联元素设置padding、border、margin 基本盒模型的属性,只是有些不生效而已。

1.2内联盒子

  内联元素的外在盒子就是内联盒子,如上面代码中,文本元素和em元素的外在盒子都是内联盒子,决定了他们可以在一行显示。

1.3行框盒子

 在 p 元素内,每一行都存在一个行框盒子, 每个行框盒子又是由一个个内联盒子组成的。

1.4包含盒子

   p 元素所包含的所有区域就是包含盒子,由一个个行框盒子组成,也称为包含块。

 

也就是说,当我书写了一个p元素,在元素内写下一个字符后,字符本身产生了内容区域,字符属于内联元素,也携带了内联盒子,字符所在的这一行也产生了一个行框盒子,而包含行框盒子的p元素则形成了一个包含块。

随着字符越来越多,内容区域越来越大,随着更多内联元素的加入,开始换行,又产生了一个行框盒子,最终行越来越多,包含块也越来越大。

2.幽灵空白节点

这是内联盒模型中非常重要的一个概念,官方文档说:内联元素的所有解析和渲染表现就如同每个行框盒子的前面有一个“空白节点”一样。

这个空白节点永远透明,不占据任何宽度,看不见也无法通过脚本获取,就像幽灵一样,但确确实实存在。

今天我就遇到了,发现一个元素在某些情况下高度莫名其妙的增加了4px,不明所以,突然想到是不是幽灵节点的问题,因为那个元素正好没有内容时高度才会变化,最后果然通过设置fontsize为0 将问题解决。

举个栗子:

div{
background-color:#cd0000;
}

span{
display:inline-block;
}

<div><span></span> </div>

通过浏览器查看元素,此 div 高度并不是 0,这就证明了幽灵空白节点确确实实存在,诚不我欺。               

posted @ 2020-11-08 19:46  yuanxv  阅读(198)  评论(0编辑  收藏  举报