HTML&CSS:精美的3D折叠卡片悬停效果

这个 HTML 文件实现了一个精美的 3D 折叠卡片悬停效果。当用户将鼠标悬停在中间的卡片上时,卡片会展开成多层结构,呈现出立体感的动态变换,同时整体视角也会发生倾斜,创造出深度感和视觉吸引力。


大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能解决问题,私信回复源码两字,我会发送完整的压缩包给你。

演示效果

HTML&CSS

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>有趣的鼠标效果</title>
    <style>
        @import url("https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap");
        * {
        box-sizing: border-box;
        }
        html,
        body {
            height: 100%;
            overflow: hidden;
            margin: 0;
            padding: 0;
        }
        :root {
            --sz: clamp(10px, min(2vw, 3vh), 24px);
            font-size: var(--sz);
            --fz: 10rem;
            --exp: 24deg;
            --per: 54deg;
            --tilt: 10deg;
        }
        body {
            display: grid;
            place-items: center;
            background: #e0e0e0;
            color: #444;
        }
        body,
        .base,
        .base * {
            transform-style: preserve-3d;
            perspective: 2000px;
            font-weight: 100;
            transition: all 1s ease-in-out;
            font-family: "Playfair Display", serif;
        }
        body > h2 {
            transition: all 1s ease-in-out;
            position: absolute;
            font-size: var(--fz);
            transform: rotateX(var(--per));
            font-weight: 100;
        }
        body:has(.base:hover) > h2 {
            transform: rotateX(calc(var(--per) + var(--tilt)));
        }

        .base {
            transform: rotateX(var(--per));
            width: 10rem;
            height: 15rem;
            border: 1px solid #fff;
            position: relative;
            box-shadow: 0 0 0 0.6rem #000c, inset 10rem 0 10rem -5rem #000a,
                inset 0 0 0 0.6rem #fff, 0 0 0 0 #000a;
            background: url("https://img0.baidu.com/it/u=283204948,2024515402&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800");
            background-size: cover;
            cursor: pointer;
        }
        .base:hover {
            transform: rotateX(calc(var(--per) + var(--tilt)));
            box-shadow: 0 0 0 0.6rem #000c, inset 10rem 0 10rem -5rem #000a,
                inset 0 0 0 0.6rem #fff, 2rem -2rem 5rem 0 #000a;
        }
        .pane {
            width: 100%;
            height: 100%;
            box-shadow: inset 0 0 0 0.6rem #fff;
            display: grid;
            place-items: center;
        }
        .base > .pane {
            transform-origin: 0 50%;
            background: url("https://img0.baidu.com/it/u=283204948,2024515402&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800");
            background-size: cover;
            box-shadow: inset -10rem 0 10rem -5rem #0004, inset 0 0 0 0.6rem #fff;
        }
        .base > .pane > .pane {
            transform-origin: 100% 50%;
            background: url("https://img0.baidu.com/it/u=283204948,2024515402&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800");
            background-size: cover;
            box-shadow: inset 10rem 0 10rem -5rem #000a, inset 0 0 0 0.6rem #fff;
        }
        .base > .pane > .pane > .pane {
            transform-origin: 0 50%;
            background: #e0e0e0;
            overflow: hidden;
            position: relative;
        h2 {
            font-size: var(--fz);
            text-align: center;
            position: absolute;
            white-space: nowrap;
        }
        }
        .base:hover > .pane {
            transform: rotateY(calc(-1 * var(--exp)));
        }
        .base:hover > .pane > .pane {
            transform: rotateY(calc(2 * var(--exp)));
        }
        .base:hover > .pane > .pane > .pane {
            transform: rotateY(calc(-1 * var(--exp)));
        }

    </style>
</head>
<body>
    <h2>喜欢你</h2>
    <div class="base">
        <div class="pane">
            <div class="pane">
                <div class="pane">
                    <h2>喜欢你</h2>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

HTML

html 复制代码
  <h2>喜欢你</h2>
  <div class="base">
      <div class="pane">
          <div class="pane">
              <div class="pane">
                  <h2>喜欢你</h2>
              </div>
          </div>
      </div>
  </div>
  • 外层 h2:作为背景装饰性文字

  • base 容器:主卡片容器,包含多层嵌套结构

  • pane 层级:三层嵌套的 pane 元素,用于创建 3D 折叠效果

  • 内层 h2:折叠展开后显示的文字内容

CSS

3D 变换设置:

css 复制代码
transform-style: preserve-3d;
perspective: 2000px;

这些属性为元素及其子元素创建 3D 空间,是实现立体效果的基础

CSS 变量:

css 复制代码
:root {
--sz: clamp(10px, min(2vw, 3vh), 24px);
--fz: 10rem;
--exp: 24deg;
--per: 54deg;
--tilt: 10deg;
}

使用 CSS 变量方便统一调整参数,增强代码可维护性。

悬停效果:

css 复制代码
.base:hover {
transform: rotateX(calc(var(--per) + var(--tilt)));
}
.base:hover > .pane {
transform: rotateY(calc(-1 * var(--exp)));
}

通过:hover 伪类实现鼠标交互,各层 pane 以不同角度旋转,形成折叠效果


各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!

相关推荐
孟健1 小时前
Claude Code 同需求写两版对比:装不装 frontend-design 差多远?
前端·ai编程·claude
OpsEye2 小时前
大模型 Token 计量不准,是什么原因,怎么解决??
javascript·ai编程
梦de天空一米16883 小时前
【一个重复id让游戏卡在62%,聊聊配置表检查】
前端
用户3434612783203 小时前
用户认证系统在高并发下的幂等性与限流策略踩坑实录
css
ryn483983 小时前
01 一个功能模块,怎么分层才不乱
前端·ai编程·claude
Amos_Web3 小时前
通过 Rspack 源码学 Rust(五):读懂 Result 与问号运算符的错误返回
前端
杨航 AI4 小时前
JEV的用法
java·前端·数据库
Amos_Web4 小时前
Rspack 源码解析(三十五):rspack_error 如何用 miette 渲染带源码定位的错误链
前端
去伪存真4 小时前
高敏资产场景下的大模型协同设计架构
前端·agent
修炼的dance4 小时前
OCR预处理测了108组,纠斜去噪有用,坑在顺序和力度
前端