HTML文档类型

DOCTYPE,是英文Document type的缩写,翻译为“文档类型”

DOCTYPE标签是单独出现的,定义了标准文档的类型

【说明】

①文档类型,会使浏览器使用相应标准加载网页并显示

②文档类型定义在HTML文档的第一行,在html标签之前

③文档不定义DOCTYPE,浏览器将无法获知HTML或XHTML文档的类型,因此会进入混乱模式,详见:浏览器模式

【浏览器表现模式】

      浏览器从服务端获取网页后会根据文档的DOCTYPE定义显示网页,如果文档正确定义了DOCTYPE浏览器则会进入标准模式(Standards Mode),否则浏览器会进入怪异模式或混杂模式(Quirks mode)

【浏览器多种表现模式的来源】

      浏览器开发初期W3C倡导的网页标准并不流行,因此浏览器有独特的对网页标签或属性的解析模式,随着日后网页标准的流行,浏览器增加了对新标准的支持(Standards Mode标准模式),但又没有放弃对原有模式的兼容(Quirks mode怪异模式),这就是浏览器多种表现模式的来源。

     而且Standards Mode  W3C标准推出以后,浏览器都开始采纳新标准,但存在一个问题就是如何保证旧的网页还能继续浏览,在标准出来以前,很多页面都是根据旧的渲染方法编写的,如果用的标准来渲染,将导致页面显示异常。为保持浏览器渲染的兼容性,使以前的页面能够正常浏览,浏览器都保留了旧的渲染方法(如:微软的IE)。这样浏览器渲染上就产生了Quircks mode怪异模式和Standars mode标准模式,两种渲染方法共存在一个浏览器上。

      那么浏览器究竟该采用哪种模式渲染呢?这就引出的DTD,既是网页的头部声明,浏览器会通过识别DTD而采用相对应的渲染模式:

      1. 浏览器要使老旧的网页正常工作,但这部分网页是没有doctype声明的,所以浏览器对没有doctype声明的网页采用quirks mode解析。  

      2. 对于拥有doctype声明的网页,什么浏览器采用何种模式解析,这里有一张详细列表可参考:http://hsivonen.iki.fi/doctype/  

      3. 对于拥有doctype声明的网页,这里有几条简单的规则可用于判断:对于那些浏览器不能识别的doctype声明,浏览器采用strict mode解析

      4. 在doctype声明中,没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本所有的浏览器都是使用quirks mode呈现,其他的则使用strict mode解析。

      5. 可以这么说,在现有有doctype声明的网页,绝大多数是采用strict mode进行解析的。

      6. 在ie6中,如果在doctype声明前有一个xml声明(比如:<?xml version="1.0" encoding="iso-8859-1"?>),则采用quirks mode解析。这条规则在ie7中已经移除了。

【为什么使用<!DOCTYPE HTML>】

       不管是刚接触前端,还是你已经“精通”web前端开发的内容,你应该知道在你写html的时候需要定义文档类型;你知道如果没有它,浏览器在渲染页面的时候会使用怪异模式;你知道各个浏览器在怪异模式下对各个元素渲染是有差异的。所以你会写像这样的doctype:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

         好在现在的各种web开发工具都足够强大,支持插入模板代码,因此你并不需要把这又长又臭的doctype一个个字母的敲出来。但是如果你受够了它,你也许可以尝试下面这个写法:

<!DOCTYPE html>

          哇哦,很简洁哦!好处显而易见:

一、你可以轻松的写下这个doctype,而不用担心会写错;

二、它是向后兼容的,是的,html5的doctype就是这样写的,并且现代浏览器都认识它

          如果你跟我一样一直以为:没有指定dtd将会开启浏览器的怪异模式,这种说法是错的!

          正确的说法应该是:没有定义doctype才会开启怪异模式,也就是说你只需要定义<!doctype html>就可以让浏览器在严格模式(标准模式)下渲染页面,而不需要指定某个类型dtd。

          让我们来回顾一下,所有的浏览器都需要两种模式:怪异模式和严格模式(也有人叫标准模式)。IE 6 for Windows/mac, Mozilla, Safari和Opera 都实现了这两种模式,但是IE 6以下版本永远定在了怪异模式。关于两种模式,你需要知道以下几点:

          ①在标准化之前写的页面是没有doctype的,因此没有doctype的页面是在怪异模式下渲染的。

           ②反过来说,如果web开发人员加入的doctype,说明他知道他所要做的事情,大部分的doctype会开启严格模式(标准模式),页面也会按照标准来渲染。

           ③任何新的或者未知的doctype都会开启严格模式(标准模式)。

           ④每个浏览器都有自己的方式来激活怪异模式。

注意:你可以根本不需要根据你选择的doctype来验证你的页面,只要doctype标签存在就足以开启严格模式(标准模式)了

我们只需要一小段JavaScript代码就可以得到答案,它就是:

mode=document.compatMode;

 这个代码可以用来判断,当前浏览器是处于怪异模式还是标准模式,该属性的兼容性毋庸置疑

