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

目錄
我們正在做什麼
圖表的基礎(chǔ)
確定最高價(jià)值
計(jì)算矩形的尺寸
創(chuàng)建和插入DOM元素
切割矩形
掩蓋101
白色填充
黑色填充
灰色填充
最後一點(diǎn)
生成口罩
最終結(jié)果
首頁(yè) web前端 css教學(xué) 如何使用口罩創(chuàng)建嵌套正方形的動(dòng)畫(huà)圖表

如何使用口罩創(chuàng)建嵌套正方形的動(dòng)畫(huà)圖表

Mar 18, 2025 am 11:03 AM

如何使用口罩創(chuàng)建嵌套正方形的動(dòng)畫(huà)圖表

我們有許多眾所周知的圖表類(lèi)型:酒吧,甜甜圈,線(xiàn),派,您可以命名。所有流行的圖表庫(kù)支持這些。然後有圖表類(lèi)型甚至沒(méi)有名稱(chēng)。使用堆疊的(嵌套)正方形查看此DreamT-Up圖表,可以幫助可視化相對(duì)大小,或者不同的值相互比較:

我們正在做什麼

沒(méi)有任何互動(dòng),創(chuàng)建此設(shè)計(jì)非常簡(jiǎn)單。一種方法是堆疊元素(例如SVG 元素,甚至是HTML Divs),尺寸的尺寸均勻,其中所有左下角都觸及相同的點(diǎn)。

但是,一旦我們引入了一些互動(dòng)性,事情就會(huì)變得棘手。應(yīng)該這樣做:當(dāng)我們將鼠標(biāo)移到其中一種形狀上時(shí),我們希望其他人逐漸消失並移開(kāi)。

我們將使用矩形和掩碼創(chuàng)建這些不規(guī)則的形狀 - 具有元素的字面。如果您是面具的新手,那麼您就在正確的位置。這是一篇介紹性的文章。如果您的經(jīng)驗(yàn)豐富,那麼也許這種切割效果是您可以帶來(lái)的技巧。

現(xiàn)在,在我們開(kāi)始之前,您可能會(huì)想知道是否是使用自定義形狀的更好的SVG替代品。絕對(duì)是可能的!但是用繪製形狀可能令人生畏,甚至?xí)兊昧鑱y。因此,我們正在使用“更容易”的元素來(lái)獲得相同的形狀和效果。

例如,這是我們必須使用來(lái)表示最大的藍(lán)色形狀。

 <svg viewbox="“" width="“" height="“">
  
</svg>

如果0H0V56…對(duì)您沒(méi)有任何意義,請(qǐng)查看“ SVG路徑語(yǔ)法:插圖指南”,以詳細(xì)說(shuō)明語(yǔ)法。

圖表的基礎(chǔ)

給定這樣的數(shù)據(jù)集:

鍵入datasetEntry = {
  標(biāo)籤:字符串;
  值:數(shù)字;
};

鍵入dataset = datasetEntry [];

const rawdataset:dataset = [
  {label:'bad',值:1231},
  {label:'begint',value:6321},
  {label:'開(kāi)發(fā)',值:10028},
  {label:'已完成',值:12123},,
  {label:'示例',值:2120}
];

…我們想以這樣的SVG結(jié)束:

 <svg viewbox="“" width="“" height="“">
  <rect width="“" height="“" y="“" fill="“" ...> </rect>
  <rect width="“" height="“" y="“" fill="“" ...> </rect>
  <rect width="“" y="“" fill="“" ...> </rect>
  <rect width="“" y="“" fill="“" ...> </rect>
  <rect width="“" height="“" y="“" fill="“" ...> </rect>
</svg>

確定最高價(jià)值

在瞬間,我們需要最高價(jià)值會(huì)變得很明顯。我們可以使用Math.max()獲取它。它接受任何數(shù)量的參數(shù),並返回集合中的最高值。

 const dataseThighestValue:number = math.max(
  ... RAWDATASET.MAP((輸入:DataSetEntry)=> entry.value)
);

由於我們有一個(gè)小數(shù)據(jù)集,因此我們可以說(shuō)我們將獲得12123。

計(jì)算矩形的尺寸

如果我們看設(shè)計(jì),則代表最高值(12123)的矩形覆蓋了圖表的整個(gè)區(qū)域。

我們?nèi)我膺x擇320個(gè)SVG尺寸。由於我們的矩形是正方形,因此寬度和高度相等。我們?nèi)绾问?2123等於320?較少的“特殊”值怎麼樣? 6321矩形有多大?

換句話(huà)說(shuō),我們?nèi)绾螌⒁粋€(gè)數(shù)字從一個(gè)範(fàn)圍([0,12123])映射到另一個(gè)範(fàn)圍([0,320])?或者,用更多的數(shù)學(xué)術(shù)語(yǔ),我們?nèi)绾螌⒆兞繑U(kuò)展到[a,b]的間隔?

