@Selector

选择器作用:使用选择器选择某个或某些元素以应用其定义的样式|规则
标签选择器 Type selectors
.使用元素标签名,如使用div表示选择<div>
.也称元素选择器
.可以选择多个元素
.通常用来 初始化 标签属性
类选择器 Class selectors
.以 . 表示,如 .wrap
.可以选择多个元素
.元素可以同时使用多个类/层叠,最后的样式由多个类共同作用
.应用最为广泛
ID选择器 ID selectors
.以 # 表示,如 #cont
.ID用来唯一标识一个元素
.一般供JavaScript操作元素使用
属性选择器 Attribute selectors
.选择带有特定属性的元素
.可以选择多个元素
.使用正则语法可以更加精准的选择元素
类别 说明
[attribute] 选择带有指定属性的元素
[attribute="value"] 选择带有指定属性和值的元素
[attribute^="value"] 选择指定属性以指定值开头的元素
[attribute$="value"] 选择指定属性以指定值结尾的元素
[attribute*="value"] 选择属性包含指定值的元素
[] 为表单中的特定input设置样式
input[type='text'] {
  color: #f40;
}

input[type='radio'],
input[type='checkbox'] {
  accent-color: #f40;
}
*通配符选择器 Universal selectors
.以 * 表示所有元素
.优先级最低
.利用CSS为当前元素重新创建或指定元素,不能按照传统的HTML元素那样操作,所以叫伪元素
.伪元素附加在选择器末尾;简化了HTML结构却能实现更多效果;应用非常广泛!!!多用于修饰元素
.不需要借助元素的 ID 或 class 属性就可以定义被选择元素的特定样式
.更多伪元素选择器使用,请查阅 伪元素
语法
selector::pseudo-element {
    property: value;
}
子元素选择器
.为当前元素创建第一个或最后一个子元素
.子元素::before、::after必须指定content属性,内容可以为空
.创建的子元素是inline
类别 说明
::before 在元素的内容之前插入内容,将作为第一个子元素
::after 在元素的内容之后插入内容,将作为最后一个子元素
[] 自定义列表项符号- 更多实例,请查看list
ul li::before {
    content: '>';
}
元素部分内容选择器
.设置的样式有限;只能应用于块级元素
类别 说明
::first-letter 元素首字母
::first-line 元素首行;::first-letter优先级高于::first-line;
::selection 元素被选择的部分;默认是蓝底白字
::placeholder 占位符样式;多用于表单元素input
[] 首字下沉,且高亮选择 - 注意行高的影响

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Modi, deserunt placeat corrupti eveniet, tempore assumenda rem minus laborum fuga magni mollitia recusandae qui laboriosam autem accusantium ullam obcaecati distinctio? Laudantium, mollitia excepturi commodi quasi cum repellendus odio sapiente minus ratione ab quis sunt, optio nobis consequuntur nihil aperiam ipsam officia rem dolorum culpa magni accusamus similique repellat? Iste quisquam dolore perferendis quo ratione deleniti, asperiores quia voluptatum, soluta nisi modi dicta repudiandae praesentium, odit dolores blanditiis ea. Minima velit numquam nemo vitae architecto harum facilis et totam expedita quisquam delectus eos quaerat sunt labore eligendi vel, dolore earum ullam voluptatem.

.info::first-letter {
  font-size: 3em;
  color: #f40;
  float: left;
  margin-right: 1em;
}

.info::first-line {
  font-weight: 600;
}

.info::selection {
  background-color: #f40;
  color: #fff;
}
列表标记选择器
.定义标记类型
.适用于<li>或说明为list-item的元素
.使用content属性指定内容
.因为标记会破坏布局,基本很少使用
类别 说明
::marker 标记选择器
li::marker {
  content: '+';
}
.和普通类的可以应用在多个元素不同,伪类仅仅限定当前元素使用,所以叫伪类
.伪元素会增加元素,伪类不增加元素
超链接伪类选择器
.常见于超链接<a>桌面端应用,移动端无效
.<a>使用时,需按下述顺序定义:a:link→a:visted→a:hover→a:active
.除了超链接<a>,还可以作用于其它元素,如表单元素
.详情参看 超链接一节
.更多案例,请查看 accordion
类别 说明
:link <a>初始状态/为访问过
:visited <a>访问过/点击后状态
:hover 鼠标置于<a>上时的状态;使用最广泛
:focus <a>获取焦点时的状态
:active <a>为活动状态时
:target 当前元素为锚点目标时选中;目标元素需要指定ID
表单伪类
.多用于表单元素
.功能非常强大,很多纯CSS效果甚至可以媲美JavaScript
.凡是鼠标点击的联动响应,都可以使用:checked,如标签页、轮播、导航;见后续案例
.更多案例,请查看 form
类别 说明
:checked 元素选择中
:valid 有效时
:invalid 无效时
:in-range 在指定范围
:out-of-range 超出指定范围
结构伪类选择器
1. 根据序号选择元素
类别 说明
:first-child 第一个孩子
:last-child 最后一个孩子
:nth-child(n) 第几个孩子;孩子从1开始
.根据文档结构来选择,通常配合父级元素一起使用
.nth-child可以使用关键字;odd选中序号为奇数的孩子;even选中序号为偶数的孩子
.nth-child可以使用表达式;n只能是数字,不能是字母;n必须是表达式的第一项
.以上选择器不区分元素类型
.请参看- table一节斑马纹实例
:nth-child(even)//选择序号为偶数的元素
:nth-child(odd)//选择序号为奇数的元素
:nth-child(2n)//选择序号为偶数的元素
:nth-child(2n+1)//选择序号为奇数的元素
:nth-child(3n)//选择序号为3、6、9等元素
:nth-child(3n+1)//选择序号为1、4、7、10等元素
:nth-child(-n+3)//选择序号为3、2、1的元素;:nth-child(3-n)错误
2. 根据类型选择元素
类别 说明
first-of-type() 选择指定类型第一个
last-of-type() 选择指定类型最后一个
nth-of-type() 选择指定类型第几个
.根据类型选择符合条件的元素;适合多种元素类型并存的情况
.同样可以使用关键字或表达式
[] 按序号、按类型选择元素
[HTML]
<div class="box">
  <h2>...</h2>
  <p>...</p>
  <p>...</p>
  <p>...</p>
  <h2>...</h2>
  <p>...</p>
  <p>...</p>
  <h2>...</h2>
  <p>...</p>
  <p>...</p>
  <p>...</p>
