用 CSS 打造玻璃态卡片悬停效果,几步就能搞定

作者: jie 分类: CSS 发布时间: 2026-01-02 16:16

前言

玻璃态设计(Glassmorphism)在 UI 设计里一直很受欢迎 —— 半透明的质感、柔和的模糊效果,再加上光影层次,能让界面瞬间有了高级感。今天想跟大家分享一个简单但很出效果的玻璃态卡片案例,不用复杂的 JS纯 CSS 就能实现悬停时的动态变化,新手也能快速上手。

效果预览

页面中央有四个卡片,每个卡片都带着玻璃态的磨砂质感,初始状态会有不同角度的倾斜,卡片上有对应的图标(设计、代码、发射、收益相关),底部还有文字标识。当鼠标移到卡片区域时,所有卡片会自动摆正角度,整齐排列,间距也会调整得更均匀,整个过程平滑流畅,视觉上很有张力。

目标与实现思路

核心目标

  1. 实现卡片的玻璃态视觉效果(半透明、模糊背景、边框质感)
  2. 添加悬停时的动画效果(角度归位、间距调整)

实现要点

  • 用 CSS 的backdrop-filter和半透明背景模拟玻璃质感
  • 通过自定义属性--r控制卡片初始旋转角度
  • 利用transition实现悬停时的平滑动画过渡
  • 用 Flex 布局控制卡片的排列方式

HTML结构说明

整体结构很简单:一个container容器包裹了四个glass卡片。每个卡片通过style="--r: 角度值”定义初始旋转角度,data-text属性存储底部显示的文字(比如 “Design”“Code”),内部用 Font Awesome 的图标标签<i>展示对应图标。没有多余嵌套,语义清晰,新手也能快速看懂。

CSS样式详解

这部分是实现效果的核心,挑几个关键属性说说:

1. 玻璃态核心

  • background: linear-gradient(#fff2, transparent):用渐变实现轻微的白色半透明背景,避免纯透明显得单薄
  • backdrop-filter: blur(10px):关键属性!让卡片背后的背景产生模糊,模拟磨砂玻璃效果
  • border: 1px solid rgba(255,255,255,0.1):浅色细边框增强玻璃的 “边框感”,避免边缘太生硬

2. 初始状态与动画

  • transform: rotate(calc(var(--r) * 1deg)):通过自定义属性–r计算旋转角度,让每个卡片初始倾斜角度不同
  • transition: 0.5s:给所有属性变化添加 0.5 秒过渡,让动画更顺滑

3. 悬停交互

  • 鼠标移到容器时,container:hover .glass会触发样式变化:transform: rotate(0deg)让卡片归位,margin: 0 20px调整间距,实现整齐排列的效果

4. 细节增强

  • box-shadow: 0 25px 25px rgba(0,0,0,0.25):深色阴影增加卡片的悬浮感,让玻璃态不显得 “飘”
  • 卡片底部的文字通过::before伪元素实现,用attr(data-text)读取 HTML 中的文字,减少冗余代码

完整源码附录

index.html

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>CSS 玻璃态卡片悬停效果</title>
		<!-- 引入Font Awesome图标库 -->
		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css" integrity="sha512-DxV+EoADOkOygM4IR9yXP8Sb2qwgidEmeqAEmDKIOfPRQZOWbXCzLC6vjbZyy0vPisbH2SyW27+ddLVCN+OMzQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
		<!-- 引入自定义样式 -->
		<link rel="stylesheet" href="style.css">
	</head>
	<body>
		<!-- 卡片容器 -->
		<div class="container">
			<!-- 玻璃态卡片1:设计 -->
			<div class="glass" style="--r: -15;" data-text="Design">
				<i class="fa-regular fa-pen-to-square"></i>
			</div>
			<!-- 玻璃态卡片2:代码 -->
			<div class="glass" style="--r: 5;" data-text="Code">
				<i class="fa-solid fa-code"></i>
			</div>
			<!-- 玻璃态卡片3:发射 -->
			<div class="glass" style="--r: 25;" data-text="Launch">
				<i class="fa-solid fa-rocket"></i>
			</div>
			<!-- 玻璃态卡片4:收益 -->
			<div class="glass" style="--r: -15;" data-text="Earn">
				<i class="fa-solid fa-money-check-dollar"></i>
			</div>
		</div>
	</body>
</html>

style.css

/* 初始化样式:清除默认内外边距,设置盒模型 */
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

/* 页面主体样式:黑色背景,居中布局 */
body {
	display: flex;
	justify-content: center;
	align-items: center;
	height: 100vh;
	/* 占满整个视口高度 */
	background: #0f222f;
	/* 深色背景,突出玻璃态效果 */
}

/* 卡片容器:控制卡片整体排列 */
.container {
	position: relative;
	display: flex;
	/* 让卡片横向排列 */
	justify-content: center;
	align-items: center;
}

/* 玻璃态卡片基础样式 */
.container .glass {
	position: relative;
	width: 200px;
	height: 240px;
	background: linear-gradient(#fff2, transparent);
	/* 半透明渐变背景 */
	border: 1px solid rgba(255, 255, 255, 0.1);
	/* 浅色边框增强玻璃质感 */
	box-shadow: 0 25px 25px rgba(0, 0, 0, 0.25);
	/* 深色阴影增加立体感 */
	backdrop-filter: blur(10px);
	/* 关键:背景模糊,实现磨砂玻璃效果 */
	display: flex;
	justify-content: center;
	align-items: center;
	transition: 0.5s;
	/* 所有变化添加过渡动画 */
	border-radius: 10px;
	/* 圆角处理 */
	margin: 0 -45px;
	/* 初始重叠一点,增强错落感 */
	transform: rotate(calc(var(--r) * 1deg));
	/* 用自定义属性控制初始旋转角度 */
}

/* 鼠标悬停容器时的卡片样式 */
.container:hover .glass {
	transform: rotate(0deg);
	/* 旋转归位 */
	margin: 0 20px;
	/* 调整间距,整齐排列 */
}

/* 卡片底部文字:通过伪元素实现 */
.container .glass::before {
	content: attr(data-text);
	/* 读取data-text属性的值作为文字 */
	position: absolute;
	bottom: 0;
	width: 100%;
	height: 40px;
	background: rgba(255, 255, 255, 0.05);
	/* 轻微底色,突出文字 */
	display: flex;
	justify-content: center;
	align-items: center;
	color: #fff;
	/* 白色文字,与深色背景对比 */
}

/* 卡片图标样式 */
.container .glass i {
	font-size: 4em;
	/* 图标放大 */
	color: #fff;
	/* 白色图标,保持风格统一 */
}

结语 & 行动建议

这个案例其实不难,核心就是把玻璃态的几个关键 CSS 属性用好,再配合简单的过渡动画。你完全可以动手改改看:比如换个背景色(试试深蓝色或紫色?)、调整卡片尺寸、换一套图标,甚至改改悬停时的动画时长,看看会有什么新效果。

发表回复