出於我們的目的,我們將實(shí)現(xiàn)這樣的功能:

 const remapvalue =(
  價(jià)值:數(shù)字,
  Frommin:數(shù)字,
  Frommax:數(shù)字,
  Tomin:數(shù)字,
  tomax:數(shù)字
):數(shù)字=> {
  返回((value -frommin) /(frommax -frommin)) *(tomax -tomin)tomin;
};

重新值(1231,0,12123,0,320); // 32
重新值(6321,0,12123,0,320); // 167
重新值(12123,0,12123,0,320); // 320

由於我們將值映射到代碼中的相同範(fàn)圍,而不是一遍又一遍地傳遞最小值和最大值,因此我們可以創(chuàng)建一個(gè)包裝函數(shù):

 const valuerMapper =(
  Frommin:數(shù)字,
  Frommax:數(shù)字,
  Tomin:數(shù)字,
  tomax:數(shù)字
)=> {
  返回(值:數(shù)字):number => {
    返回重新值(Value,F(xiàn)rommin,F(xiàn)rommax,Tomin,Tomax);
  };
};

const remapdatasetValuetosvgdimension = valueremapper(
  0,
  DataseThighestValue,
  0,
  svgdimension
);

我們可以這樣使用:

 RemapdatasetValuetosvgdimension(1231); // 32
RemapdatasetValuetosvgdimension(6321); // 167
RemapdatasetValuetosvgdimension(12123); // 320

創(chuàng)建和插入DOM元素

剩下的與DOM操縱有關(guān)。我們必須創(chuàng)建和五個(gè)元素,設(shè)置其屬性,然後將它們附加到DOM。我們可以使用基本的createlementn,setAttribute和附錄函數(shù)來(lái)完成所有這些。

請(qǐng)注意,我們使用的是CreateElementn,而不是更常見(jiàn)的Createlement。這是因?yàn)槲覀冋谑褂肧VG。 HTML和SVG元素具有不同的規(guī)格,因此它們屬於不同的名稱(chēng)空間URI。碰巧的是,CreateElement便利地使用HTML名稱(chēng)空間!因此,要?jiǎng)?chuàng)建一個(gè)SVG,我們必須是這個(gè)冗長(zhǎng):

 document.createelementns('http://www.w3.org/2000/svg','svg')as svgsvgelement;

當(dāng)然,我們可以創(chuàng)建另一個(gè)輔助功能:

 const createsvgnSelement =(element:string):svgelement => {
  返回document.createelementns('http://www.w3.org/2000/svg',element);
};

當(dāng)我們將矩形附加到DOM時(shí),我們必須注意它們的命令。否則,我們必須明確指定z索引。第一個(gè)矩形必須是最大的,最後一個(gè)矩形必須是最小的。最好在循環(huán)之前對(duì)數(shù)據(jù)進(jìn)行分類(lèi)。

 const data = rawdataset.sort(
  (a:datasetEntry,b:datasetEntry)=> b.value -a.value
);

data.foreach((D:DATASETENTRY,index:number)=> {
  const rect:svgrectelement = keresvgnSelement('rect')作為svgrectelement;
  const rectdimension:number = remapdatasetValuetosvgdimension(d.Value);

  rect.setAttribute('width',`$ {rectDimension}`);
  rect.setAttribute('height',`$ {rectDimension}`);
  rect.setAttribute('y',`$ {svgdimension -rectDimension}`);

  svg.appendchild(rect);
});

坐標(biāo)係從左上角開(kāi)始;那就是[0,0]在哪裡。我們總是要從左側(cè)繪製矩形??刂扑轿恢玫腦屬性默認(rèn)為0,因此我們不必設(shè)置它。 Y屬性控制垂直位置。

為了給人以視覺(jué)印象:所有矩形都源於觸摸其左下角的同一點(diǎn),我們必須將矩形向下推下。多少錢(qián)?矩形不填充的確切量。該值是圖表的維度和特定矩形之間的差異。如果我們將所有位放在一起,我們最終都會(huì)得到這樣做:

我們已經(jīng)使用CSS添加了該動(dòng)畫(huà)的代碼。

切割矩形

我們必須將矩形變成不規(guī)則的形狀,看起來(lái)像是第七名,或者字母L旋轉(zhuǎn)180度。

如果我們專(zhuān)注於“丟失的零件”,那麼我們可以看到它們切入了我們已經(jīng)與之合作的相同矩形。

我們想隱藏那些切口。這就是我們最終要獲得想要的L形狀的方式。

掩蓋101

