返回顶部
首页 > 资讯 > 前端开发 > VUE >什么是CSS特性检测
  • 534
分享到

什么是CSS特性检测

2024-04-02 19:04:59 534人浏览 安东尼
摘要

本篇内容主要讲解“什么是CSS特性检测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是CSS特性检测”吧!什么是 CSS 特性检测?我们知道,前端技术日新月

本篇内容主要讲解“什么是CSS特性检测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是CSS特性检测”吧!

什么是 CSS 特性检测?我们知道,前端技术日新月异的今天,各种新技术新属性层出不穷。在 CSS 层面亦不例外。

一些新属性能极大提升用户体验以及减少工程师的工作量,并且在当下的前端氛围下:

  • 很多实验性功能未成为标准却被大量使用;

  • 需要兼容多终端,多浏览器,而各浏览器对某一新功能的实现表现的天差地别;

所以有了优雅降级和渐进增强的说法,在这种背景下,又想使用新的技术给用户提供更好的体验,又想做好回退机制保证低版本终端用户的基本体验,CSS  特性检测就应运而生了。

CSS 特性检测就是针对不同浏览器终端,判断当前浏览器对某个特性是否支持。运用 CSS  特性检测,我们可以在支持当前特性的浏览器环境下使用新的技术,而不支持的则做出某些回退机制。

本文将主要介绍两种 CSS 特性检测的方式:

  1. @supports

  2. modernizr

CSS @supports

传统的 CSS 特性检测都是通过 javascript 实现的,但是未来,原生 CSS 即可实现。

CSS @supports 通过 CSS 语法来实现特性检测,并在内部 CSS 区块中写入如果特性检测通过希望实现的 CSS 语句。

语法:

@supports <supports_condition> {      }

举个例子:

div {  position: fixed; }  @supports (position:sticky) {     div {         position:sticky;     } }

上面的例子中,position: sticky 是 position 的一个新属性,用于实现黏性布局,可以轻松实现一些以往需要 javascript  才能实现的布局(戳我了解详情[1]),但是目前只有在 -WEBkit- 内核下才得到支持。

上面的写法,首先定义了 div 的 position: fixed ,紧接着下面一句 @supports (position:sticky)  则是特性检测括号内的内容,如果当前浏览器支持 @supports 语法,并且支持 position:sticky 语法,那么 div 的 则会被设置为  position:sticky 。

我们可以看到,@supports 语法的核心就在于这一句:@supports (...) { } ,括号内是一个 CSS  表达式,如果浏览器判断括号内的表达式合法,那么接下来就会去渲染括号内的 CSS 表达式。除了这种最常规的用法,还可以配合其他几个关键字:

@supports not && @supports and && @supports or

@supports not -- 非

not 操作符可以放在任何表达式的前面来产生一个新的表达式,新的表达式为原表达式的值的否定。看个例子:

@supports not (background: linear-gradient(90deg, red, yellow)) {     div {         background: red;     } }

因为添加了 not 关键字,所以与上面第一个例子相反,这里如果检测到浏览器不支持线性渐变 background:  linear-gradient(90deg, red, yellow) 的语法,则将 div 的颜色设置为红色 background: red 。

@supports and -- 与

这个也好理解,多重判断,类似 javascript 的 && 运算符符。用 and  操作符连接两个原始的表达式。只有两个原始表达式的值都为真,生成的表达式才为真,反之为假。

当然,and 可以连接任意多个表达式看个例子:

p {     overflow: hidden;     text-overflow: ellipsis; } @supports (display:-webkit-box) and (-webkit-line-clamp:2) and (-webkit-box-orient:vertical) {     p {         display: -webkit-box;         -webkit-line-clamp: 2;         -webkit-box-orient: vertical;     } }

上面同时,检测 @supports (display:-webkit-box) and (-webkit-line-clamp:2) and  (-webkit-box-orient:vertical) 了三个语法,如果同时支持,则设定三个 CSS  规则。这三个语法必须同时得到浏览器的支持,如果表达式为真,则可以用于实现多行省略效果:

Code Demo - @supportAnd[2]

@supports or -- 或

理解了 @supports and,就很好理解 @supports or 了,与 javascript 的 ||  运算符类似,表达式中只要有一个为真,则生成表达式表达式为真。

看例子:

@supports (background:-webkit-linear-gradient(0deg, yellow, red)) or (background:linear-gradient(90deg, yellow, red)){     div {         background:-webkit-linear-gradient(0deg, yellow, red);         background:linear-gradient(90deg, yellow, red)     } }

上面的例子中,只有检测到浏览器支持 background:-webkit-linear-gradient(0deg, yellow, red)  或者(or) background:linear-gradient(90deg, yellow, red) 其中一个,则给 div 元素添加渐变。

CodePen Demo -- @supports or[3]

