不一样的浏览器渲染过程实际上并不相同,可是依旧存在相一致的部分,大体过程以下所示:css
上诉过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽量早的将内容呈现到屏幕上,并不会等到全部的html都解析完成以后再去构建和布局render树,而是解析完一部分就渲染一部份内容。html
回流(reflow):若是改变了影响元素布局信息的CSS样式,好比width、height、left、top等,该元素的位置信息就会发生变化,也可能会致使整个页面其余元素的位置信息都发生变化,因此渲染引擎须要从新执行layout过程,从新计算每一个元素的位置。reflow是在浏览器下一帧绘制的时候,进行从新布局,若是修改了元素的布局样式后,立马去获取offsetTop、scrollTop等属性,那么渲染引擎就会强制进行从新布局过程,以保证在JS中获取到正确的offsetTop、scrollTop等属性值。浏览器
重绘(repaint):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分须要重绘,可是元素的几何尺寸不会变化。布局
display:none的标签不会被加入Render Tree,也不会触发reflow,visibility:hidden的标签会被加入到Render Tree,不会触发reflow,只会触发repaint。flex
HTML文档中的每一个元素在渲染的时候都会被描述成一个矩形盒子,而盒模型正是用来表示每一个元素盒子所占用空间大小的模型,CSS盒模型分为W3C标准盒模型和IE盒模型,IE盒模型就是在IE6如下版本的怪异模式下的盒模型,IE6以及更高版本都遵循标准盒模型。在CSS中主要经过四个部分来描述,分别为margin、border、padding、content。通常来讲,IE盒模型的宽高计算方式为:width/height = content + padding + border,W3C标准盒模型的宽高计算方式为:width/height = content。动画
W3C标准盒模型宽高的计算模式在对于非px为单位的宽高时,会带来很是大的计算困扰,以下:spa
.box { width:50%; border:1px solid #ccc; }
这个地方想要的确定是50%,可是实际的大小趣事50% + 2px,这多出的2px就很让人无奈,因而为了避免破坏这个50%的宽度,每每得再内嵌一层元素用来设置border,就成了下面这样:code
.box { width:50%; } .box .box-inner { border:1px solid #ccc; }
这种解决方式显然不太科学,至少致使了HTML结构的臃肿,而box-sizing属性的出现就解决了这个问题,它就是用来改变元素宽高的计算方式。box-sizing属性有两个经常使用的取值content-box和border-box,若是值为content-box(默认),则实际宽度为上面所说的计算方式:实际宽高 = border + padding + width/height
。如为border-box则是另外一种计算方式,其实际宽高就是设置的width/height。orm
浏览器选择哪一个盒模型,主要是看浏览器处于标准模式仍是怪异模式,在<DOCTYPE DTD="">
标签里有DTD声明,若是有DTD声明,浏览器处于标准模式,没有DTD声明,浏览器处于怪异模式,处于怪异模式的浏览器按照自身的解析方式去解析,IE6会选择IE盒模型,其余现代浏览器都会采用W3C标准盒模型。IE6如下版本的浏览器没有遵循W3C标准,不管页面有没有DTD声明,它都是按照IE盒模型解析代码。htm
margin:% | px
,margin的值若是为%,其是根据父元素的宽度来计算的,包括margin-top和margin-bottom,其值也是相对于父元素的宽度。而且内联元素的margin-top/bottom是不容许设置的。
.wrap:after { content:' ', display:block; height:0; clear:both; } .wrap { zoom:1; }
content是在父容器的后面添加一个空白字符,height:0是让这个空白字符不显示出来,display:block;clear:both是确保这个空白字符是非浮动的独立区块。zoom:1是IE6独有的属性,做用是激活父元素的hasLayout属性,让父元素拥有本身的布局,其余浏览器会直接忽略该属性。
BFC即块级格式化上下文,它属于普通文档流,具备BFC特性的元素能够看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,而且BFC具备普通容器所没有的一些特性。通俗来讲,能够把BFC理解为一个封闭的大箱子,箱子内部的元素不管如何翻江倒海都不会影响到外部。
只要元素知足下面任一条件便可触发BFC特性:
一个DOM元素,在不考虑层叠上下文的状况下,会按照层叠水平决定元素在Z轴上的显示顺序,通俗来说,不一样的DOM元素组合在一块儿发生层叠的时候,它们的显示顺序会遵循层叠水平的规则,而z-index是用来调整某个元素显示顺序。
若是两个元素层叠水平相同的时候,这个时候就要遵循下面两个准则:
1 后来居上原则
2 谁z-index大,谁在上原则
一个页面中每每不止一个层叠上下文,在同一个层叠上下文中按照层叠水平的规则来堆叠元素,正常状况下,一共有三种大的类型建立层叠上下文:
1 默认建立层叠上下文,HTML根元素属于根层叠上下文元素
2 须要配合z-index触发建立层叠上下文
3 不须要配合z-index触发建立层叠上下文
1 含有position属性的元素
2 flex项(父元素diaplay为flex|inline-flex)注意是子元素,不是父元素建立层叠上下文
这两种状况下,须要设置具体的z-index值,不能设置z-index为auto,这也就是z-index:auto和z-index:0的一点细微差异
这种状况下,基本上都是由CSS3中新增的属性来触发的,常见的有: