本文主要通过一些简单习题,学习css选择器的一些小技巧。
要求:选中箭头指向的元素
一、 :not
用来匹配不符合一组选择器的元素。由于它的作用是防止特定的元素被选中
p:not(.foo)
li:nth-child(2n+1):not(:first-child)
/* 或者 */
li:nth-child(2n + 3)
注意:
:not()伪类不能被嵌套,这意味着:not(:not(...))是无效的- 由于伪元素不是简单的选择器,他们不能被当作
:not()中的参数,形如:not(p::before)这样的选择器将不会工作。
/* 类名不是 `.fancy` 的 <p> 元素 */
p:not(.fancy) {
color: green;
}
/* 非 <p> 元素 */
body :not(p) {
text-decoration: underline;
}
/* 既不是 <div> 也不是 <span> 的元素 */
body :not(div):not(span) {
font-weight: bold;
}
/* 类名不是 `.crazy` 或 `.fancy` 的元素 */
/* 注意,此语法尚未获广泛支持。 */
body :not(.crazy, .fancy) {
font-family: sans-serif;
}
二、选择父元素下的任意子元素(*)
div>*
三、属性选择器
CSS 属性选择器通过已经存在的属性名或属性值匹配元素
span[data-item]
属性选择器语法:
-
[attr]:表示带有以attr命名的属性的元素。/* 存在title属性的<a> 元素 */ a[title] { color: purple; } -
[attr=value]:表示带有以attr命名的属性,且属性值为value的元素。 -
[attr~=value]:表示带有以attr命名的属性的元素,并且该属性是一个以空格作为分隔的值列表,其中至少有一个值为value。 -
[attr|=value]:表示带有以attr命名的属性的元素,属性值为“value”或是以“value-”为前缀("-"为连字符)。 -
[attr^=value]:表示带有以attr命名的属性,且属性值是以value开头的元素。/* 以 "#" 开头的页面本地链接 */ a[href^="#"] { background-color: gold; } -
[attr$=value]:表示带有以attr命名的属性,且属性值是以value结尾的元素。 -
[attr*=value]:表示带有以attr命名的属性,且属性值至少包含一个value值的元素。/* 包含 "example" 的链接 */ a[href*="example"] { background-color: silver; } -
[attr operator value i]:表示带有以attr命名的属性,且属性值是以value结尾的元素。
四、通用兄弟选择器 (~)
兄弟选择符,位置无须紧邻,只须同层级,A~B 选择A元素之后所有同层级B元素。
p ~ span
五、元素的激活(:enabled)与禁用:disabled
*:enabled
:enabled 表示任何被启用的(enabled)元素。传送门
input:enabled {
color: #2b2;
}
input:disabled {
color: #aaa;
}
六、:is
:is(#one,#two,#five,#six,#nine)
首先讲讲选择器列表
CSS 选择器列表(,),常被称为并集选择器或并集组合器,选择所有能被列表中的任意一个选择器选中的节点。
/* 选择所有 <span> 和 <div> 元素 */
span, div {
border: red 2px solid;
}
但是会出现选择器列表无效化的情况,比如:
h1 { font-family: sans-serif }
h2:maybe-unsupported { font-family: sans-serif }
h3 { font-family: sans-serif }
h1, h2:maybe-unsupported, h3 { font-family: sans-serif }
以上两段 CSS 代码并不不等价,这是因为,在选择器列表中如果有一个选择器不被支持,那么整条规则都会失效。
解决这个问题的一个方法是使用 :is() 选择器,它会忽视它的参数列表中失效的选择器,但是由于 :is() 会影响优先级的计算方式,这么做的代价是,其中的所有选择器都会拥有相同的优先级。
:is(h1, h2:maybe-unsupported, h3) { font-family: sans-serif }
选择器优先级
详细说明可参考MDN相关文档
下面列表中,选择器类型的优先级是递减的:
- !important
- 内联样式
- ID选择器(例如:
#example) - 类选择器(例如:
.example),属性选择器(例如,[type="radio"]),伪类例如,:hover) - 标签选择器(例如,
h1)和伪元素(例如,::before) - 通配符选择器
*、关系选择器(+,>,~)和否定伪类(:not()),(但是,在:not()内部声明的选择器会影响优先级)