CSS中重要的BFC

html-css016

CSS中重要的BFC,第1张

CSS中有个重要的概念BFC,搞懂BFC可以让我们理解CSS中某些原本诡异(??)的地方。

在解释BFC之前,先说一下文档流。我们常说的文档流其实分为 定位流 浮动流 普通流 三种。而普通流其实就是指BFC中的FC。FC(Formatting Context),直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC,还有GFC和FFC。

BFC (Block Formatting Context)块级格式化上下文,是用于布局块级盒子的一块渲染区域。[MDN上的解释]:BFC是Web页面 CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。

注意:一个BFC的范围包含创建该上下文元素的所有子元素,但 不包括 创建了新BFC的子元素的内部元素。这从另一方角度说明,一个元素不能同时存在于两个BFC中。因为如果一个元素能够同时处于两个BFC中,那么就意味着这个元素能与两个BFC中的元素发生作用,就违反了BFC的隔离作用。

常规流(Normal flow)

浮动(Floats)

绝对定位(Absolute positioning)

注意: display:table也可以生成BFC的原因在于Table会默认生成一个匿名的table-cell,是这个匿名的table-cell生成了BFC。

浏览器对BFC区域的约束规则:

规则解读:

BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。我们可以利用BFC的这个特性来做很多事。

一个正常文档流的block元素可能被一个float元素覆盖,挤占正常文档流,因此可以设置一个元素的float、display、position值等方式触发BFC,以阻止被浮动盒子覆盖。

[使用BFC阻止元素被浮动元素覆盖]点击预览

通过改变包含浮动子元素的父盒子的属性值,触发BFC,以此来包含子元素的浮动盒子。

[使用BFC包含浮动元素]

注意,这里触发BFC并不能阻止其它形式的脱离文档流的元素覆盖正常流元素。

BFC内部其他形式脱离文档流(absolute fixed) 点击预览

有时候因为多列布局采用小数点位的width导致因为浏览器因为四舍五入造成的换行的情况,可以在最后一列触发BFC的形式来阻止换行的发生。比如下面栗子的特殊情况

使用BFC阻止多列布局最后一列换行 点击预览

属于同一个BFC的两个相邻块级子元素的上下margin会发生重叠,(设置writing-mode:tb-rl时,水平margin会发生重叠)。所以当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠。

这里给任一个相邻块级盒子的外面包一个div,通过改变此div的属性使两个原盒子分属于两个不同的BFC,以此来阻止margin重叠。

使用BFC阻止margin合并 点击预览

但是这里有个 疑问 点击预览 :

如果外面包一层div,设置能触发BFC的任何属性都能阻止相邻元素的margin合并。因为分属不同BFC不会发生margin合并。

而如果在外面不包一个div的话,当设置display为inline-block、inline-flex、table-captain,和position为absolute、fixed,float为left、right是可以阻止margin合并的。这里问题来了:

我们知道设置position和float会让元素脱离文档流并且又创建新的BFC,所以两个元素就不是相邻元素了,因此可以阻止相邻元素margin合并,但是inline-block、inline-flex、inline-grid、table-captain为什么可以呢?如果有人知道为什么,请告知~

1. 继承性

继承是一种规则,它允许样式不仅应用于某个特定 html 标签元素,而且应用于其后代。

比如下面代码:如某种颜色应用于 p 标签,这个颜色设置不仅应用 p 标签,还应用于 p 标签中的所有子元素文本,这里子元素为 span 标签。

<span style="font-size: 18px">p{color:red}

<p>三年级时,我还是一个<span>胆小如鼠</span>的小男孩。</p> </span>

结果 p 中的文本与 span 中的文本都设置为了红色。但注意有一些 css 样式是不具有继承性的。如 border:1px solid red

<span style="font-size:18px">p{border:1px solid red}  </span>

在上面例子中它代码的作用只是给 p 标签设置了边框为1像素、红色、实心边框线,而对于子元素 span 是没用起到作用的。

2. 特殊性

<span style="font-size:18px">p{color:red}

.first{color:green}

<p class="first">三年级时,我还是一个<span>胆小如鼠</span>的小男孩。</p>  </span>

p 和 .first 都匹配到了 p 这个标签上,那么会显示哪种颜色呢?green是正确的颜色,那么为什么呢?是因为浏览器是根据权值来判断使用哪种 css 样式的,权值高的就使用哪种 css 样式。

下面是权值的规则:

标签的权值为1,类选择符的权值为10,ID选择符的权值最高为100。例如下面的代码:

