IE,火狐,OPERA等浏览器CSS Hack和向后兼容

人一旦习惯了某些东西就很难去改,以及各种各样的原因,新的浏览器越来越多,而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题。说 到浏览器兼容,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 注释<!--[if IE]>IE only<![endif]-->

<!--[if !IE]>NOT IE<![endif]-->

这种写法的优缺点是:

优点:安全;向后兼容好;易维护 缺点:用不好会增加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

<!--[if IE6]--><body class="ie6"><![endif]-->

<!--[if IE7]--><body class="ie7"><![endif]-->

<!--[if IE8]--><body class="ie8"><![endif]-->

<!--[if IE9]--><body class="ie9"><![endif]-->

<!--[if!IE]--><body class="non-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 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上,而不是添加单独的<link />或者@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://xiahunao.cn/news/1382392.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Firefox 修复 21 年前的老 bug

2000 年时&#xff0c;一个名叫 Matthew T 的开发者向 Mozila 提交了一个 Bug。 bug 描述如下&#xff1a; Mozilla 在 MacOS 上使用本机主菜单时&#xff0c;XUL菜单项会转换为本地菜单结构&#xff0c;导致 Mozilla 能直接使用 Mac 的主菜单栏。Matthew T 提到&#xff0c;为…

firefox浏览器需要新建窗口时以新建标签页代替

今天修改了一下firefox的配置&#xff0c;然后不知道修改错哪里了&#xff0c;每次新跳转一个连接&#xff0c;就会新打开一个页面&#xff0c;无奈至极啊。于是查了一下怎么解决&#xff0c;记录一下解决方法。 1.firefox浏览器的右上角&#xff0c;打开 》 选项 》 标签页 》…

Firefox 差点就赢了第二次浏览器大战!

作为 IE 的挑战者&#xff0c;Firefox 浏览器引入了标签、弹窗拦截器、扩展和主题等功能&#xff0c;并将速度、可用性、以及最终的隐私和用户定位完美地结合在了一起——在它发布后的五年内&#xff0c;迅速占领了全部网页浏览量的近三分之一。但尽管如此&#xff0c;在它与微…

火狐和谷歌浏览器屏蔽键盘按键Backspace回退网页

我们在做web应用程序时&#xff0c;常有的应用是输入表单或其他数据&#xff0c;然而在我们输入数据或其他的时候&#xff0c;不小心触发了键盘上的“Backspace”&#xff0c; 就会回到我们访问的上一个页面&#xff0c;导致我们输入的数据就消失了&#xff0c;屏蔽浏览器的Ba…

离谱:火狐浏览器重启后插件,书签,浏览记录全部没了???

就在刚刚我再次打开火狐浏览器&#xff0c;发现一切从0开始了&#xff1f;&#xff1f;&#xff1f;我整个人都懵逼了&#xff0c;我的书签我的插件我的浏览记录全没了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 最后终于找到了解决办法&#xff1a; 在火狐…

【火狐】如何隐藏最近的书签、历史、关闭的页面

我经常浏览各种网页&#xff0c;收藏了很多有意思的网站&#xff0c;火狐的书签里有个“最近的书签功能”&#xff0c;长期以来各种各样的收藏都被展示了出来&#xff0c;很不好看(懂的都懂)&#xff0c;这几天都在国内的搜索平台找隐藏方法&#xff0c;笑死&#xff0c;感觉根…

火狐浏览器更新版本之后总是在当前页面打开新链接覆盖掉原先内容

火狐浏览器更新版本之后总是在当前页面打开新链接覆盖掉原先内容 自从火狐浏览器更新版本之后&#xff0c;我发现新版本中总是把新链接地址或者书签地址等在当前页面打开&#xff0c;覆盖掉原先页面内容&#xff0c;很不方便。(备注&#xff1a;本人浏览器版本为&#xff1a;8…

Firefox 与 IE 已死?Chrome 一统天下!

【CSDN 编者按】日前&#xff0c;微软宣布从 2021 年 8 月17 日起&#xff0c;微软 365 办公软件应用和服务将全面停止对 IE 11 浏览器的支持。与此同时&#xff0c;微软表示这一计划并不影响 IE11 的正常使用&#xff0c;IE11也不会消失。 然而&#xff0c;在浏览器弱肉强食的…

火狐浏览器新标签页搜索栏不能打字

