国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
> d3在通過(guò)平穩(wěn)過(guò)渡的添加交互式和動(dòng)態(tài)元素方面表現(xiàn)出色,通過(guò)優(yōu)雅的編程和語(yǔ)法增強(qiáng)視覺(jué)體驗(yàn)和用戶參與。
>如何使我的D3可視化互動(dòng)互動(dòng)?
>在廣泛的領(lǐng)域中,從新聞到新聞業(yè)到D3?商業(yè)科學(xué)。一些常見(jiàn)的用例包括創(chuàng)建交互式圖,構(gòu)建動(dòng)態(tài)圖表和圖形,可視化復(fù)雜的網(wǎng)絡(luò)以及創(chuàng)建自定義數(shù)據(jù)驅(qū)動(dòng)的動(dòng)畫(huà)。
首頁(yè) web前端 js教程 與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

Feb 15, 2025 am 09:41 AM

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

>在本文中,我想帶您完成我最近構(gòu)建的示例項(xiàng)目 - a完全原始的使用D3庫(kù)的可視化類型,該類型展示了這些組件中的每個(gè)組件如何累加以使D3一個(gè)很棒的圖書(shū)館。

D3代表數(shù)據(jù)驅(qū)動(dòng)的文檔。這是一個(gè)JavaScript庫(kù),可用于制作各種出色的數(shù)據(jù)可視化和圖表。

>如果您曾經(jīng)看過(guò)《紐約時(shí)報(bào)》中的任何出色的互動(dòng)故事,那么您已經(jīng)看到了D3的行動(dòng)。您還可以在此處查看使用D3構(gòu)建的一些很棒的項(xiàng)目。>

>學(xué)習(xí)曲線對(duì)于進(jìn)入圖書(shū)館的啟動(dòng)非常陡峭,因?yàn)镈3有一些特殊的怪癖,您可能從未見(jiàn)過(guò)。但是,如果您可以超越足夠的D3學(xué)習(xí)的第一階段,那么您很快就可以為自己構(gòu)建一些非??岬臇|西。

>

>有三個(gè)主要因素確實(shí)使D3在那里的任何其他庫(kù)中脫穎而出:

  1. 靈活性。 D3允許您獲取任何類型的數(shù)據(jù),并將其與瀏覽器窗口中的形狀直接關(guān)聯(lián)。這些數(shù)據(jù)可以是絕對(duì)的>,允許大量有趣的用例創(chuàng)建完全原始的可視化。 優(yōu)雅。在更新之間添加具有
  2. 平滑過(guò)渡>的交互式元素很容易。圖書(shū)館的書(shū)面形式是精美的
  3. ,一旦您掌握了語(yǔ)法,就可以很容易地保持代碼清潔和整潔。> 社區(qū)。已經(jīng)有一個(gè)龐大的生態(tài)系統(tǒng),它已經(jīng)使用了D3,他們很容易在線共享他們的代碼。您可以使用bl.ocks.org和blockbuilder.org等網(wǎng)站快速查找其他人的預(yù)先編寫(xiě)代碼,并將這些摘要直接復(fù)制到您自己的項(xiàng)目中。> 鑰匙要點(diǎn)
  4. 代表數(shù)據(jù)驅(qū)動(dòng)的文檔的
  5. d3是一個(gè)強(qiáng)大的JavaScript庫(kù),用于創(chuàng)建多樣化和交互式數(shù)據(jù)可視化,如它在紐約時(shí)報(bào)等平臺(tái)中的廣泛使用所證明的。
庫(kù)提供了無(wú)與倫比的靈活性,使開(kāi)發(fā)人員可以將任何類型的數(shù)據(jù)綁定到瀏覽器中的圖形表示,從而在可視化設(shè)計(jì)中促進(jìn)創(chuàng)造力。

> d3在通過(guò)平穩(wěn)過(guò)渡的添加交互式和動(dòng)態(tài)元素方面表現(xiàn)出色,通過(guò)優(yōu)雅的編程和語(yǔ)法增強(qiáng)視覺(jué)體驗(yàn)和用戶參與。

    >一個(gè)強(qiáng)大的開(kāi)發(fā)人員社區(qū)支持D3,在Bl.ocks.org等平臺(tái)上提供了豐富的共享代碼和示例資源,可以利用這些代碼和項(xiàng)目開(kāi)發(fā)。 該教程詳細(xì)介紹了收入分布創(chuàng)新可視化的創(chuàng)建,利用D3的功能動(dòng)態(tài)操縱和呈現(xiàn)數(shù)據(jù),根據(jù)實(shí)際數(shù)據(jù)值調(diào)整視覺(jué)元素(例如餅圖半徑)。
  • 該項(xiàng)目通過(guò)借貸和調(diào)整現(xiàn)有代碼進(jìn)行迭代開(kāi)發(fā),證明了D3的適應(yīng)性和社區(qū)在編碼中的重要性,然后轉(zhuǎn)化為動(dòng)態(tài)和交互式增強(qiáng)。
  • 最終的交互式可視化包括播放/暫停按鈕和用于年度選擇的滑塊等功能,說(shuō)明了如何使用D3來(lái)使數(shù)據(jù)可視化不僅提供信息,而且可以吸引。
  • 項(xiàng)目
  • 作為大學(xué)的經(jīng)濟(jì)學(xué)專業(yè),我一直對(duì)收入不平等感興趣。我上了幾門(mén)關(guān)于這個(gè)主題的課程,這讓我感到震驚,因?yàn)樗鼞?yīng)該完全理解。
  • >我開(kāi)始使用Google的公共數(shù)據(jù)資源管理器探索收入不平等……>
  • 調(diào)整通貨膨脹時(shí),盡管每工業(yè)生產(chǎn)力一直在飆升,但家庭收入在40%的社會(huì)中保持了幾乎恒定的。它確實(shí)是最高的20%,它獲得了更多的好處(在該括號(hào)內(nèi),如果您看著前5%的前5%,那么差異更加令人震驚)。

    這是我想以令人信服的方式傳播的信息,這為使用一些D3.js提供了絕佳的機(jī)會(huì),所以我開(kāi)始繪制一些想法。

    >

    素描

    因?yàn)槲覀冋谂cD3合作,所以我或多或少可以開(kāi)始繪制我能想到的任何東西

    。制作簡(jiǎn)單的線圖,條形圖或氣泡圖非常容易,但是我想做一些不同的東西。 >我發(fā)現(xiàn)人們傾向于用作對(duì)不平等問(wèn)題的擔(dān)憂的最常見(jiàn)類比是“如果餡餅變大,那么還有更多事情要解決”。直覺(jué)是,如果GDP的總份額在很大程度上增加了,那么即使有些人獲得了pie的較薄

    ,但它們?nèi)匀粫?huì)更好地

    > ??>。但是,正如我們所看到的,餡餅完全有可能變得更大讓人們總體上變得更少。 我可視化這些數(shù)據(jù)的第一個(gè)想法看起來(lái)像這樣:

    的想法是,我們將擁有此脈動(dòng)餅圖,每個(gè)切片代表美國(guó)收入分配的五分之一。每個(gè)派片的面積與該人口的收入收入有關(guān),圖表的總面積將代表其總GDP。 但是,我很快遇到了一些問(wèn)題。事實(shí)證明,人的大腦在區(qū)分不同區(qū)域的大小方面非常差。當(dāng)我更具體地將其映射出來(lái)時(shí),該消息并沒(méi)有像應(yīng)該如此明顯的地方:>

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

    >在這里,實(shí)際上,最貧窮的美國(guó)人隨著時(shí)間的流逝而變得更加富裕,這證實(shí)了似乎直覺(jué)上的真實(shí)。我再考慮這個(gè)問(wèn)題,我的解決方案涉及保持每個(gè)弧的角度恒定的角度,每個(gè)弧的半徑動(dòng)態(tài)變化。

    這是在實(shí)踐中最終尋找的方式:

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

    >我想指出,此圖像仍然傾向于低估這里的效果。如果我們使用一個(gè)簡(jiǎn)單的條形圖,效果將會(huì)更加明顯:

    但是,我致力于做出獨(dú)特的可視化,我想將此消息錘回回家,即

    pie 可以得到更大的> ,而ashare> share>它可以得到較小的?,F(xiàn)在我有了我的主意,是時(shí)候用D3構(gòu)建它了。>

    >借用代碼

    >所以,現(xiàn)在我知道要構(gòu)建什么,是時(shí)候進(jìn)入該項(xiàng)目的真正肉了,然后開(kāi)始編寫(xiě)一些代碼

    。 >您可能會(huì)認(rèn)為我會(huì)從頭開(kāi)始編寫(xiě)我的前幾行代碼行,但是您錯(cuò)了。這是D3,由于我們正在與D3合作,因此我們總是可以從社區(qū)中找到一些預(yù)先編寫(xiě)的代碼,以使我們脫穎而出。>

    >我們正在創(chuàng)建全新的東西,但是它與常規(guī)餅圖有很多共同點(diǎn),因此我快速查看了bl.ocks.org,我決定使用Mike Bostock的經(jīng)典實(shí)施, D3的創(chuàng)造者之一。該文件可能已經(jīng)復(fù)制了數(shù)千次,而寫(xiě)它的人是帶有JavaScript的真正向?qū)?,因此我們可以確定我們已經(jīng)從一個(gè)不錯(cuò)的代碼開(kāi)始了。

    此文件寫(xiě)在D3 V3中,該文件現(xiàn)在已經(jīng)過(guò)時(shí)了兩個(gè)版本,因?yàn)榘姹?最終在上個(gè)月發(fā)布。 D3 V4的一個(gè)很大的變化是,庫(kù)切換到使用平坦的名稱空間,因此比例功能諸如d3.scale.ordinal()的編寫(xiě)一樣,就像d3.scaleordinal()相反。在版本5中,最大的更改是,數(shù)據(jù)加載函數(shù)現(xiàn)在是按照承諾構(gòu)造的,這使得更容易一次處理多個(gè)數(shù)據(jù)集。

    > 為了避免混亂,我已經(jīng)遇到了創(chuàng)建此代碼的更新V5版本的麻煩,我已將其保存在blockbuilder.org上。我還將語(yǔ)法轉(zhuǎn)換為適合ES6慣例,例如將ES5匿名函數(shù)切換到箭頭函數(shù)。

    這是我們已經(jīng)開(kāi)始的:

    >

    然后,我將這些文件復(fù)制到我的工作目錄中,并確保我可以在自己的計(jì)算機(jī)上復(fù)制所有內(nèi)容。如果您想自己跟隨本教程,那么您可以從我們的GitHub倉(cāng)庫(kù)中克隆該項(xiàng)目。您可以從文件啟動(dòng)器.html中的代碼開(kāi)始。請(qǐng)注意,您將需要一臺(tái)服務(wù)器(例如該服務(wù)器)來(lái)運(yùn)行此代碼,因?yàn)樗蕾囉贔etch API檢索數(shù)據(jù)。

    >讓我快速介紹此代碼的工作原理。

    瀏覽我們的代碼

    與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化首先,我們?cè)谖募敳柯暶髁艘恍┏?shù),我們將使用該常數(shù)來(lái)定義餅圖的大?。?/p>

    >這使我們的代碼超級(jí)重復(fù)使用,因?yàn)槿绻覀兿胧蛊涓蠡蚋?,那么我們只需要?dān)心在此處更改這些值。

    >

    接下來(lái),我們將SVG畫(huà)布附加到屏幕上。如果您對(duì)SVG的了解不多,那么您可以將畫(huà)布視為我們可以繪制形狀的頁(yè)面上的空間。如果我們嘗試在該區(qū)域之外繪制SVG,那么它根本不會(huì)出現(xiàn)在屏幕上:>

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
>我們正在用圖表區(qū)域的ID抓住一個(gè)空的DIV,并致電D3.Select()。我們還使用d3.append()方法將SVG畫(huà)布附加,并且使用d3.attr()方法為其寬度和高度設(shè)置了一些尺寸。

