D3動畫--動態繪制文本下劃線,支持自定義曲線

前言:在現實生活中,看書的時候,在文本的下面畫個波浪線,畫個橫線,是很常見的行為。本篇文章使用D3動畫來實現一個給文本繪制下劃線的效果,可以暫停繪制,繼續繪制,重新繪制,還可以支持自定義的曲線,不過自定義曲線就需要你自己書寫曲線函數,接下來就來看一下如何實現吧!
可惜文章里沒辦法上傳視頻,只能截圖給大家看了。
我上傳了視頻資源效果演示

在這里插入圖片描述
GitHub - d3/d3: Bring data to life with SVG, Canvas and HTML. 📊📈🎉

D3(或D3.js)是一個用于可視化數據的免費開源JavaScript庫。D3不是傳統意義上的圖表庫。它沒有“圖表”的概念。當您使用D3可視化數據時,您可以組合各種基元。

官網還推薦了一個高級姐妹庫:

D3中的直方圖可能需要50行代碼,而Plot可以在一行中完成!Plot的簡潔而富有表現力的API讓您更專注于分析和可視化數據,而不是Web開發。

Observable Plot

D3名字含義為data-driven documents,數據驅動的文檔,其中的選擇和過渡模塊會操作DOM,但是大部分模塊是對數據進行操作。D3還可以與React、Vue和Svelte等Web框架搭配使用。

D3用于定制可視化。D3適合對于可視化效果要求比較高的場景,如果只是渲染普通的圖表,建議使用Plot。

D3用于動態可視化。D3可以實現數據綁定,實現動態、交互式可視化。

下面的網站是D3示例網站:

Recent notebooks by D3

D3可以用來繪制圖表和動畫,功能非常的豐富,可玩性很強,今天先來分享一個動畫的效果

D3是結合SVG一起使用的

d3-ease | D3 by Observable

D3 中的API都采用鏈式調用的方式,非常的方便進行連續的操作。

一、動畫實現

(一)路徑的繪制

d3.path() 用來繪制路徑

d3.path

構建一個路徑對象 path,通過路徑對象上面的API來繪制路徑

  • path.moveTo(x, y) 移動畫筆到特定點,不會進行繪制,用于波的起始位置的設定。
  • path.lineTo(x, y) 從當前點到特定點繪制直線,用于執行繪制過程。

path.lineTo() 是繪制直線的,如果函數是一條直線,那么調用一次即可。如果要繪制波函數,則需要在無數個微小時間間隔中調用path.lineTo() 以組成具有弧度的曲線。以正弦波為例,

const yCenter = 0; // 波的y軸的坐標,相對于svg元素,控制下劃線和文字的垂直距離
// 正弦波浪線
const waveAmplitude = 1.5; // 振幅
const waveLength = 8; // 波長,表示一個周期中波的傳播距離
const pointsPerCycle = 10; // 每個周期點數 點數越多,曲線越平滑,但計算量也越大
const totalCycles = width / waveLength; // 總周期數
const steps = Math.floor(totalCycles * pointsPerCycle) // 總步數path.moveTo(0, yCenter);
for (let i = 0; i <= steps; i++) {const x = (i / steps) * width;const waveY = yCenter + Math.sin((x / waveLength) * Math.PI * 2) * waveAmplitude;path.lineTo(x, waveY);
}

(二)創建SVG元素

考慮到一段文字可能出現換行,所以需要動態創建SVG元素數組。通過遍歷文字,計算當前文字和上一個文字的位置差異,如果兩個文字離得比較遠,則代表出現了換行。換行的時候就需要往下劃線數組中增加一行。

然后需要給SVG元素添加波浪線

const svg = d3.select(svgEl); // 獲取SVG元素
const wavePath = g.append("path").attr("class", `wavy-path-${index}`).attr("d", wavePathString)  // 調用 wavePathString 生成 path.attr("stroke", props.wavyLineColor).attr("stroke-width", waveStyle.strokeWidth).attr("fill", waveStyle.fill).attr("stroke-linecap", waveStyle.strokeLinecap).attr("stroke-linejoin", waveStyle.strokeLinejoin);

