导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

冷门技能

⭐️ CSS 选择器

⭐️ 基础选择器

ID 选择器 #app
类选择器 .container
标签选择器 divp
一般兄弟选择器 p ~ span 匹配同一父元素下,p 元素后的所有 span 元素
紧邻兄弟选择器 h1 + p 紧贴h1 后面的第一个 p 标签。同级标签,之间不能有其他标签
并集选择器 .one, p 给 类名 为 one,标签为 p 标签的元素共同设置
子代选择器 ul > li ul 标签下的下一个层级的 li ,并不是所有
后代选择器 li a 和子代选择器不同,可以选择多层嵌套的后代元素,无论嵌套层次有多深
通配符选择器 *

⭐️ 属性选择器

名称 子类 语法 说明 例子
简单属性选择器 element[attribute] 选择具有指定属性的元素,无论属性值是什么 a[href]会选择所有带有 href 属性的 <a> 元素
具体属性值选择 element[attribute="value"] 选择具有指定属性且属性值完全匹配的元素 input[type="text"]会选择所有 type 属性值为 "text" 的 <input> 元素
部分属性值选择(包含特定词汇) element[attribute~="value"] 选择属性值中包含指定词汇的元素。属性值可以是用空格分隔的多个值,只要其中一个值包含指定词汇,该元素就会被选中 p[class~="important"]会选择 class 属性值中包含 "important" 的 <p> 元素

备注: p 标签的 class 属性中得包含 important 这个单词,且此单词必须独立存在。

正例: <p class="text-center important">...</p> 反例: <p class="text-center !important">...</p> | | 子串匹配属性选择器 | 以指定值开头 | element[attribute^="value"] | 匹配属性值以指定值开头的元素 | a[href^="https"]会选择所有 href 属性值以 "https" 开头的 <a> 元素 | | | 以指定值结尾 | element[attribute$="value"] | 匹配属性值以指定值结尾的元素 | img[src$=".jpg"]会选择所有 src 属性值以 .jpg 结尾的 <img> 元素 | | | 包含指定值 | element[attribute*="value"] | 匹配属性值中包含指定值的元素 | p[title*="example"]会选择所有 title 属性值中包含 "example" 的 <p> 元素 | | 特定属性选择类型(竖线匹配) | | element[attribute|="value"] | 选择带有指定属性,并且属性值以指定值或者以指定值加横杠(value-)开头的元素。通常用于选择语言属性等。 | [lang|="en"]会选择所有 lang 属性值为 "en" 或者以 "en-" 开头的元素 | | 条件连写 | | element[key1=value1][key2=value2][key3=value3]... | 表示当前元素需要同时具备才会出现效果 | |

https://codepen.io/JingW/pen/VwoygvQ

⭐️ CSS 优先级算法

⭐️ CSS选择器匹配规则

Untitled

.mod-nav header h3 span

.mod-nav ul a

匹配规则:

⭐️ 为什么从右往左

**因为写样式是可以越级设置的,**例如 .mod-nav ul a 的这个 a 不一定是直接挂载到 .mod-nav 下的 li 上的 ,有可能像上图所示在其很深层级的位置。

GPT 回复

CSS选择器的匹配规则的解析是一个从右向左的过程,这样的解析顺序是出于性能优化的考虑。以下是详细解析原理和原因:

解析原理

1. 从右向左匹配的步骤

假设有一个选择器 div ul > li a.active

  1. 从最右边的选择器开始,即 .active,查找所有带有 class="active"<a> 元素。
  2. 然后往左移动li a.active,过滤掉不在 <li> 内部的 <a> 元素。
  3. 接着移动到 ul > li a.active,进一步过滤掉不在直接子元素 <li> 内部的 <a> 元素。
  4. 最后到 div ul > li a.active,过滤掉不在 <div> 内部的 <ul> 内部的 <li> 内部的 <a> 元素。

2. 优化原因

这种从右向左的匹配方式主要是为了优化选择器的性能:

示例解释

假设有以下 HTML 结构:

<div>
  <ul>
    <li><a class="active">Link 1</a></li>
    <li><a>Link 2</a></li>
  </ul>
</div>

对于选择器 div ul > li a.active

  1. 最右边选择器 .active:查找所有带 class="active"<a> 元素,找到 <a class="active">Link 1</a>
  2. 过滤父元素 <li>:确定这个 <a> 是否在 <li> 内,是的,继续。
  3. 检查父元素 <ul> 的子元素关系:确认这个 <li> 是直接子元素 <ul>,是的,继续。
  4. 最终检查 <div> 元素:确认这个 <ul> 是否在 <div> 内,是的,匹配成功。

实际性能影响

这种从右向左的解析方式减少了不必要的查找和遍历,提高了选择器匹配的效率。因为浏览器引擎可以在找到潜在匹配的元素后,逐步验证其祖先元素是否符合条件,从而避免了大量无效的元素检查。

总结:

从右向左匹配的解析顺序是为了优化选择器的性能,使得浏览器可以快速排除不符合条件的元素,并减少不必要的全局查找和遍历,提高渲染效率。

CSS3 新增伪类

⭐️ CSS 伪类、CSS 伪元素

伪类

CSS 伪类 是添加到选择器的关键字,指定要选择的元素的特殊状态。例如,:hover 可被用于在用户将鼠标悬停在按钮上时改变按钮的颜色。

伪类应用

/*
	我们想让被访问过的链接和未被访问的链接看起来一样
*/
a:visited {
  color: blue;
}

span:nth-child(1)
/* 表示父元素中子元素为第一的并且名字为 span 的标签被选中 */

伪元素

CSS 伪元素(Pseudo-element)跟伪类很像,但它们又有不同的地方。它们都是关键字,但这次伪元素前缀是两个冒号 (::) , 同样是添加到选择器后面去选择某个元素的某个部分。【::after生成的是个inline元素】

注意

伪元素必须写 content 属性

伪元素应用

/*
	所有含有"href"属性并且值以"http"开始的元素,
	将会在其内容后增加一个箭头(去表明它是外部链接)
*/
[href^=http]::after {
  content: '⤴';
}