搜索

CSS 教学

基本介绍

认识 CSS 开始使用 CSS CSS 语法规则 CSS 命名原则 CSS 常用样式属性

CSS 选择器

认识 CSS 选择器 优先级 ( 权重 ) 样式继承与联集 使用巢状结构语法 元素选择器 ID 和 Class 选择器 属性选择器 文件结构选择器 虚拟类别选择器 ( 结构 ) 虚拟类别选择器 ( 类型 ) 虚拟类别选择器 ( 输入 ) 虚拟类别选择器 ( 行为 ) 虚拟类别选择器 ( 超链接 ) 虚拟类别选择器 ( 逻辑 ) 虚拟类别选择器 ( 其他 ) 虚拟元素选择器 群组与组合选择器

数值与单位

全域关键字与文字数值 长度与角度单位 位置名称与时间单位 特殊样式属性 ( all、appearance)

规则与定义

变数 ( Variables ) 媒体查询 ( @media ) 容器查询 ( @container ) 自订属性值 ( @property ) 导入样式 ( @import ) 分层优先级 ( @layer ) 选择器作用域 ( @scope ) 定义字型 ( @font-face ) 计数规则 ( @counter-style ) 打印网页 ( @page )

函数类型

数学计算 文字与清单计数 形状与线段 路径 ( path )

颜色与滤镜

颜色单位 色彩模型 相对颜色 渐层色 图像滤镜 ( filter ) 背景滤镜 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字与段落

设定字型 ( font-family ) 使用外部字型 文字尺寸 文字样式 ( 常用 ) 文字样式 ( 其他实用 ) 文字样式 ( 特殊用途 ) 文字换行 文字空白与 Tab 大小 文字行高与缩排 文字水平与垂直对齐 文字书写方向 文字自动分栏 使用 Color Font ( 彩色字型 ) 使用 Icon Font ( 图示文字 ) 制作自己的 Icon Font 显示生成内容与引号

元素容器

容器显示类型 ( display ) 元素 display 对照表 盒子模型 ( Box Model ) 宽高尺寸 ( width、height ) 显示与比例 ( box-sizing、aspect-ratio ) 内边距 ( padding ) 外边界 ( margin ) 边框 ( border ) 边框圆角 ( border-radius ) 图像边框 ( border-image ) 轮廓 ( outline ) 内容溢出与裁切 ( overflow ) 内容范围 ( contain ) 可见性与透明度 缩放与调整 ( zoom、resize )

背景与阴影

背景 ( 背景色、背景裁切 ) 背景图 ( 定位、尺寸 ) 背景图 ( 固定、重复 ) 背景图 ( 多重背景、混合 ) 背景缩写 ( background ) 容器阴影 ( box-shadow )

清单与表格

清单样式 清单计数器 表格基本样式 表格边框重叠与间距 表格内容宽度与对齐

基本排版与定位

元素排版方式 浮动 ( float ) 浮动形状 ( shape-* ) 定位 ( position ) 逻辑属性 ( logical properties ) 重置 CSS ( Reset CSS ) 水平置中技巧 垂直置中技巧

Flex 弹性排版

Flexbox 弹性盒子 Flex 对齐方式 Flex 弹性伸缩

Grid 网格排版

Grid 网格容器与格线 Grid 网格空间与命名 Grid 网格流向与间距 Grid 排列网格项目 Grid 项目对齐与顺序

转场与动画

转场 ( transition ) 转场触发事件 动画 ( animation ) 自订动画路径 ( offset ) 动画触发事件 多重动画的权重与顺序 动画进度控制 ( timeline )

变形、裁切与遮罩

裁切路径 ( clip-path ) 图像遮罩 ( mask ) 对象填满方式与定位 转换函数 ( transform ) 平移、旋转与缩放 3D 转换与透视

视窗与用户行为

卷轴样式 ( scrollbar ) 拉霸、滑杆样式 ( slider ) 鼠标光标图示 ( cursor ) 鼠标事件 ( pointer-events ) 用户选取 ( user-select ) 卷动行为 ( scroll、overscroll ) 打印换页 ( break-* )

CSS 预处理器

认识 CSS 预处理器 Less ( 安装、开始使用 ) Less ( 巢状结构、选择器 ) Less ( 变数、import ) Less ( Extend、Mixin ) Less ( 逻辑、循环、函数 )

范例效果