掩模是您定義的東西,然後應(yīng)用於元素。通常,掩碼在其屬於的元素中夾住。而且,通常,它應(yīng)該具有唯一的ID,因?yàn)槲覀儽仨殞⑵湟貌拍軐⒀诖a應(yīng)用於元素。

 <svg>
  <mask>
    
  </mask>
</svg>

標(biāo)籤中,我們將形狀作為實(shí)際面具。我們還將蒙版屬性應(yīng)用於元素。

 <svg>
  <mask>
    
  </mask>
  <rect mask="“" url> </rect>
</svg>

這不是定義或塗上口罩的唯一方法,但這是該演示的最直接方法。讓我們?cè)诰帉?xiě)任何代碼以生成口罩之前進(jìn)行一些實(shí)驗(yàn)。

我們說(shuō),我們想覆蓋與現(xiàn)有矩形大小相匹配的切口區(qū)域。如果我們採(cǎi)用最大的元素,並且將先前的矩形應(yīng)用於掩模,我們最終以此代碼:

 <svg viewbox="“" width="“" height="“">
  <mask>
    <rect width="“" height="“" y="“" fill="“”"> </rect>
  </mask>
  <rect width="“" height="“" y="“" fill="“#264653”" mask="“" url> </rect>
</svg>

蒙版內(nèi)的元素需要一個(gè)填充值。那應(yīng)該是什麼?我們會(huì)根據(jù)選擇的填充值(顏色)看到完全不同的結(jié)果。

白色填充

如果我們?yōu)樘畛涫褂冒咨?,那麼我們就會(huì)得到:

現(xiàn)在,我們的大矩形與掩蔽矩形相同。不完全是我們想要的。

黑色填充

如果我們使用黑色值,則看起來(lái)像這樣:

我們什麼都沒(méi)有。那是因?yàn)槌錆M(mǎn)黑色的東西變得不可見(jiàn)。我們使用白色和黑色填充物控制面具的可見(jiàn)性。虛線(xiàn)作為視覺(jué)輔助,以引用無(wú)形區(qū)域的尺寸。

灰色填充

現(xiàn)在,讓我們使用白色和黑色之間的東西,說(shuō)格雷:

它既不是完全不透明的也不是堅(jiān)固的;這是透明的。因此,現(xiàn)在我們知道我們可以使用與白色和黑色值不同的東西來(lái)控制這裡的“可見(jiàn)度”,這是一個(gè)很好的技巧,可以保留在我們的後口袋中。

最後一點(diǎn)

到目前為止,這是我們涵蓋和了解的有關(guān)面具的知識(shí):

  • 內(nèi)部的元素控制蒙版區(qū)域的尺寸。
  • 我們可以使蒙版區(qū)域的內(nèi)容可見(jiàn),看不見(jiàn)或透明。

我們只為掩模使用了一種形狀,但是與任何通用HTML標(biāo)籤一樣,我們可以根據(jù)需要在其中嵌套盡可能多的子元素。實(shí)際上,實(shí)現(xiàn)我們想要的目標(biāo)的訣竅是使用兩個(gè)SVG 元素。我們必須將它們堆放在另一個(gè)上方:

 <svg viewbox="“" width="“" height="“">
  <mask>
    <rect width="“" height="“" y="“" fill="“"> </rect>
    <rect width="“" height="“" y="“" fill="“"> </rect>
  </mask>
  <rect width="“" height="“" y="“" fill="“#264653”" mask="“" url> </rect>
</svg>

我們的掩蔽矩形之一充滿(mǎn)了白色。另一個(gè)充滿(mǎn)黑色。即使我們知道規(guī)則,也要嘗試一下可能性。

 <mask>
  <rect width="“" height="“" y="“" fill="“" black> </rect>
  <rect width="“" height="“" y="“" fill="“" white> </rect>
</mask>

是最大元素的維度,最大元素充滿(mǎn)了黑色。這意味著該區(qū)域下的一切都是看不見(jiàn)的。較小的矩形下的一切都是可見(jiàn)的。

現(xiàn)在讓我們對(duì)黑色矩形頂部的東西進(jìn)行翻轉(zhuǎn):

 <mask>
  <rect width="“" height="“" y="“" fill="“" white> </rect>
  <rect width="“" height="“" y="“" fill="“" black> </rect>
</mask>

這就是我們想要的!

最大的白色矩形下的所有內(nèi)容都是可見(jiàn)的,但是較小的黑色矩形在其頂部(在Z軸上更靠近我們),掩蓋了這一部分。

生成口罩

現(xiàn)在我們知道了我們必須做什麼,我們可以相對(duì)輕鬆地創(chuàng)建口罩。這類(lèi)似於我們首先生成彩色矩形的方式 - 我們創(chuàng)建了一個(gè)輔助環(huán),在其中創(chuàng)建掩碼和兩個(gè)矩形。

