超简单!手把手教你用HTML实现页面平滑滚动效果
想要实现网页的平滑滚动效果吗?本文将分享超简单的HTML代码,助你轻松实现页面元素的平滑过渡滚动,告别生硬的跳转。文章主要介绍两种实现方式:一是利用CSS的`scroll-behavior`属性,代码简洁但兼容性稍逊;二是使用JavaScript,通过`window.scrollTo()`或`requestAnimationFrame()`实现,虽然代码量稍多,但拥有更好的兼容性和自定义性,能够灵活控制滚动速度和缓动函数。同时,本文还提供了兼容旧版浏览器的解决方案,以及针对特定容器应用平滑滚动并修正偏移量的方法,并教你如何自定义滚动速度和缓动函数,打造更个性化的滚动体验。
实现页面平滑滚动主要有两种方式:1.CSS scroll-behavior,通过设置html或特定元素的scroll-behavior属性实现平滑滚动,优点是简单易用但兼容性较差且无法自定义动画细节;2.JavaScript实现,使用window.scrollTo()或requestAnimationFrame()方法,可灵活控制滚动速度和缓动函数,兼容性好但代码量较多;对于不支持scroll-behavior的浏览器可采用JavaScript方案作为备选,也可针对特定容器应用平滑滚动并修正偏移量;自定义滚动速度可通过修改duration参数实现,缓动函数则可通过替换easeInOutCubic等函数来调整效果。

页面平滑滚动,简单来说,就是让页面滚动的时候,不是“嗖”的一下跳到目标位置,而是有一个平滑过渡的动画效果。实现起来并不复杂,主要通过CSS和JavaScript来实现。

解决方案
实现平滑滚动主要有两种方式:CSS scroll-behavior 和 JavaScript。

1. CSS scroll-behavior
这是最简单的方式,只需要一行CSS代码:

