读完了《Visual Studio Code权威指南》,前端方面书籍不能停,于是捡起「CSS一姐」 Lea Verou 的《CSS魔法》。

我们没法控制用户使用新版本还是老版本的浏览器,因此往往需要根据浏览器对于属性的兼容情况书写多套 CSS 代码。本文就是探讨如何优雅地应对浏览器兼容问题,包括四点:层叠机制来支持较早的浏览器,Modernizr设置辅助类来分别编写样式,使用 @supports 规则回退,简短的 JavaScript 代码实现回退。

提供浏览器兼容的网站

层叠机制来支持较早的浏览器

/* 防止 linear-gradient 在老浏览器中挂掉导致没有背景 */
background: rgb(255, 128, 0);
background: -moz-linear-gradient(0deg, yellow, red);
background: -o-linear-gradient(0deg, yellow, red);
background: -webkit-linear-gradient(0deg, yellow, red);
/* 应该将标准语法放在最后,来确保最终生效的是是标准语法 */
background: linear-gradient(90deg, yellow, red);

Modernizr设置辅助类来分别编写样式

这里参考了一篇14年的老博客 Modernizr 的介绍和使用。

Modernizr 官网:https://modernizr.com/

Modernizr 如何生效?如果页面支持 text-shadow 属性,那么 Modernizr 会添加 textshadow 类。如果不支持,那么它用 no-textshadow 类作为替代进行添加。

因此,前端开发人员就可以设置两套代码,来应对浏览器提供或者不提供 text-shadow 支持的两种情况。

/* 浏览器不支持 text-shaow */
h1 { color: gray } /* 浏览器支持 text-shaow */
.textshaow h1 {
color: transparent;
text-shadow: 0 0 .3rem gray;
}

使用 @supports 规则回退

除了使用 Modernizr ,也可以使用浏览器自带的 @supports :

/* 浏览器不支持 text-shaow */
h1 { color: gray } /* 浏览器支持 text-shaow */
@supports (text-shadow: 0 0 .3rem gray){
h1 {
color: transparent;
text-shadow: 0 0 .3rem gray;
}
}

但是 Lea Verou 指出,上述代码的投影效果只有在即支持 @supports 又支持 text-shadow 的浏览器中才会生效。因此慎用 @supports 。

简短的 JavaScript 代码实现回退

思路与 Modernizr 相同,做特性检测,然后添加辅助类。

var root = document.documentElement;  // <html>

if ('textShadow' in root.style) {
root.classList.add('textshadow')
} else {
rott.classList.add('no-textshadow')
}

如上,我们为 html 添加了辅助类:

  • 如果浏览器支持 text-shadow ,那么添加 textshadow
  • 如果浏览器不支持 text-shadow ,那么添加 no-textshadow

上述代码可以被封装为函数:

function testProperty(property) {
var root = document.documentElement; if (property in root.style) {
root.classList.add(property.toLowerCase());
return true;
} root.classList.add('no-' + property.toLowerCase());
return false;
}

注意到上述方法只能用来检测属性是否支持,而非属性值。(如下,解释一下属性和属性值,如下代码)

background : linear-gradient(red, tan);
属性 : 属性值 ;

检测属性值是否支持,常见的思路是:赋给对应属性,然后看浏览器是否还保存着这个值。这个方法会改变元素样式,因此可以用隐藏元素防止样式因为检测被改变。

var dummy = document.createElement('p');
dummy.style.backgroundImage = 'linear-gradient(red, tan)'; if (dummy.style.backgroundImage) {
root.classList.add('lineargradients');
} else {
root.classList.add('no-lineargradients');
}

封装函数如下:

function testValue(id, value, property) {
var dummy = document.createElement('p');
dummy.style[property] = value; if (dummy.style[property]) // 属性值被浏览器保留
{
root.classList.add(id);
return true;
} root.classList.add('no-' + id);
return false;
}

CSS一姐的书真的很有水平,怪不得前端大大们把她的《CSS揭秘》列为必读书目。