這次,我們沒(méi)有將矩形直接附加到SVG上,而是將其附加到蒙版:

 data.foreach((D:DATASETENTRY,index:number)=> {
  constmask:svgMaskElement = svgmaskelement; createSvgnSelement('mask');

  const rectdimension:number = remapdatasetValuetosvgdimension(d.Value);
  const rect:svgrectelement = keresvgnSelement('rect')作為svgrectelement;

  rect.setAttribute('width',`$ {rectDimension}`);
  // ...設(shè)置其餘屬性...

  mask.setAttribute('id',`maskw $ {rectDimension.tofixed()}`);

  mask.appendchild(rect);

  // ...創(chuàng)建和設(shè)置較小矩形的屬性...

  svg.appendchild(蒙版);
});

data.foreach((D:DATASETENTRY,index:number)=> {
    // ...我們的代碼生成彩色矩形...
});

我們可以將索引用作面具的ID,但這似乎是一個(gè)更可讀的選擇,至少對(duì)我而言:

 mask.setAttribute('id',`maskw $ {rectDimension.tofixed()}`); // MaskW320,MASW240,...

至於在面罩中添加較小的矩形,我們可以輕鬆訪(fǎng)問(wèn)所需的值,因?yàn)槲覀円郧坝嗁?gòu)了從最高到最低的矩形值。這意味著循環(huán)中的下一個(gè)元素是較小的矩形,我們應(yīng)該引用一個(gè)元素。我們可以通過(guò)其索引來(lái)做到這一點(diǎn)。

 // ...上一部分我們創(chuàng)建了蒙版和矩形...

const smalleRectIndex =索引1;

//當(dāng)我們處?kù)蹲钚r(shí),沒(méi)有下一個(gè)
if(data [smalleRectIndex]!== undefined){
  const smalleRectDimension:number = remapdatasetValuetosvgdimension(
    數(shù)據(jù)[SmalleRectIndex]
  );
  const smallErcret:svgrectelement = createSvgnSelement(
    'rect'
  )作為svgrectement;

  // ...設(shè)置矩形屬性...

  mask.AppendChild(SmallerRect);
}

svg.appendchild(蒙版);

剩下的就是將蒙版屬性添加到我們?cè)佳h(huán)中的彩色矩形中。它應(yīng)該匹配我們選擇的格式:

 rect.setAttribute('mask',`url(#baskw $ {rectdimension.tofixed()})`); // maskW320,maskW240,...

最終結(jié)果

我們完成了!我們已經(jīng)成功製作了一個(gè)由嵌套正方形製成的圖表。它甚至在鼠標(biāo)懸停上分開(kāi)。而所需的只是使用元素來(lái)繪製每個(gè)正方形的切口區(qū)域的SVG。

以上是如何使用口罩創(chuàng)建嵌套正方形的動(dòng)畫(huà)圖表的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)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

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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)話(huà)題

什麼是'渲染障礙CSS”? 什麼是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁(yè)面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢(xún)樣式。 1.提取關(guān)鍵CSS並內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過(guò)JavaScript;3.使用media屬性?xún)?yōu)化加載如打印樣式;4.壓縮合併CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

外部與內(nèi)部CSS:最好的方法是什麼? 外部與內(nèi)部CSS:最好的方法是什麼? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。 1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

什麼是AutoPrefixer,它如何工作? 什麼是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器範(fàn)圍自動(dòng)為CSS屬性添加廠(chǎng)商前綴的工具。 1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問(wèn)題;2.通過(guò)PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什麼是CSS計(jì)數(shù)器? 什麼是CSS計(jì)數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時(shí)重要(何時(shí)不)? CSS:何時(shí)重要(何時(shí)不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫(xiě),而值、命名顏色、URL和自定義屬性則區(qū)分大小寫(xiě)。 1.選擇器和屬性名不區(qū)分大小寫(xiě),例如background-color和Background-Color相同。 2.值中的十六進(jìn)制顏色不區(qū)分大小寫(xiě),但命名顏色區(qū)分大小寫(xiě),如red有效而Red無(wú)效。 3.URL區(qū)分大小寫(xiě),可能導(dǎo)致文件加載問(wèn)題。 4.自定義屬性(變量)區(qū)分大小寫(xiě),使用時(shí)需注意大小寫(xiě)一致。

CSS中的情況敏感性:選擇器,屬性和值所解釋的 CSS中的情況敏感性:選擇器,屬性和值所解釋的 Jun 19, 2025 am 12:38 AM

cssselectorsand and propertynamesarecase-insimentimentiment.1)selectorSlike like'div'div'div'div'and'and'and'And'Andiv'areequivalent.2)propertioessuchas'backusuchas'backusuchas'backusuchas'backusuchas'backer'back-and'background and backorgook crolor'backorground-artreateateDthesementhesame.3)

See all articles