悟道Web标准:让W3C标准兼容终端(2)
作者:greengnn 来源:蓝色理想 发布时间:2009-10-11 16:40:00
其实上面所说的,也就是让W3C标准兼容终端,本应该终端按照W3C规范来开发解析器,但是种种的原意,终端各持己见,置W3C标准于不顾,而用户体验永远是第一位的。所以我们既然遵循标准,又要兼容终端。
我们不是标准的制定者,仅仅是实施者。就要考虑到项目的用户群体的特性,使用哪个终端多一点,显而易见,IE6的使用者仍然是大多数的。而且XHTML的严格定义方式不符合IE6的解析方式。通过权衡,即选择了W3C的推荐标准,虽然不是最新的,也兼容了现有终端的情况。
废话有点多了,概要的说明一下,选择一个适合项目大多数用户终端的标准,就HTML来说,4.0和xhtml1.0(改良后)都是不错的,但是要遵循HTML的结构化和语义化的要求,标签必须小写,闭合合理,嵌套正确,摒弃表现型标记,结构代码和表现代码分离。html1.0也可以编写成xml结构化的状态,即时没有xml声明。
CSS是最头疼的一块,如果严格按照W3C的css2.1规范,是很难兼容到IE系列浏览器的,特别是IE5.5 IE6两种,他们的解析和W3C相差甚远,所以CSS文件就必须进入hack,一种是css自身的私有属性和私有识别的代码,一种是IE浏览器特有的条件注释。细节就不多讲了。
如何既遵循标准,有兼容浏览器。那就是使用符合标准或者近似符合的浏览器作为主要开发软件,我建议安装有firebug插件的firefox作为第一个调试工具,等界面完成后,再调试其他浏览器,通过csshack或者条件注释,或者两者混搭。
理想的CSS兼容方案是,IE8,firefox这类通过Acid2 测试的浏览器使用标准的CSS代码,对没有通过测试的(就是IE系列)使用条件注释。例如:
<link rel="stylesheet" type="text/css" href="w3c.css" />
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="ie7.css" />
<![endif]-->
<!--[if lt IE 7]>
<link rel="stylesheet" type="text/css" href="ie7lt.css" />
<![endif]-->
IE5.5的份额太少,可以考虑不兼容,兼容也主要是盒模型上的兼容。
理想的终究会存在很多现实的问题,比如IE的请求数过多,这是速度上的损失,代码维护不方面,同一个页面需要维护多个css文件,容易产生遗漏,避免这两个因素,css hack是做好的方式,主样式+私有样式解决兼容问题。
针对IE,常见bug的处理,haslayout的触发,放在标准CSS代码的后面。比如:
.clearfix:after{content:"\0020"; display:block; height:0; clear:both;}
.clearfix{*zoom:1;/*IE haslayout*/}
.box {float:left;margin-left:20px;_display:inline;/*双倍margin bug*/}
以后的浏览器对CSS的处理都采用W3C css2.1规范为主,私有属性为辅的策略,比如firefox的-moz-,IE8的-ms-,sefari和Chrome的-webkit-,Opera的-o-。
Javascript的标准兼容终端,我不是很清楚,基本的还可以看出,应用W3C的DOM操作文档树,而不是IE的document.all,摒弃IE的Jscript和VBscript。而且JS是可以去判断终端的,实例:
var ua = navigator.userAgent.toLowerCase();
var _isOpera = ua.indexOf('opera') != -1,
_isSafari = ua.indexOf('safari') != -1,
_isGecko = !_isOpera && !_isSafari && ua.indexOf('gecko') > -1,
_isIE = !_isOpera && ua.indexOf('msie') != -1,
_isIE6 = !_isOpera && ua.indexOf('msie 6') != -1,
_isIE7 = !_isOpera && ua.indexOf('msie 7') != -1;
通过终端的判断,给IE开小灶,解决IE 的兼容问题。
if (_isIE6) { // IE6
//语句
}
DHTML的历史远远大于现在所说的富客户端,很多经验组建都源自于早期的IE平台上的DHTML,如何保持JS主体代码的标准化和对IE系列的兼容,我自己还需要再积累积累。
最后,为什么很多团队要求将firefox作为开发环境,待代码完成后再进行IE系列的bug调试。就是基于这个思想,先按照W3C标准规范编码,再处理对标准支持不好的浏览器的。这样你才能理解为什么把IE的错误解析成为bug,而且页面工程师的教材也接近统一,那就是W3C的文档,那是我们权威的教材。向后,终端都尊重了W3C标准,IE8就是很好的例子。


猜你喜欢
- import timefrom selenium import webdriverfrom selenium.webdriver.commo
- 前言在自学机器学习或者是深度学习的过程中,有的时候总想把执行过程或者执行结果显示出来,所以就想到了动画。好在用 Python 实现动画有许多
- 一、程序功能:为Repeater实现分页二、窗体设计:1、新建ASP.NET Web应用程序,命名为Repeater2,保存路径为http:
- 前言本文主要给大家介绍了关于python使用正则表达式的集合字符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
- 或者说有一条命令 hostname [string],当string是不包含2950时,是true,包含2950时是false。使用Exce
- 前言help(argparse)查看说明文档,“argparse - Command-line parsing libr
- 前言:在很多应用场景下,我们不但需要堆的特性,例如快速知道数据最大值或最小值,同时还需要知道元素的排序信息,因此本节我们看看如何实现鱼和熊掌
- 本次分析一下Logger.info的流程1. Logger.info源码: def info(self, msg, *args, **kwa
- 本文定位:已将CPU历史数据存盘,等待可视化进行分析,可暂时没有思路。前面一篇文章(https://www.jb51.net/article
- 本文实例讲述了Python实现简单查找最长子串功能。分享给大家供大家参考,具体如下:题目选自edX公开课 MITx: 6.00.1x Int
- 终端输出彩色文字开发工具:Mac,Goland,Mac自带shell。这是基于Mac的测试结果,根据读者留言,在Windows上不生效,标识
- USE Demo GO /* 将表Code的列String中的值提取放到Record表中 String 中字符类型为 dsddddd,222
- 本文实例讲述了Python实现程序的单一实例用法。分享给大家供大家参考。具体如下:这里先使用win32ui.FindWindow查找窗口名字
- 环境搭建python 3.xrequests 包re 包gooey包 (用于可视化)代码import requestsimport reim
- 在使用缓存时,容易发生缓存击穿。缓存击穿:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去读dB,这些请求都会击穿
- 这次分享的是关于Vue自定义指令的使用方法,学习完基础后我们再来实战完成一个下拉列表,废话不多说,直接上干货基本用法//全局注册Vue.di
- 虽然小型web应用程序用单个脚本可以很方便,但这种方法却不能很好地扩展。随着应用变得复杂,在单个大的源文件中处理会变得问题重重。与大多数其他
- 与运算 &举例: 3&5 &n
- 最近在使用linux上进行本地登录时,发现既然无法正常登录 , 报如下错误信息:[root@xxxx ~]# mysql -h localh
- 运行代码框<SCRIPT>var oPopup = window.createPopup();var popTop=50;fun