就是下面搜索框打字就会跳转到上面的搜索栏 在上面的地址栏中输入about:config 在 about:config 把browser.newtabpage.activity-stream.improvesearch.handoffToAwesomebar改成 false

漫画:从新手到老油条

后记&#xff1a;这是我很久之前看到的一个故事《三个程序员的寓言》&#xff0c;作者到底是谁我已经找不到了&#xff0c;知道的同学可以告知一下。 故事讲了三种程序员在面对一个需求时处理问题的能力&#xff1a; 1. 新手程序员经验不足&#xff0c;有着盲目的乐观和自信&a…

漫画 | 为什么大家都愿意进入外企?

一直以来&#xff0c;张大胖都对外企有着莫名的好感。 他觉得那里都是职场精英&#xff0c;环境好&#xff0c;福利好。 终于&#xff0c;经过前同事的朋友的内部推荐&#xff0c;他拿到了一个面试的机会。 对技术面试张大胖很自信&#xff0c;他担心的是英语口语&#xff0c…

20 幅描述程序员的漫画,太真实了!

来源&#xff1a;https://javascript.plainenglish.io/ | 大迁世界 我们作为程序员&#xff0c;整天编写代码&#xff0c;整夜调试&#xff0c;写给成千上万行代码。可能这个编程也不一定是他们最喜欢或者最擅长干的事情。 但是&#xff0c;程序员真的很有幽默细胞&#xff0c;…

关于程序员的20 幅幽默漫画,太真实了!

来源&#xff1a;https://javascript.plainenglish.io/ | 大迁世界 我们作为程序员&#xff0c;整天编写代码&#xff0c;整夜调试&#xff0c;写给成千上万行代码。可能这个编程也不一定是他们最喜欢或者最擅长干的事情。 但是&#xff0c;程序员真的很有幽默细胞&#xff0c;…

漫画 | 单元测试实在是太可怕了!

周一刚上班&#xff0c;会议室就传来了经理老梁的咆哮。 张大胖和何小痩赶紧分析原因 许久都没人敢发言。 老梁打开了电脑&#xff0c;决定给程序员上一课。 新版本的开发又开始了。 张大胖无奈&#xff0c;只好加班写单元测试用例 过了两天&#xff0c;老梁又来找张大胖了 既然…

《全生命周期眼健康管理》助力健康科学用眼

8月8日下午&#xff0c;烟台正大光明眼科医院眼健康管理中心张提主任受邀来到烟台市残疾人事务综合服务中心&#xff0c;为残联康复训练教师及相关工作人员进行了《全生命周期眼健康管理》讲座。 烟台正大光明眼科医院眼健康管理中心张提主任 “全生命周期眼健康”这一理念其宗…

侯捷 C++ part2 兼谈对象模型笔记——5 三个C++11新特性

5 三个C11新特性 5.1 variadic templates 模板参数可变化&#xff0c;其语法为 ... (加在哪看情况) // 当参数pack里没有东西了就调用这个基本函数结束输出 void print() { }// 用于打印多个参数的可变参数模板函数 template <typename T, typename... Args> void pri…

排序excel怎么设置_Excel考勤打卡统计,这才是最简单的方法!

小编看了这样一个关于考勤打卡的求助: 从打卡机中导出的2016-2019年员工考勤信息 问:如何统计2018/9/1-2018/12/31(含)每人打卡次数 很明显,这是一个根据条件统计个数的问题。很多同学首先会想到用Countifs进行统计 =COUNTIFS(B:B,">2018/8/31",B:B,"&l…

Excel·VBA考勤打卡记录数据整理

《excel吧提问-转置打卡数据》&#xff0c;打卡记录进行数据整理&#xff0c;分别提取3个时间段的开始、结束时间。 与之前写过的《ExcelVBA考勤打卡记录统计出勤小时》要求不同&#xff0c;仅需要提取打卡时间&#xff0c;特殊之处在于开始时间要最晚&#xff0c;而结束时间要…

使用php吧excel数据存到数据库,php导入excel表,保存进数据库,使用phpexcel插件

安装phpexcel插件 composer require phpoffice/phpexcel -vvv 表单 function test() { alert(点击确定后请勿刷新) document.getElementById("myform").submit(); } 导入本月考勤表 php接收导入的excel文件 ///接受文件 public function actionFile(){ if ($_FILES[&…