亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
核心概念
HTML 結(jié)構(gòu)
CSS 樣式
JavaScript 邏輯
1. 準備文本與初始化渲染
2. 計算滾動進度
3. 監(jiān)聽滾動事件并動態(tài)更新文本
完整代碼示例
注意事項與優(yōu)化
總結(jié)
首頁 web前端 js教程 實現(xiàn)基於滾動進度的文本漸變高亮效果教程

實現(xiàn)基於滾動進度的文本漸變高亮效果教程

Oct 16, 2025 pm 03:30 PM

實現(xiàn)基于滾動進度的文本漸變高亮效果教程

本教程將詳細指導(dǎo)如何利用JavaScript的滾動事件,實現(xiàn)文本內(nèi)容根據(jù)頁面滾動進度動態(tài)漸變高亮的效果。通過將頁面滾動百分比映射到文本的詞語數(shù)量,我們能創(chuàng)建出一種視覺上引人入勝的交互體驗,使文本從左到右逐步被著色,并在反向滾動時逐漸取消高亮。文章將提供完整的HTML、CSS和JavaScript代碼示例,并探討相關(guān)實現(xiàn)細節(jié)和優(yōu)化建議。

在現(xiàn)代網(wǎng)頁設(shè)計中,交互式動畫能夠顯著提升用戶體驗。其中一種引人注目的效果是文本內(nèi)容根據(jù)用戶的滾動行為進行動態(tài)高亮或著色。本教程將介紹如何利用簡單的JavaScript和CSS,實現(xiàn)一個文本逐詞高亮(或稱“填充”)的效果,使其進度與頁面滾動百分比相關(guān)聯(lián)。當用戶向下滾動時,文本會從左到右逐漸被著色;當向上滾動時,著色部分則會相應(yīng)地減少。

核心概念

實現(xiàn)這一效果的核心思想是將頁面的滾動進度(一個0到1之間的百分比)映射到文本中需要高亮的詞語數(shù)量。具體步驟如下:

  1. 準備文本: 將一段長文本拆分成獨立的詞語。
  2. 初始化渲染: 將每個詞語包裹在獨立的標簽中,以便單獨控制其樣式。
  3. 監(jiān)聽滾動事件: 注冊window的scroll事件監(jiān)聽器。
  4. 計算滾動進度: 在滾動事件中,獲取當前頁面的滾動百分比。
  5. 動態(tài)更新樣式: 根據(jù)滾動百分比計算出應(yīng)高亮的詞語數(shù)量,然后重新渲染文本,為相應(yīng)數(shù)量的詞語添加高亮樣式。

HTML 結(jié)構(gòu)

首先,我們需要一個基本的HTML頁面結(jié)構(gòu),其中包含一個用于顯示動態(tài)文本的容器。我們將使用一個元素作為文本的占位符。



  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>滾動進度文本高亮</title>
  <link rel="stylesheet" href="style.css">


  <span class="text"></span>
  <script src="script.js"></script>

這里,將是我們的目標元素,所有動態(tài)生成的文本內(nèi)容都將注入到其中。

CSS 樣式

為了使?jié)L動效果可見,我們需要確保頁面有足夠的滾動空間。同時,我們還需要定義高亮文本的樣式,并固定文本容器的位置,使其在滾動時始終可見。

body {
  /* 設(shè)置一個足夠大的高度以產(chǎn)生滾動條 */
  height: 5000px;
  margin: 0; /* 移除默認外邊距 */
  font-family: sans-serif;
}

.text {
  /* 固定文本容器位置,使其在滾動時保持在視口內(nèi) */
  position: fixed;
  top: 10px;
  left: 20px; /* 適當調(diào)整位置 */
  max-width: 80%; /* 防止文本過寬 */
  line-height: 1.6;
  color: #333; /* 默認文本顏色 */
}

.highlight {
  /* 定義高亮文本的顏色 */
  color: #f00; /* 醒目的紅色 */
  font-weight: bold; /* 增加字體粗細 */
}

body { height: 5000px; }是關(guān)鍵,它確保了頁面有足夠的垂直空間來產(chǎn)生滾動條。.text { position: fixed; ... }則保證了我們的目標文本在用戶滾動頁面時能始終保持在視口頂部,方便觀察效果。.highlight類定義了高亮文本的樣式。

JavaScript 邏輯

JavaScript是實現(xiàn)動態(tài)效果的核心。它負責文本的拆分、初始化渲染、滾動監(jiān)聽和樣式的動態(tài)更新。

1. 準備文本與初始化渲染

首先,定義我們的原始文本內(nèi)容,并將其拆分成詞語數(shù)組。然后,將每個詞語包裹在標簽中并插入到HTML中。

const HIGHLIGHT_CLASS = 'highlight'; // 定義高亮樣式類名
const TEXT_CONTENT = "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 = TEXT_CONTENT.split(" "); // 將文本按空格拆分成詞語數(shù)組
let textContainer = document.querySelector('.text'); // 獲取文本容器元素

// 初始渲染:將每個詞語包裹在<span>中并加入容器
textContainer.innerHTML = words
  .map(w => `<span>${w}</span>`)
  .join(' ');</span>

這里,TEXT_CONTENT是我們將要操作的文本。words.map(...)將每個詞語轉(zhuǎn)換為一個詞語的字符串,然后join(' ')將它們連接起來,形成最終的HTML字符串并賦值給textContainer.innerHTML。

2. 計算滾動進度

我們需要一個函數(shù)來獲取當前頁面的滾動百分比(從0到1)。

/**
 * 獲取頁面滾動百分比 (0 到 1)
 * 來源: https://stackoverflow.com/a/8028584/2931840
 */
function getScrollFraction() {
    var docElem = document.documentElement,
        body = document.body,
        scrollTop = 'scrollTop',
        scrollHeight = 'scrollHeight';
    // 計算滾動條位置 / (整個可滾動高度 - 視口高度)
    return (docElem[scrollTop] || body[scrollTop]) / ((docElem[scrollHeight] || body[scrollHeight]) - docElem.clientHeight);
}

這個getScrollFraction函數(shù)是一個常用的工具函數(shù),它通過計算當前滾動位置與總可滾動高度的比例來返回一個0到1之間的值,代表滾動進度。

3. 監(jiān)聽滾動事件并動態(tài)更新文本

最后,我們添加一個事件監(jiān)聽器來響應(yīng)window的scroll事件。在每次滾動時,我們重新計算需要高亮的詞語數(shù)量,并更新文本容器的HTML。

window.addEventListener('scroll', () => {
  let scrollFraction = getScrollFraction(); // 獲取當前滾動百分比
  // 根據(jù)滾動百分比和詞語總數(shù),計算應(yīng)高亮的詞語數(shù)量
  let wordsHighlightedCount = Math.floor(scrollFraction * words.length);

  // 重新渲染文本,為前wordsHighlightedCount個詞語添加高亮類
  textContainer.innerHTML = words
    .map((word, index) => {
      // 如果當前詞語的索引小于應(yīng)高亮的數(shù)量,則添加高亮類
      return `<span wordshighlightedcount :>${word}</span>`;
    })
    .join(' ');
});

在scroll事件監(jiān)聽器中:

  • getScrollFraction()獲取當前滾動進度。
  • Math.floor(scrollFraction * words.length)計算出應(yīng)該高亮的詞語數(shù)量,確保是一個整數(shù)。
  • words.map(...)再次遍歷所有詞語。對于索引小于wordsHighlightedCount的詞語,我們?yōu)槠?span>標簽添加class="highlight"屬性。
  • 最終,更新textContainer.innerHTML,完成文本的動態(tài)高亮。

完整代碼示例

將上述HTML、CSS和JavaScript代碼分別保存為index.html、style.css和script.js,并在同一目錄下,即可運行查看效果。

index.html:



  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>滾動進度文本高亮</title>
  <link rel="stylesheet" href="style.css">


  <span class="text"></span>
  <script src="script.js"></script>

style.css:

body {
  height: 5000px; /* 提供足夠的滾動空間 */
  margin: 0;
  font-family: sans-serif;
  background-color: #f9f9f9;
}

.text {
  position: fixed; /* 固定文本位置 */
  top: 50px; /* 距離頂部 */
  left: 50%; /* 水平居中 */
  transform: translateX(-50%); /* 水平居中 */
  max-width: 700px; /* 限制文本寬度 */
  line-height: 1.8;
  font-size: 1.2em;
  color: #555; /* 默認文本顏色 */
  background-color: #fff;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  text-align: justify;
}

.text span {
  transition: color 0.1s ease-out; /* 添加顏色過渡效果,使高亮更平滑 */
}

.highlight {
  color: #007bff; /* 高亮顏色 */
  font-weight: bold;
}

script.js:

const HIGHLIGHT_CLASS = 'highlight';
const TEXT_CONTENT = "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 = TEXT_CONTENT.split(" ");
let textContainer = document.querySelector('.text');

