下面我将从简单到复杂,为你提供几个非常实用的动态效果代码示例,并附上详细解释,你可以直接复制这些代码,保存为 .html 文件,然后在浏览器中打开查看效果。

(图片来源网络,侵删)
示例 1:CSS 实现的平滑滚动和渐显动画
这是最基础也是最常用的动态效果,非常适合用于作品集、博客等网站,让页面加载和滚动时更平滑、更有层次感。
效果描述:
- 当你滚动页面时,标题和卡片会平滑地淡入并滑入视野。
- 点击导航栏的链接,页面会平滑滚动到对应部分,而不是瞬间跳转。
代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">CSS 动态效果示例</title>
<style>
/* --- 全局和基础样式 --- */
body {
font-family: 'Arial', sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
color: #333;
}
/* --- 平滑滚动 --- */
html {
scroll-behavior: smooth; /* 一行代码实现平滑滚动! */
}
/* --- 导航栏 --- */
nav {
position: fixed; /* 固定在顶部 */
top: 0;
width: 100%;
background-color: #333;
z-index: 1000; /* 确保在最上层 */
}
nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
}
nav a {
display: block;
color: white;
text-decoration: none;
padding: 20px 30px;
transition: background-color 0.3s ease;
}
nav a:hover {
background-color: #555;
}
/* --- 内容区域 --- */
section {
height: 100vh; /* 每个section占满一屏 */
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
#home { background-color: #ff9a9e; }
#about { background-color: #a8edea; }
#portfolio { background-color: #fed6e3; }
/* --- 动画元素 --- */
.fade-in {
opacity: 0; /* 初始状态为透明 */
transform: translateY(30px); /* 初始状态向下偏移 */
transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}
.fade-in.visible {
opacity: 1; /* 变为不透明 */
transform: translateY(0); /* 回到原位 */
}
/* 卡片样式 */
.card {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
max-width: 400px;
text-align: center;
margin: 20px;
}
</style>
</head>
<body>
<nav>
<ul>
<li><a href="#home">首页</a></li>
<li><a href="#about">lt;/a></li>
<li><a href="#portfolio">作品集</a></li>
</ul>
</nav>
<section id="home">
<h1 class="fade-in">欢迎来到我的网站</h1>
<p class="fade-in">滚动页面查看动画效果</p>
</section>
<section id="about">
<h2 class="fade-in">关于我</h2>
<div class="card fade-in">
<p>我是一名热爱创造美好用户体验的前端开发者。</p>
</div>
</section>
<section id="portfolio">
<h2 class="fade-in">我的作品</h2>
<div class="card fade-in">
<p>这是一个使用纯CSS实现的动态效果示例。</p>
</div>
<div class="card fade-in">
<p>简单、优雅且高效。</p>
</div>
</section>
<script>
// --- JavaScript 控制滚动时的动画 ---
// 获取所有带有 'fade-in' 类的元素
const faders = document.querySelectorAll('.fade-in');
// 创建一个观察器实例
const appearOptions = {
threshold: 0.1, // 当元素10%进入视口时触发
rootMargin: "0px 0px -100px 0px" // 触发前100px就开始
};
const appearOnScroll = new IntersectionObserver(function(entries, appearOnScroll) {
entries.forEach(entry => {
// 如果元素在视口中
if (!entry.isIntersecting) {
return;
} else {
// 添加 'visible' 类来触发动画
entry.target.classList.add('visible');
// 动画完成后,停止观察该元素以优化性能
appearOnScroll.unobserve(entry.target);
}
});
}, appearOptions);
// 开始观察每个需要动画的元素
faders.forEach(fader => {
appearOnScroll.observe(fader);
});
</script>
</body>
</html>
代码解析:
-
CSS:
scroll-behavior: smooth;: 在html标签上设置,让所有锚点链接的滚动都变得平滑。.fade-in: 定义了元素的初始状态(透明、下移)和最终状态(不透明、原位)。transition属性告诉浏览器,当opacity和transform属性变化时,用0.8秒的时间进行平滑过渡。.fade-in.visible: 这是动画的终点,当这个类被添加到元素上时,opacity和transform的值改变,触发transition动画。
-
JavaScript:
- 我们使用 Intersection Observer API,这是现代浏览器提供的高性能API,用于检测元素是否进入或离开视口。
- 我们创建了一个观察器
appearOnScroll,并设置threshold: 0.1,意味着当元素有10%进入浏览器窗口时,观察器就会触发。 faders.forEach(...)遍历所有带有fade-in类的元素,并让观察器开始观察它们。- 当元素进入视口时,观察器的回调函数被执行,我们给该元素添加
visible类,从而触发CSS动画。
示例 2:JavaScript 实现的打字机效果
这个效果非常适合用在首页的欢迎语或标题上,能吸引用户的注意力。

(图片来源网络,侵删)
效果描述:
- 一行文字会像打字机一样,一个字符一个字符地出现。
- 打字完成后,光标会闪烁。
代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">打字机效果</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #282c34;
color: white;
font-family: 'Courier New', Courier, monospace;
}
h1 {
font-size: 3rem;
}
.cursor {
display: inline-block;
width: 3px;
height: 1em;
background-color: white;
animation: blink 1s infinite;
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
</style>
</head>
<body>
<h1 id="typewriter"></h1>
<span class="cursor"> </span> <!-- 光标 -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const text = "你好,世界!";
const element = document.getElementById('typewriter');
let index = 0;
function typeWriter() {
if (index < text.length) {
element.innerHTML += text.charAt(index);
index++;
// 调整速度,单位是毫秒
setTimeout(typeWriter, 150);
}
}
typeWriter();
});
</script>
</body>
</html>
代码解析:
- HTML: 只需要一个
<h1>元素来显示文字,和一个<span>元素作为闪烁的光标。 - CSS:
.cursor: 定义了一个很窄的白色竖条作为光标。@keyframes blink: 定义了一个名为blink的动画,让光标的透明度在1和0之间切换,infinite表示无限循环。animation: blink 1s infinite;: 将blink动画应用到光标上,每次循环1秒。
- JavaScript:
document.addEventListener('DOMContentLoaded', ...): 确保在HTML文档完全加载和解析后才执行脚本。typeWriter函数是核心逻辑。if (index < text.length): 检查是否还有字符需要打印。element.innerHTML += text.charAt(index);: 每次循环,将目标字符串的下一个字符追加到h1的内容中。index++: 增加索引,以便下一次循环获取下一个字符。setTimeout(typeWriter, 150);: 在150毫秒后再次调用typeWriter函数,形成循环,通过调整这个时间值,可以控制打字的速度。
示例 3:鼠标悬停的 3D 卡片翻转效果
这是一个非常酷炫的交互效果,能让你的卡片或图片在鼠标悬停时翻转,显示背面的内容。
效果描述:
- 卡片默认显示正面。
- 当鼠标移到卡片上时,卡片会沿Y轴翻转180度,显示背面的内容。
- 鼠标移开时,卡片会翻转回来。
代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">3D 翻转卡片</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(135deg, #6e8efb, #a777e3);
perspective: 1000px; /* 为3D变换设置视角距离 */
}
.card-container {
width: 300px;
height: 400px;
position: relative;
transform-style: preserve-3d; /* 保持3D变换,让子元素也能进行3D变换 */
transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); /* 平滑的翻转过渡 */
}
.card-container:hover {
transform: rotateY(180deg); /* 悬停时,沿Y轴旋转180度 */
}
.card {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden; /* 隐藏元素的背面 */
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
color: white;
text-align: center;
padding: 20px;
}
.card-front {
background-image: linear-gradient(to right, #ff7e5f, #feb47b);
}
.card-back {
background-image: linear-gradient(to right, #4facfe, #00f2fe);
transform: rotateY(180deg); /* 初始状态下,背面已经旋转180度,所以是正对我们的 */
}
</style>
</head>
<body>
<div class="card-container">
<div class="card card-front">
<h2>正面内容</h2>
<p>将鼠标悬停在此卡片上</p>
</div>
<div class="card card-back">
<h2>背面内容</h2>
<p>这里可以放更多信息</p>
</div>
</div>
</body>
</html>
代码解析:
- CSS (3D变换的关键):
perspective: 1000px;: 在父元素上设置,它定义了观察者与z=0平面的距离,值越小,3D效果越强烈(透视感越强)。transform-style: preserve-3d;: 在父元素(.card-container)上设置,这是实现3D翻转的核心,它告诉浏览器这个元素的子元素应该在3D空间中进行变换。.card-container:hover { transform: rotateY(180deg); }: 当鼠标悬停时,让整个容器翻转180度。backface-visibility: hidden;: 在两个卡片上设置,这非常重要!它防止了翻转过程中,卡片的背面(现在变成了正面)在翻转到一半时显示出来,造成视觉上的混乱。.card-back { transform: rotateY(180deg); }: 在初始状态下,就将背面旋转180度,这样,当容器整体再旋转180度时,背面就正好旋转了360度(即0度),正面朝向我们。
总结与建议
| 动效类型 | 主要技术 | 难度 | 适用场景 |
|---|---|---|---|
| 滚动动画 | CSS transition + JavaScript Intersection Observer |
中等 | 页面加载、滚动时的元素渐入、滑入 |
| 打字机效果 | JavaScript setTimeout / setInterval |
简单 | 、Slogan、动态文本展示 |
| 3D翻转 | CSS transform (rotateY, preserve-3d, perspective) |
中等 | 卡片式设计、产品展示、个人简介 |
学习建议:
- 从模仿开始:先复制上面的代码,理解每一部分的作用。
- 修改参数:尝试修改动画时间、颜色、文字、旋转角度等,看看效果如何变化。
- 组合使用:将多个效果组合在一起,比如一个带有打字机效果的标题,在滚动时再渐显。
- 学习更多API:除了
Intersection Observer,还可以学习requestAnimationFrame(用于制作高性能动画) 和 CSS 的@keyframes(用于制作更复杂的序列动画)。
希望这些例子能帮助你开始制作精彩的动态网页!

(图片来源网络,侵删)