>我們還將SVG組元素附加到此畫(huà)布上,這是一種特殊類型的元素,我們可以將其用于將元素構(gòu)造在一起。這使我們可以使用組元素的轉(zhuǎn)換屬性將整個(gè)可視化轉(zhuǎn)移到屏幕的中心。

之后,我們正在設(shè)置一個(gè)默認(rèn)量表,我們將使用該量表來(lái)為我們的派的每一個(gè)分配新顏色:

>

接下來(lái),我們有幾行設(shè)置了D3的派布局:>

在D3中,布局是我們可以在一組數(shù)據(jù)中調(diào)用的特殊功能。一個(gè)布局函數(shù)以特定格式接收一系列數(shù)據(jù),并使用一些自動(dòng)生成的值吐出
<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
轉(zhuǎn)換的數(shù)組

,然后我們可以用。 然后,我們需要定義一個(gè)可以用來(lái)繪制弧的路徑生成器。路徑生成器允許我們?cè)赪eb瀏覽器中繪制路徑SVG。 D3真正要做的就是將數(shù)據(jù)與屏幕上的形狀相關(guān)聯(lián),但是在這種情況下,我們要定義更復(fù)雜的形狀,而不是簡(jiǎn)單的圓或正方形。路徑SVG通過(guò)定義在之間繪制線路的路由來(lái)工作,我們可以使用其D屬性來(lái)定義。

這可能是:
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

d屬性包含一個(gè)特殊的編碼,可以讓瀏覽器繪制我們想要的路徑。如果您真的想知道此字符串的含義,則可以在MDN的SVG文檔中找到它。對(duì)于D3中的編程,我們實(shí)際上不需要了解此特殊編碼的任何信息,因?yàn)槲覀兊陌l(fā)電機(jī)會(huì)為我們吐出D屬性,我們只需要使用一些簡(jiǎn)單的參數(shù)來(lái)初始化。 對(duì)于弧線,我們需要為我們的路徑發(fā)生器一個(gè)Innerradius和像素中的外段值,并且發(fā)電機(jī)將分類為我們計(jì)算每個(gè)角度的復(fù)雜數(shù)學(xué):

>

對(duì)于我們的圖表,我們?yōu)镮nnerradius使用了零值,這為我們提供了標(biāo)準(zhǔn)的餅圖。但是,如果我們想繪制甜甜圈圖,那么我們要做的就是插入一個(gè)小于我們的outerradius值的值。
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>

>幾次函數(shù)聲明后,我們將使用d3.json()函數(shù)加載數(shù)據(jù):>

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
在D3版本5.x中,呼叫d3.json()返回諾言,這意味著D3將獲取它在我們給它的相對(duì)路徑上找到的JSON文件的內(nèi)容,并執(zhí)行該功能加載后,我們將在The The The The The The The()方法中調(diào)用。然后,我們可以訪問(wèn)我們?cè)诨卣{(diào)的數(shù)據(jù)參數(shù)中查看的對(duì)象。>

>我們還在此處傳遞函數(shù)參考 - 類型 - 它將轉(zhuǎn)換我們加載成數(shù)的所有值,我們可以稍后使用:>

>

<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
如果我們添加console.log(data);向我們的d3.json回調(diào)的口頭聲明,我們可以查看我們現(xiàn)在正在使用的數(shù)據(jù):>

我們的數(shù)據(jù)在這里分為兩個(gè)不同的數(shù)組,分別代表我們的蘋(píng)果和橘子數(shù)據(jù)。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

>使用此行,我們將在單擊我們的一個(gè)無(wú)線電按鈕時(shí)切換我們正在查看的數(shù)據(jù):

>

>我們還需要在可視化的第一次運(yùn)行中調(diào)用update()函數(shù),以傳遞初始值(帶有“蘋(píng)果”數(shù)組)。
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

>讓我們看一下我們的update()函數(shù)在做什么。如果您是D3的新手,這可能會(huì)引起一些困惑,因?yàn)樗荄3最困難的部分之一……>
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span>  <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>

