搜索

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 的动画或裁切效果时,有时会用到“形状”或“线段”相关 CSS 函数,这些函数有 circle()、rect()、ellipse()、ray()、inset()、polygon()、和 xywh() 等,透过这些函数的操作,可以让 CSS 更有特色更具变化,这篇教学会介绍这些有趣的 CSS 函数。

延伸阅读:CSS 路径 path ( 函数类型 )

CSS 教学 - CSS 形状与线段 ( 函数类型 )

教学影片

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

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

“形状与线段”的 CSS 函数

下方列出“形状与路径”类型的 CSS 函数 ( 目前主流浏览器都支援 ),基本上都会搭配动画和裁切才会有实际效果。

参考:裁切路径 clip-path、自订动画路径 offset

形状与路径函数 说明 裁切路径 自订动画路径
circle() 圆形 O O
ellipse() 椭圆形 O O
rect() 四边形 O O
polygon() 多边形 O O
inset() 内缩边距和圆角 O O
xywh() 虚拟矩形 O O
ray() 放射线形状 X O

circle() 圆形

circle() 是“圆形”CSS 函数,可以产生一个“封闭”的圆形路径,具有下列参数:

参数 说明 是否必填
r 半径数值,使用长度单位数值。 必填
cx cy 搭配 at 定义圆心位置,使用长度单位数值或位置关键字。 选填,默认使用 center center。
closest-side 半径关键字,表示从中心到元素边缘最近的长度。 和数值择一使用。
farthest-side 半径关键字,表示从中心到元素边缘最远的长度。 和数值择一使用。

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - circle() 圆形参数

circle() 可以使用下方相关写法:

/* 裁切路徑 */
div {
  clip-path: circle(50px);                /* 半徑 50px,圓心 xy 為 center center */
  clip-path: circle(50px at 50px 50px);   /* 半徑 50px,圓心 xy 為 50px 50px */
  clip-path: circle(closest-side);        /* 半徑是從中心到元素邊緣最近的長度 */
  clip-path: circle(farthest-side);       /* 半徑是從中心到元素邊緣最遠的長度 */
}
/* 動畫路徑 */
div {
  offset-path: circle(50px);              /* 半徑 50px,圓心 xy 為 center center */
  offset-path: circle(50px at 50px 50px); /* 半徑 50px,圓心 xy 為 50px 50px */
  offset-path: circle(closest-side);      /* 半徑是從中心到元素邊緣最近的長度 */
  offset-path: circle(farthest-side);     /* 半徑是從中心到元素邊緣最遠的長度 */
}

下方的范例执行后,前两个 div 会裁切出圆形,后两个 div 则会出现绕着圆形路径移动的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }
  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height: 150px;
    background: red;
  }
  .a div{clip-path: circle(50px at center center);} /* 裁切半徑 50px 圓形 */
  .b div{clip-path: circle(100px at 0 50px);}       /* 裁切半徑 100px 圓形 */

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: circle(50px at center center); /* 動畫路徑為半徑 50px 圓形 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  .d div{
    offset-path: circle(20px);                  /* 動畫路徑為半徑 20px 圓形 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}                   /* 改變移動距離 */
    100% {offset-distance: 100%;}               /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - circle() 圆形路径,搭配裁切和动画

ellipse() 椭圆形

ellipse() 是“椭圆形”CSS 函数,可以产生一个“封闭”的椭圆形路径,具有下列的参数:

参数 说明 是否必填
rx x 轴半径数值,使用长度单位数值。 必填
ry y 轴半径数值,使用长度单位数值。 必填
cx cy 搭配 at 定义圆心位置,使用长度单位数值或位置关键字。 选填,默认使用 center center。
closest-side 半径关键字,表示从中心到元素边缘最近的长度。 和数值择一使用。
farthest-side 半径关键字,表示从中心到元素边缘最远的长度。 和数值择一使用。

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - ellipse() 椭圆形参数

ellipse() 支援下列几种写法:

/* 裁切路徑 */
div {
  clip-path: ellipse(20px 50px);                /* x 軸半徑 20px,y 軸半徑 50px,圓心 xy 為 center center */
  clip-path: ellipse(20px 50px at 20px 50px);   /* x 軸半徑 20px,y 軸半徑 50px,圓心 xy 為 20px 50px */
  clip-path: ellipse(closest-side 50px);        /* x 半徑是從中心到元素邊緣最近的長度,y 軸半徑 50px */
  clip-path: ellipse(farthest-side 50px);       /* x 半徑是從中心到元素邊緣最遠的長度,y 軸半徑 50px */
}
/* 動畫路徑 */
div {
  offset-path: ellipse(20px 50px);              /* x 軸半徑 20px,y 軸半徑 50px,圓心 xy 為 center center */
  offset-path: ellipse(20px 50px at 20px 50px); /* x 軸半徑 20px,y 軸半徑 50px,圓心 xy 為 20px 50px */
  offset-path: ellipse(closest-side 50px);      /* x 半徑是從中心到元素邊緣最近的長度,y 軸半徑 50px */
  offset-path: ellipse(farthest-side 50px);     /* x 半徑是從中心到元素邊緣最遠的長度,y 軸半徑 50px */
}

下方的范例执行后,前两个 div 会裁切出椭圆形,后两个 div 则会出现绕着椭圆形路径移动的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }

  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height:150px;
    background: red;
  }
  .a div{clip-path: ellipse(10px 50px at center center);}   /* x 軸半徑 10px,y 軸半徑 50px,圓心置中 */
  .b div{clip-path: ellipse(farthest-side 20px at 0 50px);} /* x 軸半徑 100px ( 200/2 ),y 軸半徑 50px,圓心 0 50px */

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: ellipse(10px 50px at center center); /* x 軸半徑 10px,y 軸半徑 50px,圓心置中 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  .d div{
    offset-path: ellipse(closest-side 50px);    /* x 軸半徑 75px ( 150/2 ),y 軸半徑 50px,圓心置中 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}                   /* 改變移動距離 */
    100% {offset-distance: 100%;}               /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - ellipse() 椭圆形路径,搭配裁切和动画

rect() 四边形

rect() 是“四边形”CSS 函数,可以产生一个“封闭”的四边形路径,具有下列几个参数 ( 撰写时需要按照下表,从上而下的顺序,主要都是针对元素的上缘和左侧 ):

参数 说明 是否必填
dt 路径“上缘”与“元素上缘”的距离,使用长度单位数值,使用 auto 表示碰触元素上缘。 必填
dr 路径“右侧”与“元素左侧”的距离,使用长度单位数值,使用 auto 表示碰触元素右侧。 必填
db 路径“下缘”与“元素上缘”的距离,使用长度单位数值,使用 auto 表示碰触元素下缘。 必填
dl 路径“左侧”与“元素左侧”的距离,使用长度单位数值,使用 auto 表示碰触元素左侧。 必填
radius 搭配 round 定义四个角落圆角半径,一个数值为四个角落,两个数值为“左上右下,右上左下”,三个数值为“左上,右上左下,右下”,四个数值为“左上,右上,右下,左下”。 选填,默认 0。

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - rect() 四边形参数

rect() 支援下列几种写法:

/* 裁切路徑 */
div {
  clip-path: rect(0 100px 100px 50px);
   /* 高 100px 寬 50px 位置往右偏移 50px 的四邊形 */

  clip-path: rect(20px 100px 100px 50px);
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形 */

  clip-path: rect(20px 100px 100px 50px round 10px 20px 30px 40px);  
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形,左上到左下順時針的圓角半徑為 10px 20px 30px 40px*/

  clip-path: rect(20px 100px 100px 50px round 10px 40px);
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形,左上右下圓角半徑為 10px 右上左下圓角半徑為 40px*/
}
/* 動畫路徑 */
div {
  offset-path: rect(0 100px 100px 50px);
  /* 高 100px 寬 50px 位置往右偏移 50px 的四邊形 */

  offset-path: rect(20px 100px 100px 50px);
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形 */

  offset-path: rect(20px 100px 100px 50px round 10px 20px 30px 40px);  
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形,左上到左下順時針的圓角半徑為 10px 20px 30px 40px*/

  offset-path: rect(20px 100px 100px 50px round 10px 40px);
  /* 高 80px 寬 50px 位置往下偏移 20px 往右偏移 50px 的四邊形,左上右下圓角半徑為 10px 右上左下圓角半徑為 40px*/
}

下方的范例执行后,前两个 div 会裁切出四边形,后两个 div 则会出现绕着四边形路径移动的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }
  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height: 150px;
    background: red;
  }
  .a div{clip-path: rect(20px 150px 100px 50px);}                 /* 裁切四邊形 */
  .b div{clip-path: rect(50px 150px 100px 50px round 5px 30px);}  /* 裁切四邊形 */      /* 裁切半徑 100px 圓形 */

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: rect(20px 150px 100px 50px);   /* 動畫路徑為四邊形 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  .d div{
    offset-path: rect(50px 150px 100px 50px round 5px 30px);  /* 動畫路徑為四邊形 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}                   /* 改變移動距離 */
    100% {offset-distance: 100%;}               /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - rect() 四边形路径,搭配裁切和动画

