基于滚动进度的文本高亮动画实现教程

基于滚动进度的文本高亮动画实现教程

本教程将指导您如何利用JavaScript的滚动事件,实现一个引人注目的文本高亮动画效果。通过计算页面滚动百分比,我们将动态地为文本中的单词添加或移除高亮样式,从而使文本填充颜色与用户的滚动行为同步,提供独特的视觉反馈。

核心原理与实现思路

实现这种滚动进度关联的文本高亮效果,其核心在于以下几个步骤:

监听滚动事件: 捕获浏览器窗口的滚动行为。计算滚动进度: 获取当前页面滚动条的位置,并将其转换为一个0到1之间的百分比值。文本拆分与初始化: 将待高亮的整段文本拆分成独立的单词,并为每个单词包裹一个独立的HTML元素(如),以便单独控制其样式。动态应用样式: 根据计算出的滚动百分比,确定当前应该高亮的单词数量,并为这些单词动态地添加或移除特定的CSS高亮类。

HTML 结构准备

首先,我们需要一个基本的HTML页面结构,包含一个用于显示文本的容器元素。

      滚动文本高亮              

在这个结构中, 是我们将用来承载和显示动态高亮文本的容器。

CSS 样式定义

为了让文本在滚动时固定在视口中,并定义高亮时的颜色,我们需要一些基本的CSS样式。

