使用 sessionStorage 实现网页闪屏动画的会话级控制与重置

使用 sessionStorage 实现网页闪屏动画的会话级控制与重置

本文将指导您如何利用 `sessionstorage` api 精确控制网页闪屏动画的播放行为。通过将闪屏状态存储在会话存储中,您可以确保动画在用户首次访问页面时播放一次,并在关闭浏览器标签页或窗口后自动重置,从而在下次访问时重新显示闪屏,有效解决了 `localstorage` 导致的动画永久不显示问题。

闪屏动画与数据持久化机制

网页闪屏动画(Splash Screen)常用于在页面内容加载或初始化时提供视觉反馈,或展示品牌信息。为了优化用户体验,通常希望闪屏动画只在用户首次访问时播放,而在后续同一会话内的导航中不再出现。然而,当用户关闭浏览器标签页或窗口后,如果希望闪屏动画在下次重新打开页面时再次播放,就需要一种合适的机制来管理其播放状态。

最初,开发者可能会倾向于使用 localStorage 来记录闪屏是否已播放。localStorage 能够实现数据的持久化存储,即使浏览器关闭,数据也不会丢失。但这恰恰导致了问题:一旦闪屏被标记为已播放,即使关闭并重新打开浏览器,它也不会再次出现。为了实现“关闭标签页后重置”的需求,我们需要更精细的数据持久化控制。

localStorage 与 sessionStorage:核心差异

理解 localStorage 和 sessionStorage 的别是解决此问题的关键:

localStorage (本地存储)

数据以键值对的形式存储在浏览器中。数据永久保存,没有过期时间。除非用户手动清除浏览器数据,或通过 JavaScript 代码删除,否则数据会一直存在。数据在所有同源窗口和标签页之间共享。适用于需要长期保存的用户偏好设置、离线数据等。

sessionStorage (会话存储)

数据也以键值对的形式存储在浏览器中。数据仅在当前浏览器会话期间有效。这意味着当用户关闭浏览器标签页或窗口时,所有 sessionStorage 中的数据都会被清除。数据在不同的标签页或窗口之间是隔离的,即使是同源页面,每个标签页也有独立的 sessionStorage。适用于需要在单个会话中保持状态的数据,例如表单数据、购物车内容等。

根据我们的需求,即闪屏状态在关闭标签页后重置,sessionStorage 是理想的选择。

构建闪屏动画的基础结构

首先,我们需要一个基本的 HTML 结构来承载闪屏内容,以及相应的 CSS 样式来定义闪屏的外观和动画效果。

HTML 结构示例:

            闪屏动画示例        

欢迎

来到

我的世界

这是页面的主要内容

闪屏动画播放完毕后,您将看到这里。

尝试关闭此标签页后重新打开,观察闪屏是否会再次播放。

CSS 样式与动画示例 (style.css):

body {    margin: 0;    font-family: sans-serif;    overflow-x: hidden; /* 防止横向滚动 */}/* 闪屏容器样式 */.splash {    background: black;    z-index: 2; /* 确保在其他内容之上 */    display: flex; /* 使用 flexbox 居中内容 */    flex-direction: column; /* 垂直排列 */    justify-content: center; /* 垂直居中 */    align-items: center; /* 水平居中 */    width: 100%;    height: 100vh; /* 占据整个视口高度 */    position: fixed; /* 固定在视口 */    top: 0;    left: 0;    transition: opacity 1.5s ease-out, transform 1.5s ease-out; /* 隐藏时的过渡效果 */}/* 闪屏内容样式 */.splash-content {    color: white;    /* 初始位置,会被动画覆盖 */    transform: translateY(11em);     opacity: 0; /* 初始不可见 */    margin: 0.5em 0;}/* 闪屏隐藏时的样式 */.splash.display-none {    opacity: 0;    z-index: 0; /* 隐藏后降低 z-index */    transform: translateY(-100%); /* 向上滑动隐藏 */}/* 动画结束后彻底移除,防止遮挡页面点击 */.splash.post_animated {    display: none;}/* 各个内容的入场动画 */#content1 { animation: come-in-first 2s ease-in forwards; }#content2 { animation: come-in-second 3s ease-in forwards; }#content3 { animation: come-in-third 4s ease-in forwards; }/* 关键帧动画定义 */@keyframes come-in-first {    0% { transform: translateY(13em); opacity: 0; }    100% { transform: translateY(11em); opacity: 1; }}@keyframes come-in-second {    0%, 50% { transform: translateY(11.5em); opacity: 0; }    100% { transform: translateY(11em); opacity: 1; }}@keyframes come-in-third {    0%, 60% { transform: translate(4px, 11.5em); opacity: 0; }    100% { transform: translate(4px, 11em); opacity: 1; }}

