0

0

CSS如何制作悬浮卡片视差效果?translateZ景深差异

星夢妙者

星夢妙者

发布时间:2025-08-23 15:05:01

|

753人浏览过

|

来源于php中文网

原创

实现悬浮卡片视差效果的关键是利用css 3d变换中的perspective、transform-style: preserve-3d和translatez属性协同工作,1. 首先在父容器设置perspective定义观察距离,2. 卡片元素设置transform-style: preserve-3d以保持子元素的3d空间关系,3. 内部各层元素通过不同正负值的translatez建立景深层次,4. 鼠标悬停时卡片通过rotatex/y旋转,结合z轴差异放大视差,5. 所有动画仅使用transform和opacity等gpu加速属性以确保性能,6. 可配合will-change优化渲染,最终形成前景元素移动快、背景移动慢的立体悬浮效果,整个过程由css驱动且无需javascript即可完成。

CSS如何制作悬浮卡片视差效果?translateZ景深差异

CSS制作悬浮卡片视差效果,本质上是利用了CSS的3D变换特性,尤其是

translateZ
来模拟景深差异,再结合父元素的旋转来展现这种深度感。核心在于给卡片内部的不同元素赋予不同的Z轴位置,当卡片本身因为鼠标悬停而发生轻微旋转时,这些Z轴位置的差异就会被放大,形成我们所说的视差效果。

解决方案

要实现这种效果,我们需要几个关键的CSS属性协同工作。首先,你的卡片容器需要一个透视(

perspective
)属性,这就像给你的眼睛设定了一个观察点,没有它,3D效果就无从谈起。然后,卡片本身需要声明
transform-style: preserve-3d;
,这告诉浏览器,卡片内部的子元素也应该在同一个3D空间里进行变换,而不是在它们父元素变换前就被拍平。

想象一下卡片的HTML结构,通常会有一个主容器,里面是卡片本身,而卡片内部又包含了几层元素,比如背景图、标题、描述文字或者一个图标。这些内部元素就是我们操作

translateZ
的目标。

立即学习前端免费学习笔记(深入)”;

精彩标题

这里是卡片的描述文字,它会与标题和背景产生不同的视差效果。

@@##@@

接着是CSS部分。

.card-container {
  perspective: 1000px; /* 关键:定义视距,值越大,透视效果越弱 */
  display: flex; /* 示例布局,让卡片居中 */
  justify-content: center;
  align-items: center;
  height: 100vh;
  overflow: hidden; /* 防止溢出 */
}

.card {
  width: 300px;
  height: 400px;
  border-radius: 15px;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
  transform-style: preserve-3d; /* 关键:让子元素保持3D空间 */
  transition: transform 0.3s ease-out; /* 让卡片旋转更平滑 */
  position: relative;
  overflow: hidden; /* 确保内部元素不会超出卡片边界 */
}

.card:hover {
  transform: rotateY(5deg) rotateX(5deg); /* 鼠标悬停时,卡片轻微旋转 */
}

.card-bg,
.card-content,
.card-title,
.card-description,
.card-icon {
  position: absolute; /* 让所有内部元素可以自由定位 */
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: transform 0.3s ease-out; /* 内部元素也需要过渡 */
}

