1 选择器
- 通用选择器:匹配所有元素
*{
}
- 标签选择器
一般选择
header{
}
递推选择 选择header下的nav
header nav{
}
- 类选择器
.a{
}
<div class="a"> </div>
// 选择同时包含多个类名的元素
.a.b.c {}
- ID选择器 唯一
#a{
}
<div id="a"> </div>
- 空格后代选择器 选到所有的p后代,无视嵌套深度
-
>后代选择器,仅选取直接子元素
div p {
}
<div>
<p></p>
</div>
div > p {
}
- 多选择器
a,b,c{
}
- 类名筛选选择
*:包含abc^:以abc开头$:以abc结尾
[clss*="abc"] {}
- 添加剔除条件的选择器
*:not(任意选择器) {
}
- 子元素奇偶选择
#markdown-output tr:nth-child(even) {
background-color: #f2f2f2; /* 偶数行的背景色 */
}
#markdown-output tr:nth-child(odd) {
background-color: #ffffff; /* 奇数行的背景色 */
}
2 CSS属性样式
*{ margin: 0; padding: 0;}
边框厚度为0 内部填充为0
header {
display: flex; justify-content: space-between; align-items: center;
}
- 显示方式:弹性盒子布局;
- 主轴(水平轴)元素对齐方式:左边第一元素紧贴左边,右边第一元素紧贴右边,中间间隔均匀;
- 主轴水平:垂直居中 主轴垂直:水平居中 (示例主轴水平)由
flex-direction: column决定主轴方向
flex-direction决定主轴方向: row(默认值)
justify-content控制主轴对齐方式
align-items控制交叉轴对齐方式 或者align-content(多行时)
自定义属性
data-xxx
弹性盒子的空间比例
flex:1 /*占据剩余空间*/
flex:1;
flex:2;/*按1:2比例占据剩余空间*/
3 对象大小设置
一种更方便的字体设置
html { font-size: 12px;} /*后续推荐使用rem单位*/
html {
}
*,
*::before,
*::after {
box-sizing: inherit;
}
a { font-size: 1.5rem} /*一个rem表示一个12px*/
4 一般的CSS前置模板
/* 重置样式 *号代表通用选择器 匹配所有元素 */
*{ margin: 0; padding: 0;}
html { font-size: 12px;
box-sizing: border-box;
} /*后续推荐使用rem单位*/
*,
*::before,
*::after {
box-sizing: inherit;
}
/* 恢复列表项的样式 */
ol, ul {
margin-left: 40px; /* 或其他适当的值 */
padding-left: 20px; /* 或其他适当的值 */
}
5 全局更改标准盒模型为代替盒模型
标准盒模型:元素宽度=内容+2*内边距+2*边框宽度
代替盒模型:元素宽/高度=width/height; 其他内边距调节不影响,只要width、height不变,宽、高就不变
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
6 CSS样式优先级及继承
标签选择器 < 类选择器 < id选择器
父元素的属性可集成到子元素,但前提是子元素没有该属性
但是使用通配符会提前给所有元素设置一个对应属性,原本没有该属性的子元素提前拥有了该属性
* {
font-family = "宋体";
}
父元素 {
font-family = "微软雅黑";
}
则父元素的字体设置会向子元素继承失败,因为子元素由通配符提前设置了属性
解决办法是强制继承属性
父元素 {
font-family = "宋体";
}
父元素<一个空格>* {
font-family:inherit;
}
7 百分比单位的计算依据
在CSS中,margin、padding、width、left、right、text-indent 等属性的百分比值都是相对于其父元素的宽度来计算的。以下是一些常见的例子:
-
margin 和 padding:
-
margin-top: 10%和padding-top: 10%都是基于父元素的宽度来计算,而不是高度。
-
-
width:
-
width: 50%是基于父元素的宽度来计算。
-
-
left 和 right:
-
left: 20%和right: 20%是基于父元素的宽度来计算。
-
-
text-indent:
-
text-indent: 10%是基于父元素的宽度来计算。
-
需要注意的是,height、top、bottom 等属性的百分比值则是相对于其父元素的高度来计算的。例如:
-
height: 50%是基于父元素的高度来计算。 -
top: 10%和bottom: 10%也是基于父元素的高度来计算。
8 img标签的样式细节
object-fit: 'contain' // 保持宽高比 保持原图不缩放显示 可能会在容器中留下空白区域
object-fit: cover // 保持图片的原始宽高比 图片会填满整个容器 可能会裁剪掉图片的部分内容相当于"填满容器但可能裁剪"
9 CSS的移动坐标系 translateX translateY