CSS 多重绕圈 3D 动画 CSS 圆饼图 CSS 跑马灯 Google 加载动画 电子时钟数字 渐层色的转场与动画 渐层色制作星空背景 渐层色边框 渐层色制作图案背景 不规则形状动画 弹跳的正方形动画 3D 正多面体 超链接底线动画效果 恶心黏黏球效果 CSS 视差滚动效果 卷轴控制放射形选单 卷轴改变文字背景色 CSS 页面卷动进度条 CSS 水波效果 圆点加载动画 ( 阴影动画 ) 字母翻牌效果 探照灯动画 立体双色跑马灯 楼梯文字动态效果 渐层色文字、双色文字 流动色彩文字 空心文字、文字水波背景 左右倾斜的背景效果 Icon 图示形状变换 故障文字效果 按钮的多种 hover 效果 点击展开或收折的选单 点击爱心图案放射效果 纯 CSS 数字加载进度条 纯 CSS 码表 ( 可计时 )

虚拟类别选择器 ( 结构 )

虚拟类别选择器是根据“元素的状态”来选取元素,这篇教学会介绍透过元素在“文件结构”中的“位置”状态,进行选取元素的虚拟类别选择器,这类型的选择器有 :root、:empty、:first-child、:last-child、:nth-child(n)、:nth-last-child(n) 和 :only-child,都是非常方便实用的选择器。

CSS 教学 - 虚拟类别选择器 ( 结构位置 )

教学影片

搭配教学影片一起阅读,效果会更好!欢迎大家订阅 STEAM 教育学习网的 Youtube 频道。

前往:https://www.youtube.com/@steam.oxxostudio

“结构位置”虚拟类别选择器

下方列出和“结构位置”有关的虚拟类别选择器 ( 支援度 All 表示主流浏览器都支援 ):

虚拟类别选择器 说明 支援度
:root 文件根元素,如果是 html 文件就是 html 元素。 All
:empty 元素里没有任何元素、字元或换行。 All
:first-child 同一层元素里的第一个元素。 All
:last-child 同一层元素里的最后一个元素 All
:nth-child(n) 同一层元素里,从头数来第 n 个元素。 All
:nth-last-child(n) 同一层元素里,倒数第 n 个元素。 All
:only-child 同一层只有自己一个元素。 All

:root

“:root”表示文件的“根元素”,在网页 HTML 文件里通常指的是“html”元素,但由于网页有时并非完全由 HTML 构成,有些时候会使用 XML 或 RSS,对应的根元素就会不相同,下方的 CSS 会让 html 元素的背景变成灰色。

:root {background: gray;}

:empty

“:empty”表示“空元素”,泛指“元素里没有任何元素、字元或换行”,有时透过程序自动产生的网页,或一些特殊需求的网页,会多出一些没有任何内容的元素,透过 :empty 选取这些元素后,搭配“display: none;”的样式,就能隐藏这些不应该存在的空元素,如此一来就不用特别透过 JavaScript 来清除这些元素。

:empty {display: none;}

除了隐藏空元素的功能,也可以透过样式的设定,替空元素加上特殊样式,例如下方的 CSS 会将所有的空元素加上灰色背景,但如果是“空的 div 元素”,就会变成红色背景。

线上展示:https://codepen.io/oxxo/pen/GRapWMq

<!--  HTML 程式碼 -->
<h2></h2>
<h3></h3>
<div></div>

<!--  CSS 程式碼 -->
<style>
  * {width: 100px; height: 50px;}  /* 所有元素的寬 100px 高 50px */
  :empty {background: gray;}       /* 所有空元素的背景灰色 */
  div:empty {background: red;}     /* 所有空元素是 div,背景紅色 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :empty 空元素

:first-child

“:first-child”表示“同一层里的第一个元素”,下方的 CSS 会将 body 里,所有元素中的第一个子元素都变成红色文字,注意,如果直接写“* :first-child”,会造成 body 里的第一个元素也会变成红色。

线上展示:https://codepen.io/oxxo/pen/dyEYgdW

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li>           <!-- ul 裡第一個子元素 -->
  <li>orange</li>
  <li>banana</li>
</ul>
<div>
  <h2>oxxo.studio</h2>     <!-- div 裡的第一個子元素 -->
  <h3>hello world!!</h3>
  <span><em>Yes</em> or <em>No</em></span>  <!-- 第一個 em 為 span 裡第一個子元素 -->
</div>

<!-- CSS 程式碼 -->
<style>
  body * :first-child {color: red;}  /* body 裡所有元素中的第一個子元素呈現紅色文字 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :first-child 同一层的第一个元素

除了单除使用 :first-child,如果在“开头加上元素名称”,就会表示“指定的元素的第一个”,以下方的 CSS 为例,就会单独将第一个 li 变色,而不会影响到其他的元素。

body * li:first-child {color: red;}  /* body 裡所有元素中的第一個 li 呈現紅色文字 */

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - 标签:first-child