如何优雅地实现浏览器兼容与CSS规则回退的更多相关文章

  1. 转载于山边小溪的博客--编写跨浏览器兼容的 CSS 代码的金科玉律

    http://www.cnblogs.com/lhb25/archive/2010/06/19/1760786.html   原始网页 作为 Web 设计师,你的网站在各种浏览器中有完全一样的表现是很 ...

  2. 转:【总结】浏览器CSS Hacks汇总,浏览器兼容方式CSS Hacks

    [总结]浏览器CSS Hacks汇总   浏览器兼容可以说是前端开发所要面对的第一个挑战,目前我的电脑上已经安装了6种浏览器(基于IE内核的不算,如Maxthon等). CSS hacks利用浏览器的 ...

  3. 聊聊一直困扰前端程序员的浏览器兼容-【css】

    1.为什么会出现浏览器兼容问题? 由于各大主流浏览器由不同的厂家开发,所用的核心架构和代码也很难重和,这就为各种莫名其妙的Bug(代码错误)提供了温床.再加上各大厂商出于自身利益考虑而设置的种种技术壁 ...

  4. 浏览器兼容的css hack

    <style> div{ background:green; /* for firefox */ *background:red; /* for IE6 */ } </style&g ...

  5. CSS实现背景透明,文字不透明(各浏览器兼容)

    /*CSS*/.waps{ background:url(07158.bmp) no-repeat top center fixed; width:1004px; text-align:center; ...

  6. CSS实现背景透明,文字不透明(各浏览器兼容) (转)

    /*CSS*/ .waps{ background:url(07158.bmp) no-repeat top center fixed; width:1004px; text-align:center ...

  7. 最全的CSS浏览器兼容问题(转至http://68design.net/Web-Guide/HTMLCSS/37154-1.html)

    最全的CSS浏览器兼容问题   CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2 ...

  8. 浏览器兼容问题汇总<转>

    浏览器的内核 Mozilla Firefox ( Gecko ) Internet Explorer ( Trident ) Opera ( Presto ) Safari ( WebKit ) Go ...

  9. 跨浏览器开发:CSS

    理解CSS盒子模型 如果不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器.CS ...

随机推荐

  1. 在linux下把jsp文件 打包war格式(centos7)

    在linux下把jsp文件 打成war包 chmod -R 777 /data/jdk8u242-b08/bincd /data/TongWeb61712/deployment/TestCase//d ...

  2. 用于监视Linux上的内存使用情况的Bash脚本

    用于监视Linux上的内存使用情况的Bash脚本 2019-06-17 11:32:45作者:戴进稿源:云网牛站 在本文中,我们添加了两个shell脚本来监视Linux操作系统上的内存利用率,即用于监 ...

  3. ar是System Activity Reporter(系统活动情况报告)的缩写。这

    ar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工具将对系统当前的状态就行取样,然后通过 ...

  4. 克隆 JavaScript

    克隆 浅克隆 浅克隆无法copy数组和对象 var obj = { name : "abs", age : '18', sex : 'male' } var obj1 = {} f ...

  5. L3级自动驾驶

    L3级自动驾驶 2020年开年 3月9日,工信部在其官网公示了<汽车驾驶自动化分级>推荐性国家标准报批稿,并拟于2021年1月1日开始实施. 按照中国自身标准制定的自动驾驶分级标准,在千呼 ...

  6. 3D惯导Lidar仿真

    3D惯导Lidar仿真 LiDAR-Inertial 3D Plane Simulator 摘要 提出了最*点*面表示的形式化方法,并分析了其在三维室内同步定位与映射中的应用.提出了一个利用最*点*面 ...

  7. 基于NVIDIA GPUs的深度学习训练新优化

    基于NVIDIA GPUs的深度学习训练新优化 New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs 不同行业采用 ...

  8. ARMed解决方案对DSP的战争

    ARMed解决方案对DSP的战争 ARM体系结构简化了数字信号处理 ARM与数字信号处理(DSP)有什么关系? ARM似乎在处理领域处于领先地位.该处理器已将其视为其最大的细分市场之一,这主要是由于该 ...

  9. algorithm头文件下的常用函数

    algorithm头文件常用高效函数 max() max(a, b)返回a和b中的最大值,参数必须是两个(可以是浮点型). 1 #include <iostream> 2 #include ...

  10. oracle单机开机自启动

    ====================== 单机数据库开机自启动  ============================= 环境: oracle数据库单机 版本:11.2.0.4 1.修改配置文 ...