当然,关键字 not 还可以和 and 或者 or 混合使用。感兴趣的可以尝试一下。

Can i use?

兼容性来看,先看看 Can i use(更新至 2021/05/13)[4] 吧:

什么是CSS特性检测

Can i use -- CSS @support

大部分浏览器都已经支持了,主要需要使用 polyfill 来兼容的是安卓 4.4 以下版本。

我们已经可以开始使用起来了,使用 @supports 实现渐进增强的效果。

渐进增强(progressive  enhancement):针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验:

CSS.supports()

谈到了 @supports,就有必要再说说 CSS.supports() 。

它是作为 @supports 的另一种形式出现的,我们可以使用 javascript 的方式来获得 CSS 属性的支持情况。

可以打开控制台,输入 CSS.supports 试试:

什么是CSS特性检测

如果没有自己实现 CSS.supports 这个方法,输出上述信息,表示浏览器是支持 @supports 语法的,使用如下:

CSS.supports('display', 'flex')  // true CSS.supports('position', 'sticky')  // true

 什么是CSS特性检测

那它有什么用呢?如果你的页面需要动态添加一些你不确定哪些浏览器支持的新的属性,那它也许会派上用场。以及,它可以配合我们下文即将要讲的 modernizr  。

modernizr

上面介绍了 CSS 方式的特性检测,在以前,通常是使用 javascript 来进行特性检测的,其中 modernizr  就是其中最为出色的佼佼者。

modernizr(戳我查看 Github[5] )是一个开源的 javascript 库。有着将近 2W 的 star ,其优秀程度可见一斑。

简单看看使用方法,假设页面已经引用了 modernizr ,语法如下:

// Listen to a test, give it a callback Modernizr.on('testname', function( result ) {   if (result) {     console.log('The test passed!');   }   else {     console.log('The test failed!');   } });  // 或者是类似 CSS.supports() Modernizr.testAllProps('background', 'linear-gradient(90deg, #888, #ccc)');  // true

举个实际的例子,假设我们希望对是否支持渐变这个样式浏览器下的一个 div 区别对待,有如下 CSS:

div {     background: #aaa; }  .linear-gradient div{     background: linear-gradient(90deg, #888, #ccc); }

使用 Modernizr 进行判断,如果支持渐变,则在根元素添加一个 .linear-gradient 样式,方便示例,使用了 Jquery  语法:

if (Modernizr.testAllProps('background', 'linear-gradient(90deg, #888, #ccc)')) {     $('html').addClass('linear-gradient'); }

Demo - modernizr[6]

当然,Modernizr 还有很多其他的功能,可以去翻翻它的 api

特性检测原理

如果嫌引入整一个 Modernizr 库太大,页面又不支持 @supports ,其实我们自己用简单的 javascript 实现也非常方便简单。

想要知道浏览器支持多少 CSS 属性,可以在调试窗口试试:

var root = document.documentElement; //HTML  for(var key in root.style) {     console.log(key); }

 什么是CSS特性检测

上面图片截取的只是打印出来的一小部分。如果我们要检测某个属性样式是否被支持,在任意的 element.style 检测它是否存在即可,即上面代码示例的  root 可以替换成任意元素。

当然,元素可能有 background 属性,但是不支持具体的 linear-gradinet()  属性值。这个时候该如何检测呢?只需要将具体的值赋值给某一元素,再查询这个属性值能否被读取。

var root = document.documentElement;  root.style.backgroundImage = 'linear-gradient(90deg, #888, #ccc)';  if(root.style.backgroundImage) {   // 支持 } else {   // 不支持 }

所以上面 Modernizr 的例子里,javascript 代码可以改成:

var root = document.documentElement; root.style.backgroundImage = 'linear-gradient(90deg, #888, #ccc)';  if(root.style.backgroundImage) {   $('html').addClass('linear-gradient'); }

当然,做这种特定属性值判断的时候由于有个 CSS 赋值操作,所以我们选取用于判断的元素应该是一个隐藏在页面上的元素。

各种方式间的优劣

  • 原生的 @supports 的性能肯定是最好的,而且无需引入外部 javascript ,首推这个,但是无奈兼容问题,目前来看不是最好的选择。

  • Modernizr 功能强大,兼容性好,但是需要引入外部 javascript,多一个 Http  请求,如果只是进行几个特性检测,有点杀鸡用牛刀的感觉。

  • 针对需要的特性检测,使用 javascript 实现一个简单的函数,再把上面用到的方法封装一下:

 function cssTest(property, value) {  // 用于测试的元素,隐藏在页面上  var ele = document.getElementById('test-display-none');   // 只有一个参数的情况  if(arguments.length === 1) {   if(property in ele.style) {    return true;   }  // 两个参数的情况  }else if(arguments.length === 2){   ele.style[property] = value;    if(ele.style[property]) {    return true;   }  }   return false; }

 什么是CSS特性检测

软件工程没有银弹,所以无论哪种方式,都有适合的场景,我们要做的就是掌握了解它们的原理,根据不同的场景灵活运用即可。

到此,相信大家对“什么是CSS特性检测”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 什么是CSS特性检测

本文链接: https://lsjlt.com/news/67210.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 什么是CSS特性检测
    本篇内容主要讲解“什么是CSS特性检测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是CSS特性检测”吧!什么是 CSS 特性检测我们知道,前端技术日新月异...
    99+
    2024-04-02
  • CSS规则特性是什么
    这篇文章主要介绍CSS规则特性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 继承性:父元素的声明可以被子元素继承,如字体、颜色等。 层叠性:同一个元素若存在多个css规则...
    99+
    2024-04-02
  • CSS三大特性是什么
    这篇文章主要介绍“CSS三大特性是什么”,在日常操作中,相信很多人在CSS三大特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS三大特性是什么”的疑惑有所帮助!接...
    99+
    2024-04-02
  • CSS的三个特性是什么
    这篇文章给大家分享的是有关CSS的三个特性是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 层叠(cascade)、继承(Inheritance)、特异性(Specific...
    99+
    2024-04-02
  • CSS的三大特性是什么
    这篇文章主要介绍“CSS的三大特性是什么”,在日常操作中,相信很多人在CSS的三大特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS的三大特性是什么”的疑惑有所帮...
    99+
    2024-04-02
  • CSS中的@property特性是什么
    小编给大家分享一下CSS中的@property特性是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是csscss是一种用来表现HTML或XML等文件样式的...
    99+
    2023-06-14
  • css文档流的特性是什么
    这篇文章主要介绍“css文档流的特性是什么”,在日常操作中,相信很多人在css文档流的特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css文档流的特性是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • css中background属性的特点是什么
    小编给大家分享一下css中background属性的特点是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   简写顺序:color-image-repeat-attachment-p...
    99+
    2024-04-02
  • css中border边框属性特点是什么
    小编给大家分享一下css中border边框属性特点是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   简写顺序:widt...
    99+
    2024-04-02
  • css中margin有什么特性
    这篇文章给大家分享的是有关css中margin有什么特性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Margin是什么 CSS 边距属性定义元素周围的空间。通过使用单独的属性,...
    99+
    2024-04-02
  • css浮动有什么特性
    这篇文章主要讲解了“css浮动有什么特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css浮动有什么特性”吧!说明浮动元素会从普通文档流中分离出来,但浮动元素不仅会影响自己,还会影响周围元...
    99+
    2023-06-20
  • 云服务器运算性能检测方法是什么
    CPU测试:可以使用SuperPi、Prime95、Cinebench等工具来模拟真实用户的操作,测试云服务器的处理能力。 内存测试:可以使用 SuperPi 和 GoldWrk 等内存测试工具来测试云服务器的内存使用情况,比较不同进程之...
    99+
    2023-10-27
    检测方法 性能 服务器
  • CSS中display属性参数的特点是什么
    本篇内容介绍了“CSS中display属性参数的特点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C...
    99+
    2024-04-02
  • CSS的继承、层叠和特殊性是什么
    这篇文章主要讲解了“CSS的继承、层叠和特殊性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS的继承、层叠和特殊性是什么”吧!CSS 的某些样式是...
    99+
    2024-04-02
  • javascript特性是什么
    这篇文章给大家分享的是有关javascript特性是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 javascript特性有:1、展开操作符;2...
    99+
    2024-04-02
  • Angular中什么是变更检测?什么情况下会引起变更检测?
    Angular中什么是变更检测?下面本篇文章带大家了解一下变更检测,并介绍一下什么情况下会引起变更检测,希望对大家有所帮助!什么是变更检测?简单来说,变更检测就是Angular用来检测视图与模型之间绑定的值是否发生了改变,当检测到模型中的值...
    99+
    2023-05-14
    Angular 变更检测
  • css中的特定属性选择类型是什么
    这篇文章主要为大家展示了“css中的特定属性选择类型是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中的特定属性选择类型是什么”这篇文章吧。 最后为...
    99+
    2024-04-02
  • angular变更检测机制是什么
    Angular的变更检测机制是通过比较当前视图和上一次视图的状态来确定是否需要更新视图。它基于Zone.js库,通过Zone来跟踪和...
    99+
    2023-10-24
    angular
  • JS属性的特性是什么
    这篇文章将为大家详细讲解有关JS属性的特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念ECMAScript 5 中定义了一个名叫“属性描述符”的...
    99+
    2024-04-02
  • MySQL的特性是什么
    这篇文章主要介绍MySQL的特性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作