如果在“没有指定元素名称”的状况下使用 :first-child,需要注意浏览器在渲染网页时,会自动添加一些“隐藏元素”,例如 table 元素就有隐藏了一个 tbody 元素,如果单纯使用 table *:first-child,会发生内容元素全部套用样式的状况,因为 table 的第一个子元素是隐藏的 tbody,如果要解决这个问题,就需要明确定义元素名称。

线上展示:https://codepen.io/oxxo/pen/vYwNQab

<!-- HTML 程式碼 -->
<table border="1">
  <tr>
    <td>AAA</td><td>BBB</td>
  </tr>
  <tr>
    <td>CCC</td><td>DDD</td>
  </tr>
</table>

<!-- CSS 程式碼 -->
<style>
  table :first-child {color: red;}
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :first-child 对于 隐藏元素

:last-child

“:last-child”表示“同一层里的最后一个元素”,下方的 CSS 会将 body 里,所有元素中的最后的子元素都变成红色文字,注意,如果直接写“* :last-child”,会造成 body 里的最后一个元素也会变成红色。

线上展示:https://codepen.io/oxxo/pen/yLWYQQM

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li> 
  <li>orange</li>
  <li>banana</li>    <!-- ul 裡最後一個子元素 -->
</ul>
<div>
  <h2>oxxo.studio</h2>     
  <h3>hello world!!</h3>
  <span><em>Yes</em> or <em>No</em></span>  <!-- div 裡的最後一個子元素 -->
</div>

<!-- CSS 程式碼 -->
<style>
  body * :last-child {color: red;}  /* body 裡所有元素中的最後一個子元素呈現紅色文字 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :last-child

除了单除使用 :last-child,如果在“开头加上元素名称”,就会表示“指定的元素的最后一个”,以下方的 CSS 为例,就会单独将最后一个 li 变色,而不会影响到其他的元素。

body * li:last-child {color: red;}  /* body 裡所有元素中的最後一個 li 呈現紅色文字 */

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - 标签:last-child

:nth-child(n)

“:nth-child(n)”表示“同一层元素里,从头数来第 n 个元素”,下方的 CSS 会将 body 里,所有元素中从头数来的第二个子元素都变成红色文字。

线上展示:https://codepen.io/oxxo/pen/bGyVQZE

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li> 
  <li>orange</li>        <!-- ul 裡第二個子元素 -->
  <li>banana</li>   
  <li>grape</li>   
</ul>
<div>
  <h2>oxxo.studio</h2>     
  <h3>hello world!!</h3>  <!-- div 裡的第二個子元素 -->
  <span><em>Yes</em> or <em>No</em></span>  <!-- No 是 span 裡第二個子元素 -->
  <a>Google</a>
</div>

<!-- CSS 程式碼 -->
<style>
  body * :nth-child(2) {color: red;} /* body 裡所有元素中從頭數來的第二個子元素呈現紅色文字 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-child(n)

除了单除使用 :nth-child(n),如果在“开头加上选择器”,就会表示“第二个且是特定元素”,以下方的 CSS 为例,就会单独将第二个 li 变色,而不会影响到其他的元素。

body * li:nth-child(2) {color: red;}  /* body 裡所有元素中的第二個元素,而且是 li,呈現紅色文字 */

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - 标签:nth-child(n)

因为 :nth-child(n) 表示“第几个”,不论该元素是什么都会按照顺序选取,而搭配选择器则是“判断条件”,也就是要同时满足“几个”和“选择器”才会选取成功,此外要特别注意,<br> 换行符也属于第几个元素的选取范围,下方范例虽然设定了 div:nth-child(3),但因为第三个元素是 span 就不会被选取,又因为 span:nth-child(4) 第四个元素是 span 就会选取成功。

线上展示:https://codepen.io/oxxo/pen/XJWZBER

<!-- HTML 程式碼 -->
<div>div 1 ( 實際是 nth-child(1) )</div>
<div>div 2 ( 實際是 nth-child(2) )</div>
<span>span 1 ( 實際是 nth-child(3) )</span>
<span>span 2 ( 實際是 nth-child(4) )</span>
<br> ( 換行符號也算,實際是 nth-child(5)  )
<div>div 3 ( 實際是 nth-child(6) )</div>
<div>div 4 ( 實際是 nth-child(7) )</div>
<span>span 3 ( 實際是 nth-child(8) )</span>
<div>div 5 ( 實際是 nth-child(9) )</div>
<div>div 6 ( 實際是 nth-child(10) )</div>