(三)動畫控制

由于SVG元素可能有多個,所以動畫也需要維護一個數組。

const animationProgress = ref([]);
animationProgress.value.push({element: wavePath.node(), // 波浪線元素originalPathLength: pathLength, // 原始路徑長度originalDuration: lineDuration, // 原始持續時間pausedOffset: pathLength, // 暫停偏移量lineIndex: index // 行索引
});

數組中存放所有的SVG元素的相關信息,通過下面的API,對SVG元素遍歷進行操作

1、d3.select(selector)

選中元素目標元素,返回目標元素對象 element,鏈式進行動畫。參數為選擇器的字符串。

2、element.interrupt()

暫停動畫。

3、element.transition()

這是D3動畫系統的基礎,用于創建一個過渡效果。它會返回一個過渡對象 transition,可以在該對象上鏈式調用其他過渡方法。

d3.selectAll("rect").transition() // 開始過渡
4、transition.duration()

設置動畫持續時間(毫秒)。持續時間越長,動畫越慢。

.duration(1000) // 1秒動畫

延時時間是一個需要計算的點,因為在多行繪制的情況下,除了第一行,下面的行都需要等待上面的行的波浪線繪制完成之后再進行動畫。

5、transition.delay()
.delay(function(d, i) {return i * 100; // 每個元素延遲100ms
})
6、transition.ease()

設置緩動函數,(如 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">d3.easeLinear</font><font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">d3.easeBounce</font>等),官網給出了不同速度下波的函數圖像,斜率表示速度。

element.transition().duration(duration).ease(d3.easeLinear) // 勻速
7、transition.on()

監聽函數

  • <font style="color:rgb(224, 70, 0);background-color:rgba(142, 150, 170, 0.14);">start</font> - 動畫開始
  • <font style="color:rgb(224, 70, 0);background-color:rgba(142, 150, 170, 0.14);">end</font> - 動畫結束
  • <font style="color:rgb(224, 70, 0);background-color:rgba(142, 150, 170, 0.14);">interrupt</font> - 動畫暫停
  • <font style="color:rgb(224, 70, 0);background-color:rgba(142, 150, 170, 0.14);">cancel</font> - 動畫取消

二、組件介紹

寫了一個Vue3組件,實現在文檔中動態繪制波浪線的效果,可以動態控制波浪線繪制的動畫效果的暫停和播放。接收參數:

  • 文本 text 字符串
  • 文本樣式 style 對象
  • 波浪線顏色 wavyLineColor 字符串
  • 波浪線類型 waveType sin | solid | zigzag | custom
  • customFunction自定義曲線的函數 返回值是一個函數,比如 Math.sin(),會根據這個函數按照步長輸入 x 得到 y,然后繪制曲線

方法:

  • action 執行動畫
  • pause 暫停動畫
  • resume 繼續播放暫停的動畫

使用示例

 <WavyText ref="wavyText1"text="D3.js 的反反復復鳳飛飛反反復復方法方法反反復復反反復復鳳飛飛發發發發發發發發發發發反反復復鳳飛飛反反復復方法方法方法反反復復鳳飛飛反反復復發發發發發發發發發發發發發發發都Vue 3 作為漸進式 JavaScript 框架的代表,憑借其出色的響應式系統和組合式 API":style="{ fontSize: '18px', color: '#2c3e50' }" wavyLineColor="#42b883" waveType="sin" />

三、開源代碼

wavy-text-d3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89841.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單表查詢-分頁提前獲取數據

1、 問題 以下的例子如何優化呢&#xff1f; SELECT * FROM(SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM FROM (SELECT t1.* FROM ( SELECT * FROM T1 ) t1 WHERE 1 1 ORDER BY T1.TTIME DESC)INNER_TABLE ) OUTER_TABLE WHERE OUTER_TABLE_ROWNUM<25AND OUTER_TA…