CSS 样式说明:

.splash 类定义了闪屏容器的全局样式,包括背景、定位、尺寸以及内容居中方式。transition 属性为闪屏隐藏时提供了平滑的过渡效果。.splash.display-none 用于在动画播放完毕后,通过改变 opacity 和 transform 来视觉上隐藏闪屏。.splash.post_animated 在 display-none 的过渡完成后,彻底将闪屏元素从文档流中移除 (display: none;),以确保它不会阻挡用户与页面内容的交互。@keyframes 定义了每个 h1 元素的入场动画,forwards 关键字确保动画结束后元素保持在最终状态。

JavaScript 逻辑:实现会话级控制

现在,我们将实现核心的 JavaScript 逻辑 (script.js),利用 sessionStorage 来控制闪屏的播放。

const splash = document.querySelector('.splash');// 检查 sessionStorage 中是否有 'hasRan' 标记const hasSplashPlayed = sessionStorage.getItem('hasRan');if (!hasSplashPlayed) {    // 如果本会话中闪屏未播放过    document.addEventListener('DOMContentLoaded', () => {        // 确保DOM加载完成后执行动画        // 闪屏动画持续一段时间后,开始隐藏        setTimeout(() => {            splash.classList.add('display-none'); // 添加隐藏类,触发过渡动画            // 监听隐藏过渡动画结束事件,彻底移除元素            splash.addEventListener('transitionend', () => {                splash.classList.add('post_animated');            }, { once: true }); // { once: true } 确保事件只触发一次        }, 6000); // 假设闪屏动画总时长为6秒,之后开始隐藏        // 标记本会话已播放闪屏        sessionStorage.setItem('hasRan', 'true');     });} else {    // 如果本会话已播放过闪屏,则直接隐藏    // 立即添加隐藏和彻底移除的类,跳过动画    splash.classList.add('display-none');    splash.classList.add('post_animated');}

JavaScript 逻辑说明:

获取元素与检查状态:首先获取 .splash 元素,并检查 sessionStorage.getItem(‘hasRan’) 来判断当前会话中闪屏是否已播放。首次播放逻辑:如果 hasSplashPlayed 为空(即未播放过),则在 DOMContentLoaded 事件触发后(确保页面DOM已完全加载),通过 setTimeout 延迟执行隐藏逻辑。setTimeout 的延迟时间应略大于闪屏动画的总时长,以确保动画完整播放。splash.classList.add(‘display-none’) 会触发 CSS 中定义的隐藏过渡动画。为了在过渡动画结束后彻底移除闪屏元素,我们监听 transitionend 事件,并在事件触发时添加 post_animated 类。{ once: true } 选项确保此事件监听器在触发一次后自动移除,避免不必要的资源占用。最后,通过 sessionStorage.setItem(‘hasRan’, ‘true’) 标记本会话闪屏已播放。后续访问逻辑:如果 hasSplashPlayed 不为空(即已播放过),则直接添加 display-none 和 post_animated 类,使闪屏立即隐藏并从文档流中移除,跳过动画。

注意事项与最佳实践