<span style="font-size:18px">p{color:red} /*权值为1*/

p span{color:green} /*权值为1+1=2*/

.warning{color:white} /*权值为10*/

p span.warning{color:purple} /*权值为1+1+10=12*/

#footer .note p{color:yellow} /*权值为100+10+1=111*/   </span>

注意:还有一个权值比较特殊–继承也有权值但很低,有的文献提出它只有0.1,所以可以理解为继承的权值最低。

3. 层叠性

层叠就是在html文件中对于同一个元素可以有多个css样式存在,当有相同权重的样式存在时,会根据这些css样式的前后顺序来决定,处于最后面的css样式会被应用。

如下面代码:

<span style="font-size:18px">p{color:red}

p{color:green}  </span>

最后 p 中的文本会设置为green,这个层叠很好理解,理解为后面的样式会覆盖前面的样式。

所以前面的css样式优先级就不难理解了:

内联样式表(标签内部)>嵌入样式表(当前文件中)>外部样式表(外部文件中)。

4. 重要性

我们在做网页代码的时,有些特殊的情况需要为某些样式设置具有最高权值,怎么办?这时候我们可以用!important来解决。

如下代码:

<span style="font-size:18px">p{color:red!important}

p{color:green}

<p class="first">三年级时,我还是一个<span>胆小如鼠</span>的小男孩。</p>  </span>

这时 p 段落中的文本会显示的red红色。

CSS网页布局的意义体现在如下方面: 一、使页面载入得更快 由于将大部分页面代码写在了CSS当中,使得页面体积容量变得更小。相对于表格嵌套的方式,DIV+CSS将页面独立成更多的区域,在打开页面的时候,逐层加载。而不像表格嵌套那样将整个页面圈在一个大表格里,使得加载速度很慢。 二、降低流量费用 页面体积变小,浏览速度变快,这就使得对于某些控制主机流量的网站来说是最大的优势了。 三、修改设计时更有效率 由于使用了DIV+CSS制作方法,在修改页面的时候更加容易省时。根据区域内容标记,到CSS里找到相应的ID,使得修改页面的时候更加方便,也不会破坏页面其他部分的布局样式。 四、保持视觉的一致性 DIV+CSS最重要的优势之一:保持视觉的一致性;以往表格嵌套的制作方法,会使得页面与页面,或者区域与区域之间的显示效果会有偏差。而使用DIV+CSS的制作方法,将所有页面,或所有区域统一用CSS文件控制,就避免了不同区域或不同页面体现出的效果偏差。 五、更好地被搜索引擎收录 由于将大部分的HTML代码和内容样式写入了CSS文件中,这就使得网页中正文部分更为突出明显,便于被搜索引擎采集收录。 六、对浏览者和浏览器更具亲和力 我们都知道网站做出来是给浏览者使用的,对浏览者和浏览器更具亲和力,DIV+CSS在这方面更具优势。由于CSS富含丰富的样式,使页面更加灵活性,它可以根据不同的浏览器,而达到显示效果的统一和不变形。 说了这么多CSS网页布局的意义与优点,同时也不能轻视CSS网页布局的副作用: 一、DIV+CSS尽管不是高不可及,但至少要比表格定位复杂的多,即使对于网站设计高手也很容易出现问题,更不要说初学者了。 二、CSS网站制作的设计元素通常放在1个外部文件中,或几个文件,有可能相当复杂,甚至比较庞大,如果CSS文件调用出现异常,那么整个网站将变得惨不忍睹。 三、虽然说DIV+CSS解决了大部分浏览器兼容问题,但是也有在部分浏览器中使用出现异常,比如火狐浏览器,在IE中显示正常的页面,到了火狐浏览器中可能会面目全非。当然这应该是浏览器的问题,但是可以说在目前来看,DIV+CSS还没有实现所有浏览器的统一兼容。 四、DIV+CSS对搜索引擎优化与否,取决于网页设计的专业水平,而不是DIV+CSS本身。DIV+CSS网页设计并不能保证网页对搜索引擎的优化,甚至不能保证一定比HTML网站有更简洁的代码设计,何况搜索引擎对于网页的收录和排序显然不是以是否采用表格和CSS定位来衡量,这就是为什么很多传统表格布局制作的网站在搜索结果中的排序靠前,而很多使用CSS及web标准制作的网页排名依然靠后的原因。因为对于搜索引擎而言,网站结构、内容、相关网站链接等因素始终是网站优化最重要的指标。