/* 赋予不同的Z轴深度 */
.card-bg {
  background: linear-gradient(to top right, #6dd5ed, #2193b0);
  transform: translateZ(-50px); /* 背景推远,移动最少 */
  z-index: 1; /* 确保层级正确 */
}

.card-content {
  flex-direction: column;
  padding: 20px;
  box-sizing: border-box;
  transform: translateZ(0px); /* 内容在Z轴原点,作为参考 */
  z-index: 2;
  color: white;
  text-align: center;
}

.card-title {
  transform: translateZ(30px); /* 标题拉近,移动更多 */
  font-size: 2em;
  font-weight: bold;
  z-index: 3;
}

.card-description {
  transform: translateZ(10px); /* 描述文字略微拉近 */
  margin-top: 10px;
  font-size: 0.9em;
  line-height: 1.5;
  z-index: 3;
}

.card-icon {
  width: 80px;
  height: 80px;
  transform: translateZ(60px); /* 图标拉得最近,移动最多 */
  z-index: 4;
  top: auto; /* 调整图标位置 */
  bottom: 20px;
}

当鼠标悬停在

.card
上时,它会围绕X轴和Y轴轻微旋转。因为
.card
设置了
transform-style: preserve-3d;
,它的子元素(
.card-bg
,
.card-title
等)各自的
translateZ
值就会在
.card
的旋转中体现出来。
translateZ
值越大(越靠近观察者),在卡片旋转时,它看起来移动的幅度就越大,从而产生强烈的视差效果。

为什么需要
perspective
transform-style: preserve-3d

说实话,刚接触CSS 3D变换时,这两个属性真的挺让人困惑的,尤其是它们各自扮演的角色。但理解了它们,整个3D空间的概念就清晰多了。

perspective
,中文直译是“透视”,在CSS 3D里,它就像你坐在电影院里看电影的位置。它定义了你(观察者)到屏幕(Z=0平面)的距离。这个距离决定了3D元素的“失真”程度或者说“透视感”的强度。如果
perspective
的值很小,比如
100px
,那么元素在Z轴上的微小移动都会显得非常巨大,透视效果会非常夸张,甚至有点扭曲。反之,如果值很大,比如
2000px
,透视效果就会非常微弱,元素看起来更像是平面的。没有
perspective
,即使你给元素设置了
translateZ
,浏览器也无法正确地渲染出3D深度,因为缺少了观察的参照系。它通常设置在要进行3D变换的元素的父级上,因为它定义的是整个3D场景的“视点”。

transform-style: preserve-3d;
,我觉得它才是实现嵌套3D效果的真正魔法。想象一下,你有一个盒子(父元素),里面放了一些小物件(子元素)。如果你想让这些小物件在盒子旋转的时候,各自按照自己的深度(
translateZ
)也产生相应的位移,你就需要告诉盒子:“嘿,我里面的东西是立体的,你旋转的时候别把它们当成平面的!”这就是
preserve-3d
的作用。默认情况下,浏览器在处理父元素的3D变换时,会把它的子元素“拍平”到父元素的2D平面上,然后再一起进行3D变换。这意味着子元素自己的
translateZ
或者其他3D变换会被忽略。而
preserve-3d
就是打破这种默认行为,让子元素在父元素的3D空间中保持它们各自的3D状态。所以,它通常设置在需要包含其他3D子元素的父元素上,比如我们例子中的
.card
。没有它,你给
.card-bg
设置的
translateZ
.card
旋转时,是不会产生我们想要的视差效果的,因为
.card-bg
已经被“拍平”了。

花生AI
花生AI

B站推出的AI视频创作工具

下载

translateZ
的正负值如何影响视差效果?

translateZ
的值,直观来说,就是元素沿着Z轴(深度轴)移动的距离。理解它的正负,是玩转视差效果的关键。

简单来说,

translateZ(正值)
会将元素从Z=0平面“拉近”观察者。想象一下,一个物体离你越近,当你头部轻微转动时,它在你视野中移动的幅度就越大。在我们的悬浮卡片视差效果中,那些设置了较大正
translateZ
值的元素(比如图标、标题),在卡片旋转时,它们相对于卡片其他部分会显得移动得更快、幅度更大,仿佛它们真的从卡片中“跳”了出来,形成一种强烈的“前景”视差。

相反,

translateZ(负值)
则会将元素从Z=0平面“推远”观察者。离你越远的物体,当你转动头部时,它在你视野中移动的幅度就越小。在卡片效果中,背景图片通常会设置一个负的
translateZ
值,让它看起来“沉”在卡片的最深处。当卡片旋转时,背景的移动幅度最小,甚至可能看起来与卡片旋转方向相同,从而营造出一种“背景”的稳定感。

translateZ(0)
的元素,则停留在Z轴的原点,它们是参照系,移动幅度介于正负
translateZ
之间。通过巧妙地组合这些正负值,我们就能创造出多层次、富有深度的视差效果,让卡片看起来更立体、更生动。这就像是舞台剧,不同的道具放在不同的景深位置,灯光一变,它们呈现的相对运动就不同了。

如何优化悬浮卡片视差效果的性能?

虽然CSS 3D变换通常由GPU加速,性能表现不错,但如果滥用或者不注意细节,依然可能造成卡顿。优化这些效果,我觉得主要有几点:

首先,要充分利用硬件加速

transform
属性(包括
translateZ
rotateX/Y
)和
opacity
是CSS中性能最好的动画属性,因为它们不会触发页面的重排(reflow)或重绘(repaint),而是直接作用于复合层(composite layer)。所以,尽量只动画这些属性,避免去动画
width
height
margin
padding
等会引起布局变化的属性。

其次,可以考虑使用

will-change
属性。这是一个性能优化的提示,告诉浏览器某个元素将要发生变化(比如
transform
),这样浏览器可以提前进行一些优化准备,比如创建独立的图层。在我们的例子中,可以在
.card
和内部需要动画的元素上添加
will-change: transform;
。不过,这玩意儿不能滥用,只在你确定元素会频繁或大幅度变化时使用,否则反而可能带来负面效果,因为它会消耗更多的内存。

再者,保持DOM结构和CSS的简洁性。复杂的嵌套和过多的CSS规则会增加浏览器计算的负担。尽量减少需要应用

translateZ
的元素数量,每个额外的3D层都会增加渲染的复杂性。

最后,如果你考虑用JavaScript来增强效果(比如更精确的鼠标跟随视差),务必对事件监听器进行节流(throttle)或防抖(debounce)处理。

mousemove
事件触发频率非常高,不加限制地进行DOM操作或复杂计算,很容易导致性能瓶颈。不过对于纯CSS的
:hover
效果,这一点就不是问题了。本质上,就是让浏览器做它最擅长的事情,并且尽量减少不必要的计算和渲染。

icon

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

556

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

732

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

414

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

552

2023.09.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 20.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号