通过示例回顾 CSS 选择器
你是否曾经在使用 CSS 选择器来设置某个元素的样式时遇到困难nth
?该元素是某个元素的子元素的第一个兄弟元素,并且该元素包含具有特定值的属性。如果你使用过动态布局,那么你可能已经经历过这种情况了。
本文旨在提供 CSS 选择器、属性和伪类的快速参考,并附上示例。由于市面上有大量的 CSS 速查表,我原本想将其整理成一份私人文档供个人使用。但或许我可以换一种方式,让其他人更容易理解。所以,何不与大家分享呢?
对于这篇文章,在继续之前你必须了解一些基本概念,即选择器(类型、属性、id、类)、伪类、伪元素和组合器。
让我们开始吧。
选择器
尽管 CSS 教程通常将我们在此讨论的所有内容视为 CSS 选择器,但值得指出的是,CSS 样式表中每种类型的选择器都有一个特定的术语。
类型选择器
这些是用于匹配 DOM 中的元素的选择器,例如、、,p
甚至自定义标签,如下例所示。div
span
custom {
border: 1px solid black;
}
p {
color: green;
}
<custom>Custom element</custom>
<p>Paragraph</p>
类选择器
这些用于选择 DOM 中具有特定类作为属性的元素。为此,你必须在.
要匹配的名称开头添加 。
.bordered {
border: 1px solid red;
}
<div class="bordered">
Bordered element.
</div>
属性选择器
这些选择器将匹配具有特定关联属性的元素。它既可以匹配单个属性,也可以匹配与其值关联的属性。对于此类选择器,必须用方括号将属性名称括起来。请参阅下面的示例。
[name] {
background-color: green;
}
[name="age"] {
background-color: red;
}
<input type="text" name="name" placeholder="Your name" />
<input type="number" name="age" placeholder="Your age" />
在这个例子中,您可以注意到,最初我们为所有具有 属性的元素创建了一条 CSS 规则name
。这将导致您的 HTML 代码中显示两个输入框,因为它们都具有 属性。但是,之后,我们将创建一个更具体的规则,告诉浏览器对具有 属性且name
值为的元素使用红色背景age
,这将导致您看到最后一个输入框。
除了使用 之外,你还可以使用其他运算符来匹配值=
。请查看下文。
~=
此运算符匹配以空格分隔的单词列表,其中一个单词恰好是传递的值。
[class~="bordered"] {
border: 3px solid green;
}
<button class="btn bordered">Click Here</button>
|=
此运算符与属性值为传递的精确字符串或以后跟 的字符串开头的元素进行匹配-
。
[class|="primary"] {
color: green;
}
<button class="primary-btn">Click Here</button>
<p class="primary">Paragraph</p>
^=
该运算符与以传递的字符串开头的属性值元素进行匹配。
[class^="call"] {
color: green;
}
<button class="caller">Caller</button>
<button class="called">Called</button>
<button class="calling">Calling</button>
$=
该运算符与属性值以传递的字符串结尾的元素进行匹配。
[class$="ed"] {
background-color: pink;
}
<div class="required">
<p>Required</p>
</div>
<div class="validated">
<p>Validated</p>
</div>
*=
该运算符至少匹配一次包含传递的字符串的属性值的元素。
[class*="prim"] {
background-color: pink;
}
<button class="btn-primary">Click here</button>
PS:为了以不区分大小写的方式执行这些匹配,您可以将一个附加i
到规则中,例如:[attr="value" i]
。
ID 选择器
这些选择器将匹配与特定标识符关联的元素。对于此类选择器,您必须在#
要匹配的 ID 前添加一个。请查看下面的示例。
#d123 {
font-weight: bold;
}
<div>block without ID</div>
<div id="d123">block with ID of d123</div>
通用选择器
这个用于匹配页面中的所有元素。例如,它可以用于重置所有元素的边距和填充。但是,由于它会导致页面渲染进程过载,因此不建议使用。
* {
border: 1px solid yellow;
}
<ul>
<li>
<a href="#">Item 1</a>
</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>
<span>Item 5</span>
</li>
</ul>
伪类
伪类用于更广泛地匹配内容,因为它们几乎在所有情况下都可以引用未直接在 DOM 中呈现的元素。这类选择器通常引用元素的状态。因此,它们可以根据用户交互动态访问。很好的例子是:link
和:visited
伪类,它们用于根据链接是否被访问来设置链接的样式。要使用伪类,必须:
在类名开头添加一个。由于这些选择器难以在本文中静态表示,我认为最好将它们放在 JSFiddle 中,以便您可以根据需要进行一些尝试。在那里,您只需取消注释所需的 CSS 和 HTML 部分,即可在右侧选项卡中查看结果。点击此处查看以下列出的选择器示例(其中一些示例在表格下方有说明,而另一些示例过于直观,无需赘述)。
-
:focus
匹配当前聚焦的元素,例如当用户单击以编辑输入或textarea
元素时。 -
:active
匹配用户点击元素的瞬间。只要用户在元素上持续点击,该样式就会一直生效。 -
:hover
匹配鼠标当前所在的元素。 -
:empty
匹配没有任何子元素的元素。 -
:valid
根据每种输入类型匹配包含合法值的输入。例如,当您有一个用于输入电子邮件值的输入框时,您可以为用户输入有效的电子邮件应用样式。请注意,未设置值的输入框将被视为处于有效状态。 -
:checked
匹配当前选中的复选框输入。 -
:link
匹配未访问的链接。 -
:in-range
匹配包含特定范围内的值的输入元素。 -
:not(selector)
匹配不是作为参数传递的每个元素。 -
:first-child
匹配特定父级中的第一个子级。例如,如果执行p:first-child
此操作,则会匹配其父级中的第一个段落。 -
:first-of-type
匹配给定类型的第一个元素。例如,如果你选择 simply,:first-of-type
它将匹配特定父元素中所有同类型的第一个元素。 -
:lang(language)
lang
匹配具有特定值的属性的元素。 -
:nth-child(n)
匹配特定父元素中的第 n 个元素。对于这些可以为索引指定整数值的规则,您可以传递类似以下类型的值2n
来获取每两个索引位置的元素。 -
:nth-last-child(n)
相同,nth-child
但从末尾开始计数。 -
:nth-of-type(n)
匹配特定父级内给定类型的第 n 个元素。 -
:nth-last-of-type(n)
相同,nth-of-type
但从末尾开始计数。 -
:only-of-type
匹配特定父元素中唯一同类型的元素。例如,如果匹配,p:only-of-type
它将匹配唯一存在的段落;如果存在多个段落,它将不匹配任何内容。 -
:only-child
匹配特定父元素的唯一子元素。如果该父元素中有多个子元素,则不匹配任何元素。 -
:optional
匹配没有required
属性的输入元素。 -
:read-only
匹配具有属性的元素read-only
。 -
:read-write
匹配没有read-only
属性的元素。 -
:required
匹配带有 的元素required attribute
。 -
:root
匹配文档的根元素。此选择器通常用于设置全局 CSS 变量。
伪元素
伪元素可以用来引用源代码中不存在的内容,即后续生成的内容。下面我们来看一下。如果你想查看本节的示例,请查看这个 fiddle。
-
::after
并::before
用于添加和设置所选元素的最后一个和第一个子元素的样式。这通常用于向标签、输入框等添加工具提示或图标。 -
::first-letter
选择元素内文本的首字母。 -
::first-line
选择元素内文本的第一行。 -
::selection
选择用户当前选择的文本。
组合器
在我看来,组合器是 CSS 选择器中最有趣的部分。现在,你将能够整合目前所学的知识,并将其与组合器关联起来,从而获得更复杂的 CSS 规则。让我们来看看有哪些可用的 CSS 组合器。点击此处查看示例。
- 选择器组
,
当您想将相同的样式应用于多个元素时可以使用此选项,因此您不必为每个元素创建不同的块,而只需列出它们,
并编写一次规则即可。
h1, h2, h3, h4, h5, h6 {
margin: 1rem;
text-decoration: underline;
}
上述规则同时适用margin
于text-decoration
所有标题标签。
- 后代选择器
空格可用于选择特定块内(后代)的元素。
.container .col {
padding: .5rem 1rem;
}
上面我们为所有带有 类的元素添加了填充,col
这些元素位于带有 类的元素内部container
- 子选择器:
>
用于选择特定元素的直系子元素。它与空格组合器不同,因为子选择器无法选择给定父元素的孙元素。
.container > ul {
border: 1px solid black;
}
上面我们选择了ul
该块的所有直接子元素.container
。
- 相邻兄弟选择器:
+
此组合器用于选择给定元素的相邻兄弟元素。请查看下面的示例。
.item2 + li {
font-size: 2rem;
}
这里我们将 的字体大小应用于元素的直接兄弟元素2rem
。请注意,此组合器和下一个组合器仅沿树向下查找。li
.item2
- 通用同级选择器
~
此组合器为您提供给定元素的所有同级。
.item2 ~ li {
color: red;
}
这里我们选择li
该元素的所有兄弟元素.item2
,再次查看树。
好了,就到这里!希望这篇快速回顾能帮到你 :)
附言:这是一份动态文档,如果您有任何意见、提示或了解缺少的选择器,请在评论中告诉我,我会更新它。
鏂囩珷鏉ユ簮锛�https://dev.to/willamesoares/css-selectors-reviewed-with-examples-3f29