`
阿尔萨斯
  • 浏览: 4579147 次
社区版块
存档分类
最新评论

Goodbye to CSS Hack

 
阅读更多

看看下面这段代码,是否倍感亲切但又觉得很陌生呢:

.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 下,会添加以下信息:
ext-css-hack.png

将浏览器信息添加到 body 和 html 上后,我们书写 CSS Hack 就会变得很容易了。

通过 JS 添加浏览器信息,需要将 JS 放在头部执行,以确保渲染前就添加好。另外,对于不支持 JS 的用户代理,此方法无效。

还有一个方案是在服务器端处理,比如 browscap 方案。优点的是没有 JS 方案的缺点,缺点是遇上 proxy cache 就不准确了。

个人觉得 JS 方案可行。因为禁用 JS 的浏览器用户,自身已是高手,不用我们担心。对于不支持 JS 的用户代理,比如手机等浏览器,则有对应的 WAP 版本给用户使用。这样,我们可以:

  1. 在 head 部分加载一个非常小巧精简的 js,该 js 在 body 可用时,能立刻给 body 添加浏览器信息。
  2. 在 css 里,通过body.ie6 .test { ... }来书写 css hack

这样,无论浏览器如何更新换代,我们都不必去记忆或发掘那一堆诡异的 css hack 的写法了。

分享到:
评论

相关推荐

    AE PR Goodbye Greenscreen v1.3.0.人工智能抠像 + 去绿背插件

    ### Goodbye Greenscreen v1.3.0:人工智能抠像技术解析 #### 一、概述 Goodbye Greenscreen是一款专为Adobe After Effects (AE)设计的人工智能抠像插件,版本号为v1.3.0。该插件利用先进的AI技术,能够在多种背景...

    Never Say Goodbye-Baby VOXNever Say Goodbye-Baby VOXNever Say Goodbye-Baby VOX

    标题和描述提到的是"Never Say Goodbye"这首歌,由Baby VOX演唱,而标签和部分内容是歌曲的歌词。如果你需要关于IT的知识,例如编程、网络技术、软件开发或者数据分析等相关内容,请提供正确的输入,这样我才能为你...

    杂文 never say goodbye to learn

    在IT领域,学习永无止境,"杂文 never say goodbye to learn"的主题鼓励我们持续探索和提升自己的技能。在这个快速发展的行业中,不断学习是保持竞争力的关键。让我们逐一解析压缩包中的三个文件,看看它们能为我们...

    Goodbye

    标题"Goodbye"虽然简洁,但可以引发我们对字体设计的深入探讨。在这个压缩包中,只有一个名为"Goodbye"的文件,这可能是一个字体文件或者一个包含多个字体的文件夹。下面我们将详细探讨字体的相关知识点。 字体是...

    数学建模-A76271-Wave Goodbye to Poor Reception.zip

    《数学建模-A76271-Wave Goodbye to Poor Reception》这个压缩包文件,主要聚焦于利用数学建模解决通信系统中的信号接收问题。从标题可以看出,它可能涉及了无线通信领域的某个具体问题,比如如何改善信号接收质量,...

    spca5xx-v4l1goodbye

    标题“spca5xx-v4l1goodbye”暗示了我们正在讨论的是一个与Linux操作系统相关的摄像头驱动程序,特别是针对SPCA5xx系列芯片的驱动。这个版本可能是V4L1(Video for Linux One)接口的告别版,意味着它可能已经升级到...

    老外教你说英语第一课say hello and goodbye

    "老外教你说英语第一课:Say Hello and Goodbye"这一主题旨在帮助我们了解如何在不同的场合下恰当地使用问候语。 首先,最常用的问候语就是"Hi"和"Hello",它们可以单独使用,也可以搭配其他表达,如"Hi there"或...

    Moving To Linux Kiss The Blue Screen Of Death Goodbye 2004

    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 linux_lvs永志不谕 Time To Say Goodbye_there for me for love_happay.rar

    2018美赛O奖论文A题-A76271-Wave Goodbye to Poor Reception-解密.pdf

    美国大学生数学竞赛获奖论文,历届,单项文件,内容丰富,大学生数学,数学竞赛,参考资料,极具参考价值

    开源项目-TheCodeTeam-goodbye.zip

    【标题】:“开源项目-TheCodeTeam-goodbye.zip”是一个由TheCodeTeam开发并分享的开源项目,主要功能是实现程序退出时执行特定代码的功能。这个项目名为“Hello Goodbye”,暗示了它在程序生命周期结束时(即“再见...

    Moving to Linux®: Kiss the Blue Screen of Death Goodbye! Second Edition

    Moving to Linux®: Kiss the Blue Screen of Death Goodbye! Second Edition By Marcel Gagné ............................................... Publisher: Addison Wesley Professional Pub Date: August 01...

    AE背景去除插件Aescripts Goodbye Greenscreen

    然而,Goodbye Greenscreen V1.13.3 采用了全新的方法:AI 驱动的图像识别和修复技术。这使得用户能够以更快速、更准确的方式从视频中移除绿幕,无需复杂的设置和调整。 主要特性 1. **智能识别与修复**:利用先进...

    小学英语 3AUnit4 Goodbye教案 苏教牛津版.doc

    小学英语 3AUnit4 Goodbye教案 苏教牛津版.doc

    KClutter - Say goodbye to p2p clutter!-开源

    标题中的“KClutter - Say goodbye to p2p clutter!”提到了一个名为KClutter的工具,它显然是针对P2P(对等网络)环境设计的,旨在帮助用户管理和清理与P2P应用相关的文件混乱。这个工具的核心功能是通过关键词搜索...

    Goodbye DevOps Hello ContainerOps

    该文档来自Jerome在2014 Container技术大会的演讲。

    react-goodbye:React Router v4 +的保存提醒组件

    react-goodbye是一个保存提醒实用程序,可以防止在离开之前进行路由转换而不保存更改。 请查看页面以获取更多信息。 安装 npm install --save react-goodbye 或者您可以使用yarn : yarn add react-goodbye ...

    css样式 good example

    css样式 good example

Global site tag (gtag.js) - Google Analytics