body {  height: 5000px; /* 制造足够的滚动空间,以便观察效果 */  margin: 0; /* 移除浏览器默认的body边距 */  font-family: sans-serif; /* 设置基础字体 */  background-color: #f8f8f8; /* 背景色 */}.text {  position: fixed; /* 将文本容器固定在视口中 */  top: 10px; /* 距离视口顶部10px */  left: 10px; /* 距离视口左侧10px */  width: calc(100% - 20px); /* 占据大部分宽度,留出左右边距 */  line-height: 1.6; /* 设置行高,提高可读性 */  font-size: 24px; /* 设置字号 */  color: #333; /* 默认文本颜色 */  padding: 10px; /* 文本内边距 */  box-sizing: border-box; /* 边框盒模型 */}.text span {    /* 为文本颜色变化添加过渡效果,使高亮/取消高亮更平滑 */    transition: color 0.1s ease-out;     white-space: pre-wrap; /* 保留空格和换行符 */}.highlight {  color: #f00; /* 定义高亮文本的颜色,这里设置为红色 */}

样式说明:

body { height: 5000px; }:这是关键一步,它为页面创建了足够的高度,从而生成滚动条。在实际应用中,这个高度应由您的实际内容决定。.text { position: fixed; … }:使文本内容在用户滚动页面时始终保持在屏幕上的固定位置。.highlight { color: #f00; }:定义了当单词被高亮时所呈现的颜色。.text span { transition: color 0.1s ease-out; }:为颜色变化添加了平滑的过渡效果,提升用户体验。

JavaScript 逻辑实现

JavaScript是实现动态高亮的核心。它负责初始化文本、监听滚动事件、计算滚动进度并更新文本样式。

// 定义高亮样式类名常量const HIGHLIGHT_CLASS = 'highlight'; // 待高亮的文章文本const ARTICLE_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer suscipit libero eu ligula molestie, sed faucibus leo iaculis. Quisque scelerisque ligula in volutpat venenatis. Fusce velit felis, pretium eu varius quis, facilisis eget nunc. Quisque eu eros tellus. Cras condimentum efficitur turpis, ac laoreet velit rhoncus et. Maecenas non lorem auctor dolor auctor gravida ut at diam. Proin eleifend elementum lacus in varius. In dapibus mi ut erat gravida, non dictum nisi luctus. Aliquam imperdiet commodo ante, posuere vestibulum eros mattis vitae. Cras molestie commodo turpis, vitae tempus magna dictum pharetra. Duis quis eros at magna sodales mollis. Fusce sollicitudin purus sit amet est ullamcorper luctus. Donec molestie, nisi quis luctus malesuada, lectus arcu rutrum turpis, ac bibendum libero tellus at metus. Vivamus mattis ultricies metus eu dignissim. Mauris sed consectetur nisl.";// 将文章文本按空格分割成单词数组let words = ARTICLE_TEXT.split(" "); // 获取文本容器元素let textContainer = document.querySelector('.text'); // 初始化文本:将每个单词包裹在中并插入到DOM// 这样每个单词都可以独立地被高亮或取消高亮textContainer.innerHTML = words  .map(word => `${word}`)  .join(' ');// 监听窗口滚动事件window.addEventListener('scroll', () => {  // 获取当前页面滚动进度(0.0到1.0之间)  let scrollFraction = getScrollFraction();   // 根据滚动进度和总单词数,计算当前需要高亮的单词数量  let wordsToHighlight = Math.floor(scrollFraction * words.length);   // 重新渲染文本容器的innerHTML,根据计算结果应用高亮样式  // 如果单词的索引小于wordsToHighlight,则为其添加高亮类  textContainer.innerHTML = words    .map((word, index) => `<span ${index ${word}`)    .join(' ');});/** * 计算页面滚动百分比 * 此函数考虑了不同浏览器对scrollTop和scrollHeight的实现差异 * @returns {number} 滚动百分比(0.0到1.0之间),0表示顶部,1表示底部 */function getScrollFraction() {    const docElem = document.documentElement;    const body = document.body;    // 获取当前滚动距离,兼容不同浏览器    const scrollTop = docElem.scrollTop || body.scrollTop;     // 计算可滚动总高度 = (文档总高度 - 视口高度)    const scrollHeight = (docElem.scrollHeight || body.scrollHeight) - docElem.clientHeight;     // 避免除以零,如果无可滚动高度则返回0    return scrollHeight > 0 ? scrollTop / scrollHeight : 0;}

JavaScript代码详解:

HIGHLIGHT_CLASS 和 ARTICLE_TEXT 是常量,用于配置样式类名和初始文本内容。ARTICLE_TEXT.split(” “) 将文本按空格分割成一个单词数组。在页面加载时,textContainer.innerHTML = words.map(…) 会遍历单词数组,为每个单词生成一个 标签,并将其组合成HTML字符串插入到 .text 容器中。这是为了确保每个单词都能被独立地操作。window.addEventListener(‘scroll’, …) 注册了一个滚动事件监听器。每当用户滚动页面时,回调函数就会执行。getScrollFraction() 函数是核心辅助函数,它计算了当前滚动条位置占总可滚动高度的百分比。它通过获取 document.documentElement 或 document.body 的 scrollTop 和 scrollHeight 属性来完成计算,并考虑了浏览器兼容性。wordsToHighlight 根据滚动百分比和总单词数计算出当前应该高亮的单词数量。Math.floor() 用于取整。最后,再次使用 map 方法遍历单词数组,根据 wordsToHighlight 的值,为相应的单词添加 highlight 类。通过更新 textContainer.innerHTML,浏览器会重新渲染文本,显示新的高亮状态。

注意事项与优化

性能考量: 频繁地修改 innerHTML 会导致浏览器重新解析和渲染 DOM,这在大型文本或复杂页面中可能造成性能问题。对于更复杂的场景,可以考虑以下优化:DOM 操作优化: 避免在每次滚动时完全重绘 innerHTML。可以只更新受影响的 元素的 class 属性。这需要更复杂的 DOM 操作逻辑(例如,存储所有 元素的引用,然后遍历并按需添加/移除类)。节流(Throttling)或防抖(Debouncing): 限制 scroll 事件处理函数的执行频率。例如,使用 requestAnimationFrame 或设置一个定时器,确保函数在一定时间间隔内只执行一次,以减少不必要的计算和DOM操作。可访问性: 这种视觉高亮可能不适用于所有用户。确保您的内容在没有此效果时也能清晰阅读,并考虑为屏幕阅读器提供替代文本或功能。滚动高度与文本长度: 页面 body 的 height 越大,滚动条的移动距离就越长,文本高亮的速度(相对于滚动条的移动)就越慢。反之,body 高度越小,文本高亮速度越快。您需要根据内容和期望的用户体验来调整 body 的高度。文本内容: 如果文本中包含HTML标签或特殊字符,split(” “) 可能需要更复杂的正则匹配来准确分割单词,以避免破坏HTML结构。平滑过渡: 如CSS代码所示,为 span 元素添加 transition 属性(如 transition: color 0.2s ease-out;)可以使高亮颜色的变化更加平滑自然。

通过上述步骤和注意事项,您可以实现一个功能完善且视觉吸引力强的基于滚动进度的文本高亮动画效果。

以上就是基于滚动进度的文本高亮动画实现教程的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月12日 22:38:59
下一篇 2025年11月12日 23:23:50

相关推荐

  • AO3镜像站备用镜像网址_AO3镜像站快速访问官网

    AO3镜像站备用网址包括ao3mirror.com和xiaozhan.icu,当主站archiveofourown.org无法访问时可切换使用,二者均同步更新内容并支持多语言检索与离线下载功能。 AO3镜像站备用镜像网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站快速访问官…

    2025年12月6日 软件教程
    100
  • Pboot插件缓存机制的详细解析_Pboot插件缓存清理的命令操作

    插件功能异常或页面显示陈旧内容可能是缓存未更新所致。PbootCMS通过/runtime/cache/与/runtime/temp/目录缓存插件配置、模板解析结果和数据库查询数据,提升性能但影响调试。解决方法包括:1. 手动删除上述目录下所有文件;2. 后台进入“系统工具”-“缓存管理”,勾选插件、…

    2025年12月6日 软件教程
    100
  • Word2013如何插入SmartArt图形_Word2013SmartArt插入的视觉表达

    答案:可通过四种方法在Word 2013中插入SmartArt图形。一、使用“插入”选项卡中的“SmartArt”按钮,选择所需类型并插入;二、从快速样式库中选择常用模板如组织结构图直接应用;三、复制已有SmartArt图形到目标文档后调整内容与格式;四、将带项目符号的文本选中后右键转换为Smart…

    2025年12月6日 软件教程
    000
  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    000
  • Pages怎么协作编辑同一文档 Pages多人实时协作的流程

    首先启用Pages共享功能,点击右上角共享按钮并选择“添加协作者”,设置为可编辑并生成链接;接着复制链接通过邮件或社交软件发送给成员,确保其使用Apple ID登录iCloud后即可加入编辑;也可直接在共享菜单中输入邮箱地址定向邀请,设定编辑权限后发送;最后在共享面板中管理协作者权限,查看实时在线状…

    2025年12月6日 软件教程
    100
  • word表格怎么调整行高_word表格行高调整的具体操作

    手动拖动可快速调整单行行高;2. 通过表格属性精确设置指定高度,选择固定值或最小值模式;3. 全选表格批量统一行高;4. 设为自动或最小值使行高随内容自适应,确保文字显示完整。 在使用Word制作表格时,调整行高是常见的排版需求。合理的行高能让表格内容更清晰易读。下面介绍几种常用的调整Word表格行…

    2025年12月6日 软件教程
    000
  • jm漫画官方正版入口 jm漫画官方网站登录链接

    JM漫画作为一个致力于为广大漫画爱好者服务的全方位的数字漫画阅读平台,凭借其海量的资源储备、卓越的阅读体验和人性化的功能设计,在众多同类平台中脱颖而出。它不仅收录了来自世界各地的热门连载与经典完结作品,更通过智能推荐算法,精准地将符合用户口味的精彩内容呈现眼前,让每一位用户都能在这里找到属于自己的精…

    2025年12月6日 软件教程
    000
  • 怎么下载安装快手极速版_快手极速版下载安装详细教程

    1、优先通过华为应用市场搜索“快手极速版”,确认开发者为北京快手科技有限公司后安装;2、若应用商店无结果,可访问快手极速版官网下载APK文件,需手动开启浏览器的未知来源安装权限;3、也可选择豌豆荚、应用宝等可信第三方平台下载官方版本,核对安全标识后完成安装。 如果您尝试在手机上安装快手极速版,但无法…

    2025年12月6日 软件教程
    000
  • 哔哩哔哩的视频卡在加载中怎么办_哔哩哔哩视频加载卡顿解决方法

    视频加载停滞可先切换网络或重启路由器,再清除B站缓存并重装应用,接着调低播放清晰度并关闭自动选分辨率,随后更改播放策略为AVC编码,最后关闭硬件加速功能以恢复播放。 如果您尝试播放哔哩哔哩的视频,但进度条停滞在加载状态,无法继续播放,这通常是由于网络、应用缓存或播放设置等因素导致。以下是解决此问题的…

    2025年12月6日 软件教程
    000
  • REDMI K90系列正式发布,售价2599元起!

    10月23日,redmi k90系列正式亮相,推出redmi k90与redmi k90 pro max两款新机。其中,redmi k90搭载骁龙8至尊版处理器、7100mah大电池及100w有线快充等多项旗舰配置,起售价为2599元,官方称其为k系列迄今为止最完整的标准版本。 图源:REDMI红米…

    2025年12月6日 行业动态
    200
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • 华为新机发布计划曝光:Pura 90系列或明年4月登场

    近日,有数码博主透露了华为2025年至2026年的新品规划,其中pura 90系列预计在2026年4月发布,有望成为华为新一代影像旗舰。根据路线图,华为将在2025年底至2026年陆续推出mate 80系列、折叠屏新机mate x7系列以及nova 15系列,而pura 90系列则将成为2026年上…

    2025年12月6日 行业动态
    100
  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    100
  • Linux如何优化系统性能_Linux系统性能优化的实用方法

    优化Linux性能需先监控资源使用,通过top、vmstat等命令分析负载,再调整内核参数如TCP优化与内存交换,结合关闭无用服务、选用合适文件系统与I/O调度器,持续按需调优以提升系统效率。 Linux系统性能优化的核心在于合理配置资源、监控系统状态并及时调整瓶颈环节。通过一系列实用手段,可以显著…

    2025年12月6日 运维
    000
  • Pboot插件数据库连接的配置教程_Pboot插件数据库备份的自动化脚本

    首先配置PbootCMS数据库连接参数,确保插件正常访问;接着创建auto_backup.php脚本实现备份功能;然后通过Windows任务计划程序或Linux Cron定时执行该脚本,完成自动化备份流程。 如果您正在开发或维护一个基于PbootCMS的网站,并希望实现插件对数据库的连接配置以及自动…

    2025年12月6日 软件教程
    000
  • Linux命令行中wc命令的实用技巧

    wc命令可统计文件的行数、单词数、字符数和字节数,常用-l统计行数,如wc -l /etc/passwd查看用户数量;结合grep可分析日志,如grep “error” logfile.txt | wc -l统计错误行数;-w统计单词数,-m统计字符数(含空格换行),-c统计…

    2025年12月6日 运维
    000
  • jm漫画网页网址 jm漫画网页版进入 jm漫画网站网页版

    在广阔的数字漫画世界中,无数爱好者渴望寻得一个能够汇集海量作品、提供流畅阅读体验的综合性平台。这样的平台不仅是追更新、补旧番的乐园,更是连接创作者与读者的桥梁,让每一个精彩的故事都能被发现和分享。它以其丰富的资源和人性化的设计,成为了漫画迷们探索奇妙二次元世界的理想起点,满足了从热门大作到小众佳作的…

    2025年12月6日 软件教程
    000
  • 曝小米17 Air正在筹备 超薄机身+2亿像素+eSIM技术?

    近日,手机行业再度掀起超薄机型热潮,三星与苹果已相继推出s25 edge与iphone air等轻薄旗舰,引发市场高度关注。在此趋势下,多家国产厂商被曝正积极布局相关技术,加速抢占这一细分赛道。据业内人士消息,小米的超薄旗舰机型小米17 air已进入筹备阶段。 小米17 Pro 爆料显示,小米正在评…

    2025年12月6日 行业动态
    000
  • 荣耀手表5Pro 10月23日正式开启首销国补优惠价1359.2元起售

    荣耀手表5pro自9月25日开启全渠道预售以来,市场热度持续攀升,上市初期便迎来抢购热潮,一度出现全线售罄、供不应求的局面。10月23日,荣耀手表5pro正式迎来首销,提供蓝牙版与esim版两种选择。其中,蓝牙版本的攀登者(橙色)、开拓者(黑色)和远航者(灰色)首销期间享受国补优惠价,到手价为135…

    2025年12月6日 行业动态
    000

发表回复

登录后才能评论
关注微信