个性原创,打造品牌

拒绝模仿抄袭、拒绝模板建站;
多位资深网页设计师同时设计,让您优中选优;
网站独一无二,品牌轻易提升...

了解详情 >

代码规范,国际标准

后台php+mysql动态管理,功能强大,千万级数据;
前台div+css生成静态,代码精简,访问速度快,
符合w3c国际标准,兼容ie/火狐/苹果等任意浏览器...

了解详情 >

细微高效,全程无忧

域名一个,主机一台;
主机BGP多线路,5G存储空间,流量不限;
新闻录入、图片处理、数据备份、安全监测、网站升级...

了解详情 >

移动时代,机不可失

全新视觉、创新操作;
跨平台兼容,微信无缝对接;
不容错过的手机网络商机,不能错过的手机网站时代...

了解详情 >

搜索领先,锁定访客

在主流搜索引擎的搜索结果中,
网站的名称,排在第一页的第一名,
网站其他相关的3-5个关键词,排在第一页...

了解详情 >

营销利器,决胜千里

全国统一呼叫,品牌企业的象标志。
中国电信4008/4009、中国联通4000/4006,号码任选;
通话资费预存...

了解详情 >
以“信”为主的服务理念,“源”为标杆的服务特点351532641点击咨询010-86203368联系电话
CSS问题设计问题程序问题优化问题

CSS中Hack兼容的常见问题

发布时间:2012-11-14      浏览次数:2964

人一旦习惯了某些东西就很难去改,以及各种各样的原因,新的浏览器越来越多,而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题。说 到浏览器兼容,CSS HACK自然而然地被我们想起。今天,我们通常都有一个团队或者将有一个团队的人在一个公司里面做相同的事,需要我们有统一的规范来进行Coding,以 方便维护。而解决兼容的方法就是(必须是,因为这才最容易有问题的)其中一个最重要的、要解决的规范之一。

在解决兼容方法上,想定出一个统一的规范,个人认为应该以下面3点为基本原则:

权衡成本:在浏览器被淘汰后,如何快速清理掉无用代码 可维护:在资源成本和完美间平衡的向后兼容 可读:省力、易记

这里把成本放在了第一位,并不是说我们不愿意追求完美,而只是,太刻意追求完美有时候可能会阻碍我们前进;在成本后,应该是可维护和可读,这点对于团队的合作来说至关重要,而最终结果也是为了减少成本。

先把这三个原则存起来,来看看我们平时解决兼容的写法(后面会附详细的Hack方法列表):

一、CSS 选择器 Hack/* Opera */
@media all and(-webkit-min-device-pixel-ratio:10000),not all and(-webkit-min-device-pixel-ratio:0)
{head~body .sofish{display:block;}}

这种写法的优缺点是:

优点:全面,各种HACK都有;清理无用代码里易认 缺点:选择器名称不易记;代码量多(要重复写选择器) 二、CSS 属性 Hack.sofish {
padding
:10px;
padding
:9px\9;/* all ie */
padding
:8px\0;/* ie8-9 */
*padding:5px;/* ie6-7 */
+padding:7px;/* ie7 */
_padding
:6px;/* ie6 */
}

这种写法的优缺点是:

优点:易记;代码少 缺点:不全面 三、IE 注释IE only

这种写法的优缺点是:

优点:安全;向后兼容好;易维护 缺点:用不好会增加HTTP请求;用得好代码又多 四、浏览器探测:JS/后端程序判断// 以jQuery为例,检测是否是IE6,是则加上class="ie6"
if($.browser.msie && $.browser.version =6){
$
('div').addClass('ie6');
}

这种写法的优缺点是:

优点:全面;易维护;可读性高 缺点:占资源;代码量大(要重写选择器)

上面4种是我们最常用的方法。现在,让我们抽出心里存着的那3个原则,看看如何选择。要时间思考一下么?这里简单地说一下我的选择:

尽量使用单独HACK

这样维护起来成本比较低,改动不会影响其他的浏览器,而一旦有浏览器淘汰,只要搜索关键字,就可以批量去掉这些代码。比如,ie6的单独hack:_padding:6px;;

向后兼容的目标:1年

你想现在的网站兼容IE10么,谁不想,但这可预见性太低了,也可以说,成本太高了。暂时没必要。不过,IE9可能要发布了,所以,选择像padding:8px\0;这样的IE8+的hack,在删掉其他代码不影响向后兼容上,会更好;并且,如果IE10出来,一旦支持这个hack,而又没有这个bug,可能删掉只影响2个浏览器,也会更方便;

尽可能省资源

你要是不考虑页面加载速度,不考虑服务器承受能力的话,那在向后兼容和淘汰的处理上可以做得很完美(从代码上),但这从某种程度上,不如不做。

五、个人推荐写法

其实可以纠结的还真多,这里结合A-Grade浏览器的种类和HACK的种类,写两种个人认为比较合理的HACK和向后兼容相兼顾的写法,仅供大家参考的。

经济实惠型写法:注重单独的HACK。 IE的HACK比较多,选择省力易记的属性HACK;其他浏览器HACK少,选择块状的选择器HACK(推荐)

