讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋辰大大_3807

秋辰大大_3807

发布时间:2025-09-16 10:44:33

|

529人浏览过

|

来源于php中文网

原创

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

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

核心原理与实现思路

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

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

HTML 结构准备

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

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>滚动文本高亮</title>
  <!-- 引入自定义CSS样式文件 -->
  <link rel="stylesheet" href="style.css"> 
</head>
<body>
  <!-- 文本内容将动态加载到此span元素中 -->
  <span class="text"></span>
  <!-- 引入JavaScript逻辑文件 -->
  <script src="script.js"></script> 
</body>
</html>

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

CSS 样式定义

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

word报告自动生成神器
word报告自动生成神器

Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。

下载
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'); 

// 初始化文本:将每个单词包裹在<span>中并插入到DOM
// 这样每个单词都可以独立地被高亮或取消高亮
textContainer.innerHTML = words
  .map(word => `<span>${word}</span>`)
  .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 < wordsToHighlight ? `class="${HIGHLIGHT_CLASS}"` : ''}>${word}</span>`)
    .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;)可以使高亮颜色的变化更加平滑自然。

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

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5909

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7534

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11174

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5739

2025.07.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

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

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6.1万人学习

CSS教程
CSS教程

共754课时 | 98.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn