跨浏览器兼容性问题

8
我发现很多人都遇到了跨浏览器兼容性问题。
我的问题是为什么浏览器会以不同的方式呈现HTML、CSS或JS?
这是否是由于DOM或盒模型导致的?
既然W3C等机构有标准,为什么还会出现跨浏览器兼容性问题?
主要互联网浏览器在显示HTML内容时是否有差异?为什么Internet Explorer、Firefox(Mozilla)、Opera可能以不同的方式显示相同的内容?
建立跨浏览器兼容的网站时应该注意什么?

即使你强调你的问题,答案仍然是:“因为不同的浏览器是不同的。” 对于最后一个问题,我认为davidsulc给出了一个好的答案。 - deceze
1
有什么不同吗?解析器?DOM?盒模型? - DarthVader
1
@user177883 - 是的,所有的都包括。还有渲染代码、脚本语言、内部架构以及组成浏览器的其他一切。- 实际上,浏览器最显著的特点是它们的相似之处。 - Alohci
@user177883 微软过去大多数时间并不关心标准。现在他们正在致力于IE9的开发,它相比之前版本有了很大的改进。 - Šime Vidas
@Šime Vidas - 我认为这是相当不公平的。如果您查看HTML和CSS W3C规范的致谢部分,您会发现几乎所有部分都有微软的名字。我们不应忘记IE6曾经是最先进、符合标准的浏览器。只是出于商业原因,微软停止了IE6的进展,当他们最终意识到需要重新开始时,陷入了困境。 - Alohci
@Alohci今天使用的大多数标准在2000年至2003年之间达到推荐状态。微软于2006年发布了IE7,2009年发布了IE8,但两者都实现了标准较差。当我说微软不关心标准时,我的意思是过去十年。在2001年IE6发布时,IE占据了市场的90%以上,这意味着当时并不重视符合标准。说IE6曾经是最符合标准的浏览器没有任何价值。当时没有相关的替代浏览器-IE 就是“标准”。 - Šime Vidas
5个回答

5

有很多原因导致不兼容:

  • 规范通常是针对特定供应商的专有功能而编写的响应文件,
  • 规范有时会写得很差,存在歧义或者没有考虑到特定的最终使用情况,
  • 浏览器供应商偶尔会出于自己的原因忽略规范。

其他因素:

  • 很多东西很难实现,更别说正确实现了,
  • 它还必须被实现以处理格式错误的HTML、向后兼容等。浏览器供应商有时会为了“互操作性”而牺牲“正确性”,
  • 历史、政治和个人品味。

1
这并没有真正解释任何关于问题的内容。它可能只是对一个问题的部分回答。 - DarthVader
1
@user177883:Hamish刚刚为你概述了所有问题的大部分原因,除了最后一个问题。 - Jason S
1
@user177883,你的问题(或一系列问题)非常广泛,我试图以同样的精神回答它——概述根本原因。也许将每个问题分解成更具体的问题,你会得到每个主题的详细答案。 - Hamish

4
我确信会有更好的回答,但这里是一个开始:
是的,关于CSS渲染有应该遵循的标准。问题在于,一些浏览器编辑器(咳咳,微软咳咳)不认为正确实现规范是优先考虑的事情(甚至完全实现都不行)。即使布局引擎正在努力确保兼容性,当混合各种CSS属性和单位时,弄清楚如何正确呈现事物可能会变得非常棘手(例如,请参见ACID测试http://en.wikipedia.org/wiki/Acid3
要拥有跨浏览器的网站,您基本上必须检查您网站的所有页面在您的访问者使用的浏览器(或您支持的浏览器)中是否正确呈现。各种工具,如Selenium(seleniumhq.org),可以帮助处理此问题。
您基本上必须决定要做什么。
  • 考虑最低公共分母进行设计(如果是IE6,你将无法做很多事情)
  • 使用验证CSS进行设计,并使用hack(如clearfix)来纠正某些浏览器中的错误行为
  • 决定不支持某些浏览器(IE6是一个主要候选者)
  • 嗅探浏览器并相应地适应显示(这不是首选的方法)

关于操作DOM的差异,诸如jQuery之类的库非常有帮助,因为它们将实现差异隐藏在背后。

作为参考,建议至少在以下浏览器中测试您的网站:

  • 基于WebKit的浏览器(Chrome,Safari)
  • 基于Gecko的浏览器(Firefox)
  • IE
  • Opera

3

这是“浏览器大战”的余波。现在Netscape Communications已经破产,但为了超越对手而做出的怪癖仍然存在于浏览器的代码库中,而且人们仍在开发团队中。考虑观看Crockford的讲座,他对这个主题进行了一些重点介绍。(你会想要保存文件而不是流式传输)


2
该标准规定了HTML/CSS标记应呈现为可视元素的方式,但不具体规定呈现方式。许多不同的人和公司都创建了不同的呈现标记的方式。由于HTML呈现是一个极其复杂的任务,因此他们当然没有达成完全相同的解决方案。所有的渲染引擎都在追求同一目标,但通常规范足够模糊以允许小差异(即使只是像素级别),而且错误也是不可避免的。
加上在过去,浏览器厂商更关注快速获取市场份额,而不是遵循规范,并且某些公司一直非常缓慢地转向支持标准(你知道你是谁)。
最后,规范(非常复杂)和浏览器(更复杂)由许多不同的人编写。你不能期望这个过程会产生绝对的完美。而完美也不是HTML的目标;它旨在成为一个简单、跨平台、独立于厂商的标记语言,可以在各种设备上呈现信息,这一点它做得非常好。如果你需要像素完美的结果,你需要选择一种旨在提供这种效果的技术,比如Adobe Flash(既不跨平台也不独立于厂商,也不简单)。
试着从半杯水的角度看待它:成千上万的不同人在许多不同的平台上编写了数百万行代码,执行着完全不同的任务,关注着许多不同的目标,但最终所有呈现HTML标记的引擎几乎都是相同的,并且通常只有微小的、几乎可以忽略不计的差异。当然,每个引擎都有弱点,如果你碰巧同时遇到所有问题,你的网站将在每个浏览器中以不同的方式崩溃。但这是可以通过一些经验来避免的。

2

除了Hamish提到的问题,还有另一个主要问题是浏览器如何处理不正确的HTML。例如,在IE4 / NS4时代,<table>元素非常具有问题性。如果您没有关闭<table>标签,IE4会为您关闭它。Netscape 4将完全忽略该表。

即使在今天,一个浏览器会以不同于另一个浏览器修复不正确的标记。 是的,标记应该被纠正,但浏览器将尝试尽力呈现某些内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接