html如何实现平滑滚动 页面平滑滚动效果设置

陌雪小哥_3082

陌雪小哥_3082

2025-06-25

923人浏览

原创

实现页面平滑滚动主要有两种方式:1.css scroll-behavior,通过设置html或特定元素的scroll-behavior属性实现平滑滚动,优点是简单易用但兼容性较差且无法自定义动画细节;2.javascript实现,使用window.scrollto()或requestanimationframe()方法,可灵活控制滚动速度和缓动函数,兼容性好但代码量较多;对于不支持scroll-behavior的浏览器可采用javascript方案作为备选,也可针对特定容器应用平滑滚动并修正偏移量;自定义滚动速度可通过修改duration参数实现,缓动函数则可通过替换easeinoutcubic等函数来调整效果。

html如何实现平滑滚动 页面平滑滚动效果设置

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

html如何实现平滑滚动 页面平滑滚动效果设置

解决方案

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

html如何实现平滑滚动 页面平滑滚动效果设置

1. CSS scroll-behavior

这是最简单的方式,只需要一行CSS代码:

html如何实现平滑滚动 页面平滑滚动效果设置
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  {
  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 是一种常用的缓动函数,可以产生先加速后减速的效果。

优点:兼容性好,可以自定义滚动动画的各种参数,灵活性高。

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载

缺点:代码量相对较多,需要一定的 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 <p>这个 <code>easeOutBounce</code> 缓动函数会产生一个类似弹跳的效果。</p>

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

20

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

20

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

20

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

120

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

100

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

300

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习