你可以在你想测试的浏览器里查看:

便可看到结果了,据我所知,这样并没有激活怪异模式,即使是ie6下

【JS判断浏览器解析模式/方式】

在js中如何判断当前浏览器正在以何种方式解析?   

document对象有个属性compatMode ,它有两个值:

①BackCompat     对应quirks mode

②CSS1Compat     对应strict mode 

var mode = document.compatMode;
console.log(mode)
 

 【怪异模式与标准模式区别】

 Quirks mode和Standars mode最大的不同就是提现在对盒模式的解释上,这也是我们在js里要注意的地方。

     什么是盒模式? 这是针对块级元素说的,说白了就是把块级元素想像成一个装东西的盒子,而margin,padding,border,width这些css属性构成了盒模式。 

在Standars mode标准模式中: 

元素真正的宽度 = margin-left   +   border-left-width   +   padding-left   + width   +   padding-right   +   border-right-width   +   margin-right;  

在Quirks mode怪异模式中: 

width则是元素的实际宽度,内容宽度 = width   -   (margin-left   +   margin-right   +   padding-left   +   padding-right   +   border-left-width   +   border-right-width)

    1. 内联元素 ,例如<a>|<span>等,定义上下边界不会影响到行高(line-height),内联元素距离上一行元素的距离由行高决定,而不是填充或边界。  

    2.   内联元素(display: inline) 内联元素不需要在新行内显示,而且也不强迫其后的元素换行,如a|em|span等都为内联元素。内联元素可以为任何其他元素的子元素。

    3. 浮动元素(无论左或者右浮动)边界不压缩 ,且若浮动元素不声明宽度,则其宽度趋向于0,即压缩到其内容能承受的最小宽度。  

    4. 如果盒中没有内容,则即使定义了宽度和高度都为100%,实际上只占0% ,因此不会被显示,此点在采取层布局的时候需特别注意。  

    5. 边界值可为负,其显示效果各浏览器可能不相同。  

    6. 填充值不可为负。  

    7. 边框默认的样式(border-style)为不显示(none)。

【用法】

官方解析:

在实际的项目中,我们还需要在获取浏览是否IE,这样就可以得到IE的渲染模式了。在Ext中的代码:isBorderBox=isIE&&!isStrict

当文档有了标准声明时, document.compatMode 的值就等于 "CSS1compat", 因此, 我们可以根据 document.compatMode 的值来判断文档是否加了标准声明

var height = document.compatMode=="CSS1Compat" ? 
document.documentElement.clientHeight : document.body.clientHeight;

【注意:】这里document.compatMode(文档渲染模式)用来判断当前浏览器采用的渲染方式

①等于BackCompat怪异模式时,浏览器客户区宽度是document.body.clientWidth

②等于CSS1Compat标准模式时,浏览器客户区宽度是document.documentElement.clientWidth

浏览器客户区高度、滚动条高度、滚动条的Left、滚动条的Top等等都是上面的情况。

一个准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top的代码:

if (document.compatMode == \"BackCompat\") {
     cWidth = document.body.clientWidth;
     cHeight = document.body.clientHeight;
     sWidth = document.body.scrollWidth;
     sHeight = document.body.scrollHeight;
     sLeft = document.body.scrollLeft;
     sTop = document.body.scrollTop;
   }else { //document.compatMode == \"CSS1Compat\"
     cWidth = document.documentElement.clientWidth;
     cHeight = document.documentElement.clientHeight;
     sWidth = document.documentElement.scrollWidth;
     sHeight = document.documentElement.scrollHeight;
     sLeft = document.documentElement.scrollLeft == 0 ? 
             document.body.scrollLeft : document.documentElement.scrollLeft;
     sTop = document.documentElement.scrollTop == 0 ? 
            document.body.scrollTop : document.documentElement.scrollTop;
}

 简而言之:

var pageWidth=window.innerWidth,
pageHeight=window.innerHeight;
if(typeof pageWidth!='number'){
    if(document.compatMode=='CSS1Compat'){//标准模式
       pageWidth=document.documentElement.clientWidth;
       pageHeight=document.documentElement.clientHeight;
    }else{
       pageWidth=document.body.clientWidth;
       pageHeight=document.body.clientHeight;
    }
}

 (以上代码兼容目前流行的全部浏览器,包括:IE、Firefox、Safari、Opera、Chrome) 

 常用的浏览器表现模式包括:

①IE

IE包括两种模式:标准模式(Standards Mode)与怪异模式或混杂模式(Quirks mode),简称为IE(S)与IE(Q)

②FireFox

FIreFox包括三种模式:Full Standards Mode、Almost Standards Mode与Quirks Mode。对这三种模式的描述见:Mozilla's DOCTYPE sniffing

③Opera

Opera包括三种模式:Quirks、Standards与Almost Standards。对这三种模式的描述见:DOCTYPE Switches support in Opera

.