HTML5 是唯一一个通吃PC、Mac、iPhone、iPad、Android、Windows Phone 等主流平台的跨平台语言。Java 和 Flash 都曾梦想这个位置,但都梦断于iOS。此时人们纷纷开始研究基于HTML5 开发跨平台手机应用,很多人都认为,原生应用只是过渡,就像当年从C/S 结构转变为B/S 结构一样。而且学习 Objective-C 和 Java 很费劲,既然会网页开发,为何不试试 HTML5。
然而,HTML5毕竟只是一个技术标准,所以跨平台确实跨平台,但只是理论上的跨平台。
在实际应用过程中,大家会发现各种浏览器之间存在各种各样的差异性,导致HTML5页面在不同浏览器上显示的效果不一致,于是要经过大量的兼容性测试和修复才能真正实现“一次开发,所有平台完美运行”的理想,而这样的工作量并不小。对此,大家可能有疑问,HTML5不是国际标准么,浏览器都遵守HTML5国际标准来开发的话,不应该出现不一致啊?其实,这里面有多方面的原因:
1、HTML5的功能是个巨大的集合,浏览器产商不可能在一个版本开发周期中实现所有的HTML5能力,每个版本都只能开发一小部分子集。 不同的浏览器产商会根据自己对市场的判断以及公司的战略,制定自己的开发路线图,所以自然会出现不同浏览器支持的HTML5功能集合不一致;
2、W3C一直把制定的标准文档定义成“推荐”,也就是说,HTML5并不是一个强制的标准。如果开发者写的HTML网页不符合标准,浏览器依然能够显示。事实上,互联网上有95%以上的网页都是不符合W3C标准的。结果就是,网页中有大量的异常情况,需要浏览器自己去修复。如何修复不标准的网页并没有一个固定做法,所以不同浏览器产商都有自己的一套解决方式。这也导致了各个浏览器虽然都是按照相同的W3C来开发的,但是最后的代码算法是不同的,继而导致了显示结果不一致;
3、互联网是个高速发展的市场,每个浏览器产商都要为适应新的市场变化开发具有足够创新升级版本。然而向前创新和向后兼容往往是矛盾的,所以浏览器产商在新版本中可能会做出一些巨大的代码调整。然而,浏览器是安装在用户手机上客户端程序,用户有权利选择是否进行升级。这就导致了即使是同一个产商的浏览器,你还得为它的不同版本做相应的兼容性修复。这一点相信大家在PC时代的IE浏览器上都吃过很多苦头,每个前端开发者都需要为 IE6、IE7等不同版本做出大量的工作;
4、今天的手机操作系统是个非常碎片化的市场。安卓的开发性为它带来了高速的市场覆盖,但同时也带来了极度碎片的版本分支。几乎每个手机产商都会做一些定制,以实现自己在市场上的差异化。小米有MIUI、华为有EMUI、三星有TouchWiz等等。手机操作系统自带的默认浏览器也会做相应的定制,因此导致HTML5网页在不同手机操作系统的默认浏览器上显示不一致。由于很多第三方App内嵌浏览器一般都直接调用了操作系统自带的浏览器内核,从而导致网页在了不同手机上显示效果不一样,这点在混合App(Hybrid App)中体现尤为明显。