Oracle觸發器:數據世界的“隱形守護者“

今天&#xff0c;我想和大家聊一個在Oracle數據庫領域既強大又神秘的話題——觸發器&#xff08;Trigger&#xff09;?。在座的各位可能都寫過SQL語句&#xff0c;做過表結構設計&#xff0c;甚至用過存儲過程&#xff0c;但有很多人對觸發器的態度可能是"既愛又怕"…

Python桌面版數獨游戲(三版)-增加難易度模式

數獨游戲難度模式解析 在數獨游戲中&#xff0c;難度通常由已知數字&#xff08;提示數&#xff09;的數量決定。難度越高&#xff0c;已知數字越少&#xff0c;玩家需要推理的步驟越多。以下是不同模式下的算法區別和核心代碼解析。 文章目錄數獨游戲難度模式解析1. **難度模…

k8s查看某個pod的svc

在 Kubernetes 中&#xff0c;要查看與特定 Pod 相關的 Service&#xff0c;可以通過以下方法&#xff1a;#### 方法一&#xff1a;通過標簽匹配1. **獲取 Pod 的標簽**bashkubectl get pod <pod-name> --show-labels輸出示例&#xff1a;NAME READY STATUS RESTARTS AGE…

通俗易懂卷積神經網絡(CNN)指南

本文用直觀類比和可視化方法&#xff0c;幫你徹底理解CNN的工作原理&#xff0c;無需深厚數學基礎也能掌握計算機視覺的核心技術。卷積神經網絡&#xff08;CNN&#xff09;是深度學習中革命性的架構&#xff0c;它徹底改變了計算機"看世界"的方式。本文將用最直觀的…

AV1平滑緩沖區

對于解碼的每一幀視頻數據&#xff0c;解碼器都必須從緩沖池中找到一個尚未被使用的幀緩沖區插槽來存儲解碼后的數據。分配的幀緩沖區插槽用于臨時保存解碼過程中生成的幀數據&#xff0c;直到它們被用于顯示或進一步的處理。函數get_free_buffer的作用是在緩沖池中搜索尚未被分…

Python并發編程:突破GIL枷鎖,高效利用多核CPU

解密concurrent.futures的雙引擎&#xff1a;線程池與進程池的明智選擇在Python并發編程領域&#xff0c;concurrent.futures模塊堪稱利器&#xff0c;但如何正確使用其兩大核心組件——ThreadPoolExecutor和ProcessPoolExecutor&#xff0c;卻讓許多開發者困惑。本文將深入剖析…

在Windows Server 2012 R2中安裝與配置IIS服務并部署mssql靶機教程

在Windows Server 2012 R2中安裝與配置IIS服務全指南 IIS&#xff08;Internet Information Services&#xff09;作為Windows系統自帶的Web服務組件&#xff0c;在企業級Web部署、內網服務搭建等場景中應用廣泛。本文將詳細介紹在Windows Server 2012 R2中安裝IIS服務的完整流…

C#/.NET/.NET Core技術前沿周刊 | 第 47 期(2025年7.14-7.20)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

一.AD域與DFS集群-AD域安裝

目錄 1.網絡規劃 2.主域控安裝 3.輔助域控安裝 1.網絡規劃 服務器名稱IP地址DNS名稱主域控192.168.188.2pdc.test.cn輔助域控192.168.188.3bdc.test.cnDFS1192.168.188.4dfs1.test.cnDFS2192.168.188.5dfs2.test.cn 服務器系統版本為windows server 2022 2.主域控安裝 第一…

BUUCTF在線評測-練習場-WebCTF習題[BSidesCF 2020]Had a bad day1-flag獲取、解析

