搜索

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 码表 ( 可计时 )

显示生成内容与引号

CSS 的“生成内容 content”是相当特殊的样式属性,这两个样式只能套用在特定选择器,也不会负责“样式”,而是会产生额外元素的“内容”,这篇教学会介绍生成内容 content 与引号 quotes 的用法,还有鲜少人使用的关键字 before-quote、after-quote 读取引号值,或搭配虚拟元素加入引号。

快速导览:

CSS 教学 - 生成内容 content 与引号 quotes

教学影片

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

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

生成内容 content

生成内容 content 是专属于特定“虚拟元素”的样式属性,没有继承特性,只针对“::before、::after、::marker”这三个虚拟元素有作用,如果套用于虚拟元素之外的元素不会有任何作用。而所谓的“生成内容”并不是生成式 AI,而是会根据用户输入的内容,或读取元素特定属性值而产生的内容。

更多参考:虚拟元素选择器 ( 伪元素 )

下方范例会使用 content 搭配虚拟元素,就能在元素的前后加上内容,或将清单标记修改成用户输入的内容。

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

<!-- HTML 程式碼 -->
<h3 class="a">apple</h3>
<h3 class="b">banana</h3>
<ul>
  <li>coconut</li>
  <li>papaya</li>
  <li>pineapple</li>
</ul>