经典的和父元素中心重合方法:
将父元素的position设置为:relative
子元素设置:
position:absolute
top:50%
left:50%
transform(-50%, -50%)
10 ::after ::before 伪元素
有.katex::after 和 .katex::before ,在.katex的渲染位置之前或之后插入新元素,但新元素没有类名,所以无视CSS中:not(.katex *)的约束
可以使用content变量插入
- 字符串
- 图片
- 空白
- 计数器
11 正确的deep()用法
.layout-demo :deep(.arco-layout-header) {
height: 64px;
line-height: 64px;
background: var(--color-bg-3);
}
12 在按钮:hover伪类中的颜色修改无法传递到内部SVG
原因是按钮的color颜色直接继承给了SVG,而hover无法继承
直接用后代选择器更改即可
.voice-listen-btn:hover svg{
cursor: pointer;
transition: all 0.3s ease;
color: #019a32;
}
13 增加选择器的特殊性
当有多个选择器选择同一个元素时,多个选择器中特殊性最大的选择器最终决定元素的样式,其他选择器的样式都会被覆盖。
如何增加选择器的特殊性?
- 增加选择器的数量
每增加一个类选择器(class)、属性选择器([attr])或 伪类(:hover),特殊性都会提高。
/* 特殊性:10 (1个类) */
.my-class { color: red; }
/* 特殊性:20 (2个类) */
.container .my-class { color: blue; }
/* 特殊性:30 (3个类) */
body .container .my-class { color: green; }
- 使用 ID 选择器(特殊性最高)
ID 选择器(#id)的特殊性远高于类选择器(100 vs 10)
/* 特殊性:10 (1个类) */
.my-class { color: red; }
/* 特殊性:100 (1个ID) */
#my-id { color: blue; } /* 这个会覆盖上面的.my-class */
- 内联样式(特殊性最高,但不推荐)
直接在 HTML 元素上写style=""的特殊性最高(1000),但会破坏 CSS 的可维护性
<div style="color: red;">这个优先级最高</div>
- 使用 !important(慎用)
!important 会强制覆盖其他样式,但滥用会导致维护困难。
.my-class { color: red !important; /* 强制生效 */ } - 组合选择器提高特殊性
结合 类、ID、属性选择器 来增加特殊性
/* 特殊性:110 (1个ID + 1个类) */
#header .my-class { color: blue; }
/* 特殊性:111 (1个ID + 1个类 + 1个属性选择器) */
#header .my-class[data-active] { color: green; }
14 常见伪类辨析
| 伪类/状态 | 触发条件 | 常见混淆点 |
|---|---|---|
| :active | 鼠标按下期间 | 容易和 :focus(聚焦)或 :checked(选中)混淆 |
| :focus | 元素获得焦点(如键盘Tab选中)单div没有 仅限:表单控件(<input>、<select>、<button>等)链接(<a href>)可编辑元素(<div contenteditable>)带有 tabindex 属性的元素 |
和 :active 无关 |
| :checked | 单选框/复选框被选中 | 需要用户点击但不要求按住 |
| :selected | 无此伪类(CSS中不存在) | 可能误认为是 :checked 或 :active |
| :focus-within | 某个元素或其任意子元素获得焦点(:focus)时,为该元素应用样式 | - |
15 网格布局
Grid 布局,即网格布局,是一种强大的 CSS 布局模型,它让你能够轻松地创建二维网格容器和项目。下面为你详细介绍 Grid 布局的使用方法:
1. 创建网格容器
要使用 Grid 布局,首先要把一个元素指定为网格容器。这可以通过设置其 display 属性为 grid 或者 inline-grid 来实现。
.grid-container {
display: grid;
}
2. 定义网格轨道
网格轨道指的是网格的行和列。你可以使用 grid-template-columns 和 grid-template-rows 属性来定义它们。
.grid-container {
display: grid;
grid-template-columns: 100px 200px 100px; /* 定义三列,宽度分别为 100px、200px 和 100px */
grid-template-rows: 50px 100px; /* 定义两行,高度分别为 50px 和 100px */
}
你还能使用 fr 单位(分数单位)来按比例分配空间。
.grid-container {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* 三列,中间列宽度是两边列的两倍 */
}
3. 定义网格间距
你可以使用 grid-column-gap、grid-row-gap 或者 grid-gap(在 CSS Grid Level 2 中已被 column-gap、row-gap 和 gap 替代)来设置网格项之间的间距。
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px; /* 设置行和列之间的间距为 10px */
}
4. 放置网格项
网格项是网格容器的子元素。你可以使用 grid-column 和 grid-row 属性来指定网格项在网格中的位置。
.grid-item {
grid-column: 1 / 3; /* 从第 1 列线开始,到第 3 列线结束 也就是占据1-2列*/
grid-row: 1 / 2; /* 从第 1 行线开始,到第 2 行线结束 */
grid-row: 1 / span 2; 占据1-2行
}
5. 示例代码
以下是一个完整的 HTML 和 CSS 示例,展示了如何使用 Grid 布局创建一个简单的网格。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
.grid-item {
background-color: #e0e0e0;
padding: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">Item 3</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">Item 5</div>
<div class="grid-item">Item 6</div>
</div>
</body>
</html>
在这个示例中,我们创建了一个包含三列的网格容器,并且在容器中放置了六个网格项。每个网格项都有一个灰色的背景和一些内边距。
6. 其他高级特性
-
网格区域:你可以使用
grid-template-areas属性定义网格区域,并使用grid-area属性将网格项放置到这些区域中。 -
自动布局:使用
grid-auto-columns和grid-auto-rows属性来定义自动生成的行和列的大小。 -
对齐和分布:使用
place-items、place-content、align-items、align-content、justify-items和justify-content属性来控制网格项和内容的对齐方式。
通过以上步骤,你就可以使用 Grid 布局创建出复杂而灵活的网页布局。
7 所有块级元素和行内元素
- 块级元素
默认占满父容器宽度
高度由内容撑开
可设置 width、height、padding、border、margin,且所有方向(上下左右)均生效
结构类
<div> <header> <footer>
<main> <section> <article>
<aside> <nav>
文本容器类
<p> <h1> ~ <h6> <blockquote>
<pre>
列表类
<ul>、<ol>、<li>
<dl>、<dt>、<dd>
表格类
<table>
<tr>、<thead>、<tbody>、<tfoot>
表单类
<form>
<hr>(水平线)
<address>
- 行内元素
默认不可设置宽度,其宽度由内容决定
高度由内容撑开
设置display: inline-block; /* 保留行内特性,同时支持宽高 */
文本类
<span> <a>(超链接)
<strong>、<b>(加粗)
<em>、<i>(斜体)
<code>(代码)
<br>(换行)
表单类
<input> <button> <label>
<select> <textarea>
媒体类
<img>
<svg>
其他
<sup>、<sub>(上标/下标)
<time>
8 CSS层叠上下文

9 Grid布局产生的隐藏层叠关系
我想给父元素的背景创建一个毛玻璃滤镜:
<a-layout-content class="contact-content" :style="{
backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})`: 'unset',
backgroundSize: 'cover',
backgroundAttachment: 'fixed', // 固定背景图片
backgroundPosition: 'center', // 确保居中定位
overflow: 'hidden',
position: 'relative',
}">
<RoleInfo></RoleInfo>
<div class="test">
<p class="test-content">测试内容</p>
</div>
<button class="test-btn">testButton</button>
</a-layout-content>
使用伪类创建毛玻璃滤镜:
.contact-content::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/*filter: blur(10px);*/
backdrop-filter: blur(100px);
z-index: 0;
}
一般的方式先在父元素处创建层叠上下文
position: 'relative';
z-index:0;
然后给伪类设置z-index;
position:'absolute'
z-index:-1;
因为伪类的z-index -1高于父元素的背景层级,但又小于其他子元素(z-Index:auto),所以可以实现只针对父元素背景的虚化,而子元素不受影响,如下所示

但如果删除父元素处设置的
z-index:0
<a-layout-content class="contact-content" :style="{
backgroundImage: backgroundImageUrl ? `url(${backgroundImageUrl})`: 'unset',
backgroundSize: 'cover',
backgroundAttachment: 'fixed', // 固定背景图片
backgroundPosition: 'center', // 确保居中定位
overflow: 'hidden',
position: 'relative'
}">
其他不变,伪类就会失去虚化效果

这是因为丢失了基于父元素的层叠上下文,而因为
backdrop-filter的属性特性,其层叠基于全局的DOM渲染关系。因为z-index: -1;的层级几乎就是最后面,其他元素就把它覆盖了
如果把伪类改为z-index:0,伪类就会虚化几乎所有子元素:

因为
z-index:0在z-index:auto之前
- Grid的特殊情况
在删除父元素z-index的情况下,设置滤镜z-index:0,其他子元素设置为:
.contact-content * {
position: relative;
z-index: 1;
}
也能实现只虚化背景

但如果最上方子元素改为
grid布局,其他block子元素布局不变,再将子元素层级设置为
.contact-content * {
z-index: 1;
}
虚化效果为:

Grid子元素只有背景被虚化,说明z-index属性在Grid布局的元素中生效了,而且只有背景被虚化
但其他block元素没有设置position属性,又不是grid布局,所以z-index无效,仍是z-index: auto,在DOM中,处于滤镜下方,就被虚化了
将block元素的改为grid布局后,其他不变

其他
grid布局元素也只有背景被虚化了
应用场景:当背景虚化影响子元素阅读时,可以把子元素改为
grid布局,同增加一个纯色背景,滤镜会把子元素的纯色背景和父元素的背景一起虚化,美观的同时,子元素的纯色虚化背景还能增强其阅读性。
虚化和层级控制本质
- 虚化
CSS 的 filter 属性会对元素及其所有子元素产生影响,包括 .son 元素和其中的文字。当你在 .father 上应用 blur(50px) 时,整个父元素及其内容都会被模糊处理。而backdrop-filter只虚化该元素的背后所有元素 - 层级控制
z-index 属性只对定位元素(position 值为 relative、absolute、fixed 或 sticky 的元素)有效。如果 .son 不设置定位,它的 z-index 会被忽略,导致内容层可能被模糊的背景层遮挡。
10 父block div控制子元素居中
父元素设置为display: block时,可以通过text-align属性控制其行内级子元素的水平对齐方式
但text-align 只能直接影响父元素内的行内级子元素(如inline, inline-block, inline-flex, 文字等)。
如果子元素是block或float布局,text-align 无效
- 控制单行文本垂直居中 父元素block
.element {
height: 40px; /* 容器高度 */
line-height: 40px; /* 行高 = 容器高度 */
}
11 常用指针样式
在 CSS 中,cursor 属性用于定义鼠标指针的样式。以下是 常用的指针样式 及其适用场景:
1. 基础指针样式
| 值 | 效果 | 适用场景 |
|---|---|---|
default |
默认箭头(🖱️) | 常规操作 |
pointer |
手型(👆) | 可点击元素(按钮/链接) |
text |
文本选择(I 型) | 可编辑或可选择的文本 |
move |
十字箭头(✥) | 可拖拽元素 |
wait |
加载中(⏳) | 系统繁忙时 |
not-allowed |
禁止(🚫) | 禁用状态(如灰色按钮) |
2. 滚动相关
| 值 | 效果 | 适用场景 |
|---|---|---|
grab |
手掌张开(🖐️) | 元素可被拖拽(如地图) |
grabbing |
手掌抓取(🤚) | 拖拽过程中 |
3. 调整尺寸
| 值 | 效果 | 适用场景 |
|---|---|---|
col-resize |
左右调整(↔️) | 列宽调整(如表格分隔线) |
row-resize |
上下调整(↕️) | 行高调整 |
nesw-resize |
斜向调整(↖️↘️) | 元素角落拉伸 |
nwse-resize |
斜向调整(↗️↙️) | 元素角落拉伸 |
4. 特殊场景
| 值 | 效果 | 适用场景 |
|---|---|---|
zoom-in |
放大镜(🔍+) | 图片放大 |
zoom-out |
缩小镜(🔍-) | 图片缩小 |
context-menu |
上下文菜单(🖱️+📋) | 右键菜单触发 |
5. 自定义指针
.custom {
cursor: url('path/to/cursor.png'), auto;
}
-
自定义图片:支持
.png、.cur等格式。 -
回退方案:逗号后指定备用样式(如
auto)。
