`
yiminghe
  • 浏览: 1434188 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

dtd 的作用 - ie8 bug !?

阅读更多

分析一下 dtd 对于 firefox 和 ie 的 作用

 

 

首先看一段很短的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
	<head>
		<title>ie8 bug测试 </title>
		</head>
	
	<body>
<div id="marquees" style='width:100px;height:200px;overflow:hidden;border :1px solid green;padding:100px;'> 
	
<a href="#">链接1</a>
<br> <a href="#">链接2</a>
<br> <a href="#">链接3</a>
<br> <a href="#">链接4</a>
<br> <!-- 字幕内容结束 -->
</div>
</body>
</html>
<!-- 以下是javascript代码 -->
<script type="text/javascript">

alert(document.getElementById('marquees').offsetHeight);


</script>

 

在  ie6 ie7 firefox3 上都显示 402 ,布局也都一样 , 他们 都遵从了 xhtml 1. 0 transitional 标准。

 

 

 

那么把 dtd 删掉 则会有很大不同了 :

 

<html>
	<head>
		<title>ie8 bug测试 </title>
		</head>
	
	<body>
<div id="marquees" style='width:100px;height:200px;overflow:hidden;border :1px solid green;padding:100px;'> 
	
<a href="#">链接1</a>
<br> <a href="#">链接2</a>
<br> <a href="#">链接3</a>
<br> <a href="#">链接4</a>
<br> <!-- 字幕内容结束 -->
</div>
</body>
</html>
<!-- 以下是javascript代码 -->
<script type="text/javascript">

alert(document.getElementById('marquees').offsetHeight);


</script>

 

ie 6 7 显示 200,firefox 显示 402  ,

这就是网上常说的 ie 和 firefox 的 盒模型的区别  , 实际上 是 处于 qirk(混杂) 模式下的区别 ,ie为了兼容以前自己专有的的盒模型而不符合后来制定的标准。 网上提供的css hack才是真正害人 , 设成 标准模式就可以了 ,何必 要刻意 hack

 

 

 

 

下面来看看 ie8 的特殊表现

 

运行 第一段 带 dtd 的 xhtml , 当从 浏览器直接输入 xhtml 本地地址 ,打印 402 ,布局也正常 ,这时 点一下 刷新   ,结果 , 打印 200 ,布局变成了 混杂模式的样子!!!!!!!!!!!!!

 

 

 

 

 


转载一篇 : 关于 dtd 的 有趣文章

 

我们都知道,要做WD(web designer),首先得伺侯好几个浏览器:IE6,IE7,Firefox.一般的页面,都只要求在IE6,IE7,Firefox下正常工作就行了。
   但是实际上,浏览器远远不止这几个,Firefox分为Firefox 1.5,Firefox 2,Firefox 3几个主要版本,IE7,IE6 中也各有好几个系列,另外除开这两个主流厂商的产品之外,还有Opera,Konqueror,Netscape,chrome等一系列。

   这些浏览器,各有各的一套,往往在这里运行正常,在那里运行就不正常了。于是WD们拆东边补西边,终于能在几个浏览器下都正常了。结果,产品经理又有了 新的需求,需要在哪儿哪儿那儿改一下,于是乎,好不容易糊弄好的的纸架子一下子倒塌了,WD们又忙得焦头烂额。之所以这么说,因为,这是我的经验。
  大凡是WD,总是收集了一堆Css Hacking 技巧,为的是在各个浏览器下正常。网上一搜,一大堆。
  然而,首先WD们没有弄清楚一个基本问题,我们为什么需要css Hacking?如果有1000种浏览器,我们是不是要记住1000种浏览器的Hack 技巧?

   事实上, Css Hacking从某种程度上说,是一个拿不上台面的东西。Css Hacking有很多技巧,纯粹就是利用了浏览器的Bug.比如常 见的用_class{….} 去区别IE和firefox,按理说_class是一个不合法的标记方法。Css Hacking的出现,是WD们不得已而 为之,WD们的日常工作并不是疯狂地Css Hack.
  其实这么多浏览器,并不是可以随便乱来,想自己定义个啥就定义个啥标记的。人们习惯了 在标准的世界里生活,在网页世界里,也有一系列标准。浏览器们也都努力地做到web标准兼容。但是有些浏览器出道得早,可以说后来出现的web标准就是在 它们的影响下诞生的。还有一个,当年非常牛B,所以做了很多创新,没有把web标准放在心上,蛮不在乎。更何况,标准自身也是在不断更新的。因此,一般各 个浏览器产品系统都曾有过一段没有不太在乎web标准的日子,后来大家都意识到不行了,我们大家都妥协一下,要制订一套标准,大家都遵守。可是以前各家都 有自己制订的一些小条条小框框,他们不符合标准,咋办呢?

  于是,这些人想了个法子:标准模式和怪异模式。另外还有一种,叫“近乎标准模式”,almost standard.要说真是够怪异,我都听晕了。别着急,听我慢慢道来。
  不是说了吗,这些老大们坐在一起,制定了各式各样的标准,以后大家都按这套标准来解释网页。如果你做的网页可以按这套标准来解释,那就用一个标记doctype注明这是可以按web标准来解释的。这就是标准模式。
   那以前各家都生产过,规定过的小九九们不符合标准,咋办啊?也不能就马上把它们全扔掉不要了吧?软件上大抵有这样一套原则,叫向下兼容。在怪异模式下, 各个浏览器都模拟那些老版本的浏览器的操作,以防止老的页面无法工作。在网页没有指定doctype时,浏览器一般就都按怪异模式工作,以防老页面无法工 作。

  对于这两种模式之间的差异,最显著的例子涉及Windows上IE专有的框模型。在IE 6出现时,在标准模式中使用正确的框模 型,在怪异模式中使用老式的专有框模型。为了维持对IE 5和更低版本的向后兼容性,Opera 7和更高版本也在怪异模式中使用有缺点的IE框模型。
  Mozilla和Safari还有第三种模式,称为“几乎标准的模式(almost standards mode)”,除了在处理表格的方式方面有一些细微的差异之外,这种模式与标准模式相同。 

  正是由于这个原因,您可以丢掉很多css hacking技巧了。有些书介绍说,IE6和firefox的盒模型(或者有的地方叫框模型)不一致,因此需要这样做hack:

 Example Source Code [www.xxcss.com]
     div{
        width:100px;
        *width:95px;
     }


  我说,这种书真是误人子弟。因为,只要正确指定了doctype,这些浏览器解释上的差异就都不存在了,我们按照标准来就行了。
  这个模式的指位于HTML文件开头的DOCTYPE域指定的。一般常见的有这几种:

HTML 4.01 Transitional:

 Example Source Code [www.xxcss.com]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


  HTML 4.01 Frameset

 Example Source Code [www.xxcss.com]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">


  XHTML 1.0 Strict

 Example Source Code [www.xxcss.com]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


  XHTML 1.0 Frameset

 Example Source Code [www.xxcss.com]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">


  XHTML 1.1

 Example Source Code [www.xxcss.com]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

 


 

document .compatMode


IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。所以为兼容性考虑,我们可能需要获取当前的文档渲染方式。
      document .compatMode 正好派上用场,它有两种可能的返回值:BackCompat和CSS1Compat,对其解释如下:
BackCompat Standards-compliant mode is not switched on. (Quirks Mode)
CSS1Compat Standards-compliant mode is switched on. (Standards Mode)

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



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

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

 

 

 

一篇详尽描述关于doctype对于浏览器的影响的文章:

 

http://hsivonen.iki.fi/doctype/

  • 大小: 53 KB
  • 大小: 63 KB
分享到:
评论

相关推荐

    js鼠标滑过弹出层的定位IE6bug解决办法

    大家在写div+css的时候经常会用到弹出层,由于IE6的bug,所以当使用多个标签重复写弹出层的时候会遇到后面的层压在了弹出层的上面,这种问题在火狐浏览器下可以用z-index来解决,但是在IE6下面是不起作用的,下面的...

    IE6 position:fixed bug (固定窗口方法)

    正确的代码:预览/Demo | ie6_position_fixed_bug.txt(源代码) &lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt; &lt;...

    IE6 bug修正的10个小技巧 推荐

    复制代码代码如下: &lt;!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” ...DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&gt; 你需要处理的最棘

    IE6下CSS多类选择符优先级不起作用的bug分析及解决方法

    IE6,这个前端开发的梦魇总是在你不经意的时候给你捅一刀。这次碰到的问题是CSS多类选择符的问题。IE6不支持,我们来看一段这样简单的代码: 复制代码代码如下: &lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 ...

    IE6 空格bug修正方法

    DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt; &lt;html xmlns=”//www.w3.org/1999/xhtml”&gt; &lt;head&gt; &lt;title&gt;&lt;/...

    IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法

    经常我们用表单提交东西,在提交后,浏览器会自动记录你输入的东西,下次你再输入的时候,可以重新选择,但是如果你是用IE的话,这里有一个BUG, 其他浏览器没有这个问题。当然首先你得设置IE 浏览器选项是可以记录...

    解决ie6下3像素bug问题

    复制代码代码如下: &lt;...DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “&lt;a&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;”&gt;&lt;html xmlns=””&gt;&lt;head&gt;&lt;meta h

    jsvalidation-1_0b4

    * 为validation-config.xml编写了DTD,避免编写validation-config.xml错误. [Thanks 清风] v1.0b1 * 对体系进行重构,框架更加合理 * 精简了代码,更有效率 * 现在可以正常运行在IE, Mozilla, NetScape和DOM2兼容的...

    IE6 fixed的完美解决方案

    } 这个方法有一个bug未解决:在IE6下会把所有position:absolute都变成“浮动”的元素;还有使用js方法滚动滚动条时会出现对象闪烁,如下方法结合了CSS和js的办法,解决了以上的问题。 代码如下: &lt;!DOCTYPE ...

    JavaScript Table行定位效果

    给tr设置relative后就能相对table定位了,看来很简单啊,但问题是这个方法ie8和ff都无效,而且存在很多问题,所以很快就被抛弃了。 ps:该效果用来做tr的拖动会很方便。 接着想到的是给table插入一个新tr,克隆原来...

    JavaScript代码实现左右上下自动晃动自动移动

    最近几天做了一个项目,原来是用css3动画做的,由于不兼容IE,改成用js做了,特此分享给大家,供大家参考,代码有bug欢迎提出,写的不好还请见谅! &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//...

    网页页面原结构和CSS写法导致浏览器兼容问题

    感觉这个页面比较有普遍性,下面...找Bug 篇 原始代码,未做修正: 运行代码框&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;...

    html+css+js实现xp window界面及有关功能

    注意: 该程序在IE调试的,其他浏览器可能有BUG,见谅! 代码如下: &lt;!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”&gt; &lt;html&gt; &lt;head&gt; &...

    DIV+CSS实现仿DreamWeaver界面图形菜单效果代码

    这是一款DIV+CSS实现的图形菜单仿DreamWeaver效果,做了兼容性处理,火狐和IE都无Bug了。 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/div-css-f-dreamweaver-pic-menu-codes/ 具体代码...

    JavaScript 图片切割效果

    在拖放效果中说到插入一个div解决ie的透明背景bug,这里就需要修复这个bug。 跟缩放效果配合使用时,不得不说ie6的一个渲染bug,用下面的代码测试(ie6): Code &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

Global site tag (gtag.js) - Google Analytics