总体结构说明:css
Normal flow算法
上面这张图你们应该都很熟悉,咱们知道在浏览器布局文档时,页面每个元素会被当作一个个矩形的盒子对待,咱们编写的css,决定这些盒子的大小、位置、以及各类属性(背景、颜色、等等等),这些盒子的特色以下:浏览器
1)拥有四个边界,分别是:content edge 、padding edge、border edge、margin edge
2)对应的,每个盒子,划分4个区域:布局
这里说明一点:对于平常布局中使用的width属性来讲,默认状况下width值设置的是content box 的宽度(可是早期ie版本的浏览器width值设定的是border box的宽度),这种计算方式对咱们的布局元素来讲会有一些不方便(若是涉及border、padding),因此这里提一个经常使用的属性:box-sizing,属性值与区域划分对应,分别为:content-box 、padding-box、border-box、margin-box。通常开发中最经常使用的选项为border-box,这里很少作说明。flex
定义:spa
The CSS visual formatting model is an algorithm that processes a document and displays it on visual media. This model is a basic concept of CSS
因此,视觉格式化模型是什么?
是一个算法、一系列规则
那这个算法用来干吗?
是用来描述用户代理(浏览器)如何为视觉媒体(屏幕)处理文档树。
而肯定文档在屏幕上的显示,具体又涉及:
控制元素盒子的生成、定位体系、正常流、浮动、绝对定位、层级显示、文档方向等等,因此本文后面介绍的一些概念,都属于视觉格式化模型中的一部分。代理
下面简要说明一部份内容code
在视觉格式化模型中,文档中的每个元素会对应生成0个、1个、或多个听从css 盒模型的盒子,每个盒子布局由下列因素决定:orm
通俗来讲,咱们文档中的每个元素,都被按照一个个盒子来对待,一个元素可能对应一个盒子,也可能对应多个盒子(例如列表项元素),这些盒子的特色符合css盒模型的定义,也就是说这些盒子都会有对应的内容区域、内边距区域、边框区域等等,这些盒子最终在屏幕上的显示,则取决于盒子各项 默认 或咱们设定的属性值,像display、position、width、height等等。blog
盒子的生成:
从文档元素生成盒子,盒子区分不一样的类型,对应不一样的计算规则,取决于css display 属性。元素类型区分:
盒子的定位:
生成盒子以后,css引擎须要定位每个盒子完成布局,定位区分:
对于视口,这里给出w3c的定义:
User agents for continuous media generally offer users a viewport (a window or other viewing area on the screen) through which users consult a document. User agents may change the document's layout when the viewport is resized
我的理解:浏览器提供咱们查阅文档的地方:即window窗口,即手机屏幕区域
在CSS 2.1中,许多盒子的位置和大小是针对称为包含块的矩形框的边缘计算的。通常而言,生成的框充当后代框的包含块,一个盒子为它的后代“创建”包含块,每一个盒子相对于其包含的块被赋予一个位置,但它不受该包含块的限制, 它可能溢出。
不一样定位元素的包含块:
1:若是 position 属性是 static 或 relative 的话:包含块就是由它的最近的祖先块元素的内容区(content box)的边缘组成的。
2:若是 position 属性是 absolute 的话:包含块就是由它的最近的 非static定位 的祖先元素的padding box的边缘组成的。若是不存在知足条件的祖先元素,就为 ICB (初始包含块)
3:若是 position 属性是fixed 的话:这里须要区分当前的媒体类型,通常咱们平常的使用情景就是在连续媒体下,包含块为 viewport
4:若是 position 属性是 absolute 或 fixed,包含块也多是由知足如下条件的最近父级元素的padding box的边缘组成的:
另:ICB(initial containing block):
文档根元素所在包含块称为初始包含块;
初始包含块的的尺寸和位置,对于不一样的媒体类型也是有不一样的状况,但咱们也只考虑连续媒体的状况:
尺寸:viewport的尺寸;
位置:首屏左上角
即普通流:
正常流中的框属于格式化上下文,能够是块或内联,但不能同时使用。 块级框参与块格式上下文。 内联级别框参与内联格式化上下文。
定义
A block formatting context is a part of a visual CSS rendering of a Web page. It is the region in which the layout of block boxes occurs and in which floats interact with other elements.
块格式化上下文是一个css的渲染区域,它是布局过程当中生成块级盒子的区域,也是浮动元素与其余元素的交互限定区域。
建立BFC的方式:
BFC特性说明:
特性:
另,除了BFC,IFC还有FFC(flex)、GFC(grid)等,这里再也不详细说明。