交互动效设计
一.变换
csstransform是元素进行2D/3D变换的核心属性,支持平移、旋转、倾斜、缩放、倾斜等效果,且不破坏原有文档流布局
场景: 应用非常广泛,通过简介的语法实现复杂的视觉动态效果
坐标系:
变换的时候很多情况需要按照坐标轴来变化,介绍2D坐标系和3D坐标系
2D坐标系

盒子往右是正值,往左是负值 盒子往下是正值,往上是负值
3D坐标系

基础变换函数-2D
| 变换类型 | 函数语法 | 核心描述 | 应用场景 |
|---|---|---|---|
| 平移 | translate(x, y)translateX(x)translateY(y) | 沿 X/Y 轴移动元素,参数可为像素或百分比(百分比相对于元素自身尺寸) | 微调元素位置、悬停偏移效果 |
| 旋转 | rotate(angle) | 以元素中心为基点顺时针旋转,需加单位 deg(负值为逆时针) | 图标旋转、卡片翻转 |
| 缩放 | scale(sx, sy)scaleX(sx)scaleY(sy) | X/Y 轴按比例缩放,单参数时等比例缩放(>1 放大,<1 缩小,支持百分比) | 悬停放大、焦点突出 |
| 倾斜 | skew(x-angle, y-angle)skewX(angle)skewY(angle) | 沿 X/Y 轴扭曲元素形状,参数为倾斜角度(支持负值) | 斜切导航栏、动态图表 |
1.变换函数-2D平移
平移(translate)沿X/Y轴移动元素位置,不改变元素的实际布局(原位置仍保留)
场景:
- 悬停元素微调。鼠标放入元素上下或者左右移动(添加过渡更优雅)
- 元素居中。元素实现水平垂直居中
- 平移不影响页面布局,仅是视觉上的移动
- 添加鼠标经过元素移动,优先
transform而不是通过left,top等,性能更佳 - 如果单位是百分比,相对于元素自身尺寸,而非父容器
示例:
.box { transition: transform 0.3s;}
.box:hover { transform: translate(10px, 10px);}2.变换函数-2D旋转
旋转(rotate)通过改变元素在平面或空间中的角度实现视觉效果
场景:
- 悬停动画(如按钮旋转)
- 加载动画(无线循环旋转)
语法:
.box { transform: rotate(360deg); /* 旋转 */ transform-origin: center center; /* 旋转的基点,默认中心 */}- 参数单位:deg(度),正值是顺时针,负值是逆时针
transform-origin设置旋转中心点- 属性值支持left,top等,也可以支持数字比如像素和百分比等
3.变换函数-2D缩放
缩放(scale)用于调整元素尺寸,且不改变元素在文档流中的原始占位
场景:
- 悬停放大。鼠标悬停在元素上时,元素放大
语法:
transform: scale(1.5); 整体放大1.5倍
transform: scale(1.5, 1); 水平方向放大,垂直方向不放大
- 单参数:同时作用于x轴和y轴,等比例缩放
- 双参数:分别作用于x轴和y轴,不同比例缩放
4.变换函数-2D倾斜
倾斜(skew)用于对元素进行二维*倾斜变换,通过沿x轴或y轴扭曲元素的几何形状
场景:
- 鼠标经过元素倾斜效果
语法:
transform: skew(30deg, 30deg); 水平方向倾斜30度,垂直方向倾斜30度
transform: skewX(30deg); 水平方向倾斜30度,垂直方向不倾斜
transform: skewY(30deg); 垂直方向倾斜30度,水平方向不倾斜
- 单参数:y轴默认倾斜角度为0
- 双参数:分别作用于x轴和y轴,不同角度倾斜
transform-origin设置倾斜中心点,默认中心
5.过渡transition完整写法
transition完整写法:
transition: 过渡属性 持续时间 速度曲线 延迟时间;
过渡属性:过渡属性属性值变化时触发过渡效果持续时间:属性值变化时的过渡时间,单位秒速度曲线:属性值变化时的过渡曲线延迟时间:属性值变化时的过渡时间延迟,单位秒
过渡属性: 过渡属性的值可以是:
none:表示没有过渡效果all:表示所有可过渡的属性都参与过渡(默认值)- 具体属性名:如
transform、opacity、background-color、width、height、margin、padding、border、box-shadow等常用CSS属性
注意:并非所有CSS属性都可以过渡,只有具有中间值的属性才能实现平滑过渡效果。颜色、尺寸、位置、透明度等连续性属性最适合过渡。
速度曲线:
| 速度曲线参数 | 效果描述 | 曲线可视化 |
|---|---|---|
| ease | 默认值,慢速开始 → 加速 → 慢速结束,适合大多数自然过渡(如按钮悬停) | ![]() |
| linear | 匀速运动,无加速/减速,适合机械感效果(如进度条) | ![]() |
| ease-in | 慢速开始 → 逐渐加速,适合元素从静止启动(如弹窗出现) | ![]() |
| ease-out | 快速开始 → 逐渐减速,适合元素退出(如关闭动画) | ![]() |
| ease-in-out | 慢速开始和结束,中间加速,适合对称性动画(如页面切换) | ![]() |
| cubic-bezier(x1,y1,x2,y2) | 贝塞尔曲线。通过四值(0-1范围内)自定义速度曲线,实现弹跳、骤停等创意效果(如按钮点击反馈) | ![]() |
工具:
6.变换函数-复合写法
在css中,transform属性的复合写法是将每个函数用空格隔开(多个变换函数组合使用)
语法;
transform: A() B() C();
顺序:
- 核心规则:
从右到左的执行顺序 - 实际的执行顺序是:先执行最右侧的
C(),再执行B(),最后执行A()
示例:轮胎移动效果
.img { transition: transform 0.3s;}
.box:hover img { transform: translate(10px, 10px) rotate(360deg);}3D变换与透视
css3D效果通过将二维元素在三位空间中进行变换,为网页添加立体感和动态交互体验
场景:
- 卡片翻转效果
- 3D幻灯片/轮播图
- 数据可视化。立体图表(如3D柱状图等)
相比JavaScript或WebGL,css3D利用GPU加速,动画更流畅,性能更高效
3D坐标系:
网页中的三维坐标系:

