要实现css卡片折叠立体效果,必须结合rotate3d、transform-origin、perspective和transform-style: preserve-3d。1. 首先构建多层html结构,将卡片分为多个子元素(如左、中、右三部分),每个子元素代表一个折叠页片;2. 在css中,父容器设置perspective以创建3d透视环境,并启用transform-style: preserve-3d,确保子元素处于同一3d空间而不被扁平化;3. 每个子元素使用绝对定位,并根据其折叠方向精确设置transform-origin,如左侧页片向右折叠时轴心在右侧(transform-origin: right center),右侧页片向左折叠时轴心在左侧(transform-origin: left center);4. 通过:hover或javascript触发transform属性,使用rotatey(angle)实现水平折叠(如rotatey(-90deg)或rotatey(90deg)),形成书页翻动的视觉效果;5. 为实现更复杂的交互(如点击展开、分步动画),采用css定义动画状态与过渡,javascript负责控制类名切换或动态计算transform值,实现灵活且高性能的多页折叠效果。该方法通过合理组合css 3d变换属性与javascript逻辑控制,最终实现自然真实的卡片折叠立体效果。

CSS制作卡片折叠立体效果,核心在于利用
rotate3d
transform-origin
perspective
transform-style: preserve-3d
要实现这种效果,我们需要构建一个多层的HTML结构,其中包含一个父容器和若干个子元素,每个子元素代表卡片的一个“折叠页”。
HTML结构: 设想一个卡片被纵向或横向切分成几部分。例如,一个三折页卡片:
<div class="card-container">
<div class="card-panel panel-left"></div>
<div class="card-panel panel-center"></div>
<div class="card-panel panel-right"></div>
</div>CSS基础设置:
立即学习“前端免费学习笔记(深入)”;
父容器的perspective
transform-style: preserve-3d
perspective
preserve-3d
.card-container {
width: 300px;
height: 200px;
position: relative;
/* 关键:设置透视距离 */
perspective: 1000px;
/* 关键:让子元素保持3D空间 */
transform-style: preserve-3d;
/* 居中显示,方便观察 */
margin: 50px auto;
border: 1px solid #eee;
}子元素的定位与transform-origin
card-panel
transform-origin
.card-panel {
width: 100px; /* 1/3宽度 */
height: 100%;
position: absolute;
background-color: #f0f8ff;
border: 1px solid #ccc;
box-sizing: border-box;
transition: transform 0.8s ease-in-out; /* 添加过渡效果 */
transform-origin: center center; /* 初始默认 */
}
.panel-left {
left: 0;
/* 左侧面板,向右折叠,轴心在右侧 */
transform-origin: right center; /* 0% 50% */
}
.panel-center {
left: 100px; /* 紧接左侧面板 */
z-index: 1; /* 确保中间面板在最上层 */
}
.panel-right {
left: 200px; /* 紧接中间面板 */
/* 右侧面板,向左折叠,轴心在左侧 */
transform-origin: left center; /* 100% 50% */
}应用rotate3d
:hover
card-panel
transform
rotate3d(x, y, z, angle)
rotateY
rotate3d(0, 1, 0, angle)
rotateX
rotate3d(1, 0, 0, angle)
.card-container:hover .panel-left {
/* 向内折叠,负角度 */
transform: rotateY(-90deg);
}
.card-container:hover .panel-right {
/* 向内折叠,正角度 */
transform: rotateY(90deg);
}这样,当鼠标悬停在
.card-container
perspective
transform-style: preserve-3d
说实话,我刚开始接触CSS 3D变换时,总觉得效果“不对劲”,明明设置了
rotateX
rotateY
perspective
transform-style: preserve-3d
perspective
而
transform-style: preserve-3d
preserve-3d
preserve-3d
transform-origin
transform-origin
transform
center center
50% 50%
举个例子,如果你想让一个卡片从右侧向内折叠,那么它的旋转轴心就应该在右侧边缘。这时,你就需要设置
transform-origin: right center;
transform-origin: 100% 50%;
rotateY
如果卡片是从顶部向下折叠(比如一个卷轴展开),那么轴心就应该在顶部边缘,对应
transform-origin: center top;
50% 0%;
rotateX
在制作多页折叠时,每个“页片”的
transform-origin
transform-origin
制作多页折叠效果,纯粹依赖CSS当然可以实现一些简单的交互,比如
:hover
CSS在其中的角色: CSS最擅长的是定义动画的“状态”和“过渡”。你可以用CSS
transition
transform
transform
.is-folded
transform
JavaScript在其中的角色: JavaScript则提供了对动画过程的精确控制。它能够监听用户事件(点击、滚动),动态地添加或移除CSS类,甚至直接修改元素的
style.transform
transform
translateZ
scroll
协同策略: 我通常会采取一种混合策略:
transform
transition
/* 初始展开状态 */
.card-panel {
transform: rotateY(0deg) translateZ(0px);
transition: transform 0.8s ease-in-out;
}
/* 折叠状态 */
.card-container.folded .panel-left {
transform: rotateY(-90deg) translateZ(50px); /* 适当调整Z轴避免穿插 */
}
.card-container.folded .panel-right {
transform: rotateY(90deg) translateZ(50px);
}const cardContainer = document.querySelector('.card-container');
cardContainer.addEventListener('click', () => {
cardContainer.classList.toggle('folded');
});transform-origin
translateZ
translateZ
这种协同方式既能利用CSS在动画性能上的优势,又能发挥JavaScript在逻辑控制上的强大能力,实现既流畅又复杂的折叠效果。
以上就是CSS怎样制作卡片折叠立体效果?rotate3d变换组合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号