<!-- CSS 程式碼 -->
<style>
  h3 {margin: 5px;}
  .a::before {
    color: red;
    content: '(oxxo)';  /* 元素前方加上 (oxxo) 文字 */
  }
  .b::after {
    color: red;
    content: '(oxxo)';  /* 元素後方加上 (oxxo) 文字 */
  }
  li::marker {
    color: orange;
    content: "$"       /* 將清單符號修改為 $ */
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 在元素的前后加上内容

content 搭配 attr()

使用 content 最常见的用法之一,就是搭配 attr() 函数“显示元素属性” ( attr() 过去只能针对虚拟元素使用,目前已有部分浏览器支援全部属性使用 ),下方范例会读取元素本身的属性,再将属性变成文字呈现在画面中。

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

<!-- HTML 程式碼 -->
<h3 class="a" name='oxxo'>apple</h3>
<h3 class="b" title="oxxo">banana</h3>
<ul>
  <li icon="㊙️">coconut</li>
  <li icon="💩">papaya</li>
  <li icon="🔥">pineapple</li>
</ul>

<!-- CSS 程式碼 -->
<style>
  h3 {margin: 5px;}
  .a::before {
    color: red;
    content: attr(name);  /* 讀取元素 name 屬性內容 */
  }
  .b::after {
    color: red;
    content: attr(title);  /* 讀取元素 title 屬性內容 */
  }
  li::marker {
    color: orange;
    content: attr(icon);  /* 讀取元素 icon 屬性內容 */
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 搭配 attr()

content 搭配 url()

除了显示“文字”,content 也可以搭配 url() 函数显示图片,但是使用 url() 所显示的图片无法修改长宽大小,所以这种用法也比少见。

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

<!-- HTML 程式碼 -->
<h3 class="a">apple</h3>
<h3 class="b">banana</h3>
<ul>
  <li icon="㊙️">coconut</li>
  <li icon="💩">papaya</li>
  <li icon="🔥">pineapple</li>
</ul>

<!-- CSS 程式碼 -->
<style>
  h3 {margin: 5px;}
  .a::before,
  .b::after,
  li::marker {
    content: url(https://steam.oxxostudio.tw/download/css/list-style-image-01.jpg);
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 搭配 url()

content 搭配 counter()、counters()

参考“清单计数器 counter()、counters()”教学,content 也可以搭配计数器函数 counter()、counters(),实作按照顺序出现的数字,或按照顺序出现的字母或符号,下方范例呈现两种函数产生数字或字母的做法:

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

<!-- HTML 程式碼 -->
<div class="d1">
  <h3 class="a">apple</h3>
  <h3 class="b">banana</h3>
  <ul>
    <li icon="㊙️">coconut</li><li icon="💩">papaya</li><li icon="🔥">pineapple</li>
  </ul>
</div>
<div class="d2">
  <h3 class="a">apple</h3>
  <h3 class="b">banana</h3>
  <ul>
    <li icon="㊙️">coconut</li><li icon="💩">papaya</li><li icon="🔥">pineapple</li>
  </ul>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    counter-reset: oxxo;     /* 定義計數器名稱和初始值 */
    float: left;
    border: 1px solid #000;
    margin: 5px;
  }
  h3, li {
    margin: 5px;
    counter-increment: oxxo; /* 每出現一次 h3 或 li 就將 oxxo 增加 1 */
  }
  .d1 .a::before,
  .d1 .b::after,
  .d1 li::marker {
    color: red;
    content: counter(oxxo);  /* 顯示計數器數值 */
  }
  .d2 .a::before,
  .d2 .b::after,
  .d2 li::marker {
    color: red;
    content: counters(oxxo,"",upper-alpha);  /* 顯示計數器數值對應的字母 */
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 搭配 counter()、counters()

content 组合多种内容

content 除了单纯使用文字、数值或函数,也可以将这些全部组成成一串字串,数字或文字使用“引号”包覆,函数直接撰写韩式名称与参数,彼此之间使用“空白分隔”进行组合,下方范例会将手动输入的文字、标点符号,组合元素本身的属性以及计数器数字。

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

<!-- HTML 程式碼 -->
<div class="d1">
  <h3 class="a" name="oxxo">apple</h3>
  <h3 class="b" name="xoox">banana</h3>
  <ul>
    <li icon="㊙️">coconut</li><li icon="💩">papaya</li><li icon="🔥">pineapple</li>
  </ul>
</div>
<div class="d2">
  <h3 class="a" name="oxxo">apple</h3>
  <h3 class="b" name="xoox">banana</h3>
  <ul>
    <li icon="㊙️">coconut</li><li icon="💩">papaya</li><li icon="🔥">pineapple</li>
  </ul>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    counter-reset: oxxo;
    float: left;
    border: 1px solid #000;
    margin: 10px;
  }
  h3, li {
    margin: 5px;
    counter-increment: oxxo;
  }
  .d1 .a::before,
  .d1 .b::after,
  .d1 li::marker {
    color: red;
    content: counter(oxxo) "." attr(name) attr(icon) ".ok.";
  }
  .d2 .a::before,
  .d2 .b::after,
  .d2 li::marker {
    color: red;
    content: counters(oxxo,"",upper-alpha) "." attr(name)attr(icon) ".ok.";
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 组合多种内容

content 显示引号、空白或反斜线

如果要在 content 里显示引号、空白或反斜线,则需要使用“跳脱字元”呈现,但仍需注意 content 无法呈现 HTML 标签,最终结果都是以字串呈现,下方列出常用的写法:

特殊符号 写法
单引号 \'
双引号 \"
反斜线 \\
空白、连续空白 \00a0
撰写时换行 \

下方范例会显示单引号、双引号、引号、空白、反斜线以及在 CSS 里换行的写法。

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

<!-- HTML 程式碼 -->
<h3 class="a">apple</h3>
<h3 class="b">apple</h3>
<h3 class="c">apple</h3>
<h3 class="d">apple</h3>
<h3 class="e">apple</h3>

<!-- CSS 程式碼 -->
<style>
  h3{margin: 5px;}
  h3::before {color: red;}
  .a::before{
    content: "\"\" "       /* 顯示雙引號 */
  }
  .b::before{
    content: "\' \' ";     /* 顯示單引號 */
  }
  .c::before{
    content: "\' \00a0\00a0\00a0 \" ";  /* 單引號雙引號與連續空白 */
  }
  .d::before{
    content: "\\\\\\\\ ";  /* 連續反斜線 */
  }
  .e::before{
    content: "hello\
      oxxo ";             /* 撰寫時換行 */
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - content 显示引号、空白或反斜线

引号 quotes

在 HTML 里被 q 标签所包覆的文字,会自动在前后加上“引号”,这个引号可以透过样式属性 quotes 修改,使其不单纯是双引号或单引号,quotes 具有继承特性,撰写时需要同时包含“两个属性值”,属性值使用引号包覆并用空白分隔,前方属性值代表前方引号,后方属性值代表后方引号,下方范例会透过 quotes 呈现各种不同引号效果。

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

<!-- HTML 程式碼 -->
<h3 class="a"><q>apple</q></h3>
<h3 class="b"><q>apple</q></h3>
<h3 class="c"><q>apple</q></h3>
<h3 class="d"><q>apple</q></h3>

<!-- CSS 程式碼 -->
<style>
  h3{margin: 5px;}
  .a{
    quotes: "<" ">";    /* 前後使用 < > 包覆引用文字 */
  }
  .b{
    quotes: "((" "))";  /* 前後使用 (( )) 包覆引用文字 */
  }
  .c{
    quotes: "💩" "💩";  /* 前後使用 💩 💩 包覆引用文字 */
  }
  .d{
    quotes: "\\\\" "\"\00a0\00a0\00a0\"";  /* 使用特殊字元包覆引用文字 */
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - 引号 quotes

quotes 也可以设定“多层引号”,只要让引号符号“两个为一组”,就会“由前到后”计算出每一层该用的引号符号,如果元素层级数量超过符号数量,内层会继续使用最后一个读取到的符号,下方范例会先设定三组共六个符号,接着套用到一层到四层的元素架构中显示。

<!-- HTML 程式碼 -->
<h3><q>apple</q></h3>
<h3><q>apple<q>banana</q></q></h3>
<h3><q>apple<q>banana<q>oxxo</q></q></q></h3>
<h3><q>apple<q>banana<q>oxxo<q>papaya</q></q></q></q></h3>
<h3><q>apple<q>banana<q>oxxo<q>papaya<q>coconut</q></q></q></q></q></h3>

<!-- CSS 程式碼 -->
<style>
  h3{
    margin: 5px;  
    quotes: "💩" "💩" "❤️" "❤️" "🔥" "🔥"; 
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - quotes 设定多层引号

读取引号 open-quote、close-quote

除了使用 quotes 可以定义引号,另外有两个针对虚拟元素 content 的引号关键字:open-quote 和 close-quote,这两个关键字有很专一的使用情境,open-quote 可以读取前方引号,必须搭配 ::before,close-quote 可以读取后方引号,必须搭配 ::after,如果没有摆放在正确的位置,就会无法显示。

下方范例会透过虚拟元素搭配这两个关键字,在不使用 q 元素的情况下。将其他元素的前后加上引号。

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

<!-- CSS 程式碼 -->
<style>
  div *::before {
    content: open-quote;
    color: red;
  }
  div *::after {
    content: close-quote;
    color: red;
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - open-quote、close-quote

如果有使用 quotes 定义引号,透过这两个关键字也可以读取所定义的引号值。

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

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

<!-- CSS 程式碼 -->
<style>
  div {
    quotes: "❤️" "❤️" "💩" "💩";
  }
  div *::before {
    content: open-quote;
    color: red;
  }
  div *::after {
    content: close-quote;
    color: red;
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - open-quote、close-quote 读取自订引号

如果透过虚拟元素搭配 open-quote、close-quote 建立引号,就要特别注意“巢状包覆”的状况,这时候虚拟元素的 ::before 会变成“前引号”,::after 会变成“后引号”,如果只使用了 ::before 而没有使用 ::after 结尾,在 ::before 后方所出现的引号就会是“内层”引号,下方的范例在 h1 使用了 ::before,但却在 h4 才用 ::after,这时候内容的引号就会变成内层引号,套用内层引号样式。

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

<!-- HTML 程式碼 -->
<div>
  <h1>我只有設定 ::before</h1>
  <h2>我設定了 ::before + ::after</h2>
  <h3>我只有設定 ::after</h3>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    quotes: "❤️" "❤️" "💩" "💩";
  }
  h1::before, h2::before {
    content: open-quote;
    color: red;
  }
  h2::after, h3::after {
    content: close-quote;
    color: red;
  }
</style>

CSS 教学 - 生成内容 content 与引号 quotes - open-quote、close-quote 巢状引号结构

小结

生成内容 content 与引号 quotes 是 CSS 里的特殊样式,除了虚拟元素和引用元素之外,其他元素都不支援这两个样式属性,虽然如此,其中 content 在排版中仍然大量被使用,或许这也跟虚拟元素常常被使用有关吧。

意见反馈

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