什么是标准模式和怪异模式?
在很久很久以前,那时候HTML
和CSS
还没有一个统一的标准,出现的现象就是,我用我的标准,你用你的标准,这导致了各家浏览器对于解析HTML
和CSS
的方式有很大的差别,而当标准制定出来之后,浏览器不仅要按照新的标准去支持HTML
和CSS
,还要对老旧的网页进行兼容,而这一前一后的两种支持方式,就是我们所称的标准模式(StandardMode
,)和怪异模式(QuirksMode
),对于现代规范的网页,浏览器一般用标准模式去解析和渲染,而对于古老的网页,浏览器就会使用怪异模式去渲染.而在ie的开发者工具中,你可以自定义改变文档模式,这在其他浏览器中是不行的.
浏览器怎么确定要使用哪种模式?
这里就会涉及到一段非常容易被人忽略的代码,那就是HTML
文档第一行就会出现的文档类型声明:DOCTYPE
.你一定见过这两种声明方式:
<!DOCTYPE html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
- 第一种声明方式说明这个页面遵守了
HTML5
规范的,浏览器会自动选择标准模式. - 在浏览器遇到第二种声明方式时也会自动选择标准模式,说明这个页面遵守了
HTML4
规范,和第一种声明方式会有一点区别,但是几乎可以认为是一样的. - 而当你没有或者忘记对文档类型进行声明的时候,浏览器就会选择怪异模式,我们应该避免选择这种模式,因为这种模式下浏览器对文档的解析和渲染和现代标准都有着很大的不同,这是一种非常危险的方式.
开发者还可以在
<head>
标签中加入x-ua-compatible
信息来影响文档类型的判定,这里就不做过多的介绍了,有兴趣的同学可以自行搜索.
标准模式和怪异模式下页面渲染的区别
块级元素(盒子模型)
标准模式和怪异模式下对于盒子模型的渲染效果差别是很大的. 在怪异模式下,给盒子模型设置的宽度width
和高度height
会将元素的content,padding,border
都包含进去,如下图所示:
即:
width = border left + padding left + content width + padding right + border right
height = border top + padding top + content height + padding bottom + border bottom
而在标准模式下,给盒子模型设置的宽度和高度就是content
的高度和宽度,如下图:
即:
width=content width
height=content height
这一个区别会导致渲染块级元素的时候会出现很大的差别,所以两种模式下渲染出来的页面差别也会很大.
- 示例: 我们定义一个
div
元素,分别设定宽高均为200px
,padding
为50px
,border
为20px
红色. 代码如下:
div.a{
width: 200px;
height: 200px;
padding: 50px;
border: 20px solid red;
}
- 在标准模式下如下图:
在这里其实盒子的总宽度为200 + 50 * 2 + 20 * 2= 340px
- 在怪异模式下如下图:
而在怪异模式下,整个盒子只有200px
宽,而内容区域被压缩到了200 - 50 * 2 - 20 * 2 = 60px
- 而我们也可以通过
box-sizing
属性手动的选择width
和height
包含的范围,具体的参数及含义如下
`box-sizing:border-box` //像怪异模式那样,元素的`border`和`padding`被包含在给元素设置的width和height中
`box-sizing:content-box` //默认值.给元素设置的width和height属性只表示content区域,而在`width`和`height`之外绘制padding和border
`box-sizing:inherit` //继承父元素的`box-sizing`设置
现在你一定明白了为什么有的时候元素的大小超出我们的预期,只要加一个box-sizing:border-box
,就能够正常显示了吧.
图片的对其方式
CSS中的vertical-aligh
属性用于设置对象的初值对其方式,定义了行内元素的baseline
要和所在行的baseline
初值对齐,而在表格元素中,可以设置单元格里面的内容的对其方式,取值有baseline,bottom,top,middle
等.用一幅图来解释:
在标准模式下,inline
元素和tablecell
元素的verticle-aligh
属性默认取值是baseline
,这也是我们有时会看到图片底部会有几像素留白的原因. 但是当inline
元素内只有图,并且处于怪异模式的时候,inline
元素里的元素的vertical-aligh
属性默认值是bottom
,此时就不会有白条的效果.
- 示例: 定义一个表格,表格中只有一行,一列,进行演示,代码如下:
td.a {
border:2px solid blue;
}
img.b {
width:200px;
height:200px;
border:2px solid orange;
}
在标准模式下,图片底部可以看到有几像素的白条:
而在怪异模式下,图片底部没有留白:
现在你知道为什么有时候图片处理总是很难看了吧?因为浏览器工作在标准模式,只要把图片的
vertical-align
属性修改为bottom
就解决啦!
行内元素的尺寸
行内元素分为replaced
和non-replaced
两类,而像input,textarea,img
等可以设置宽高的行内元素,成为replaced
元素,而那些不能设置宽高的元素被称为non-replaced
元素,例如span
. 而这些都是在标准模式的前提下,在怪异模式下,即使是non-replaced
元素也可以被设置元素的宽高. 示例: 定义一个div
,宽高均为200px
,背景颜色为红色,div
内部有一个span
标签,给span
标签设置宽高均为100px
,背景颜色为蓝色.代码如下:
div.a{
width: 200px;
height: 200px;
background-color: red;
}
span.b{
width: 100px;
height: 100px;
background-color: blue;
}
在标准模式下,可以看到span
元素是看不到的,这是因为non-replaced
元素的宽高由它的内容决定.
而在ie
的开发者工具中把模式调到ie5
,可以看到span
标签是有宽高的:
虽然ie5
现在已经几乎不存在了,但是了解这些可以帮助我们更深入的研究浏览器的渲染规则.
内部元素溢出处理
在实际的开发中,我们经常会遇到元素内部的内容溢出,而CSS
的overflow
属性可以处理溢出的情况,默认是visible
,即显示溢出. 如果一个元素内部的内容出现了溢出,并且我们没有设置overflow
属性,即默认vislble
时:
- 在标准模式下,溢出的部分会超出盒子本身,在盒子外部继续显示.
- 而在怪异模式下,溢出的部分会扩展盒子本身,即外部盒子的大小不一定由
css
样式决定,会根据内部内容的大小自动调整.
示例: 定义一个div
,类名为a,宽高均为200px
,背景颜色为红色,div
内部还有一个div
标签,类名为b
,给内部的div
标签设置宽为100px
,高为300px
,背景颜色为蓝色.代码如下:
div.a{
width: 200px;
height: 200px;
background-color: red;
}
div.b{
width: 100px;
height: 300px;
background-color: blue;
}
可以看到在标准模式和怪异模式下渲染的差别:
标准模式:
怪异模式:
总结
对于标准模式和怪异模式渲染的差别,主要是浏览器发展的历史以及各家标准的差异决定的,而现如今Web
前端开发越来越趋向于标准化,工程化,所以我们应该尽量避免在实际开发中使用怪异模式来渲染页面.这样不仅有利于项目的维护,也会在渲染时减少很多不必要的冲突和怪异现象. 知道这些差异对一个专业的web
前端工程师来说是必须的,在遇到上述问题的时候,需要能够辨识出浏览器是工作在标准模式下还是怪异模式下,这对我们解决bug
是很有帮助的.
浏览器标准模式和怪异模式
什么是标准模式和怪异模式?
在实现html
和css
标准化之前,各个浏览器对html和css的解析各有不同,甚至是同一个浏览器的不同版本渲染方式也不同(比如IE6和IE7)。在W3C
制定标准之后,浏览器既要按照标准去实现HTML
和CSS
的支持,又要保证能够兼容以前的非标准的旧网页,于是就有了现在所说的标准模式(严格模式)和兼容模式(怪异模式)。
浏览器如何确定渲染模式呢?
在编写HTML文档时,一般都会在文档的开头,html标签之前声明文档类型:DOCTYPE
,当浏览器在解析html文档时,若遇到正确的文档声明,则启用标准模式,按照标准来解析和渲染文档。而对于旧的html文档,或没有DOCTYPE
声明的文档,则按照怪异模式来解析文档。html5的文档声明方式:<!DOCTYPE HTML>
。
标准模式和怪异模式的区别?
1、width
不同
在标准模式中:width
是内容(content
)宽度,元素真正的宽度是外边距、内边距、边框宽度的和,即元素宽度 = margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right
。
在怪异模式中:width
则是元素的实际宽度,width = border-left-width + padding-left+ 内容(content)宽度 + padding-right + border-right-width
。
2、内联元素的尺寸
标准模式中,给span
等行内元素设置width
和height
都不会生效,而在怪异模式下,却会生效。
3、可设置百分比的高度
在标准模式下,一个元素的高度由其包含的内容content决定,如果父元素没有设置高度,子元素设置一个百分比高度是无效的。
4、用margin : 0 auto
设置水平居中
在标准模式下可以使元素水平居中,但是在怪异模式下,无效,可以用text-align : center;
来实现居中。
5、怪异模式下设置图片的padding
会失效
6、怪异模式下table
中的字体属性不能继承上层的设置
7、元素溢出的处理
标准模式下,overflow
默认去visible
,在怪异模式下,溢出会被当做扩展box
来对待,溢出不会裁减,元素框自动调整大小,能够包含溢出内容。