解題思路打開靶場&#xff0c;作者對我們進行了親切的關懷老規矩查看源碼、抓包并沒有發現什么貓膩點下面兩個按鈕會出現貓貓狗狗的圖片&#xff0c;此時我們發現url多了個 參數category那么比較明顯就是提示我們是任意文件包含、任意文件讀取漏洞了找不到任何信息&#xff0c;…

stm32mp157f-dk2安裝鏡像并且部署qt全流程

在網上看的關于stm32mp157的開發教程太少了&#xff0c;于是乎寫一篇踩坑筆記&#xff0c;僅供學習參考 大概流程&#xff1a;在虛擬機通過stm32cubeprogrammer燒錄鏡像&#xff0c;然后燒錄成功之后&#xff0c;給stm32mp157連接網線&#xff0c;使得開發板有ip地址&#xff…

遺像照片尺寸要求及手機制作打印方法

遺像作為寄托哀思的重要載體&#xff0c;其規格和質量都有嚴格要求。本文將詳細介紹遺像照片的標準尺寸規范&#xff0c;并提供使用手機快速制作合規遺像的完整方案。一、遺像照片的標準尺寸要求遺像照片的尺寸主要分為傳統黑白遺像和現代彩色遺像兩種規格。傳統黑白遺像一般采…

適配器模式 (Adapter Pattern)

適配器模式 (Adapter Pattern) 適配器模式是一種結構型設計模式&#xff0c;用于解決兩個不兼容接口之間的兼容性問題&#xff0c;充當兩個不同接口之間的橋梁。 &#x1f31f; 核心思想轉換接口&#xff1a;將一個類的接口轉換成客戶端期望的另一個接口&#xff0c;使原本不兼…

03-虛幻引擎藍圖類的各父類作用講解

虛幻引擎&#xff08;Unreal Engine&#xff09;的藍圖系統提供了多種父類&#xff0c;每種父類都有其特定的用途和生命周期。理解這些父類的作用&#xff0c;是高效使用藍圖開發游戲的基礎。以下是虛幻引擎中常見藍圖父類的詳細講解&#xff1a;1. Actor 作用&#xff1a;所有…

141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略

141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略 文章目錄 141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略 1. 引言 2. LangChain4j 組件分類 2.1. 核心模塊 (Core Modules) 2.2. LLM 集成 (LLM Integrations) 2.3. 向量存儲集成 (Embedding Store Integratio…

Python可迭代歸約函數深度解析:從all到sorted的進階指南

在Python中&#xff0c;歸約函數&#xff08;Reduction Functions&#xff09;是處理可迭代對象的利器。它們通過遍歷元素并逐步收斂為單個結果&#xff0c;廣泛應用于數據分析、邏輯判斷和數值計算等場景。本文將系統梳理這些函數的核心特性、使用技巧及底層邏輯&#xff0c;助…

大帶寬服務器都有哪些應用場景?

大帶寬服務器憑借著高速的數據傳輸能力和強大的網絡承載能力&#xff0c;通常被企業應用在需要高流量和高并發處理能力的業務場景當中&#xff0c;下面&#xff0c;就讓我們共同了解一下大帶寬服務器的應用場景吧&#xff01;首先&#xff0c;隨著科學技術的快速發展&#xff0…

爬蟲實戰指南:從定位數據到解析請求的全流程解析

爬蟲的本質是什么&#xff1f; 爬蟲的本質就是用代碼模擬人類在瀏覽器里的操作&#xff0c;像點擊網頁、填寫表單、提交數據等行為&#xff0c;自動化地進行網頁數據的獲取和處理。比如&#xff1a; 發送 GET 請求 來請求網頁內容&#xff0c;相當于你在瀏覽器地址欄輸入網址…

Sentinel dashboard 添加context-path后無法信息無法上傳問題

Sentinel dashboard 添加context-path后無法加載問題 添加server.servlet.context-path/sentinel后可以正常訪問&#xff0c;但是客戶端啟動后信息上報失敗。 transport: dashboard: localhost:8858/sentinel 經查閱文檔需要加入api-path&#xff0c;但是我配置提示無api-path所…