polygon() 多边形

polygon() 是“多边形”CSS 函数,可以产生一个“封闭”的多边形路径,至少必须具有“三个座标点”,座标可使用长度单位数值 ( 常用百分比单位 ),初学者建议透过“CSS clip-path maker”这个网站,快速产生裁切形状所需的座标位置。

前往:CSS clip-path maker

CSS clip-path maker

polygon() 相关写法如下:

/* 裁切路徑 */
div {
  clip-path: polygon(0% 100%, 50%  0%,100% 100%);       /* 三角形 */
  clip-path: polygon(0% 0%,100% 0%,100% 100%, 0% 100%); /* 正方形 */
}
/* 動畫路徑 */
div {
  offset-path: polygon(0% 100%, 50%  0%,100% 100%);       /* 三角形 */
  offset-path: polygon(0% 0%,100% 0%,100% 100%, 0% 100%); /* 正方形 */
}

下方的范例执行后,前两个 div 会裁切出三角形和矩形,后两个 div 则会出现绕着三角形和矩形的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }

  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height:150px;
    background: red;
  }
  .a div{clip-path: polygon(0% 100%, 50%  0%,100% 100%); }      /* 三角形 */
  .b div{clip-path: polygon(20% 20%,80% 20%,80% 80%, 20% 80%);} /* 矩形 */

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: polygon(0% 100%, 50%  0%,100% 100%);        /* 三角形 */
    animation: oxxo 1s linear infinite;                      /* 執行動畫 */
  }
  .d div{
    offset-path: polygon(20% 20%,80% 20%,80% 80%, 20% 80%);  /* 矩形 */
    animation: oxxo 1s linear infinite;                      /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}     /* 改變移動距離 */
    100% {offset-distance: 100%;} /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - polygon() 多边形路径,搭配裁切和动画

inset() 内缩边距和圆角

inset() 是“元素内缩边距和圆角”CSS 函数,可以使用元素内缩方式产生一个“封闭”的四边形路径,具有下列参数:

参数 说明 是否必填
length 内缩距离,一个数值为“上下左右”,两个数值为“上下、左右”,三个数值为“上、左右、下”,四个数值为“上、右、下、左”。 必填
radius 搭配 round 定义四个角落圆角半径,一个数值为四个角落,两个数值为“左上右下,右上左下”,三个数值为“左上,右上左下,右下”,四个数值为“左上,右上,右下,左下”。 选填,默认 0。

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - inset() 内缩边距和圆角参数

inset() 支援下列几种写法:

/* 裁切路徑 */
div {
  clip-path: inset(20px);                  /* 四個邊內縮 20px */
  clip-path: inset(20px 50px);             /* 上下內縮 20px,左右內縮 50px */
  clip-path: inset(20px 50px round 10px);  /* 上下內縮 20px,左右內縮 50px,四個角圓角半徑 10px */
  clip-path: inset(10px 20px 30px 40px round 10px 20px 30px 40px);      
  /* 上右下左分別內縮 10px 20px 30px 40px,從左上角開始順時針的圓角半徑 10px 20px 30px 40px */
}
/* 動畫路徑 */
div {
  offset-path: inset(20px);                  /* 四個邊內縮 20px */
  offset-path: inset(20px 50px);             /* 上下內縮 20px,左右內縮 50px */
  offset-path: inset(20px 50px round 10px);  /* 上下內縮 20px,左右內縮 50px,四個角圓角半徑 10px */
  offset-path: inset(10px 20px 30px 40px round 10px 20px 30px 40px);      
  /* 上右下左分別內縮 10px 20px 30px 40px,從左上角開始順時針的圓角半徑 10px 20px 30px 40px */
}

下方的范例执行后,前两个 div 会裁切出内缩图形,后两个 div 则会出现绕着内缩路径移动的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }

  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height:150px;
    background: red;
  }
  .a div{clip-path: inset(40px 10px); }   /* 上下內縮 40px,左右內縮 10px */
  .b div{clip-path: inset(10px 20px 30px 40px round 10px 20px 30px 40px);}
  /* 上右下左分別內縮 10px 20px 30px 40px,從左上角開始順時針的圓角半徑 10px 20px 30px 40px */

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: inset(40px 10px);         /* 上下內縮 40px,左右內縮 10px */
    animation: oxxo 1s linear infinite;    /* 執行動畫 */
  }
  .d div{
    offset-path: inset(10px 20px 30px 40px round 10px 20px 30px 40px); 
  /* 上右下左分別內縮 10px 20px 30px 40px,從左上角開始順時針的圓角半徑 10px 20px 30px 40px */
    animation: oxxo 1s linear infinite;    /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}              /* 改變移動距離 */
    100% {offset-distance: 100%;}          /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - inset() 内缩边距和圆角路径,搭配裁切和动画

