初探CSS 选择器Level 4

栏目: CSS · 发布时间: 6年前

内容简介:在开始聊CSS选择器Level 4(否定伪类我们平时开发项目的时候,时常会碰到列表这样的效果,列表项之间有一个

在开始聊CSS选择器Level 4( Selectors Level 4 )之前,先要明确一个简单的概念。时至今日,在CSS的世界之中再不会有大版本的称谓,比如以前大家熟悉的CSS2.1、CSS3。现在的CSS都只会以CSS模块的版本来进行区分,比如我们今天要聊的CSS选择器,其最新版本就是: CSS Selectors Level 4 。在CSS Selectors Level 4中为选择器增添了不少的新特性,当然这些新特性有的已得到浏览器的支持,有的只得到部分主流浏览器的支持。所以接下来,花点时间学习一下,以备后用。

:not()

否定伪类 :not() 是一个 函数伪类 ,以选择器列表做为参数,它表示的元素不是由其参数表示的。 :not() 选择器 可以用来做为判断的一个选择器,好比JavaScript中的非。其主要作用就是将符合规则的元素剔除,将样式规则应用于其他元素上。事实上,在CSS Selector Level 3就有 :not() 的身影,只不过当初的功能比较弱,比如 :not(p) 用来选择不是 <p> 的元素。但在新版本的中,其功能变得更为强大,可以应用更为复杂的规则,但是同样地不允许嵌套使用,比如 :not(:not(...))

我们平时开发项目的时候,时常会碰到列表这样的效果,列表项之间有一个 margin-bottom ,而往往想在最后一项中不设置 margin-bottom 。比如像下图这样的效果:

初探CSS 选择器Level 4

往往我们借助伪类选择器 :last-child 来帮我实现,比如:

li{
    margin-bottom: 20px;
}

li:last-child {
    margin-bottom: 0;
}

如果我们使用 :not() 选择器,会变得更容易:

li:not(:last-child) {
    margin-bottom: 20px
}

上面的代码表示的意思就是: 选中除最后一项 li 的所有 li ,并给其设置 margin-bottom: 20px;

另外, :not() 选择器还有一个提高CSS权重的小作用,比如 div:not(span)div 是同一个概念,但是明显的前者的优先级要更高。

浏览器的支持度:

:has()

关系伪类 :has() :not() 选择器类似,也是一个函数伪类,不同的是 :has() 使用相对选择器列表作为参数。它表示一个元素,任何一个相对选择器(当将元素绝对化并将其赋值为 :scope 元素)至少匹配一个元素。

:has() 伪类有点类似于jQuery中的 .has() 方法,简单来说就是用来 匹配含有某些规则的元素 。比如:

// 匹配含有`img`子元素的`a`元素
a:has(> img) { }

// 匹配拥有dt兄弟元素的dt元素
dt:has(+ dt) {}

// 匹配不含有h1、h2、h3、h4、h5和h6的section元素
section:not(:has(h1, h2, h3, h4, h5, h6)) {}

// 匹配含有的不是h1、h2、h3、h4、h5、h6子元素的元素
section:has(:not(h1, h2, h3, h4, h5, h6)) {}

最后两个示例是 :not():has() 组合在一起使用的,但两者组合在一起所达到的意思却完全不一样。其中 :not(:has(selector)) 匹配不含有 selector 选择元素的元素(有点绕,对应看上面示例描述),而 :has(:not(selector)) 匹配含有的不是 selector 子元素的元素。两都主要区别在于, :has(:not(selector)) 写法必须要含有一个子元素,而 :not(:has()) 可以不含有元素也会被匹配。

:matches()

:matches() 同样是一个函数伪类,以选择器列表作为参数。主要用于匹配所述规则的元素,并应用相应的样式规则,选择该列表中任意一个选择器可以选择的元素。它可以让我们节省书写大量的 CSS 样式匹配规则,让我们从大量重复的规则书写中解放出来。

来看两个示例:

.matches {
    color: black;
}

.matches :matches(span, div) :matches(span, div) {
    color: green;
}

上面的代码等同于:

.matches span div,
.matches span span,
.matches div span,
.matches div div {
    color: green;
}

注意,许多浏览器通过一个更旧的伪类选择器 :any() 来替代 :matches() ,并且要带上对应的浏览器私有前缀, :-webkit-any():-moz-any() ,其工作方式与 :matches() 完全相同,比如上面示例,我们可以改写成:

.matches :-webkit-any(span, div) :-webkit-any(span, div) {
    color: green;
}
.matches :-moz-any(span, div) :-moz-any(span, div) {
    color: green;
}

来看一个简单的示例:

示例中通过一行代码:

:matches(header, main, footer) p:hover {
    color: red;
    cursor: pointer;
}

就替代了:

header p:hover,
main p:hover,
footer p:hover {
    color: red;
    cursor: pointer;
}

如果你使用过CSS的处理器,就较好理解,它有点类似于CSS处理器中的嵌套规则。

有一点需要注意, :matches() 不能嵌套工作,也不能和 :not() 配合在一起工作,比如下面的几个选择器,都将无法正常工作:

:matches(:not(...)) {}
:not(:matches(...)) {}
:matches(:matches(...)) {}

除此之外,在 :matches() 传递的选择器列表中也不允许一些组合选择器,比如 ~>+ 等。

浏览器支持度:

:something()

:something() 被称为权重调整伪类,也是一个函数伪类,其语法和功能与 :matches() 类似。其不同之处是 :something() 伪类和它的任何参数都不影响选择器的权重, 它的权重总是为 0

对于在选择器中引入过滤器很有用,同时保持关联的样式声明易于重写。

下面是一个常见的例子:

a:not(:hover) {
    text-decoration: none;
}

nav a {
    /* 无效果 */
    text-decoraation: underline;
}

如果我们使用 :something() 伪类选择器就可以达到作者期望的效果:

a:something(:not(:hover)) {
    text-decoration: none;
}

nav a {
    /* Works now! */
    text-decoration: underline;
}

以上所述就是小编给大家介绍的《初探CSS 选择器Level 4》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创业者

创业者

[美] 杰西卡·利文斯顿 / 夏吉敏 / 机械工业出版社 / 2010-5 / 58.00元

本书源自作者对32个IT行业创业者的访谈,包括Apple, Gmail, hotmail, TiVo, Flickr, Lotus 及 Yahoo公司等著名公司,主题为创业初期的人和事。 对于做梦都想创业的人来说,这本书一定要读,可以看看前辈高人是如何创业的。 对于希望了解企业家成功历程和经验的人来说,这是一本必读之书,因为里面有很多成功人士年轻时的故事,你可以好象看着他们长大一样,知......一起来看看 《创业者》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具