您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么使用纯CSS仿AntDesign的Logo彩蛋效果
## 前言
Ant Design作为一款优秀的企业级UI设计语言,其Logo中隐藏的"彩蛋"动画一直为人称道——当鼠标悬停在Logo上时,字母"i"上的红点会变成一朵旋转的莲花。本文将深入剖析如何仅用CSS实现这一精致效果,无需任何JavaScript代码。
## 效果分析
先观察Ant Design原始效果:
- 静态Logo中"i"字母顶部为红色圆点
- 悬停时红点平滑转变为旋转的莲花图案
- 莲花由8片花瓣组成,旋转时带有立体感
- 整体过渡自然,没有突兀变化
## 实现思路拆解
### 1. 基础结构搭建
```html
<div class="logo">
<span class="letter-i">
<span class="dot"></span>
</span>
</div>
::before
和::after
伪元素创建花瓣.logo {
font-size: 48px;
font-weight: bold;
position: relative;
display: inline-block;
cursor: pointer;
}
.letter-i {
position: relative;
display: inline-block;
width: 0.5em;
height: 1em;
background-color: currentColor;
border-radius: 2px;
}
.dot {
position: absolute;
top: -0.3em;
left: 50%;
transform: translateX(-50%);
width: 0.3em;
height: 0.3em;
background-color: #ff4d4f;
border-radius: 50%;
transition: all 0.3s ease;
}
使用伪元素创建8个花瓣:
.dot::before,
.dot::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: inherit;
border-radius: 50%;
opacity: 0;
transition: all 0.3s ease;
}
/* 创建8个花瓣位置 */
.dot::before {
transform: rotate(0deg) translateY(-150%) scale(0.8);
}
.dot::after {
transform: rotate(45deg) translateY(-150%) scale(0.8);
}
/* 通过box-shadow创建其余6个花瓣 */
.dot {
box-shadow:
0 0 0 0 currentColor,
0 0 0 0 currentColor,
0 0 0 0 currentColor,
0 0 0 0 currentColor;
transition:
box-shadow 0.3s ease,
transform 0.3s ease;
}
.logo:hover .dot {
background-color: transparent;
transform: translateX(-50%) rotate(180deg);
box-shadow:
/* 8个花瓣位置 */
-0.2em -0.2em 0 0.03em #ff4d4f,
0 -0.28em 0 0.03em #ff4d4f,
0.2em -0.2em 0 0.03em #ff4d4f,
0.28em 0 0 0.03em #ff4d4f,
0.2em 0.2em 0 0.03em #ff4d4f,
0 0.28em 0 0.03em #ff4d4f,
-0.2em 0.2em 0 0.03em #ff4d4f,
-0.28em 0 0 0.03em #ff4d4f;
}
.logo:hover .dot::before,
.logo:hover .dot::after {
opacity: 1;
transform: rotate(0deg) translateY(-150%) scale(1);
}
@keyframes rotate {
from { transform: translateX(-50%) rotate(0deg); }
to { transform: translateX(-50%) rotate(360deg); }
}
.logo:hover .dot {
animation: rotate 3s linear infinite;
}
/* 启用GPU加速 */
.dot {
will-change: transform, box-shadow;
}
/* 减少重绘区域 */
.letter-i {
isolation: isolate;
}
.dot {
transition:
box-shadow 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55),
transform 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55);
}
@media (max-width: 768px) {
.logo {
font-size: 32px;
}
}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS实现AntD Logo彩蛋</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f5f5f5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.logo {
font-size: 64px;
font-weight: bold;
color: #1890ff;
position: relative;
display: inline-block;
cursor: pointer;
padding: 0 20px;
}
.letter-i {
position: relative;
display: inline-block;
width: 0.4em;
height: 1em;
background-color: currentColor;
border-radius: 3px;
vertical-align: middle;
margin: 0 0.1em;
}
.dot {
position: absolute;
top: -0.25em;
left: 50%;
transform: translateX(-50%);
width: 0.25em;
height: 0.25em;
background-color: #ff4d4f;
border-radius: 50%;
transition: all 0.4s cubic-bezier(0.68, -0.55, 0.27, 1.55);
will-change: transform, box-shadow;
box-shadow:
0 0 0 0 currentColor,
0 0 0 0 currentColor,
0 0 0 0 currentColor,
0 0 0 0 currentColor;
}
.dot::before,
.dot::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: inherit;
border-radius: 50%;
opacity: 0;
transition: all 0.4s ease;
}
.dot::before {
transform: rotate(0deg) translateY(-150%) scale(0.8);
}
.dot::after {
transform: rotate(45deg) translateY(-150%) scale(0.8);
}
.logo:hover .dot {
background-color: transparent;
transform: translateX(-50%) rotate(180deg);
box-shadow:
-0.15em -0.15em 0 0.02em #ff4d4f,
0 -0.21em 0 0.02em #ff4d4f,
0.15em -0.15em 0 0.02em #ff4d4f,
0.21em 0 0 0.02em #ff4d4f,
0.15em 0.15em 0 0.02em #ff4d4f,
0 0.21em 0 0.02em #ff4d4f,
-0.15em 0.15em 0 0.02em #ff4d4f,
-0.21em 0 0 0.02em #ff4d4f;
animation: rotate 3s linear infinite;
}
.logo:hover .dot::before,
.logo:hover .dot::after {
opacity: 1;
transform: rotate(0deg) translateY(-150%) scale(1);
}
@keyframes rotate {
from { transform: translateX(-50%) rotate(0deg); }
to { transform: translateX(-50%) rotate(360deg); }
}
/* 文字样式 */
.logo-text {
display: inline-block;
vertical-align: middle;
}
/* 响应式调整 */
@media (max-width: 768px) {
.logo {
font-size: 32px;
}
}
</style>
</head>
<body>
<div class="logo">
<span class="logo-text">Ant Design</span>
<span class="letter-i">
<span class="dot"></span>
</span>
</div>
</body>
</html>
通过::before
和::after
伪元素创建了两个花瓣,再配合box-shadow
复制出另外6个花瓣,避免了额外DOM节点。
使用translateX(-50%)
保持水平居中,再叠加rotate()
实现旋转,这种变换组合是CSS定位的常用模式。
will-change
预先告知浏览器可能的变化transform
和opacity
属性触发GPU加速通过currentColor
关键字继承父元素颜色值,保持与整体风格一致。
检查box-shadow
的偏移量和扩散半径,确保8个花瓣均匀分布:
box-shadow:
-0.15em -0.15em 0 0.02em #ff4d4f, /* 左上 */
0 -0.21em 0 0.02em #ff4d4f, /* 正上 */
0.15em -0.15em 0 0.02em #ff4d4f, /* 右上 */
0.21em 0 0 0.02em #ff4d4f, /* 正右 */
0.15em 0.15em 0 0.02em #ff4d4f, /* 右下 */
0 0.21em 0 0.02em #ff4d4f, /* 正下 */
-0.15em 0.15em 0 0.02em #ff4d4f, /* 左下 */
-0.21em 0 0 0.02em #ff4d4f; /* 正左 */
确保使用了硬件加速:
.dot {
transform: translateZ(0);
backface-visibility: hidden;
}
添加触摸事件支持:
@media (hover: none) {
.logo:active .dot {
/* 悬停样式 */
}
}
这个技术可以应用于: 1. 加载指示器 2. 交互式图标 3. 状态切换动画 4. 数据可视化中的焦点提示
通过纯CSS实现Ant Design的Logo彩蛋效果,我们不仅学习到了: - 复杂CSS动画的组合技巧 - 性能优化的实践方法 - 伪元素的创新用法 - 响应式动画的设计思路
这种实现方式无需JavaScript,性能高效,代码简洁,是前端动画开发的优秀实践。希望本文能帮助你深入理解CSS动画的强大能力。
最终效果可通过CodePen等在线编辑器实时预览,建议读者动手实践以加深理解。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。