xywh() 虚拟矩形

xywh() 是“虚拟矩形”CSS 函数,可以产生一个“封闭”的四边形路径,和 rect() 最大的差异在于 rect() 是根据元素边缘定义四个边的位置,而 xywh() 是根据左上角的 xy 座标与长宽尺寸来产生四边形,具有下列几个参数:

参数 说明 是否必填
x 左上角 x 座标 ( 相对父元素 )。 必填
y 左上角 y 位置 ( 相对父元素 )。 必填
w 宽度。 必填
h 高度。 必填
radius 搭配 round 定义四个角落圆角半径,一个数值为四个角落,两个数值为“左上右下,右上左下”,三个数值为“左上,右上左下,右下”,四个数值为“左上,右上,右下,左下”。 选填,默认 0。

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - inset() 内缩边距和圆角参数

xywh() 支援下列几种写法:

/* 裁切路徑 */
div {
  clip-path: xywh(50px 50px 100px 50px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形 */

  clip-path: xywh(20px 100px 100px 50px round 20px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形,四個圓角半徑為 20px */

  clip-path: xywh(20px 100px 100px 50px round 10px 20px 30px 40px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形,左上到左下順時針的圓角半徑為 10px 20px 30px 40px */
}
/* 動畫路徑 */
div {
  offset-path: xywh(50px 50px 100px 50px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形 */

  offset-path: xywh(20px 100px 100px 50px round 20px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形,四個圓角半徑為 20px */

  offset-path: xywh(20px 100px 100px 50px round 10px 20px 30px 40px);
   /* 位於父元素 50px 50px 位置的 100px x 50px 四邊形,左上到左下順時針的圓角半徑為 10px 20px 30px 40px */
}

下方的范例执行后,前两个 div 会裁切出四边形,后两个 div 则会出现绕着四边形路径移动的动画。

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

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

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 200px;
    height:150px;
    border: 1px solid #000;
    margin: 10px;
    float: left;
  }

  /* 前兩個 div 跟父元素一樣大,背景紅色 */
  .a div, .b div {
    width: 200px;
    height:150px;
    background: red;
  }
  .a div{clip-path: xywh(100px 50px 50px 50px); }   /* 位於 100px 50px 長寬為 50px 的正方形 */
  .b div{clip-path: xywh(10px 20px 150px 60px round 10px 20px 30px 40px);} 
  /* 位於 10px 20px 長寬為 150px 60px 的矩形,圓角為  10px 20px 30px 40px*/

  /* 後兩個 div 跟父元素只有 25px,背景綠色 */
  .c div, .d div {
    width: 25px;
    height: 25px;
    background: green;
  }
  .c div{
    width: 30px;
    height: 30px;
    offset-path: xywh(100px 50px 50px 50px);    /* 位於 100px 50px 長寬為 50px 的正方形 */
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  .d div{
    offset-path: xywh(10px 20px 150px 60px round 10px 20px 30px 40px);   
    /* 位於 10px 20px 長寬為 150px 60px 的矩形,圓角為  10px 20px 30px 40px*/
    animation: oxxo 1s linear infinite;         /* 執行動畫 */
  }
  @keyframes oxxo{
    0% {offset-distance: 0%;}                   /* 改變移動距離 */
    100% {offset-distance: 100%;}               /* 改變移動距離 */
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - xywh() 虚拟矩形路径,搭配裁切和动画

ray() 放射线

ray() 是“放射线”CSS 函数,可以产生一条指定角度的放射线路径,使用 ray() 要特别注意,因为“不是封闭形状”,所以并不适用 clip-path 样式属性,具有下列几个参数:

参数 说明 是否必填
angle 旋转角度,使用角度单位数值,正上方为 0deg,顺时针旋转角度增加。 必填
size 只能使用下方列出的特定关键字。 选填,默认 closest-side。
contain 填入“contain”后,size 会减少元素最大边长的一半。 选填
cx cy 搭配 at 定义圆心位置,使用长度单位数值或位置关键字。 选填,默认使用 center center。

参数 size 可使用下方的关键字 ( 注意,是指元素和“父元素”之间的距离 ):

关键字 说明
closest-side 起点和最短边距离。
closest-corner 起点和最近的角落距离。
farthest-side 起点和最远边距离。
farthest-corner 起点和最远的角落距离。
sides 起点和放射线碰到边缘的距离。

ray() 支援下列几种写法:

/* 動畫路徑 */
div {
  offset-path: ray(30deg);
  /* 起點位於父元素中心點,往右上角 30deg size 為 closest-side 的放射線 */

  offset-path: ray(30deg sides);
  /* 起點位於父元素中心點,往右上角 30deg size 為 sides 的放射線 */

  offset-path: ray(30deg farthest-corner contain);
  /* 起點位於父元素中心點,往右上角 30deg size 為 farthest-corner 但最大值為寬度一半的放射線 */

  offset-path: ray(30deg farthest-corner contain at 50px 50px);
  /* 起點位於父元素 (50px, 50px),往右上角 30deg size 為 farthest-corner 但最大值為寬度一半的放射線 */
}

下方的范例呈现 ray() 设定不同 size 的差异。

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

<!-- HTML 程式碼 -->
<div class="a"><div>1</div></div>
<div class="b"><div>2</div></div>
<div class="c"><div>3</div></div>
<div class="d"><div>4</div></div>
<div class="e"><div>5</div></div>

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 100px;
    height:200px;
    border: 1px solid #000;
    margin: 30px;
    float: left;
  }
  div div {
    width: 25px;
    height: 25px;
    background: orange;
    offset-distance: 100%;  /* 移動到路徑末端 */
    text-align: center;
  }
  .a div{offset-path: ray(150deg closest-side at 50px 50px);}
  .b div{offset-path: ray(150deg closest-corner at 50px 50px);}
  .c div{offset-path: ray(150deg farthest-side at 50px 50px);}
  .d div{offset-path: ray(150deg farthest-corner at 50px 50px);}
  .e div{offset-path: ray(150deg sides at 50px 50px);}
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - ray() 设定不同 size 的差异

下方的范例会将 ray() 的 size 加上 contain 关键字,长度就会缩减元素最大宽度 ( 或高度 ) 的一半。

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

<!-- HTML 程式碼 -->
<div class="a"><div>1</div></div>
<div class="b"><div>2</div></div>
<div class="c"><div>3</div></div>
<div class="d"><div>4</div></div>

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 100px;
    height:200px;
    border: 1px solid #000;
    margin: 20px;
    float: left;
  }
  div div {
    width: 25px;
    height: 100px;
    background: orange;
    offset-distance: 100%;  /* 移動到路徑末端 */
    text-align: center;
  }
  .a div{offset-path: ray(150deg farthest-side);}
  .b div{offset-path: ray(150deg farthest-side contain);}
  .c div{offset-path: ray(150deg farthest-corner);}
  .d div{offset-path: ray(150deg farthest-corner contain);}
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - ray() 的 size 加上 contain

下方的范例执行后,会使用 animation 搭配 ray() 实作 CSS 动画。

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

<!-- HTML 程式碼 -->
<div class="a"><div>1</div></div>
<div class="b"><div>2</div></div>
<div class="c"><div>3</div></div>
<div class="d"><div>4</div></div>
<div class="e"><div>4</div></div>

<!-- CSS 程式碼 -->
<style>
  div[class] {
    width: 100px;
    height:200px;
    border: 1px solid #000;
    margin: 20px;
    float: left;
  }
  div div {
    width: 25px;
    height: 25px;
    background: orange;
    text-align: center;
    animation: oxxo 1s infinite alternate;
  }
  .a div{offset-path: ray(150deg closest-side at 50px 50px);}
  .b div{offset-path: ray(150deg closest-corner at 50px 50px);}
  .c div{offset-path: ray(150deg farthest-side at 50px 50px);}
  .d div{offset-path: ray(150deg farthest-corner at 50px 50px);}
  .e div{offset-path: ray(150deg sides at 50px 50px);}

  @keyframes oxxo {
    0% {offset-distance: 0%;}
    100% {offset-distance: 100%;}
  }
</style>

CSS 教学 - CSS 形状与线段 ( 函数类型 ) - 使用 ray() 作 CSS 动画

小结

“形状与线段”相关的 CSS 函数最主要都是应用在“裁切”和“动画”,可以很简单的呈现许多不同的效果,如果在过去有一些无法实现的 CSS 效果,赶快用“形状与线段”相关的 CSS 函数试试看吧。

意见反馈

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