>首先,我們使用默認(rèn)函數(shù)參數(shù)作為值。如果我們將參數(shù)傳遞到我們的update()函數(shù)(當(dāng)我們第一次運(yùn)行時(shí)),我們將使用該字符串,否則我們將從單擊事件中獲得所需的值我們的無(wú)線電輸入。

然后,我們正在使用D3中的常規(guī)更新模式
<span>const arc = d3.arc()
</span>  <span>.innerRadius(0)
</span>  <span>.outerRadius(radius);
</span>
來(lái)處理我們的弧的行為。這通常涉及執(zhí)行數(shù)據(jù)加入,退出舊元素,更新屏幕上的現(xiàn)有元素,并添加添加到我們數(shù)據(jù)中的新元素。在此示例中,我們不必?fù)?dān)心退出元素,因?yàn)槲覀冊(cè)谄聊簧鲜冀K具有相同數(shù)量的餅片。

首先,有我們的數(shù)據(jù)加入:

>每次我們的可視化更新時(shí),這都會(huì)將新的數(shù)據(jù)與我們的SVG在屏幕上關(guān)聯(lián)。我們將數(shù)據(jù)(“蘋(píng)果”或“橙色”的數(shù)組)傳遞到我們的PIE()布局函數(shù)中,該功能正在計(jì)算一些開(kāi)始角度和端角,可用于繪制我們的弧線。現(xiàn)在,此路徑變量包含屏幕上所有弧的特殊

虛擬選擇

。 接下來(lái),我們將更新數(shù)據(jù)數(shù)組中仍然存在的屏幕上的所有SVG。我們?cè)诖颂幪砑恿艘粋€(gè)過(guò)渡 - D3庫(kù)的絕妙功能 - 傳播這些更新超過(guò)200毫秒:>

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

>我們?cè)赿3.transition()呼叫上使用attrtwien()方法來(lái)定義D3應(yīng)使用的自定義過(guò)渡,以更新其每個(gè)ARC的位置(使用D屬性過(guò)渡)。如果我們?cè)噲D將過(guò)渡到大多數(shù)屬性添加過(guò)渡,但是我們需要這樣做,但是我們需要這樣做以在不同的路徑之間過(guò)渡。 D3無(wú)法真正弄清楚如何在自定義路徑之間過(guò)渡,因此我們使用Arctween()函數(shù)來(lái)讓D3知道如何在每時(shí)每刻都應(yīng)繪制我們的每條路徑。

>

這是此功能的樣子:

<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>

我們?cè)诖颂幨褂胐3.interpaly()來(lái)創(chuàng)建所謂的插裝器。當(dāng)我們調(diào)用我們存儲(chǔ)在I變量中的函數(shù),值在0到1之間,我們將獲得一個(gè)介于此之間的值。_current和a。在這種情況下,this._current是一個(gè)包含我們正在查看的PIE切片的開(kāi)始和末端角度的對(duì)象,A表示我們正在更新為。

>一旦我們?cè)O(shè)置了插裝器,我們就會(huì)更新this._current值,以包含我們?cè)谀┪菜鶕碛械闹担╥(a)),然后我們正在返回一個(gè)將計(jì)算計(jì)算的函數(shù)基于此t值,我們的弧應(yīng)包含的路徑。我們的過(guò)渡將在其時(shí)鐘的每個(gè)刻度上運(yùn)行此函數(shù)(通過(guò)0到1之間的參數(shù)),此代碼將意味著我們的過(guò)渡將在任何時(shí)間點(diǎn)都知道我們的弧線應(yīng)在哪里繪制。

>

>最后,我們的update()函數(shù)需要添加在以前的數(shù)據(jù)陣列中沒(méi)有的新元素:>

這個(gè)代碼塊將設(shè)置我們每個(gè)弧的初始位置,這是第一次運(yùn)行此更新功能。此處的Enter()方法為我們提供了需要添加到屏幕中的所有元素,然后我們可以使用Attr()方法循環(huán)瀏覽這些元素,以設(shè)置每個(gè)元素的填充和位置弧。我們還為每個(gè)弧線提供了一個(gè)白色邊框,這使我們的圖表看起來(lái)有些整潔。最后,我們將這些弧的每一個(gè)的current屬性設(shè)置為數(shù)據(jù)中的初始值,我們?cè)赼rctween()函數(shù)中使用。
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>不用擔(dān)心您是否無(wú)法完全遵循它的工作原理,因?yàn)樗荄3中的一個(gè)相當(dāng)高級(jí)的話題。這個(gè)庫(kù)的偉大是,您不需要了解其所有內(nèi)部工作,就可以用它創(chuàng)建一些強(qiáng)大的東西。只要您能理解需要更改的位,就可以抽象一些并不是完全必不可少的細(xì)節(jié)。