html {
scroll-behavior: smooth;
}这行代码会使整个页面的所有锚点链接都具有平滑滚动效果。 如果想只对特定元素应用平滑滚动,可以将其应用到该元素上,比如:
.scrollable-area {
scroll-behavior: smooth;
overflow-y: auto; /* 确保元素可以滚动 */
}优点:简单易用,代码量少。
缺点:兼容性略差,一些老版本的浏览器可能不支持。另外,无法自定义滚动动画的细节,例如滚动速度、缓动函数等。
2. JavaScript 实现
JavaScript 实现方式更加灵活,可以自定义滚动动画的各种参数。
a. 使用 window.scrollTo() 或 element.scrollTo()
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement) {
window.scrollTo({
top: targetElement.offsetTop,
behavior: 'smooth'
});
}
});
});这段代码会监听页面上所有以 # 开头的链接的点击事件,阻止默认跳转行为,然后使用 window.scrollTo() 方法滚动到目标元素的位置。 behavior: 'smooth' 指定了平滑滚动。
b. 使用 requestAnimationFrame() 实现更精细的动画控制
如果需要更精细的动画控制,例如自定义缓动函数,可以使用 requestAnimationFrame()。
function smoothScroll(element, target, duration) {
let start = element.scrollTop;
let change = target - start;
let startTime = performance.now();
function easeInOutCubic(t) {
t /= duration / 2;
if (t < 1) return change / 2 * t * t * t + start;
t -= 2;
return change / 2 * (t * t * t + 2) + start;
}
function animateScroll() {
const currentTime = performance.now() - startTime;
if (currentTime < duration) {
element.scrollTop = easeInOutCubic(currentTime);
requestAnimationFrame(animateScroll);
} else {
element.scrollTop = target;
}
}
requestAnimationFrame(animateScroll);
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement) {
smoothScroll(document.documentElement || document.body, targetElement.offsetTop, 500); // 500ms 滚动时间
}
});
});这个例子使用了 requestAnimationFrame() 和一个 easeInOutCubic 缓动函数来实现更平滑、更可控的滚动动画。 easeInOutCubic 是一种常用的缓动函数,可以产生先加速后减速的效果。
优点:兼容性好,可以自定义滚动动画的各种参数,灵活性高。
缺点:代码量相对较多,需要一定的 JavaScript 基础。
如何兼容不支持scroll-behavior的浏览器?
对于不支持 scroll-behavior 的老版本浏览器,可以采用 JavaScript 方案作为备选方案。检测浏览器是否支持 scroll-behavior,如果不支持,则使用 JavaScript 实现平滑滚动。
if ('scrollBehavior' in document.documentElement.style) {
// 支持 scroll-behavior,使用 CSS 实现
document.documentElement.style.scrollBehavior = 'smooth';
} else {
// 不支持 scroll-behavior,使用 JavaScript 实现
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement) {
// 使用 JavaScript 实现平滑滚动 (上面的 JavaScript 代码)
smoothScroll(document.documentElement || document.body, targetElement.offsetTop, 500);
}
});
});
}这样可以确保在所有浏览器上都能实现平滑滚动效果。
如何实现指定容器内的平滑滚动?
有时候,我们希望只对页面中的某个特定容器(例如一个 div)应用平滑滚动效果,而不是整个页面。 这时候,需要针对该容器进行设置。
CSS 方法:
.scrollable-container {
height: 300px; /* 设置容器高度 */
overflow-y: scroll; /* 允许垂直滚动 */
scroll-behavior: smooth;
}然后,容器内的锚点链接会自动平滑滚动。
JavaScript 方法:
修改 JavaScript 代码,将 window.scrollTo 替换为容器的 scrollTo 方法:
document.querySelectorAll('.scrollable-container a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href').substring(1);
const targetElement = document.getElementById(targetId);
if (targetElement && targetElement.parentNode.classList.contains('scrollable-container')) {
document.querySelector('.scrollable-container').scrollTo({
top: targetElement.offsetTop - targetElement.parentNode.offsetTop, // 修正偏移量
behavior: 'smooth'
});
}
});
});注意,这里需要修正偏移量,因为目标元素相对于容器的 offsetTop 可能不是 0。
如何自定义滚动速度和缓动函数?
使用 CSS 的 scroll-behavior 无法自定义滚动速度和缓动函数。 需要使用 JavaScript 来实现。
在上面的 JavaScript 示例中,已经展示了如何使用 requestAnimationFrame() 和自定义缓动函数来实现更精细的动画控制。 可以修改 smoothScroll 函数的 duration 参数来调整滚动速度,修改 easeInOutCubic 函数来调整缓动效果。
例如,要将滚动速度减慢一倍,可以将 duration 参数设置为 1000 (单位是毫秒)。
要使用不同的缓动函数,可以替换 easeInOutCubic 函数。 有很多现成的缓动函数可以使用,例如 linear, easeInQuad, easeOutQuad, easeInOutQuad 等。 也可以自定义缓动函数,只要保证函数接受一个 0 到 1 之间的数值作为输入,并返回一个 0 到 1 之间的数值作为输出即可。
function easeOutBounce(x) {
const n1 = 7.5625;
const d1 = 2.75;
if (x < 1 / d1) {
return n1 * x * x;
} else if (x < 2 / d1) {
return n1 * (x -= (1.5 / d1)) * x + 0.75;
} else if (x < 2.5 / d1) {
return n1 * (x -= (2.25 / d1)) * x + 0.9375;
} else {
return n1 * (x -= (2.625 / d1)) * x + 0.984375;
}
}这个 easeOutBounce 缓动函数会产生一个类似弹跳的效果。
今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
手把手教你用JS创建自定义元素,轻松打造专属标签
- 上一篇
- 手把手教你用JS创建自定义元素,轻松打造专属标签
- 下一篇
- win11跳过网络连接安装教程,超简单上手!
-
- 文章 · 前端 | 4分钟前 | javascript · 表单 · FormData FormDataEvent formdata事件 原生表单
- FormDataEvent 统一拦截原生表单数据的实现
- 288浏览 收藏
-
- 文章 · 前端 | 8小时前 | html · javascript · 表单 · requestSubmit form.submit HTML表单校验
- requestSubmit 与 form.submit 有什么区别
- 392浏览 收藏
-
- 文章 · 前端 | 14小时前 |
- scheduler.yield 怎么把长任务拆开又保持优先级
- 110浏览 收藏
-
- 文章 · 前端 | 16小时前 | CSS 滚动动画 animation-timeline scroll-timeline
- CSS scroll-timeline 怎么驱动滚动进度动画
- 251浏览 收藏
-
- 文章 · 前端 | 18小时前 |
- IntersectionObserver scrollMargin 怎么处理嵌套滚动容器
- 380浏览 收藏
-
- 文章 · 前端 | 20小时前 |
- dialog 的 closedby 属性怎么控制关闭方式
- 269浏览 收藏
-
- 文章 · 前端 | 1天前 |
- HTML popover 属性怎么管理轻量浮层
- 249浏览 收藏
-
- 文章 · 前端 | 1天前 |
- Navigation API 怎么拦截单页应用导航
- 167浏览 收藏
-
- 文章 · 前端 | 1天前 |
- View Transition API 怎么为同文档状态切换加动画
- 149浏览 收藏
-
- 文章 · 前端 | 1天前 | map · 前端 · 数据处理 · javascript · JavaScript 数组分组 Object.groupBy Map.groupBy
- Object.groupBy 与 Map.groupBy 应该怎么选
- 138浏览 收藏
-
- 文章 · 前端 | 1天前 |
- Promise.withResolvers 适合封装哪些外部回调
- 418浏览 收藏
-
- 文章 · 前端 | 1天前 |
- CSS 容器样式查询怎么读取自定义属性
- 414浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 255次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 298次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 274次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 252次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 59次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览