// 初始渲染文本
textContainer.innerHTML = words
  .map(w => `<span>${w}</span>`)
  .join(' ');

window.addEventListener('scroll', () => {
  let scrollFraction = getScrollFraction();
  let wordsHighlightedCount = Math.floor(scrollFraction * words.length);

  // 重新渲染文本,應(yīng)用高亮
  textContainer.innerHTML = words
  .map((word, index) => `<span wordshighlightedcount :>${word}</span>`)
  .join(' ');
});

/**
 * 獲取頁面滾動百分比 (0 到 1)
 * 來源: https://stackoverflow.com/a/8028584/2931840
 */
function getScrollFraction() {
    var docElem = document.documentElement, 
        body = document.body,
        scrollTop = 'scrollTop',
        scrollHeight = 'scrollHeight';
    return (docElem[scrollTop] || body[scrollTop]) / ((docElem[scrollHeight] || body[scrollHeight]) - docElem.clientHeight);
}

注意事項與優(yōu)化

  1. 性能考慮:

    • 頻繁的innerHTML更新: 每次滾動事件都會重新構(gòu)建并賦值innerHTML,這對于包含大量詞語的文本可能會導(dǎo)致性能問題,尤其是在舊瀏覽器或低性能設(shè)備上。這是因為每次更新都會導(dǎo)致瀏覽器重新解析HTML、構(gòu)建DOM樹并重新渲染。
    • 優(yōu)化方向: 可以考慮只更新需要改變樣式的元素,而不是整個文本容器。例如,維護一個對所有詞語元素的引用數(shù)組,然后只對需要添加或移除高亮類的元素進行操作。這會減少DOM操作的開銷。
    • 節(jié)流/防抖: 對于高頻觸發(fā)的scroll事件,可以引入節(jié)流(throttle)或防抖(debounce)機制,限制事件處理函數(shù)的執(zhí)行頻率,進一步優(yōu)化性能。
  2. 滾動敏感度:

    • 示例中body的高度設(shè)置為5000px,這決定了滾動條的長度和滾動速度對文本高亮進度的影響。body的高度越大,文本高亮的速度就越慢,用戶需要滾動更多的距離才能完全高亮文本。反之,高度越小,高亮速度越快。根據(jù)實際需求調(diào)整body的高度來控制敏感度。
    • 如果文本內(nèi)容較短,可能需要進一步減小body高度以使高亮效果更明顯。
  3. “填充”與“高亮”:

    • 本教程實現(xiàn)的是“逐詞高亮”效果,即改變詞語的color屬性。如果需要實現(xiàn)更復(fù)雜的“文本填充”效果(例如,使用漸變背景作為填充,并裁剪文本),可能需要借助CSS mask、background-clip: text或SVG等更高級的技術(shù)。本例提供的是一種相對簡單且兼容性較好的實現(xiàn)方式。
  4. 用戶體驗:

    • 考慮為高亮效果添加CSS transition,例如在.text span上添加transition: color 0.1s ease-out;,可以使顏色變化更加平滑,提升視覺體驗。
    • 對于長文本,一次性高亮整個詞語可能過于突兀??梢钥紤]更細粒度的控制,例如基于字符的高亮,但這會使代碼更加復(fù)雜。

總結(jié)

通過結(jié)合HTML結(jié)構(gòu)、CSS樣式和JavaScript事件監(jiān)聽,我們成功實現(xiàn)了一個基于滾動進度的文本逐詞高亮效果。這個技術(shù)的核心在于將頁面滾動百分比與文本中詞語的索引進行映射,從而動態(tài)地應(yīng)用或移除高亮樣式。雖然示例代碼采用了一種簡單直接的innerHTML更新方式,但在實際生產(chǎn)環(huán)境中,應(yīng)根據(jù)性能要求考慮更精細的DOM操作優(yōu)化。掌握這一技術(shù),開發(fā)者可以為網(wǎng)頁添加更多富有創(chuàng)意的交互式文本動畫。

以上是實現(xiàn)基於滾動進度的文本漸變高亮效果教程的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應(yīng)的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

JavaScript實現(xiàn)點擊圖片切換效果:專業(yè)教程 JavaScript實現(xiàn)點擊圖片切換效果:專業(yè)教程 Sep 18, 2025 pm 01:03 PM

本文將介紹如何使用JavaScript實現(xiàn)點擊圖片切換的效果。核心思路是利用HTML5的data-*屬性存儲備用圖片路徑,並通過JavaScript監(jiān)聽點擊事件,動態(tài)切換src屬性,從而實現(xiàn)圖片切換。本文將提供詳細的代碼示例和解釋,幫助你理解和掌握這種常用的交互效果。