动画时长控制:合理设置闪屏动画的播放时长。过长的动画可能导致用户等待焦虑,影响用户体验。用户体验:对于复杂的闪屏,可以考虑提供一个“跳过”按钮,允许用户提前进入页面内容。性能考量:确保 CSS 动画流畅,避免使用复杂的 JavaScript 动画导致页面卡顿。尽量利用 CSS 的硬件加速特性。post_animated 的重要性:在动画结束后,使用 display: none; 彻底移除闪屏元素至关重要。否则,即使 opacity 为 0,该元素仍然会占据空间并可能阻挡用户点击其下方的页面内容。回退机制:如果用户禁用了 JavaScript,闪屏可能会永久显示。可以考虑提供一个 标签内的提示,或在 CSS 中设置一个默认的隐藏状态,仅在 JS 启用时才播放动画。其他持久化方法Cookie:也可以用于存储闪屏状态,但通常用于

以上就是使用 sessionStorage 实现网页闪屏动画的会话级控制与重置的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1532183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
React Context异步状态管理与路由保护:确保组件获取最新认证值
上一篇 2025年12月20日 23:29:43
解决 React Hook Form 提交表单时的意外刷新与数据提交问题
下一篇 2025年12月20日 23:29:55

相关推荐

  • Yii 框架执行数据库事务时遇到异常怎么处理?

    在 yii 框架中处理数据库事务异常时,应使用 try-catch 块捕获异常并回滚事务。具体方法包括:1) 使用 try-catch 块捕获 exception 和 throwable 异常,并在异常发生时回滚事务;2) 处理事务嵌套,确保只有最外层事务真正提交或回滚;3) 设置事务隔离级别以处理…

    2026年8月28日
    300
  • 使用Flag变量实现Java菜单循环与返回

    本文将介绍如何在Java程序中使用flag变量控制菜单的循环和返回。通过设置和判断flag变量的值,可以实现从子菜单返回主菜单的功能,避免不必要的菜单重复显示,提升用户体验。本文将提供代码示例,详细解释flag变量的工作原理,并给出使用注意事项。 在Java程序中,经常需要构建交互式的菜单界面,让用…

    2026年8月28日
    000
  • 投资领域掀起大模型“淘金热”,AI的“财商”有多高?

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ AI赋能财富管理:机遇与挑战并存 国产AI大模型的兴起,正深刻改变着财富管理行业的面貌。“AI理财”已成为投资者关注的焦点,但其可靠性及潜在风险也引发广泛讨论。本文将探讨AI在投资理财领域的应用…

    2026年8月28日
    000
  • 如何在 Yii 项目中引入 GraphQL?

    在 yii 项目中引入 graphql 可以通过以下步骤实现:1. 定义 schema,描述数据结构和查询操作;2. 实现解析器,映射查询到数据获取逻辑;3. 处理请求并生成响应。通过这些步骤,开发者可以在 yii 中集成 graphql api,提供灵活的数据获取方式。 引言 在现代 Web 开发…

    2026年8月28日
    300
  • 遗物随心搭,流派由你造!《狭道英雄》上线,玩出你的专属风格!

    遗物随心搭,流派由你造!《狭道英雄》上线,玩出你的专属风格!遗物随心搭,流派由你造!《狭道英雄》上线,玩出你的专属风格!遗物随心搭,流派由你造!《狭道英雄》上线,玩出你的专属风格!遗物随心搭,流派由你造!《狭道英雄》上线,玩出你的专属风格!

    各位冒险者,大家好!黑暗势力正逐渐蔓延,《狭道英雄》这款紧张刺激的追逃式冒险roguelike手游已于 7 月 4 日正式登陆 pc、安卓与 ios 平台!快来踏上这段令人热血沸腾的征程,感受传统 rpg 与创新 roguelike玩法融合所带来的独特乐趣吧!面对步步紧逼的危机,你是否已准备好成为拯…

    2026年8月28日 用户投稿
    000
  • 抖音店铺体验分受什么影响?体验分80分要多少单

    短视频平台抖音逐渐成为人们生活中不可或缺的一部分。抖音店铺作为抖音电商的重要组成部分,其店铺体验分的高低直接关系到店铺的销量和口碑。抖音店铺体验分受哪些因素影响呢?本文将为您揭秘影响抖音店铺体验分的关键因素。 一、商品质量 商品质量是影响抖音店铺体验分的首要因素。优质的产品能够满足消费者的需求,提高…

    2026年8月28日
    100
  • 清华大学2025年将适度扩招本科生 重点培养“AI+”拔尖创新人才

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 清华大学宣布将适度扩大本科招生规模,计划于2025年新增约150个本科招生名额。同时,学校将成立一所新的本科通识书院,专注培养人工智能与其他学科交叉融合的复合型人才,以满足国家战略需求和社会发展…

    2026年8月28日
    900
  • Classln怎么开启视频软件解码器功能

    在使用classln进行教学或学习时,为了确保视频播放的流畅性和画质清晰度,有时需要手动开启视频软件解码器功能。以下是详细的操作流程说明。 首先,启动classln应用程序,并进入你所参与的课程页面。在课程内容中定位到需要观看视频的部分。 接着,点击视频播放区域,使其获得焦点。此时,在视频窗口的右下…

    2026年8月28日
    000
  • 黄仁勋:英伟达最后入局半导体但永远不晚,自己若今年毕业将爱上 AI

    7 月 16 日消息,根据新浪科技报道,英伟达 CEO 黄仁勋在今日下午的媒体采访中提到,英伟达是较晚成立的半导体公司之一,但他强调“入场虽晚,却从不嫌迟”。 黄仁勋说道:“我不是先行者,而是后来者,所以永远不会太晚。因为如果你是第一个进入市场的人,你有独特的优势;而作为最后一个进入的人,同样也能找…

    2026年8月28日
    100
  • ThinkPHP 性能优化:10个提升速度的技巧

    提升thinkphp应用性能的10个技巧包括:1.优化数据库查询,减少查询次数;2.使用缓存策略,降低数据库负载;3.实施延迟加载,减少初始加载时间;4.进行批量操作,减少数据库连接次数;5.避免n+1查询问题,使用关联查询;6.优化模板渲染,使用缓存模板;7.启用编译模式,提升启动速度;8.优化日…

    2026年8月28日
    100
  • 深度解析三星GalaxyZ Fold7的轻薄化设计与结构革新

    深度解析三星GalaxyZ Fold7的轻薄化设计与结构革新深度解析三星GalaxyZ Fold7的轻薄化设计与结构革新深度解析三星GalaxyZ Fold7的轻薄化设计与结构革新深度解析三星GalaxyZ Fold7的轻薄化设计与结构革新

    提到折叠屏手机,三星无疑是行业开拓者。自2008年开始探索折叠屏技术,到2011年推出首款原型机,再到2019年正式发布首款商用折叠屏设备galaxy fold,三星在该领域深耕超过15年,持续推动形态创新,逐步确立了其行业领先地位。如今,全新推出的galaxy z fold7,在轻薄化、性能与耐用…

    2026年8月28日 用户投稿
    000
  • 小米路由器192.168.31.1.miwifi.com密码重置

    答案:小米路由器密码重置可通过尝试常用密码、使用App或重置按钮恢复出厂设置,重置后需重新配置并建议绑定小米账号以防再次忘记。 小米路由器密码重置,简单来说,就是找回或更改你用来管理路由器的那个密码。忘记了?别慌,有办法! 解决方案: 尝试常用密码: 先别急着重置,想想你是不是用了什么常用密码,比如…

    2026年8月28日
    100
  • 悟空浏览器如何设置打印网页时不带页眉页脚_悟空浏览器打印网页去掉页眉页脚方法

    在悟空浏览器中打印网页时,可通过打印预览设置取消页眉页脚:打开打印界面后展开更多设置并取消勾选“页眉和页脚”;2. 使用开发者工具添加CSS样式@media print { @page { margin: 0; } }可彻底去除页眉页脚及边距;3. 或将网页导出为PDF:选择虚拟PDF打印机并关闭页…

    2026年8月28日
    100
  • 无痕浏览模式苹果手机如何设置

    苹果手机开启无痕浏览的详细操作 1. 启动Safari浏览器:在您的iPhone上找到Safari浏览器并点击打开。该应用为系统默认浏览器,图标为蓝色背景搭配白色桑葚状图案。 2. 进入标签管理页面:在浏览器界面的底部中央位置,会看到一个由多个方块叠加组成的图标,这就是标签页按钮。轻触它,即可进入当…

    2026年8月28日
    100
  • Laravel 队列(Queue)与任务调度:提升应用性能

    laravel 应用可以通过队列和任务调度提升性能。1) 队列用于异步处理耗时任务,提高响应速度。2) 任务调度用于自动执行定时任务,实现自动化操作。 引言 当你深陷于 Laravel 应用的开发中,性能问题总会如影随形。如何让你的应用在高并发下依然保持优雅的姿态?答案之一就是巧妙地利用 Larav…

    2026年8月28日
    100
  • ZXing生成二维码水印变黑白的原因及解决方法是什么?

    解决zxing生成二维码水印变黑白的问题 在使用ZXing库生成二维码并用Thumbnailator库添加水印时,常常遇到水印颜色变黑白的困扰。这是因为ZXing生成的二维码默认位深度为1(黑白),而水印图片通常是彩色图像。Thumbnailator在叠加水印时,会根据底图(二维码)的位深度调整输出…

    2026年8月28日
    100
  • 谷歌浏览器卡顿如何清理缓存提高运行速度

    当您感觉谷歌浏览器运行变得缓慢或卡顿时,通常是由于长时间积累的缓存数据过多或损坏所致。本文将详细介绍如何通过清理浏览器缓存来解决这个问题,通过分步讲解,您可以轻松掌握操作方法,从而有效提升浏览器的运行速度和响应能力。对缓存进行清理是一个安全且常规的维护操作,有助于恢复浏览器的流畅体验。 立即进入“高…

    2026年8月28日
    100
  • 谷歌浏览器怎么清除缓存和历史记录

    本文将为您详细介绍在谷歌浏览器中清除缓存与历史记录的操作方法。通过清晰的步骤指引,您可以轻松管理自己的浏览数据,这不仅有助于保护个人隐私,还能释放存储空间,解决一些因数据陈旧导致的浏览问题,从而提升浏览器的运行效率。 立即进入“高清国产电影网站合集☜☜☜☜☜点击保存”; 立即进入“看片APP☜☜☜点…

    2026年8月28日
    100
  • 四个月内至少有九大旗舰手机发布 苹果领衔 华为缺席?

    四个月内至少有九大旗舰手机发布 苹果领衔 华为缺席?四个月内至少有九大旗舰手机发布 苹果领衔 华为缺席?四个月内至少有九大旗舰手机发布 苹果领衔 华为缺席?四个月内至少有九大旗舰手机发布 苹果领衔 华为缺席?

    7月16日,数码闲聊站透露,2025年9月至10月,预计至少有九大旗舰系列手机发布。 iPhone 17系列:包含iPhone 17、iPhone 17 Air、iPhone 17 Pro和iPhone 17 Pro Max四款机型,9月初发布; 小米16系列:首批包含小米16、小米16 Pro两款…

    2026年8月28日 用户投稿
    100
  • Laravel API 开发:RESTful 设计与 JWT 认证

    在 laravel 中构建 restful api 并使用 jwt 进行用户认证的方法如下:1. 使用 laravel 的路由系统定义 restful api 操作。2. 安装并配置 tymon/jwt-auth 包来处理 jwt 认证。3. 在 user 模型中实现 jwtsubject 接口。4…

    2026年8月28日
    100

发表回复

登录后才能评论
关注微信