<!-- CSS 程式碼 -->
<style>
  div:nth-child(1){color: red;}
  div:nth-child(3){color: red;}
  span:nth-child(4){color: red;}
  div:nth-child(6){color: red;}
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-child(n) 注意事项

:nth-child(n) 里的 n 不仅可以只是数字,也可以使用奇数“odd”和偶数“even”这两个英文单字,使用后就会自动取得奇数项元素或偶数项元素。

线上展示:https://codepen.io/oxxo/pen/RwmWEow

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li> 
  <li>orange</li>        <!-- 偶數變色 -->
  <li>banana</li>   
  <li>grape</li>          <!-- 偶數變色 -->
  <li>papaya</li> 
  <li>coconut</li>       <!-- 偶數變色 -->
</ul>
<ol>
  <li>apple</li>         <!-- 奇數變色 -->
  <li>orange</li>        
  <li>banana</li>        <!-- 奇數變色 -->
  <li>grape</li>   
  <li>papaya</li>        <!-- 奇數變色 -->
  <li>coconut</li>  
</ol>

<!-- CSS 程式碼 -->
<style>
  ul li:nth-child(even) {color: red;}         /* 偶數變色 */
  ol li:nth-child(odd) {background: green;}  /* 三的倍數變色 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-child(n) odd even

如果单纯使用 n,也可当作一个“根据 An+B 公式自动扩展的序列”( n 从 1 开始计算 ),例如“2n”就等于“2,4,6,8....”,又或者“2n+2”就是“4,6,8,10...”,例如下方的例子,ul 里偶数的 li 会是红色,ol 里的 li 则会使用三的倍数作为间隔变色。

线上展示:https://codepen.io/oxxo/pen/eYapQwe

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li> 
  <li>orange</li>        <!-- 偶數變色 -->
  <li>banana</li>   
  <li>grape</li>          <!-- 偶數變色 -->
  <li>papaya</li> 
  <li>coconut</li>       <!-- 偶數變色 -->
</ul>
<ol>
  <li>apple</li> 
  <li>orange</li>        
  <li>banana</li>        <!-- 三的倍數變色 -->
  <li>grape</li>   
  <li>papaya</li> 
  <li>coconut</li>       <!-- 三的倍數變色 -->   
</ol>

<!-- CSS 程式碼 -->
<style>
  ul li:nth-child(2n) {color: red;}         /* 偶數變色 */
  ol li:nth-child(3n) {background: green;}  /* 倒數奇數變色 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-child(n) 据简单公式自动扩展的序列

:nth-last-child(n)

“:nth-child(n)”表示“同一层元素里,倒数第 n 个元素”,下方的 CSS 会将 body 里,所有元素中倒数第二个子元素都变成红色文字。

线上展示:https://codepen.io/oxxo/pen/JjqYwXw

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li> 
  <li>orange</li> 
  <li>banana</li>       <!-- ul 裡倒數第二個子元素 -->   
  <li>grape</li>   
</ul>
<div>
  <h2>oxxo.studio</h2>     
  <h3>hello world!!</h3>
  <span><em>Yes</em> or <em>No</em></span>  <!-- div 裡倒數第二個子元素 -->
  <a>Google</a>
</div>

<!-- CSS 程式碼 -->
<style>
  body * :nth-last-child(2) {color: red;} /* body 裡所有元素中從頭數來的第二個子元素呈現紅色文字 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-last-child(n)

除了单除使用 :nth-last-child(n),如果在“开头加上选择器”,就会表示“倒数第二个,且是特定选择器”,以下方的 CSS 为例,就会单独将倒数第二个且是 li 的元素变色,而不会影响到其他的元素。

body * li:nth-last-child(2) {color: red;}  /* body 裡所有元素中倒數第二個且是 li 呈現紅色文字 */

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - 标签:nth-last-child(n)

:nth-last-child(n) 里的 n 不仅可以只是数字,也可以使用奇数“odd”和偶数“even”这两个英文单字,使用后就会自动“倒数”取得奇数项元素或偶数项元素。

