0

0

如何在页面跳转前完成 CSS 动画(阻止 href 立即重定向)

碧海醫心

碧海醫心

发布时间:2026-01-15 18:26:07

|

119人浏览过

|

来源于php中文网

原创

如何在页面跳转前完成 CSS 动画(阻止 href 立即重定向)

点击链接时,浏览器默认会立即触发跳转,导致动画来不及播放。解决方法是拦截默认行为,在动画结束后手动执行重定向,确保视觉过渡流畅完成。

在 Web 开发中,为提升用户体验,常需在页面跳转前添加平滑的 CSS 动画(如 Logo 缩放、菜单位移等)。但直接在 标签中使用 href 属性时,浏览器会在 onclick 函数执行的同时或之前就启动导航,导致 animate() 这类异步动画被中断或完全跳过。

根本原因在于:href 的跳转是同步且高优先级的 DOM 行为,而 Element.animate() 返回的是一个 Animation 对象,其播放是异步的——它不会阻塞主线程,也不会等待动画结束才继续执行后续 JS 逻辑(包括跳转)。

✅ 正确解法:阻止默认跳转 → 执行动画 → 动画完成后再手动跳转

以下是推荐实现方式(基于现代浏览器兼容性,无需 polyfill):

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载

立即学习前端免费学习笔记(深入)”;

✅ 推荐方案:使用 animation.onfinish + e.preventDefault()

Portfolio
function move(e, linkElement) {
  e.preventDefault(); // 关键:阻止默认跳转

  const logo = document.getElementById("Logo");
  const menu = document.getElementById("Menu");

  // 执行 Logo 动画
  const logoAnim = logo.animate([
    { left: '50vw', top: '25vh' },
    { left: '5vw',  top: '7.5vh' }
  ], { duration: 1000 });

  // 执行 Menu 动画
  const menuAnim = menu.animate([
    { left: '50vw', top: '40vh', width: '10vw' },
    { left: '0vw',  top: '5vh',  width: '7.5vw' }
  ], { duration: 1000 });

  // 同步设置最终样式(避免动画结束后回弹)
  logo.style.left = "5vw";
  logo.style.top  = "7.5vh";
  menu.style.left = "0vw";
  menu.style.top  = "5vh";
  menu.style.width = "7.5vw";

  // ⚠️ 关键:监听所有动画完成后再跳转
  Promise.all([
    logoAnim.finished,
    menuAnim.finished
  ]).then(() => {
    window.location.href = linkElement.href; // 安全跳转
  });
}

? 补充说明与注意事项

  • 不要用 return false 替代 e.preventDefault():虽然 onclick="move(); return false" 能阻止跳转,但它会同时阻止事件冒泡且语义模糊;e.preventDefault() 更精准、可维护性更强。
  • 避免 setTimeout 硬编码延迟:如 setTimeout(() => location.href = ..., 1000) 不可靠——若动画被用户系统性能影响或 CSS animation-duration 变更,易出现跳转早于动画结束的问题。
  • .finished 是 Promise:Animation.finished 返回一个在动画自然结束(含完成、取消、填充模式生效)时 resolve 的 Promise,比轮询 animation.playState 更优雅。
  • 兼容性提示:Animation.finished 在 Chrome 46+、Firefox 48+、Edge 79+、Safari 16.4+ 中原生支持;如需支持旧版 Safari,可降级使用 animation.onfinish 事件回调(注意:该事件不触发于被 cancel() 的动画)。

✅ 最终效果

用户点击「Portfolio」链接后:

  1. 页面不立即跳转;
  2. Logo 与菜单同步执行 1 秒位移缩放动画;
  3. 动画完全结束后,自动跳转至 {% url 'Portfolio' %} 对应路由
  4. 整个过程无闪烁、无回弹、过渡自然。

此方案兼顾语义清晰性、可维护性与跨浏览器稳定性,是实现“带动画的 SPA 式导航”的标准实践之一。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

522

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

262

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

753

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

539

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

757

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

604

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

560

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

390

2023.08.22

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号