is() 是什么?

is() 是一个 CSS 伪类函数,该函数将选择器列表作为参数,并选择该列表中任意一个选择器可以选择的元素。举个例子就比较清晰的理解:

使用前:

ul li,

ol li {}

使用后:

:is(ul, ol) li {}

优化我们的代码

假如我们系统比较复杂,is() 可以帮助我们简化代码,比如如下代码:

/* 3-deep (or more) unordered lists use a square */

ol ol ul,     ol ul ul,     ol menu ul,     ol dir ul,

ol ol menu,   ol ul menu,   ol menu menu,   ol dir menu,

ol ol dir,    ol ul dir,    ol menu dir,    ol dir dir,

ul ol ul,     ul ul ul,     ul menu ul,     ul dir ul,

ul ol menu,   ul ul menu,   ul menu menu,   ul dir menu,

ul ol dir,    ul ul dir,    ul menu dir,    ul dir dir,

menu ol ul,   menu ul ul,   menu menu ul,   menu dir ul,

menu ol menu, menu ul menu, menu menu menu, menu dir menu,

menu ol dir,  menu ul dir,  menu menu dir,  menu dir dir,

dir ol ul,    dir ul ul,    dir menu ul,    dir dir ul,

dir ol menu,  dir ul menu,  dir menu menu,  dir dir menu,

dir ol dir,   dir ul dir,   dir menu dir,   dir dir dir {

  list-style-type: square;

}

简化成:

/* 3-deep (or more) unordered lists use a square */

:is(ol, ul, menu, dir) :is(ol, ul, menu, dir) ul,

:is(ol, ul, menu, dir) :is(ol, ul, menu, dir) menu,

:is(ol, ul, menu, dir) :is(ol, ul, menu, dir) dir {

  list-style-type: square;

}

避免 CSS 错误

假如我们的 CSS 中有错误,将导致整个选择器不生效。比如下面的 .content 写成 :content。demo 地址[1]

<div class="container-1">

  <p class="title">I am Gopal</p>

  <div class="content">我是锅巴</div>

</div>

<div class="container-2">

  <p class="title">I am Gopal</p>

  <div class="content">我是锅巴</div>

</div>

/* 写错,将导致都不生效 */

.container-1 .title, .container-1 :content {

  color: #885c5c;

}

但假如使用 :is(),.title 选择器依然可以生效,如下:

/* content 写错,title 还可以生效 */

.container-2 :is(.title, :content) {

  color: #885c5c;

}

is() VS CSS 预处理器

is() 和 CSS 预处理器中的嵌套规则很相像,如下所示:

div, p, ul, ol {

  span {

    /* ... */

  }

}

/* 最终解析成 */

div span, p span, ul span, ol span {

  /* ...*/

}

以下是 :is() 的实现

:is(div, p, ul, ol) span {

}

但需要注意的是它们的优先级是不一样的。

优先级

通过 :is() 匹配到元素的优先级,会采用 :is() 选择器列表参数中优先级最高的计算(即使它不存在)。

理解起来有点拗口,直接看一个 demo 地址[2]

<ul class="container-3">

  <li class="title">I am Gopal</li>

  <li class="content">我是锅巴</li>

</ul>

/* 计算的时候,取 .list,而不是 ul。其优先级为 0 1 1 */

:is(ol, .list, ul) li {

  color: #885c5c;

}

/* 优先级为 0 0 2 */

ul li {

  color: #000;

}

在使用 :is() 的时候,它的参数为 ol, .list, ul,取最高的 .list 计算,其优先级为 0 1 1。而 ul li 的优先级是 0 0 2。所以会是 :is() 选择器生效,即使后者写在后面,这个跟预选择器是有区别的,使用预选择器会被后面的覆盖。

兼容性

:is() 兼容性,IE 还是全军覆没,但很多场景可以用起来了。详情[3]

参考

:is[4]

MDN[5]

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月29日

热门专题

安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设
大理科技管理学校|大理科技管理学校,大理科技,大理科技中等职业技术学校,大理科技管理中等职业技术学校,大理科技学校
大理科技管理学校
安徽开放大学|安徽开放大学报名,安徽开放大学报考,安徽开放大学,什么是安徽开放大学,安徽开放大学学历,安徽开放大学学费,安徽开放大学报名条件,安徽开放大学报名时间,安徽开放大学学历,安徽开放大学专业
安徽开放大学
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
卓越综合高中|卓越综合高中
卓越综合高中

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部