</div>
[CSS]
.box h2:first-child {
  color: #f40;
}

.box p:first-child {
  color: #f40;//NOT
}

.box p:first-of-type {
  color: #f40;
}

.box p:nth-child(2) {
  text-decoration: underline;
}
:root选择器
.定义CSS变量,供当前CSS文件所有元素使用,也称全局CSS变量
.借助函数 var() 使用/获取定义的变量
.方便统一调整
.还可以在元素上使用style定义内联变量,供当前元素使用,详情请查看 CSS 函数一节
:root {
  --title-h: 100px;
  --main-color-white: #f3f3f3;
  --main-color-red: #ff0f5b;
  --main-color-purple: #be01fe;
  --main-color-blue: #01b4ff;
  --main-color-green: #2dfc52;
  --main-color-orange: #ff7f50;
  --main-color-gray: #333849;
}

.warn {
  font-weight: 600;
  color: var(--main-color-red);
}
:not() 选择器
.选中不符合条件的元素
[] 元素彼此之间等间隔排列
使用:not;最后一个<li>不指定margin-right
ul li:not(:last-child) {
  margin-right: 10px;
}
使用相邻兄弟选择器实现
ul li + li {
  margin-left: 10px;
}
使用flex的gap实现
ul {
  display: flex;
  gap: 10px;
}
[] 选中不属于<header>或<section>的<h2>;范围中的h2不能省略
h2:not(header h2, section h2) {
  color: #f40;
}
:is() 选择器
.为同一个父级容器的后代元素指定相同的样式
.选中当前选择器的后代 哪些的选择器
.后代选择器的高级用法;简化代码;而且可以容错;独立写法中,如果有一个语法错误,则所有样式都不生效;:is则可以大胆使用
.The :is() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a more compact form.
.box h1,
.box h2,
.box h3 {
  color: #f40;
}
.box :is(h1, h2, h3) {
  color: #f40;
}
或者当前元素是哪些状态,如表单的伪类选择器
input:is(:hover, :focus) {
  border: 1px solid #f40;
  outline: none;
}
:has() 选择器
.选中具备某种关系的元素
.如果某个选择器 哪些选择器,则选中当前选择器
.可以根据子元素的状态设置父元素的样式,经常被认为是 父级选择器 -referred to as the parent selector;也有看作是家庭选择器,还可以匹配兄弟关系
.本质上是一个函数,参数就是和当前元素存在父子关系或兄弟关系的选择器列表,以逗号分隔- a comma-separated list
.属于关系型伪类选择器的范畴-The Relational Pseudo-class
.This pseudo-class presents a way of selecting a parent element or a previous sibling element with respect to a reference element by taking a relative selector list as an argument.
[] 如果包含有一个图形img和一个紧跟着图形的段落p,则选中
.card:has(img + p) {
  flex-direction: row;
}
[] 匹配到包含有<ol> <ul>的文章
article:has(ol, ul) {
  /* Matches an 
that contains either an ordered or unordered list. */ }
[] 选中直接兄弟是dt的dt
dt:has(+ dt)
[] 自适应布局-没有--left-width就使用48px;当元素left处于hover状态时,定义--left-width变量为30%
.grid {
  display: grid;
  transition: 300ms;
  grid-template-columns: var(--left-width, 48px) auto;
}

.grid:has(.left:hover) {
  --left-width: 30%;
}
[] 某个ID被选中时
body:has(#p0:checked) {
  background-color: #ffb8b8;
  color: #ffb8b8;
}

