如何优雅地实现浏览器兼容与CSS规则回退

开发 前端
本文就是探讨如何优雅地应对浏览器兼容问题,包括四点:层叠机制来支持较早的浏览器,Modernizr设置辅助类来分别编写样式,使用 @supports 规则回退,简短的 JavaScript 代码实现回退。

[[409677]]

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

提供浏览器兼容的网站

  • https://caniuse.com/
  • https://webplatform.github.io/
  • https://developer.mozilla.org/en-US/

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

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

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

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

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

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

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

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

使用 @supports 规则回退

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

  1. /* 浏览器不支持 text-shaow */ 
  2. h1 { color: gray } 
  3.  
  4. /* 浏览器支持 text-shaow */ 
  5. @supports (text-shadow: 0 0 .3rem gray){ 
  6.     h1 { 
  7.     color: transparent; 
  8.     text-shadow: 0 0 .3rem gray; 
  9.   } 

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

简短的 JavaScript 代码实现回退

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

  1. var root = document.documentElement;  // <html> 
  2.  
  3. if ('textShadow' in root.style) { 
  4.   root.classList.add('textshadow'
  5. else { 
  6.   rott.classList.add('no-textshadow'

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

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

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

  1. function testProperty(property) { 
  2.   var root = document.documentElement; 
  3.  
  4.   if (property in root.style) { 
  5.     root.classList.add(property.toLowerCase()); 
  6.     return true
  7.   } 
  8.  
  9.   root.classList.add('no-' + property.toLowerCase()); 
  10.   return false

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

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

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

  1. var dummy = document.createElement('p'); 
  2. dummy.style.backgroundImage = 'linear-gradient(red, tan)'
  3.  
  4. if (dummy.style.backgroundImage) { 
  5.   root.classList.add('lineargradients'); 
  6. else { 
  7.   root.classList.add('no-lineargradients'); 

封装函数如下:

  1. function testValue(id, value, property) { 
  2.   var dummy = document.createElement('p'); 
  3.   dummy.style[property] = value; 
  4.  
  5.   if (dummy.style[property])  // 属性值被浏览器保留 
  6.   { 
  7.     root.classList.add(id); 
  8.     return true
  9.   } 
  10.    
  11.   root.classList.add('no-' + id); 
  12.   return false

 

责任编辑:姜华 来源: Piper蛋窝
相关推荐

2016-09-18 20:48:21

苹果safari浏览器

2012-06-27 14:12:45

CSS

2010-08-20 13:46:10

IEFirefoxCSS

2010-09-16 13:48:15

CSS Hack

2010-04-01 13:03:10

2022-04-07 09:00:00

跨浏览器测试自动化服务异常

2015-06-12 10:08:18

QQ浏览器9.0

2010-09-14 13:32:33

CSS编码准则

2010-09-08 11:11:50

CSS样式CSS

2009-11-26 11:00:28

Chrome浏览器Windows 7

2009-11-27 09:05:19

Windows 7Chrome兼容性

2022-07-07 08:43:05

HoudiniAPICSS

2010-08-10 09:40:23

Flex与浏览器交互

2010-09-15 09:12:03

JavaScript浏览器兼容

2021-05-12 22:07:43

并发编排任务

2010-08-30 15:40:31

CSS浏览器兼容

2009-09-03 18:09:29

谷歌Chrome浏览器

2010-08-27 15:44:47

2020-07-07 07:33:12

Java单元集成

2010-09-08 09:19:49

DIVCSS
点赞
收藏

51CTO技术栈公众号