>

將我們帶到了過(guò)程中的下一步……

適應(yīng)代碼

>現(xiàn)在我們?cè)诒镜丨h(huán)境中有一些代碼,并且我們了解它在做什么,我將切換我們正在查看的數(shù)據(jù),以便它可以與我們感興趣的數(shù)據(jù)一起使用。

>我已經(jīng)包含了我們將在項(xiàng)目的數(shù)據(jù)/文件夾中使用的數(shù)據(jù)。由于此新的incomes.csv文件這次是CSV格式(這是可以使用Microsoft Excel打開(kāi)的文件),因此我將使用d3.csv()函數(shù),而不是D3.json( )函數(shù):

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

此函數(shù)基本上與D3.json()基本相同 - 將我們的數(shù)據(jù)轉(zhuǎn)換為我們可以使用的格式。我還將type()initializer函數(shù)作為這里的第二個(gè)參數(shù)刪除,因?yàn)檫@是我們舊數(shù)據(jù)的特定于。

>如果將Console.Log(Data)語(yǔ)句添加到D3.CSV回調(diào)的頂部,則可以看到我們正在使用的數(shù)據(jù)的形狀:>

>我們有50個(gè)項(xiàng)目的數(shù)組,每個(gè)項(xiàng)目都代表我們的數(shù)據(jù)一年。然后,我們每年都有一個(gè)對(duì)象,其中五個(gè)收入組中的每個(gè)集團(tuán)以及其他一些領(lǐng)域都有數(shù)據(jù)。我們可以在這里創(chuàng)建一個(gè)餅圖,這是這些年之一,但是首先,我們需要稍微繞過(guò)我們的數(shù)據(jù),以便以正確的格式。當(dāng)我們想編寫(xiě)與D3連接的數(shù)據(jù)時(shí),我們需要傳遞一個(gè)數(shù)組,每個(gè)項(xiàng)目都將綁定到SVG。
<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
回想一下,在我們的最后一個(gè)示例中,我們有一個(gè)數(shù)組,其中包含一個(gè)項(xiàng)目,適用于要在屏幕上顯示的每個(gè)派。將此與我們目前擁有的東西進(jìn)行比較,這是一個(gè)對(duì)象,其鑰匙為1至5,代表我們要繪制的每個(gè)派。

> 為了解決此問(wèn)題,我將添加一個(gè)稱為repardata()的新函數(shù)以替換我們以前擁有的type()函數(shù),該功能將在加載時(shí)迭代我們的每個(gè)數(shù)據(jù):>

>每年,此功能將返回具有值數(shù)組的對(duì)象,我們將將其傳遞到我們的數(shù)據(jù)加入中。我們將這些值中的每一個(gè)都標(biāo)記為名稱字段,并且根據(jù)我們已經(jīng)擁有的收入價(jià)值,我們?yōu)樗鼈兲峁┝藬?shù)值。我們還在跟蹤比較每年的平均收入。

>在這一點(diǎn)上,我們的數(shù)據(jù)格式可以使用:

>
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>

>我將在數(shù)據(jù)中的第一年生成圖表,然后我會(huì)擔(dān)心在剩下的幾年中更新它。

>

>目前,我們的數(shù)據(jù)始于2015年,在1967年結(jié)束,因此我們需要扭轉(zhuǎn)此數(shù)組,然后才能做其他任何事情:

<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

與普通餅圖不同,對(duì)于我們的圖形,我們要固定每個(gè)弧的角度,并且隨著可視化更新的變化,半徑更改。為此,我們將更改PIE布局上的Value()方法,以便每個(gè)派slice始終具有相同的角度:

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
接下來(lái),每次可視化更新時(shí),我們都需要更新半徑。為此,我們需要提出一個(gè)可以使用的量表。比例尺是D3中的一個(gè)函數(shù),在兩個(gè)值之間采用

input 輸入,我們作為域傳遞,然后在兩個(gè)不同的值之間吐出>輸出作為范圍。這是我們將使用的規(guī)模:

>
<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>

>一旦我們可以訪問(wèn)數(shù)據(jù),我們就會(huì)添加這個(gè)量表,我們說(shuō)我們的投入應(yīng)在0到我們數(shù)據(jù)集中最大的價(jià)值之間,這是去年最富有的群體的收入在我們的數(shù)據(jù)中(數(shù)據(jù)[49]。值[4]。值)。對(duì)于域,我們?cè)O(shè)置了我們的輸出值應(yīng)范圍的間隔。

這意味著零的輸入應(yīng)給我們一個(gè)像素值為零,并且數(shù)據(jù)中最大值的輸入應(yīng)為我們提供寬度或高度值的一半值,以較小。 >

請(qǐng)注意,我們還在此處使用

平方的根刻度

