CSS中重要的BFC

html-css010

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为什么可以呢?如果有人知道为什么,请告知~

盒子模型是CSS中一个很重要的概念,页面中的所有元素都可以看成一个盒子,并占据一定的页面空间,一个页面由很多盒子组成,盒子之间会互相影响。只有掌握盒模型以及其中每个属性的用法,才能真正控制好页面元素。

盒子模型主要定义四个区域: 内容(content)、内边距/填充(padding)、边框(border)和外边距(margin)

盒子的内容区域存放文本和图片等页面元素,拥有如下属性:

边框基本属性:

通过一个属性设置四个方向边框的宽度、样式、颜色

属性:border

取值:width style color

只设置某一条边框的宽度、样式、颜色

语法:border-方向(top/right/bottom/left):width style color

只设置边框的宽度、样式、颜色中的一种

语法:border-属性(width/style/color):取值

只设置某一条边框的宽度、样式、颜色中的一种

语法:border-方向(top/right/bottom/left)-属性(width/style/color):取值

属性:border-radius

作用:设置倒角位置处圆的半径,半径越大,弧度越大。

取值:

属性:border-image

语法:

border-image-source :引入背景图片

取值:

默认值:无图片

url(图片URL地址)

border-image-slice :切割引入背景图片,把边框背景切成9份

取值:

number:默认单位px

百分比:

fill:保留边框图像的中间部分

border-image-width :指定边框图片的宽度

border-image-repeat :指定边框背景图片的排列方式,可定义2个参数,即水平和垂直方向

取值:

Stretch:默认值,拉伸

Repeat:平铺

Round:取整平铺

内容区域和边框(边缘)之间的距离

语法:padding: 值;

单边设置:padding-方向(top/right/bottom/left):值;

取值:

数值px

百分比

内边距的简写方式:

padding:value

四个方向内边距的值均为value

padding:value1 value2

Value1为上下内边距的值,value2为左右内边距的值

padding:value1 value2 value3

Value1为上内边距的值,value2为左右内边距的值,value3为下内边距的值

padding:value1 value2 value3 value4

上右下左内边距的值分别为value1, value2, value3, value4

外边距指元素与元素之间的距离,即围绕在元素边框之外的空白区域,通过外边距可以为元素创建额外的“空间”。默认不能被其他元素所占据,用于拉伸两个元素间的距离。

语法:margin: 值;

单边设置:margin-方向(top/right/bottom/left):值;

取值:

重新制定元素尺寸计算模式

属性:box-sizing

取值:

属性:resize

取值:

位于元素边框之外的一条线

属性:

outline:width style color

属性:box-shadow

语法:

box-shadow: h-shadow v-shadow blur spread color inset

取值:由一组值构成的值列表

属性:background-color

取值:颜色值或transparent

注意:背景颜色是从边框位置处开始绘制

属性:background-image

取值:url(背景图像URL)

属性:background-repeat

取值:

属性:background-attchment

取值:

scroll:默认值,滚动

fixed:固定

属性:background-position

取值:

属性:background-size

取值:

属性:background-origin

取值:

属性:background-clip

取值:

CSS3多背景通过为每个背景属性提供多个属性值实现。

font 简写属性语法:

将所有字体属性合写为一行,其中font-family是复合属性中必不可少的属性。

可以不设置其中的某个值,如果省略值地话,就使用属性的默认值。

②文本属性:

(2)CSS3文本阴影属性:

属性:text-shadow

作用:产生阴影和模糊主体

语法:

作用:定义列表的编号样式

属性:list-style-type

作用:用于设置列表项的图像属性

语法:

图像URL地址:图像的相对路径或绝对路径

none:默认值,不指定图像

注意:图片图标与文字之间的距离在不同浏览器中是不一样的,因此,一般情况下不采用这种方式来设置列表的图片样式。

通过设置<li>的背景图片的方式来设置列表图片基本步骤:

设置list-style-type属性值为none

设置<li>标记的背景属性backgruond

作用:用于声明列表标志相对于列表项内容的位置

语法:

作用:可以同时设定列表样式类型、列表样式位置、列表样式图片等属性的值。

语法:

注意:

可以不设置其中的某个值,未设置的属性采用默认值

同时指定list-style-image和list-style-type时,list-style-image优先显示,除非list-style-image设置为none,或图片路径错误无法显示

当列表与列表项目同时使用样式时,列表项目的样式优先显示

特点:

可以设置宽度和高度

默认情况下每个块级元素独占一行

作用:

块级元素主要用于页面布局

常用块级元素:

<div>、<p>、<h1>~<h6>、<ol>、<ul>等

特点:

不可以设置宽度和高度,其宽度就是自身文字或图片的宽度

默认情况下多个行内元素会在一行内显示,遇父元素边界时会自动换行

作用:

行内元素主要用于设置文样式

常用行内元素:

<a>、<span>、<em>、<b>、<i>、<strong>、<img>、<input>等

作用:控制页面元素脱离原有文档流,实现向左或向右移动,直到该元素外边缘碰到其包含框或另一个浮动框的边缘停止,标准流中的其他盒子将顶到浮动盒子的位置。浮动的元素不占据实际空间。

属性: float

取值:

浮动元素不会相互重叠;

浮动元素不会上下浮动,如果一个浮动元素在另一个浮动元素之后显示,而且会超出容纳块,则它下降到低于先前任何浮动元素的位置。

作用:规定元素的哪一侧不允许出现其他浮动元素。

取值:

作用:控制页面元素在页面中的位置。

属性:position

取值:static/relative/absolute/fiexed

默认属性值,元素按照标准文档流进行排列,块级元素独占一行, 行内元素位于一行内显示,一行显示不下,自动换行。

特点:

相对于自身原有位置进行偏移

仍处于标准文档流中

随即拥有偏移属性和z-idex属性

偏移属性:

left:数值px

right:数值px

top:数值px

bottom:数值px

当元素相对定位后会产生Z轴上的堆叠,不设置z-index属性时,默认该元素出现在X轴和Y轴构成的平面上。

特点:

建立了以包含块为基准的定位

绝对定位的元素的位置相对于最近的已定位祖先元素(设定了绝对定位、相对定位或固定定位中的任何一种),如果元素没有已定位的祖先元素,则该元素的位置相对于浏览器窗口。

完全脱离了标准文档流

随即拥有偏移属性和z-idex属性

偏移属性:

left:数值px

right:数值px

top:数值px

bottom:数值px

绝对定位未设置偏移量的特点:

无论是否存在已经定位的祖先元素,都保持在元素的初始位置

脱离了标准文档流

设定固定定位的元素框的表现类似于将position设置为absolute,不过其包含块是浏览器窗口本身。

在计算机显示中把垂直于屏幕平面的方向称为Z方向,CSS绝对定位容器的z-index属性即对应该方向。

作用:用于控制元素的层叠次序,使得某个元素浮于其他元素之上。

语法:

auto:遵循其父元素的定位

number:整数,可负,值大者叠加在上层

注意:使用z-index属性时,要求该元素的position属性值为absolute、relative或fixed。

作用:用于定义建立布局时元素生成的显示框类型

语法:dispaly:值

作用:用于定义建立布局时元素生成的显示框类型

语法:visibility:值

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红色。