CSS Hack和向后兼容的常见问题

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


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

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

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

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

  一、CSS 选择器 Hack/* Opera */

  @media all and(-webkit-min-device-pixel-ratio:10000),not alland(-webkit-min-device-pixel-ratio:0)

  {head~body .sofish{display:block;}}

  这种写法的优缺点是:

  优点:全面,各种HACK都有;清理无用代码里易认 缺点:选择器名称不易记;代码量多(要重复写选择器) 二、CSS 属性 Hack.sofish {

  padding:10px;

  padding:9px9;/* all ie */

  padding:8px;/* 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;这样的IE8+的hack,在删掉其他代码不影响向后兼容上,会更好;并且,如果IE10出来,一旦支持这个hack,而又没有这个bug,可能删掉只影响2个浏览器,也会更方便;

  尽可能省资源

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

  五、个人推荐写法

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

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

  .sofish {

  padding:10px;

  padding:9px9;/* all ie */

  padding:8px;/* 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 alland(-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

  <!--[if IE6]--><![endif]-->

  <!--[if IE7]--><![endif]-->

  <!--[if IE8]--><![endif]-->

  <!--[if IE9]--><![endif]-->

  <!--[if!IE]--><![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 alland(-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: blue9; }

  /* IE7, IE8 */

  #veinte { color/***/: blue9; }

  /* IE6, IE7 -- acts as an !important */

  #veintesiete { color: blue !ie; } /* string after ! can be anything */

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

  最后,还是那句,希望看到你更好的方法!

时间: 2024-10-25 22:55:19

CSS Hack和向后兼容的常见问题的相关文章

【原】webapp开发中兼容Android4.0以下版本的css hack

话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了,看起来很简单,其实背后还有一个大坑等着你. 虽说是webkit内核,但页面的展现效果还会受到自身系统的影响,升级后的系统打了补丁,新增了新的属性,支持更多丰富炫丽的效果,那么旧的系统(未升级的)就不支持一些新的属性,开发哥哥就是没有做好低端版本兼容的话,就会产生所谓的bug的,再加上android

CSS hack实现 CSS完美兼容IE6/IE7/FF的通用方法_经验交流

关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一.CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得该声明位置需要提前.) <style> #wrapper { width: 100px!important; /* IE7+FF */ width: 

IE5.0、IE5.5、IE6.0、IE7.0、FF1.5、FF2.0兼容CSS Hack代码范例

css IE7.0简体中文正式版终于发布了,对于我等常和网页打交道的人来说网页兼容性问题也随之而来了.IE7.0有一个显著的改变就是支持!important了,是件好事情,但是也给广大的在IE6时代使用!important来区分处理IE和FF的网页制作者带来了不少问题,Noker也遇到了这个问题,所以翻阅网上资料,写了下面这个能够兼容现今大多数主流浏览器,覆盖绝大多数用户的Hack代码,发布在自己的论坛上,供大家查看,研究,取用.如有相关问题欢迎跟贴探讨,谢谢! 兼容浏览器版本:IE5.0,IE

CSS hack浏览器兼容一览表

css|浏览器 CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧.这是国外摘来的一张CSS hack列表,显示了各浏览器对css hack的支持程度,对我们制作兼容网页非常有帮助.

IE6,IE7,IE8,Firefox兼容的css hack详解

已经发布过关于这CSS兼容的hack的文章不止一篇,可是有太多,都已经失效,再次发布,不想谈什么乱七八糟的理论,直接上实例!如下: IE浏览器都能识别"*" "\9";标准浏览器(如FF)不能识别"*": IE6能识别"_" "+" "#" "@", 同一属性有两个的只看后者 无论有没有 如果是两句它就能识别"!important"; IE7能识别

CSS&amp;nbsp;Hack代码范例:兼容IE5.0、IE5.5、IE6.0、IE7.0、FF1.5、

本CSS Hack代码范例,可以直观显示各个版本浏览器hack的使用.兼容IE5.0.IE5.5.IE6.0.IE7.0.FF1.5.FF2.0. IE7.0简体中文正式版发布了,对于我等常和网页打交道的人来说网页兼容性问题也随之而来了.IE7.0有一个显著的改变就是支持!important了,是件好事情,但是也给广大的在IE6时代使用!important来区分处理IE和FF的网页制作者带来了不少问题,Noker也遇到了这个问题,所以翻阅网上资料,写了下面这个能够兼容现今大多数主流浏览器,覆盖绝

兼容IE6/IE7/IE8/FireFox的CSS hack

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns=""> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>区别IE6.IE

【原】CSS hack整理(更新于20141109)

浏览器的兼容性一直是个头疼的问题,使用"欺骗"技术可使各个浏览器效果一致,花了些时间整理了各个浏览器的HACK,主要包括IE系列和最新版本的Chrome.Safari.Firefox. Opera,比较全面的记录下Hack,内容包括3部分:媒体查询 hack.属性Hack.选择器Hack,这些Hack已经测试并得到有效运用,有需要的同学可以放心使用,笔者会在以后不断的更新,如果有需要补充或者修改的,欢迎大家指教! 以下代码之间的空格是必要的,缺少空格导致失效 /*-----------

转 CSS hack:针对IE6,IE7,firefox显示不同效果

CSS hack:针对IE6,IE7,firefox显示不同效果 做网站时经常会用到,衡量一个DIV+CSS架构师的水平时,这个也很重要. 区别不同浏览器的CSS hack写法: 区别IE6与FF:         background:orange;*background:blue; 区别IE6与IE7:         background:green !important;background:blue; 区别IE7与FF:         background:orange; *back