。我們這樣做的原因是,我們希望我們的餡餅切片區(qū)域與每個(gè)小組的收入成正比,而不是半徑。由于區(qū)域=πr2>,我們需要使用平方根刻度來(lái)解釋這一點(diǎn)。 然后,我們可以使用此量表來(lái)更新Update()函數(shù)中的ARC Generator的Outerradius值:>

>每當(dāng)我們的數(shù)據(jù)更改時(shí),這將編輯我們要用于每個(gè)弧線的半徑值。

>當(dāng)我們最初設(shè)置弧發(fā)生器時(shí),我們還應(yīng)該刪除對(duì)Outerradius的呼叫,以便我們將其放在文件的頂部:
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>
>

>最后,我們需要對(duì)此update()函數(shù)進(jìn)行一些編輯,以便所有內(nèi)容都與我們的新數(shù)據(jù)相匹配:>

>由于我們不再使用我們的收音機(jī)按鈕,所以我只是通過(guò)致電我們要使用的年度對(duì)象:
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>

>最后,我將刪除我們?yōu)楸韱屋斎朐O(shè)置的事件偵聽(tīng)器。如果一切都計(jì)劃在計(jì)劃中,我們的數(shù)據(jù)中應(yīng)該有一張漂亮的圖表:>
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span>  <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>

<span>const arc = d3.arc()
</span>  <span>.innerRadius(0)
</span>  <span>.outerRadius(radius);
</span>
使其動(dòng)態(tài)

下一步是在不同年份之間擁有我們的可視化周期,以表明收入如何隨著時(shí)間的流逝而變化。我們將通過(guò)添加呼叫JavaScript的setInterval()函數(shù)來(lái)做到這一點(diǎn),我們可以用它來(lái)重復(fù)執(zhí)行某些代碼:

> 與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

>我們?cè)诖藭r(shí)間變量中設(shè)置了一個(gè)計(jì)時(shí)器,每200ms,此代碼將運(yùn)行step()函數(shù),該函數(shù)將將我們的圖表更新為明年的數(shù)據(jù),并將計(jì)時(shí)器遞增1。如果計(jì)時(shí)器它的價(jià)值為49(我們的數(shù)據(jù)中的最后一年),它將自身重置?,F(xiàn)在,這為我們提供了一個(gè)不錯(cuò)的循環(huán),它將連續(xù)運(yùn)行:

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化

使事情更有用。我還將添加一些標(biāo)簽,這些標(biāo)簽為我們提供了原始數(shù)字。我將用以下方式替換文件正文中的所有HTML代碼

<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>
>我們正在使用Bootstrap的網(wǎng)格系統(tǒng)在此處構(gòu)建頁(yè)面,這使我們可以將頁(yè)面元素整潔地格式化為框。

然后,每當(dāng)我們的數(shù)據(jù)更改時(shí),我將使用jQuery更新所有這些:>

>我還將對(duì)我們文件頂部的CSS進(jìn)行一些編輯,這將為我們提供每個(gè)弧的傳奇,并以我們的標(biāo)題為中心:>

<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
我們最終得到的是相當(dāng)可觀的東西:

<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>

>很難看到這些弧線隨著時(shí)間的推移如何變化,所以我想添加一些網(wǎng)格線來(lái)顯示我們數(shù)據(jù)第一年的收入分布的樣子:>

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>我正在使用array.foreach()方法來(lái)完成此操作,盡管我也可以再次使用D3的常規(guī)

常規(guī)更新模式

(join/exit/exit/extim/update/enter)。

>
<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>我還想添加一行以顯示美國(guó)的平均收入,我每年都會(huì)更新。首先,我將首次添加平均線:

> >然后,我將在UPDATE()函數(shù)的末尾更新此版本。

>我應(yīng)該注意,對(duì)于我們來(lái)說(shuō),在我們的第一個(gè)call to Update()之后,添加每個(gè)圓圈

很重要,因?yàn)榉駝t它們最終會(huì)在每個(gè)圈子后面渲染
<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span>  <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>
>

>我們的弧路徑(SVG層取決于將它們添加到屏幕的順序,而不是通過(guò)其z索引)。

>在這一點(diǎn)上,我們有一些傳達(dá)我們正在使用的數(shù)據(jù),這些數(shù)據(jù)更清楚地:
<span>const arc = d3.arc()
</span>  <span>.innerRadius(0)
</span>  <span>.outerRadius(radius);
</span>
>

使其互動(dòng)

作為最后一步,我希望我們添加一些控件,以使用戶挖掘到特定年份。我想添加a

play/暫停

按鈕,以及一年的滑塊,允許用戶選擇特定的日期來(lái)查看。

與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>這是我用來(lái)將這些元素添加到屏幕上的HTML:>

>我們需要在這兩個(gè)元素中添加一些事件聽(tīng)眾,以設(shè)計(jì)我們要尋找的行為。

首先,我想定義我們的按鈕的行為。我們需要替換提前為間隔編寫(xiě)的代碼,以便我們使用按鈕停止并啟動(dòng)計(jì)時(shí)器。我假設(shè)可視化始于“暫?!睜顟B(tài),我們需要按下此按鈕以拉開(kāi)序幕。
<span>const width = 540;
</span><span>const height = 540;
</span><span>const radius = Math.min(width, height) / 2;
</span>