如何使用JavaScript中的GeOlocation API獲取用戶的位置? 如何使用JavaScript中的GeOlocation API獲取用戶的位置? Sep 21, 2025 am 06:19 AM

首先檢查瀏覽器是否支持GeolocationAPI,若支持則調(diào)用getCurrentPosition()獲取用戶當前位置坐標,並通過成功回調(diào)獲取緯度和經(jīng)度值,同時提供錯誤回調(diào)處理權(quán)限被拒、位置不可用或超時等異常,還可傳入配置選項以啟用高精度、設(shè)置超時時間和緩存有效期,整個過程需用戶授權(quán)並做好相應(yīng)錯誤處理。

NUXT 3組成API解釋了 NUXT 3組成API解釋了 Sep 20, 2025 am 03:00 AM

Nuxt3的CompositionAPI核心用法包括:1.definePageMeta用於定義頁面元信息,如標題、佈局和中間件,需在中直接調(diào)用,不可置於條件語句中;2.useHead用於管理頁面頭部標籤,支持靜態(tài)和響應(yīng)式更新,需與definePageMeta配合實現(xiàn)SEO優(yōu)化;3.useAsyncData用於安全地獲取異步數(shù)據(jù),自動處理loading和error狀態(tài),支持服務(wù)端和客戶端數(shù)據(jù)獲取控制;4.useFetch是useAsyncData與$fetch的封裝,自動推斷請求key,避免重複請

如何在JavaScript中使用setInterval創(chuàng)建重複間隔 如何在JavaScript中使用setInterval創(chuàng)建重複間隔 Sep 21, 2025 am 05:31 AM

要創(chuàng)建JavaScript中的重複間隔,需使用setInterval()函數(shù),它會以指定毫秒數(shù)為間隔重複執(zhí)行函數(shù)或代碼塊,例如setInterval(()=>{console.log("每2秒執(zhí)行一次");},2000)會每隔2秒輸出一次消息,直到通過clearInterval(intervalId)清除,實際應(yīng)用中可用於更新時鐘、輪詢服務(wù)器等場景,但需注意最小延遲限制、函數(shù)執(zhí)行時間影響,並在不再需要時及時清除間隔以避免內(nèi)存洩漏,特別是在組件卸載或頁面關(guān)閉前應(yīng)清理,確保

如何將文本複製到JavaScript中的剪貼板? 如何將文本複製到JavaScript中的剪貼板? Sep 18, 2025 am 03:50 AM

使用ClipboardAPI的writeText方法可複製文本到剪貼板,需在安全上下文和用戶交互中調(diào)用,支持現(xiàn)代瀏覽器,舊版可用execCommand降級處理。

如何在JavaScript中創(chuàng)建多行字符串? 如何在JavaScript中創(chuàng)建多行字符串? Sep 20, 2025 am 06:11 AM

thebestatoreateamulti-linestlinginjavascriptsisisingsistisingtemplatalalswithbacktticks,whatpreserveticks,whatpreservereakeandeexactlyaswrite。

如何在JavaScript中創(chuàng)建和使用立即調(diào)用的函數(shù)表達式(IIFE) 如何在JavaScript中創(chuàng)建和使用立即調(diào)用的函數(shù)表達式(IIFE) Sep 21, 2025 am 05:04 AM

Aniife(立即InvokedFunction表達)IsafunctionThatrunSassoonAsisition定義,createByWrappingAppappingAptappafunctionInparenthensessandMmedImmedImmedInvokingit,whopreventsglobalnamespacepacepallutionpallutionpallutionPollutionPollutionPollutionAndEnablesPrivatesScopethroughCloseconscopethroughClosecome; itiswritten; itiswritten; itiswrittenas(iTiswrittenas;

如何將JSON字符串解析到JavaScript對像中 如何將JSON字符串解析到JavaScript對像中 Sep 21, 2025 am 05:43 AM

要將JSON字符串解析為JavaScript對象,應(yīng)使用JSON.parse()方法,它能將有效的JSON字符串轉(zhuǎn)換為對應(yīng)的JavaScript對象,支持嵌套對象和數(shù)組的解析,但對無效JSON會拋出錯誤,因此需用try...catch處理異常,同時可通過第二個參數(shù)的reviver函數(shù)在解析時轉(zhuǎn)換值,如將日期字符串轉(zhuǎn)為Date對象,從而實現(xiàn)安全可靠的數(shù)據(jù)轉(zhuǎn)換。

See all articles