页面(文档树)能够想象成是由一个个的Box组合而成的,而视觉格式化模型(Visual formatting model)是一套规则,将这些框布局成访问者看到的样子。css
1. 盒的尺寸和类型 2. 定位体系 Positioning Scheme (常规流,浮动和绝对定位) 3. 文档树中元素之间的关系 4. 外部信息(如:视口大小,图片的固有尺寸等)
下文讲针对性的解释这些影响布局的因素,先来解释些概念~html
css假设每一个元素都会生成一个或者多个Box,称为元素框,元素框中心有内容区,内容区外周围包括了padding,border,margin,盒模型就是用来处理这些内容的一个模型css3
每一个元素都是相对于包含块摆放,包含块就是一个元素的“布局上下文”,segmentfault
<body> <div><p>p的包含块是div</p><div> //div的包含块是body </body>
替换元素就是浏览器根据元素的标签和属性,来决定元素的具体显示内容。
经过 CSS content 属性来插入的对象 被称做 匿名可替换元素
若是元素的内容包含在文档之中,则为非替换元素
非替换元素的全部规则一样适用于替换元素,只有一个例外,width若是是auto,元素的高宽就是内容的固有高宽,好比img就是图片的原始大浏览器
例如浏览器会根据<img>
标签的src
属性的值来读取图片信息并显示出来,查看HTML代码,则看不到图片的实际内容;<input>
标签的type
属性来决定是显示输入框,仍是单选按钮等。HTML中的<img>、<input>、<textarea>、<select>、<object>
都是替换元素。
这些元素每每没有实际的内容,便是一个空元素,例如:ide
<img src=”cat.jpg” /> <input type="submit" name="Submit" value="提交" />
浏览器会根据元素的标签类型和属性来显示这些元素。可替换元素也在其显示中生成了框。wordpress
CSS 框模型 (Box Model) 规定了元素框处理元素内容、内边距、边框 和 外边距 的方式,咱们常见的盒模型大体有两种,一种是块级的盒子(Block Box),一种是行级的盒子(Line Box)布局
详细盒子的规则见下篇想要清晰的明白(二)CSS 盒模型Block box与Line box,可是咱们至少能够知道盒子模型,在整个视觉模型中作到的是一个什么角色,盒子模型是处理盒子自己内部属性,像好比边距,边框的,而视觉格式化模型是来处理这些盒子摆放的flex
display : block 、 list-item 以及 table 会让一个元素成为块级元素。
每一行称为一条Line Box,它又是由这一行的许多inline-box组成 display:inline会让一个元素称为行内元素
将对象呈现为inline对象,可是对象的内容做为block对象呈现。以后的内联对象会被排列在同一行内。好比咱们能够给一个link(a元素)inline-block属性值,使其既具备block的宽度高度特性又具备inline的同行特性。ui
每一个元素,或者说每一个Box会根据设置的display值,去选择渲染它的方式,不一样的display有不一样层级:block-level box(块级)inline-level box(行级),run-in box(插入型框 css3),不一样的层级会参与不一样的环境(formatting context)去渲染
上文提到的环境就是这个Formatting context(格式化上下文),他是一个有渲染规则的渲染区域,不一样的层级有不一样的渲染规则,好比BFC和IFC
块级格式化上下文,Block formatting context(简称BFC),规定了块级盒子的渲染布局方式,他在计算盒子高度,margin值计算等地方有区别于其余环境。
内部盒子会在垂直方向排列
同一个BFC中的元素可能会发生margin collapse;
BFC就是页面上的一个隔离的独立容器,里外互相不影响
计算BFC的高度时,考虑BFC所包含的全部子元素,连浮动元素也参与计算;
当元素不是BFC的子元素的时候,浮动元素高度不参与BFC计算(既是常见的盒子塌陷问题)
根元素 <html>
float属性不为none
position为absolute或fixed
display为inline-block, table-cell, table-caption, flex, inline-flex
overflow不为visible
<style> html{background-color: #009a61} .a{ width: 100%; height: 80px; background-color: #f3f3f3; margin-bottom: 30px; } .b{ width: 100%; background-color: #f3f3f3; height:40px; margin-bottom: 80px; } .c{ float: left; width: 80%; height: 80px; background-color: #333333; } .d{ margin-top: 80px; width: 100%; background-color: #f3f3f3; overflow: hidden; } </style> <body > <div class="a"></div> <div class="b"> <div class="c"> </div> </div> <div class="d"> <div class="c"></div> </div> </body>
清除浮动
阻止边距折叠
用于布局,什么两栏自适应高度之类的
IE6-7不支持BFC,而是使用私有属性hasLayout。表现上来看hasLayout和BFC类似,触发hasLayout条件与BFC类似,另外须要为元素设置IE特有的CSS属性zoom:1; zoom用于设置或检索元素的缩放比例,值为1即便用元素实际尺寸,使用zoom既能够触发hasLayout又不会对元素产生其余影响,相对来讲更加方便
css布局宏观上来讲是受定位方案影响,定位方案包括普通流,浮动,定位
元素按照其在 HTML 中的位置顺序决定排布的过程。而且这种过程遵循标准的描述 只要不是float和绝对定位方式布局的,都在普通流里面。
浮动框不在文档的普通流中,浮动的流会漂浮在普通的流上面。 浮动的框能够向左或向右移动,直到它的外边缘碰到包含框或另外一个浮动框的边框为止。
1. 相对定位在普通流之中,是相对于它在普通流中的位置中进行移动,元素占据原来位置 2. 绝对定位脱离普通流,不占据空间相对于距离它最近的那个已定位的祖先(相对/绝对)元素决定的。 3. 固定定位,相对于浏览器窗口定位,脱离普通流,不占据空间 剩下的下篇见!!!(* ̄3 ̄)╭