body:has(#p1:checked) {
  background-color: #f1c40f;
  color: #f1c40f;
}
:where() 选择器
.指定一个选择器集合,当某个选择器符合条件时设置对应的样式
.对于缩短一个较长的选择器列表非常有用
.如果样式使用比较频繁,建议定义为公共类
.The :where() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list.
[] 为多个元素指定样式
:where(.left, .center, .right):hover {
  background: crimson;
}
[] 为<body>和<main>指定水平垂直居中
:where(body, main) {
  display: flex;
  justify-content: center;
  align-items: center;
}
使用公共类更加直观
.center-item {
  display: flex;
  justify-content: center;
  align-items: center;
}
说明
.使用多个选择器选择匹配的元素
叠加选择器 ( . )
.以 . 分隔,表示在当前样式的基础上,再叠加一个新样式;通常用于JS控制切换状态
.CCS文件中,新样式必须出现在当前样式的后面
<div class="box active"></div>
[]动态类
.box {
    opacity: 0.5;
}

.box.hover,
.box.active {
    opacity: 1;
}
并列/群组选择器 Selector list( , )
.The CSS selector list (,) selects all the matching nodes. A selector list is a comma-separated list of selectors.
.以 , 分隔,表示样式同时适用于这些元素
[]初始化样式表
ul,li {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
后代选择器 Descendant combinator(   )
.The descendant combinator — typically represented by a single space (" ") character — combines two selectors such that elements matched by the second selector are selected if they have an ancestor (parent, parent's parent, parent's parent's parent, etc.) element matching the first selector.
.以 空格 分隔,从所有后代[子辈、孙辈、...]中选择符合条件的元素
[]<ul>里面的<li>首字母大写
ul li{
    text-transform: capitalize;
}
直接后代选择器 Child combinator( > )
.The child combinator (>) is placed between two CSS selectors. It matches only those elements matched by the second selector that are the direct children of elements matched by the first.
.以 > 分隔,从儿子中选择符合条件的元素
兄弟/弟弟选择器 General sibling combinator( ~ )
.The general sibling combinator (~) separates two selectors and matches all iterations of the second element, that are following the first element (though not necessarily immediately), and are children of the same parent element.
.以 ~ 分隔,向后选择,从所有弟弟|little brothers中选择符合条件的元素
相邻兄弟/小弟选择器 Adjacent sibling combinator( + )
.The adjacent sibling combinator (+) separates two selectors and matches the second element only if it immediately follows the first element, and both are children of the same parent
.以 + 分隔,选择相邻immediately followed的弟弟|little brother;应用非常广泛
[] 兄弟选择器~和直接兄弟选择器+:从当前元素开始
.bro li:first-child::after {
    content: ': first-child';
}

.bro li:last-child::after {
    content: ': last-child';
}

.bro3+li {
    background-color: #078;
}

.bro6~li {
    background-color: #f40;
}
[] 标签页/选项卡
.利用<label>和<input>绑定起来,在<label>上做文章,最后隐藏<input>
.<input>选中后:1.选中相邻+的<label>兄弟,2.选中后续~的标签页容器兄弟,进而选中对应的标签页/子元素
.<label>不一定非得和<input>在一起;见后例
file
edit
selection
view
[HTML]注意元素之间的关系
<div class="tabcard">
  <input type="radio" hidden name="tabcard" id="file" checked>
  <label for="file">file</label>
  <input type="radio" hidden name="tabcard" id="edit">
  <label for="edit">edit</label>
  <input type="radio" hidden name="tabcard" id="selection">
  <label for="selection">selection</label>
  <input type="radio" hidden name="tabcard" id="view">
  <label for="view">view</label>
  <div class="tabcard-cont">
    <div>file</div>
    <div>edit</div>
    <div>selection</div>
    <div>view</div>
  </div>
</div>
[CSS]核心
.tabcard-cont div {
  display: none;
}

#file:checked+label {
  background-color: var(--main-color-blue);
  color: #fff;
  border-radius: 10px;
}

#file:checked~.tabcard-cont div:nth-child(1) {
  display: block;
}

...
更多案例
[] 详情页Details Detail
[] 手动轮播Swiper
[] 一路有你Login
[] 手风琴Accordion
说明
.不同的选择器类型,对应的优先级也不尽相同
.选择器的优先级会决定样式是否应用到元素:优先级高,选中元素,将应用/覆盖元素样式;优先级低,选不中元素,样式不应用/不覆盖,保持原来样式
.样式不生效,一定要检查选择器的优先级,特别是选择器组合使用的时候
权值分配
类别 说明
重要选择器 !
1000 行内样式 style
0100 ID选择器 #
0010 类选择器 . | 伪类选择器 : | 属性选择器 []
0001 标签选择器 tag | 伪元素选择器 ::
0000 通配符选择器*
.单个选择器比较容易
.组合选择器最终的优先级要综合计算不同选择器的权值对应的十进制
.可以使用!important提升优先级为最高,谨慎使用;某些框架开发中,为了覆盖样式,会使用样式穿刺技术提示优先级
div {
    color: #f40 !important;
}
总结与作业 Summary & Homework
总结
.选择器的使用
作业
.体会不同选择器的使用;注意优先级
.使用伪元素选择器、伪类选择器设计轮播图,优化个人网站