线上展示:https://codepen.io/oxxo/pen/NWVGedp

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li>         <!-- 倒數偶數變色 -->
  <li>orange</li> 
  <li>banana</li>        <!-- 倒數偶數變色 -->  
  <li>grap</li>
  <li>papaya</li>        <!-- 倒數偶數變色 --> 
  <li>coconut</li>
</ul>
<ol>
  <li>apple</li> 
  <li>orange</li>        <!-- 倒數奇數變色 -->       
  <li>banana</li>
  <li>grap</li>          <!-- 倒數奇數變色 -->
  <li>papaya</li>
  <li>coconut</li>       <!-- 倒數奇數變色 -->
</ol>

<!-- CSS 程式碼 -->
<style>
  ul li:nth-last-child(even) {color: red;}         /* 倒數偶數變色 */
  ol li:nth-last-child(odd) {background: green;}   /* 倒數奇數變色 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-last-child(n) odd even

如果单纯使用 n,也可当作一个会“根据 An + B 公式自动扩展的序列”( n 从 1 开始计算 ),例如“2n”就等于“...8,6,4,2”,又或者“2n+2”就是“...10,8,6,2”,例如下方的例子,ul 里倒数偶数的 li 会是红色,ol 里的 li 则会使用三的倍数作为倒数间隔变色。

线上展示:https://codepen.io/oxxo/pen/GRapPWp

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li>         <!-- 倒數偶數變色 -->
  <li>orange</li>
  <li>banana</li>        <!-- 倒數偶數變色 --> 
  <li>grape</li>   
  <li>papaya</li>        <!-- 倒數偶數變色 -->
  <li>coconut</li>
</ul>
<ol>
  <li>apple</li>         <!-- 倒數三的倍數變色 -->
  <li>orange</li>        
  <li>banana</li>
  <li>grap</li>          <!-- 倒數三的倍數變色 --> 
  <li>papaya</li> 
  <li>coconut</li>  
</ol>

<!-- CSS 程式碼 -->
<style>
  ul li:nth-last-child(2n) {color: red;}         /* 倒數偶數變色 */
  ol li:nth-last-child(3n) {background: green;}  /* 倒數三的倍數變色 */
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :nth-last-child(n) 据简单公式自动扩展的序列

:only-child

“:only-child”表示“同一层只有自己一个元素”,下方的 CSS 会将 body 里,所有元素中只有一个子元素的子元素变成红色文字。

线上展示:https://codepen.io/oxxo/pen/dyEYwZb

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li>
  <li>orange</li>
  <li>banana</li> 
  <li>grape</li>   
</ul>
<div>
  <h2>OXXO.STUDIO</h2>     <!-- 只有一個子元素,變色 -->
</div>
<div>
  <h3>Hello World!!</h3>   <!-- 只有一個子元素,變色 -->
</div>
<span><em>Yes</em> or <em>No</em></span>


<!-- CSS 程式碼 -->
<style>
  body * :only-child {color: red;}
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :only-child

除了单除使用 :only-child,如果在“开头加上元素名称”,就会表示“子元素只有一个指定元素”,以下方的 CSS 为例,就会单独只有一个 h2 的 h2 变色,而不会影响到其他的元素。

body * h2:only-child {color: red;}  /* body 裡所有元素中只有一個 h2 的 h2 變色 */

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - 标签:only-child

不过 :only-child 只针对有被标签包覆的“元素”有作用,如果父元素里有“纯文字”,因为没有被标签包覆的缘故,纯文字不属于元素,也就不会影响 :only-child 的判读,下方的范例中虽然 h3 后方有其他文字,但 h3 仍然会变色。

<!-- HTML 程式碼 -->
<ul>
  <li>apple</li>
  <li>orange</li>
  <li>banana</li> 
  <li>grape</li>   
</ul>
<div>
  <h3>Hello World!!</h3>   <!-- 只有一個子元素,變色 -->
  我是純文字呦               <!-- 同一層裡有純文字 -->
</div>
  <span><em>Yes</em> or <em>No</em></span>

<!-- CSS 程式碼 -->
<style>
  body * :only-child {color: red;}
</style>

CSS 教学 - 虚拟类别选择器 ( 文件结构 ) - :only-child 旁边有纯文字

小结

CSS 和文件结构相关的虚拟类别选择器非常好用,不但可以根据结构快速选取元素,更可以协助减少许多 JavaScript 逻辑判断选取的功能,如果妥善运用,一定可以大幅简化 CSS 程序码,实现更好的排版方式与提升页面效能。

意见反馈

微信二维码 微信扫码关注 抖音二维码 抖音扫码关注