.sofish {
padding
:10px;
padding
:9px\9;/* all ie */
padding
:8px\0;/* ie8-9 目前应用于IE8的单独hack,情况比较少 */
*padding:5px;/* ie6-7 */
+padding:7px;/* ie7 */
_padding
:6px;/* ie6 */
}

/* webkit and opera */
@media all and(min-width:0px){.sofish{padding:11px;}}

/* webkit */
@media screen and(-webkit-min-device-pixel-ratio:0){.sofish{padding:11px;}}

/* opera */
@media all and(-webkit-min-device-pixel-ratio:10000),not all and(-webkit-min-device-pixel-ratio:0){.sofish{padding:11px;}}

/* firefox * /
@-moz-document url-prefix(){ .sofish{padding:11px;}} /* all firefox */

html
>/**/body .sofish, x:-moz-any-link, x:default{ padding:11px;}/* newest firefox */

准完美主义写法:配合IE注释,一律采用选择器HACK(选择性推荐)

HTML:添加body class
endif]-->
endif]-->
endif]-->
endif]-->
endif]-->.sofish { padding:10px;}
.non-ie .sofish { padding:12px;}
.ie9 .sofish { padding:9px;}
.ie8 .sofish { padding:8px;}
.ie7 .sofish { padding:7px;}
.ie6 .sofish { padding:6px;}

/* webkit and opera */
@media all and(min-width:0px){.sofish{padding:11px;}}

/* webkit */
@media screen and(-webkit-min-device-pixel-ratio:0){.sofish{padding:11px;}}

/* opera */
@media all and(-webkit-min-device-pixel-ratio:10000),not all and(-webkit-min-device-pixel-ratio:0){.sofish{padding:11px;}}

/* firefox */
@-moz-document url-prefix(){.sofish{padding:11px;}}/* all firefox */
html
>/**/body .sofish, x:-moz-any-link, x:default{ padding:11px;}/* newest firefox */

然后,从第二种方式我们也可以发现。把IE注释用在body class上,而不是添加单独的或者@import会是更好的选择。虽然分文件也是一种不错的选择,但了为页面加载速度,HTTP请求一个都不能浪费。

至于利用JS或者后端程序来判断,除非你有足够的资源,除非你解决不了(90%不会发生),不然,并不推荐用。附上一个表(via),可以参考参考:

六:全面的IE6+ / Firefox / Webkit / Opera CSS HACK列表:/***** Selector Hacks ******/
/* IE6 and below */
* html #uno { color: red }

/* IE7 */
*:first-child+html #dos { color: red }

/* IE7, FF, Saf, Opera */
html
>body #tres { color: red }

/* IE8, FF, Saf, Opera (Everything but IE 6,7) */
html
>/**/body #cuatro { color: red }

/* Opera 9.27 and below, safari 2 */
html
:first-child #cinco { color: red }

/* Safari 2-3 */
html
[xmlns*=""] body:last-child #seis { color: red }

/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body
:nth-of-type(1)#siete { color: red }

/* safari 3+, chrome 1+, opera9+, ff 3.5+ */
body
:first-of-type #ocho { color: red }

/* saf3+, chrome1+ */
@media screen and(-webkit-min-device-pixel-ratio:0){
#diez { color: red }
}

/* iPhone / mobile webkit */
@media screen and(max-device-width:480px){
#veintiseis { color: red }
}

/* Safari 2 - 3.1 */
html
[xmlns*=""]:root #trece { color: red }

/* Safari 2 - 3.1, Opera 9.25 */
*|html[xmlns*=""]#catorce { color: red }

/* Everything but IE6-8 */
:root *>#quince { color: red }

/* IE7 */
*+html #dieciocho { color: red }

/* Firefox only. 1+ */
#veinticuatro, x:-moz-any-link { color: red }

/* Firefox 3.0+ */
#veinticinco, x:-moz-any-link, x:default { color: red }

/***** Attribute Hacks ******/
/* IE6 */
#once { _color: blue }

/* IE6, IE7 */
#doce { *color: blue; /* or #color: blue */ }

/* Everything but IE6 */
#diecisiete { color/**/: blue }

/* IE6, IE7, IE8 */
#diecinueve { color: blue\9; }

/* IE7, IE8 */
#veinte { color/*\**/: blue\9; }

/* IE6, IE7 -- acts as an !important */
#veintesiete { color: blue !ie; } /* string after ! can be anything */

其他的就不多说了。不过,还是要提醒一下: 注释也是很重要的。虽然是HACK了,但现实中情况有时候比想象中的复杂得多,给代码一个注释,好过千言万语。

最后,希望看到你更好的方法!



信源创想工作室推荐,网址为http://www.xinycx.com


上一篇:CSS常见问题小技巧解决办法
下一篇:兼容IE6的几种方法

Copyright©2016  xinycx.com  All Rights Reserved  北京信源创想科技有限公司  备案号:京ICP备17071760号-1   

京公网安备 11010802036302号


地址:北京市海淀区闵庄路门头馨村北二区33号楼3单元102室  电话:010-86203368  代理域名注册服务机构:北京新网数码信息技术有限公司

北京网站建设 北京网站制作 信源创想 品牌网站建设 企业网站建设 网站设计 APP开发 微信开发 前端切图 DIV+CSS html5切图 APP切图