看看下面这段代码,是否倍感亲切但又觉得很陌生呢:
.test {
background-color: black; /* firefox, opera, ie8 */
[;background-color: green;] /* safari, chrome */
*background-color: blue; /* ie7 */
_background-color: red; /* ie6 */
}
html*~/**/body .test {
border: 5px solid red; /* ie8 */
}
随着浏览器的更新换代,CSS Hack 变得越来越诡异和不可靠了-.-
相对来说,IE 的条件注释是值得信赖的:
<!--[if lt IE 7 ]><body class="ie6"><![endif]-->
<!--[if IE 7 ]><body class="ie7"><![endif]-->
<!--[if IE 8 ]><body class="ie8"><![endif]-->>
<!--[if !IE]>--><body><!--<![endif]-->
<style type="text/css">
body.ie6 .test { background-color: blue }
body.ie7 .test { background-color: red }
body.ie8 .test { background-color: green }
</style>
注意,上面的代码虽然也是 hack,但大大简化和规范了 css hack 的写法。
最近看 ExtCore 3.0 的代码,发现 Ext 初始化时会自动给 body 添加浏览器信息:
//Initialize doc classes
(function(){
var initExtCss = function(){
// find the body element
var bd = document.body || document.getElementsByTagName('body')[0];
if(!bd){ return false; }
var cls = [' ',
Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : (Ext.isIE7 ? 'ext-ie7' : 'ext-ie8'))
: Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? 'ext-gecko2' : 'ext-gecko3')
: Ext.isOpera ? "ext-opera"
: Ext.isWebKit ? "ext-webkit" : ""];
if(Ext.isSafari){
cls.push("ext-safari " + (Ext.isSafari2 ? 'ext-safari2' : (Ext.isSafari3 ? 'ext-safari3' : 'ext-safari4')));
}else if(Ext.isChrome){
cls.push("ext-chrome");
}
if(Ext.isMac){
cls.push("ext-mac");
}
if(Ext.isLinux){
cls.push("ext-linux");
}
if(Ext.isBorderBox){
cls.push('ext-border-box');
}
if(Ext.isStrict){ // add to the parent to allow for selectors like ".ext-strict .ext-ie"
var p = bd.parentNode;
if(p){
p.className += ' ext-strict';
}
}
bd.className += cls.join(' ');
return true;
}
if(!initExtCss()){
Ext.onReady(initExtCss);
}
})();
比如在 IE8 下,会添加以下信息:

将浏览器信息添加到 body 和 html 上后,我们书写 CSS Hack 就会变得很容易了。
通过 JS 添加浏览器信息,需要将 JS 放在头部执行,以确保渲染前就添加好。另外,对于不支持 JS 的用户代理,此方法无效。
还有一个方案是在服务器端处理,比如 browscap 方案。优点的是没有 JS 方案的缺点,缺点是遇上 proxy cache 就不准确了。
个人觉得 JS 方案可行。因为禁用 JS 的浏览器用户,自身已是高手,不用我们担心。对于不支持 JS 的用户代理,比如手机等浏览器,则有对应的 WAP 版本给用户使用。这样,我们可以:
- 在 head 部分加载一个非常小巧精简的 js,该 js 在 body 可用时,能立刻给 body 添加浏览器信息。
- 在 css 里,通过
body.ie6 .test { ... }
来书写 css hack
这样,无论浏览器如何更新换代,我们都不必去记忆或发掘那一堆诡异的 css hack 的写法了。
分享到:
相关推荐
### Goodbye Greenscreen v1.3.0:人工智能抠像技术解析 #### 一、概述 Goodbye Greenscreen是一款专为Adobe After Effects (AE)设计的人工智能抠像插件,版本号为v1.3.0。该插件利用先进的AI技术,能够在多种背景...
标题和描述提到的是"Never Say Goodbye"这首歌,由Baby VOX演唱,而标签和部分内容是歌曲的歌词。如果你需要关于IT的知识,例如编程、网络技术、软件开发或者数据分析等相关内容,请提供正确的输入,这样我才能为你...
在IT领域,学习永无止境,"杂文 never say goodbye to learn"的主题鼓励我们持续探索和提升自己的技能。在这个快速发展的行业中,不断学习是保持竞争力的关键。让我们逐一解析压缩包中的三个文件,看看它们能为我们...
标题"Goodbye"虽然简洁,但可以引发我们对字体设计的深入探讨。在这个压缩包中,只有一个名为"Goodbye"的文件,这可能是一个字体文件或者一个包含多个字体的文件夹。下面我们将详细探讨字体的相关知识点。 字体是...
《数学建模-A76271-Wave Goodbye to Poor Reception》这个压缩包文件,主要聚焦于利用数学建模解决通信系统中的信号接收问题。从标题可以看出,它可能涉及了无线通信领域的某个具体问题,比如如何改善信号接收质量,...
标题“spca5xx-v4l1goodbye”暗示了我们正在讨论的是一个与Linux操作系统相关的摄像头驱动程序,特别是针对SPCA5xx系列芯片的驱动。这个版本可能是V4L1(Video for Linux One)接口的告别版,意味着它可能已经升级到...
"老外教你说英语第一课:Say Hello and Goodbye"这一主题旨在帮助我们了解如何在不同的场合下恰当地使用问候语。 首先,最常用的问候语就是"Hi"和"Hello",它们可以单独使用,也可以搭配其他表达,如"Hi there"或...
Moving To Linux Kiss The Blue Screen Of Death Goodbye 2004
linux_lvs永志不谕 Time To Say Goodbye_there for me for love_happay.rar linux_lvs永志不谕 Time To Say Goodbye_there for me for love_happay.rar
美国大学生数学竞赛获奖论文,历届,单项文件,内容丰富,大学生数学,数学竞赛,参考资料,极具参考价值
【标题】:“开源项目-TheCodeTeam-goodbye.zip”是一个由TheCodeTeam开发并分享的开源项目,主要功能是实现程序退出时执行特定代码的功能。这个项目名为“Hello Goodbye”,暗示了它在程序生命周期结束时(即“再见...
Moving to Linux®: Kiss the Blue Screen of Death Goodbye! Second Edition By Marcel Gagné ............................................... Publisher: Addison Wesley Professional Pub Date: August 01...
然而,Goodbye Greenscreen V1.13.3 采用了全新的方法:AI 驱动的图像识别和修复技术。这使得用户能够以更快速、更准确的方式从视频中移除绿幕,无需复杂的设置和调整。 主要特性 1. **智能识别与修复**:利用先进...
小学英语 3AUnit4 Goodbye教案 苏教牛津版.doc
标题中的“KClutter - Say goodbye to p2p clutter!”提到了一个名为KClutter的工具,它显然是针对P2P(对等网络)环境设计的,旨在帮助用户管理和清理与P2P应用相关的文件混乱。这个工具的核心功能是通过关键词搜索...
该文档来自Jerome在2014 Container技术大会的演讲。
react-goodbye是一个保存提醒实用程序,可以防止在离开之前进行路由转换而不保存更改。 请查看页面以获取更多信息。 安装 npm install --save react-goodbye 或者您可以使用yarn : yarn add react-goodbye ...
css样式 good example