x轴代表左右方向。右边是正值,左边是负值y轴代表上下方向。上边是正值,下边是负值z轴代表前后方向。接近屏幕是正值,远离屏幕是负值。
默认情况下,元素在二维平面上呈现,Z轴值为0
当应用3D变换时,元素便可以在三维空间中自由变换
3D旋转
旋转(rotate)通过改变元素在3D空间中的角度实现视觉效果
语法:
transform: rotateX(30deg); 围绕x轴旋转30度
transform: rotateY(30deg); 围绕y轴旋转30度
transform: rotateZ(30deg); 围绕z轴旋转30度
- 参数单位:
deg(度),正值是顺时针旋转,负值是逆时针旋转 - rotateZ和二维里面的rotate()一样的,只是在3D空间中旋转
透视(Perspective)
”透视“(Perspective)一词源于拉丁文”perspclre“(看透),指在平面上描绘物体的口康健关系的方法或技术。
在css中,透视效果(perspective)用于模拟人眼观察3D空间时的进大远小效果

语法:
perspective: 1000px; 透视距离为1000px
- 数值越小,透视效果越强
- 给父元素添加,里面所有子元素都会添加透视效果(常用)
- 给子元素添加,当前元素添加透视效果
同时使用多个属性:
transform: perspective(1000px) rotateX(30deg);
- 注意:
perspective()必须作为transform属性的第一个元素(否则无效)
3D旋转方向:左手大拇指指向坐标轴正方向,四指指向的方向就是正值方向
3D旋转-两面翻转的盒子示例
backface-visibility:当元素旋转时,是否显示背面面
visible:显示背面hidden:隐藏背面
示例:创建一个正面粉色反面蓝色,悬停时可翻转的盒子
.box { position: relative; margin: 100px auto; width: 600px; height: 300px;}
.box .front,.box .back { position: absolute; top: 0; left: 0; width: 100%; height: 100%; /* 元素翻转隐藏背面 */ backface-visibility: hidden; transition: transform 0.6s;}
.box .front { background-color: lightblue; transform: rotateY(0deg);}
.box .back { background-color: pink; transform: rotateY(-180deg);}
.box:hover .front { transform: rotateY(180deg);}.box:hover .back { transform: rotateY(0deg);}3D位移
CSS 3D函数translatrZ()与translateX3d()
语法:
transform: translateX3d(xpx, ypx, zpx); 沿着x轴移动xpx,y轴移动ypx,z轴移动zpx
- 在三维空间中同时沿
x轴、y轴、z轴平移元素,支持更复杂的空间定位 - 位移建议通过3D变换强制启用GPU渲染,提升动画流畅度
语法:
transform: translateZ(zpx);
- 沿z轴平移元素,实现进大远小的立体效果
- 正值元素放大,负值元素缩小
- 需父容器设置透视距离(
perspective),否则无视觉变化
开启3D空间:
在变换的时候(如卡片翻转)要使子元素保留3D位置,父元素需要设置transform-style: preserve-3d;
transform-style默认值为flat,即2D空间,不保留3D位置- 开启3D空间后,子元素会保留3D位置,实现3D效果
二.动画
动画的基本使用
CSS3的animation是一种通过定义关键帧和动画属性来实现元素动态效果的技术
优势:
- 性能高效:通过浏览器原生支持,利用GPU加速渲染,避免频繁的javascript计算开销
- 代码简洁:解决了传统CSS过渡(
transition)只能定义两帧状态的局限性,可以利用关键帧实现更复杂动画 - 交互增强:支持与用户操作(如悬停、点击)结合,提升网页的动态变现里和用户体验
关键帧
关键帧(keyframe)是动画和视频制作中用于定义动作或状态变化的核心节点,它决定了动画的其实,转折和结束状态,中间帧(插帧)通过算法自动生成,形成连贯的动画效果
动画的使用
动画的使用要先定义动画,再使用动画
1.定义动画:
@keyframes move { 0% { transform: translateX(0); } 50% { transform: translateX(50px); } 100% { transform: translateX(100px); }}@keyframes:定义动画的关键帧move:动画名称,自定义0% 50% 100%:关键帧的时间点,0%表示动画开始,50%表示动画中间,100%表示动画结束- 关键帧可以定义多个,每个关键帧可以设置不同的属性值
@keyframes move { from { transform: translateX(0); } to { transform: translateX(100px); }}from:动画开始时的状态,相当于0%to:动画结束时的状态,相当于100%
2.使用动画:动画属性要写到目标元素里面
.box { animation: move 1s;}animation:应用动画move:动画名称,与定义动画时的名称一致1s:动画持续时间,单位为秒
animation属性完整写法
animation: 动画名称 动画持续时间 速度曲线 延迟时间 播放次数 播放方向 执行完毕状态;
- 动画名称和动画时长是必填项,其余可以省略,但是要保证书写顺序
- 动画属性要写到目标元素里面
|子属性|默认值|说明|
|速度曲线|ease|动画速度曲线,可选值有linear(匀速)和cubic-bezier()(自定义贝塞尔曲线)等|
|延迟时间|0s|动画延迟时间,单位为秒|
|播放次数|1|动画播放次数,无限循环播放为infinite|
|播放方向|normal|动画播放方向,可选值还有reverse(反向播放)和alternate(交替播放)|
|执行完毕状态|none|动画结束后状态(如forwards保留最后一帧,backwards回到第一帧)|
step逐帧动画
速度曲线除了常见的linear、ease、cubic-bezier等,还包含steps()函数,steps()是CSS动画中用于控制动画分段执行的计时函数,它通过将动画分割为离散的步骤,实现类似传统帧动画(逐帧动画)的跳跃效果
语法:
animation: move 1s steps(8) infinite;- steps(步数),步数为正整数
- 经常和背景图片(精灵图)来实现动画效果
逐帧动画原理:
- 移动图片。其实是通过变化背景位置,展示不同的图片帧,实现动画效果
- 图片有N个不同图形,steps()步数就写N
示例:
- 盒子大小:宽度548px,高度513px
- 背景图片大小:宽度13700px,高度513px
- 背景图片一共有25张小图片组成
@keyframes move { 0% { background-position: 0 0; } 100% { background-position: -13700px 0; }}
.box { width: 548px; height: 513px; background: url(./images/box.png) no-repeat left/13700px 513px; /* 使用动画 */ animation: move 1s steps(25) infinite;}动画单写属性
| 动画子属性 | 默认值 | 说明 |
|---|---|---|
animation-timing-function | ease | 动画速度曲线,支持 linear、cubic-bezier() 等 |
animation-delay | 0s | 动画延迟时间,可设为负值(跳过部分动画) |
animation-iteration-count | 1 | 播放次数,若需无限循环需显式声明 infinite |
animation-direction | normal | 播放方向,可选 reverse(反向)、alternate(交替) |
animation-fill-mode | none | 执行完毕状态,动画结束后是否保留样式(如 forwards 保留最后一帧) |
animation-play-state | running | 暂停或者继续动画,需单独设置 paused 暂停动画 |
三.其他效果
box-reflect: 倒影效果
box-reflect是css中用于为元素创建倒影效果
语法;
box-reflect: 倒影方向 倒影距离 倒影图像
- 倒影方向(必写):
- above:倒影在元素上方
- below:倒影在元素下方
- left:倒影在元素左侧
- right:倒影在元素右侧
- 倒影距离(必写):
- 倒影距离,单位为像素
- 倒影图像(可选):
- 倒影图像,可选值还有
none(无倒影) url(./images/reflect.png):倒影图像,可选值还有linear-gradient()(线性渐变)、radial-gradient()(径向渐变)等
注意,因为兼容性问题,前面需要添加
-webkit-前缀,例如-webkit-box-reflect: below 10px #f5f5f5;
() 父亲选择器
:has()选择器是css中用于选择包含指定子元素的元素
语法;
:has(子元素)
- 子元素(必写):
- 子元素,可选值还有
::first-child(第一个子元素)、::last-child(最后一个子元素)、::nth-child(第n个子元素)(第n个子元素)等 - 例如:
:has(子元素):选择包含子元素的元素 - 例如:
:has(子元素):nth-child(2):选择包含子元素的第2个子元素
- 子元素,可选值还有
() 反选器
:not()选择器是css中用于选择不包含指定子元素的元素
语法;
:not(子元素)
- 子元素(必写):
- 子元素,可选值还有
::first-child(第一个子元素)、::last-child(最后一个子元素)、::nth-child(第n个子元素)(第n个子元素)等 - 例如:
:not(子元素):选择不包含子元素的元素 - 例如:
:not(子元素):nth-child(2):选择不包含子元素的第2个子元素
- 子元素,可选值还有
opacity 透明度
opacity是css中用于设置元素透明度的属性
语法;
opacity: 透明度值
- 透明度值(必写):
- 透明度值,取值范围为0到1之间
- 0:完全透明
- 1:完全不透明
- 0.5:半透明
- 例如:
opacity: 0.5;:设置元素透明度为0.5
部分信息可能已经过时