>每當(dāng)我們的按鈕單擊時(shí),我們的if/else block在這里將定義不同的行為,具體取決于我們的按鈕是“播放”按鈕還是“暫?!卑粹o。如果我們單擊的按鈕說(shuō)“播放”,我們將按鈕更改為“暫停”按鈕,然后開(kāi)始我們的間隔循環(huán)。另外,如果按鈕是“暫?!卑粹o,我們將其文本更改為“ play”,我們將使用clearInterval()函數(shù)來(lái)阻止循環(huán)運(yùn)行。

>

對(duì)于我們的滑塊,我想使用jQuery UI庫(kù)隨附的滑塊。我將其包含在我們的HTML中,并且我將寫(xiě)幾行以將其添加到屏幕上:>

<span>const svg = d3.select("#chart-area")
</span>  <span>.append("svg")
</span>    <span>.attr("width", width)
</span>    <span>.attr("height", height)
</span>  <span>.append("g")
</span>    <span>.attr("transform", <span>`translate(<span>${width / 2}</span>, <span>${height / 2}</span>)`</span>);
</span>
>在這里,我們使用幻燈片選項(xiàng)將事件偵聽(tīng)器連接到滑塊。每當(dāng)我們的滑塊轉(zhuǎn)移到另一個(gè)值時(shí),我們都會(huì)將計(jì)時(shí)器更新到此新值,并且在當(dāng)年的數(shù)據(jù)中運(yùn)行了Update()函數(shù)。

>我們可以在Update()函數(shù)末尾添加此行,以便我們的滑塊移動(dòng)到我們的循環(huán)運(yùn)行時(shí)正確的一年:

>我還將在我們的UpdateHtml()函數(shù)(每當(dāng)我們的可視化更改時(shí)運(yùn)行)添加一行,該功能可以根據(jù)數(shù)據(jù)中的當(dāng)年調(diào)整標(biāo)簽的值
<span>const color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb","#e78ac3", "#a6d854", "#ffd92f"]);
</span>

>我將向我們的CSS扔幾行,以使一切看起來(lái)有些整潔:

<span>const pie = d3.pie()
</span>  <span>.value(d => d.count)
</span>  <span>.sort(null);
</span>
>我們擁有它 - 我們的成品 - 一個(gè)功能齊全的交互式數(shù)據(jù)可視化,一切都按預(yù)期工作。

<span><span><span><svg</span> width<span>="190"</span> height<span>="160"</span>></span>
</span>  <span><span><span><path</span> d<span>="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80"</span> stroke<span>="black"</span> fill<span>="transparent"</span>/></span>
</span><span><span><span></svg</span>></span>
</span>

希望,本教程展示了D3的真實(shí)力量,讓您絕對(duì)創(chuàng)建任何您可以想象的東西。

>從頭開(kāi)始始終是一個(gè)艱難的過(guò)程,但是獎(jiǎng)勵(lì)值得。如果您想學(xué)習(xí)如何創(chuàng)建自己的自定義可視化,這里有一些在線資源,您可能會(huì)發(fā)現(xiàn)有幫助:與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化>

  • > SitePoint的D3.js內(nèi)容的概述
  • > D3主頁(yè)上的圖書(shū)館簡(jiǎn)介。這是通過(guò)一些最基本的命令運(yùn)行的,向您展示了如何在D3中進(jìn)行第一個(gè)步驟。
  • >
  • >“讓我們制作條形圖” Mike Bostock(D3的創(chuàng)建者) - 向初學(xué)者展示了如何制作圖書(shū)館中最簡(jiǎn)單的圖表之一。 Elijah Meeks($ 35)的
  • d3.js,這是一本可靠的介紹性教科書(shū)。 D3的Slack頻道非常歡迎D3的新移民。它還有一個(gè)“學(xué)習(xí)材料”部分,并收集了大量資源。
  • >
  • >此在線Udemy課程(20美元),該課程涵蓋了圖書(shū)館中的所有內(nèi)容。這針對(duì)JavaScript開(kāi)發(fā)人員,包括四個(gè)很酷的項(xiàng)目。
  • 在bl.ocks.org和blockbuilder.org。
  • D3 API參考,它對(duì)D3提供的所有內(nèi)容提供了詳盡的技術(shù)解釋。
  • >不要忘記,如果您想查看我在文章中使用的代碼的完成版本,那么您可以在我們的GitHub repo上找到它。
  • >
  • >與JavaScript和D3
  • >的交互式數(shù)據(jù)可視化的經(jīng)常詢問(wèn)問(wèn)題(常見(jiàn)問(wèn)題解答)
  • > D3在交互式數(shù)據(jù)可視化中的意義是什么?
d3(代表數(shù)據(jù)驅(qū)動(dòng)的文檔)是一個(gè)JavaScript庫(kù),該庫(kù)是廣泛用于創(chuàng)建交互式數(shù)據(jù)可視化的JavaScript庫(kù)。它允許您將任意數(shù)據(jù)綁定到文檔對(duì)象模型(DOM),然后將數(shù)據(jù)驅(qū)動(dòng)的轉(zhuǎn)換應(yīng)用于文檔。 D3不是一個(gè)單層框架,它試圖提供所有可以想象的功能。取而代之的是,它解決了問(wèn)題的關(guān)鍵:根據(jù)數(shù)據(jù)有效操縱文檔。這避免了專有表示形式,并具有非凡的靈活性,揭示了HTML,SVG和CSS等網(wǎng)絡(luò)標(biāo)準(zhǔn)的全部功能。

> D3與其他JavaScript庫(kù)有何不同?之所以獨(dú)特,是因?yàn)樗鼓梢造`活地創(chuàng)建其他庫(kù)無(wú)法使用的數(shù)據(jù)可視化。它使您可以直接操縱DOM,這意味著您可以完全控制可視化的最終外觀。 D3還使用聲明的方法,這意味著您定義了想要最終結(jié)果的外觀,而D3算出了如何到達(dá)那里。

>

我可以將D3用于大數(shù)據(jù)集嗎?是的,D3能夠處理大型且復(fù)雜的數(shù)據(jù)集。它具有強(qiáng)大的數(shù)據(jù)操作功能,可讓您以任何格式使用數(shù)據(jù)。 D3還具有用于從不同來(lái)源加載數(shù)據(jù)的內(nèi)置功能,使其更容易與您的現(xiàn)有數(shù)據(jù)基礎(chǔ)結(jié)構(gòu)集成。>

>如何使我的D3可視化互動(dòng)互動(dòng)?

> d3提供了幾種將交互性添加到可視化的方法。您可以使用事件偵聽(tīng)器響應(yīng)諸如點(diǎn)擊或鼠標(biāo)運(yùn)動(dòng)之類的用戶操作,并且可以使用過(guò)渡來(lái)對(duì)數(shù)據(jù)進(jìn)行動(dòng)畫(huà)更改。 D3還支持縮放和平移,這對(duì)于探索大型數(shù)據(jù)集可能很有??用。

>

>在廣泛的領(lǐng)域中,從新聞到新聞業(yè)到D3?商業(yè)科學(xué)。一些常見(jiàn)的用例包括創(chuàng)建交互式圖,構(gòu)建動(dòng)態(tài)圖表和圖形,可視化復(fù)雜的網(wǎng)絡(luò)以及創(chuàng)建自定義數(shù)據(jù)驅(qū)動(dòng)的動(dòng)畫(huà)。

我是否需要知道JavaScript來(lái)使用D3? ,對(duì)JavaScript有效使用D3是必要的。 D3是一個(gè)JavaScript庫(kù),因此您需要編寫(xiě)JavaScript代碼來(lái)創(chuàng)建可視化。但是,D3的API旨在直觀且易于學(xué)習(xí),因此,即使您不是JavaScript專家,您仍然可以使用D3創(chuàng)建強(qiáng)大的可視化。是的,可以與其他JavaScript庫(kù)或框架一起使用D3。例如,您可以使用D3來(lái)創(chuàng)建使用React或Angular。非常適合實(shí)時(shí)數(shù)據(jù)可視化。它具有靈活的數(shù)據(jù)更新機(jī)制,可讓您在新數(shù)據(jù)進(jìn)來(lái)時(shí)輕松更新可視化。這使D3成為儀表板或?qū)崟r(shí)數(shù)據(jù)饋送等應(yīng)用程序的絕佳選擇。

>我如何學(xué)習(xí)D3? >

>有許多可用于學(xué)習(xí)D3的資源。 D3官方網(wǎng)站有大量的文檔和示例,并且有許多在線教程和課程深度涵蓋D3。練習(xí)也是關(guān)鍵 - 您使用D3越多,您的概念和API都會(huì)變得越舒適。

> d3?

是什么限制,而d3是一個(gè)強(qiáng)大的工具,它確實(shí)有一些局限性。它需要對(duì)JavaScript和Web標(biāo)準(zhǔn)有很好的了解,這可能是初學(xué)者的障礙。 D3還為開(kāi)發(fā)人員留下了很多決定,如果您不確定從哪里開(kāi)始,這可能會(huì)令人不知所措。最后,盡管D3能夠處理大型數(shù)據(jù)集,但性能可能會(huì)成為一個(gè)非常大或復(fù)雜的可視化的問(wèn)題。

以上是與現(xiàn)代JavaScript和D3的交互式數(shù)據(jù)可視化的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開(kāi)發(fā),而JavaScript主要用于網(wǎng)頁(yè)開(kāi)發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開(kāi)發(fā)人員的全面比較 JavaScript與Java:開(kāi)發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

如何減少JavaScript應(yīng)用程序的有效載荷大?。? />
								</a>
								<a href=如何減少JavaScript應(yīng)用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

如果JavaScript應(yīng)用加載慢、性能差,問(wèn)題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過(guò)React.lazy()或構(gòu)建工具將大bundle拆分為多個(gè)小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機(jī)制清除“死代碼”,確保引入的庫(kù)支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴,選用輕量級(jí)庫(kù)如day.js、fetch

See all articles