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

目錄
SVG和CSS打造逼真云朵效果
從基礎(chǔ)開始
瞧!
實驗feDisplacementMapscale屬性
修改box-shadowblur
使用圖層表達(dá)深度
使用numOctaves添加細(xì)節(jié)
結(jié)果如下
使用seed屬性實現(xiàn)無限變化
天馬行空
成就解鎖!涅菲勒云朵生成器
首頁 web前端 css教程 用SVG和CSS繪制逼真的云

用SVG和CSS繪制逼真的云

Apr 20, 2025 am 10:44 AM

SVG和CSS打造逼真云朵效果

Drawing Realistic Clouds with SVG and CSS

希臘神話中,宙斯創(chuàng)造了云仙女涅菲勒。和其它希臘神話一樣,這個故事相當(dāng)離奇。這里是一個簡短且合適的版本:

傳說中,涅菲勒是宙斯以自己美麗妻子的形象創(chuàng)造的。一位凡人邂逅涅菲勒,愛上了她,他們一起……最終,不可思議的是,這朵云誕下了半人半馬的半人馬嬰兒。

很奇怪,對吧?我個人也無法理解。幸運(yùn)的是,在瀏覽器中創(chuàng)建云朵的過程要簡單得多,也正經(jīng)得多。

最近,我發(fā)現(xiàn)開發(fā)者Yuan Chuan實現(xiàn)了代碼生成的、逼真的云朵效果。對我來說,這種在瀏覽器中實現(xiàn)的效果曾經(jīng)是神話故事。

只需瀏覽一下這個示例代碼,我們就能想象到,通過使用帶有<filter></filter>元素(包含兩個SVG濾鏡)的CSS box-shadow,可以實現(xiàn)令人信服的單個云朵效果。

我們想要的逼真效果是通過feTurbulencefeDisplacementMap的巧妙結(jié)合實現(xiàn)的。這些SVG濾鏡功能強(qiáng)大、復(fù)雜且提供了非常令人興奮的功能(包括一個奧斯卡獲獎算法!)。然而,其底層復(fù)雜性可能會讓人望而生畏。

雖然SVG濾鏡的物理原理超出了本文的范圍,但在MDN和w3.org上提供了大量的文檔。關(guān)于feTurbulencefeDisplacementMap的非常有益的頁面是免費提供的(并且作為這本精彩書籍的一個章節(jié))。

在本文中,我們將專注于學(xué)習(xí)如何使用這些SVG濾鏡來獲得驚人的效果。我們不需要深入了解幕后算法的運(yùn)作方式,就像藝術(shù)家不需要了解顏料的分子結(jié)構(gòu)就能渲染出令人驚嘆的風(fēng)景一樣。

相反,讓我們密切關(guān)注幾個對在瀏覽器中繪制令人信服的云朵至關(guān)重要的SVG屬性。使用這些屬性,我們可以將這些強(qiáng)大的濾鏡運(yùn)用自如,并學(xué)習(xí)如何在自己的項目中精確地自定義它們。

從基礎(chǔ)開始

CSS box-shadow屬性有五個值得關(guān)注的值:

<code>box-shadow: <offsetx><offsety><blurradius><spreadradius><color>;</color></spreadradius></blurradius></offsety></offsetx></code>

讓我們將這些值調(diào)高(可能高于任何理智的開發(fā)者會使用的值),這樣陰影本身就會成為舞臺上的一個角色。

<code>#cloud-square {
  background: turquoise;
  box-shadow: 200px 200px 50px 0px #000;
  width: 180px;
  height: 180px;
}

#cloud-circle {
  background: coral;
  border-radius: 50%;
  box-shadow: 200px 200px 50px 0px #000;
  width: 180px;
  height: 180px;
}</code>

你玩過或者見過影子戲嗎?

就像用手改變形狀來改變陰影一樣,我們HTML中的“源形狀”可以移動和變形來移動和改變在瀏覽器中渲染的陰影的形狀。box-shadow復(fù)制了原始大小和border-radius上的“變形”功能。SVG濾鏡同時應(yīng)用于元素及其陰影。

<code><svg height="0" width="0"><filter><feturbulence basefrequency=".01" numoctaves="10" type="fractalNoise"></feturbulence><fedisplacementmap in="SourceGraphic" scale="10"></fedisplacementmap></filter></svg></code>

這是我們目前SVG的標(biāo)記。它不會渲染,因為我們還沒有定義任何視覺效果(更不用說零寬度和高度了)。它的唯一目的是保存一個濾鏡,我們將這個濾鏡提供給我們的SourceGraphic(也就是我們的<div>)。我們的源<code><div>及其陰影都由濾鏡獨立扭曲。我們將添加必要的CSS規(guī)則,使用其ID將HTML元素(<code>#cloud-circle)鏈接到SVG濾鏡:

<code>#cloud-circle {
  filter: url(#filter);
  box-shadow: 200px 200px 50px 0px #fff;
}</code>

瞧!

好吧,承認(rèn)吧,添加SVG濾鏡相當(dāng)不起眼。

別擔(dān)心!我們只是觸及了表面,還有很多好東西要看。

實驗feDisplacementMapscale屬性

對這個屬性進(jìn)行一些非科學(xué)的實驗可以產(chǎn)生戲劇性的效果。目前,讓我們保持feTurbulence中的所有值不變,只需調(diào)整DisplacementMapscale屬性。

隨著scale值的增加(以30為增量),我們的源<div>會發(fā)生扭曲,并投射出陰影來反映云朵在天空中的隨機(jī)形態(tài)。 <pre class="brush:php;toolbar:false">&lt;code&gt;&lt;fedisplacementmap in=&quot;SourceGraphic&quot; scale=&quot;180&quot;&gt;&lt;/fedisplacementmap&gt;&lt;/code&gt;</pre> <p>好了,我們有所進(jìn)展!讓我們稍微改變一下顏色,以產(chǎn)生更令人信服的云朵效果,并增強(qiáng)效果。</p> <pre class="brush:php;toolbar:false">&lt;code&gt;body { background: linear-gradient(165deg, #527785 0%, #7FB4C7 100%); } #cloud-circle { width: 180px; height: 180px; background: #000; border-radius: 50%; filter: url(#filter); box-shadow: 200px 200px 50px 0px #fff; }&lt;/code&gt;</pre> <p>現(xiàn)在我們更接近逼真的云朵效果了!</p> <h3 id="修改-code-box-shadow-code-的-code-blur-code-值">修改<code>box-shadowblur

下面的圖像系列顯示了blur值對box-shadow的影響。在這里,blur值以10像素為增量增加。

為了使我們的云朵具有一些積云般的效果,我們可以稍微加寬我們的源<div>。 <pre class="brush:php;toolbar:false">&lt;code&gt;#cloud-circle { width: 500px; height: 275px; background: #000; border-radius: 50%; filter: url(#filter); box-shadow: 200px 200px 60px 0px #fff; }&lt;/code&gt;</pre> <p>等等!我們加寬了源元素,現(xiàn)在它擋住了我們稱之為云朵的白色陰影。讓我們將陰影“重新投射”到更遠(yuǎn)的距離,這樣我們的云朵就不會被源圖像遮擋。(可以想象一下,將你的手從墻上移開,這樣就不會擋住影子戲的視線。)</p> <p>這可以通過一些CSS定位輕松實現(xiàn)。<code><div>是云朵的父元素,默認(rèn)情況下是靜態(tài)定位的。讓我們用一些絕對定位將我們的源<code><div>“塞”起來并移出文檔流。最初,這也會重新定位我們的陰影,因此我們還需要增加陰影與元素的距離,并稍微調(diào)整元素的位置。 <pre class="brush:php;toolbar:false">&lt;code&gt;#cloud-circle { width: 500px; height: 275px; background: #000; border-radius: 50%; filter: url(#filter); box-shadow: 400px 400px 60px 0px #fff; /* 增加陰影偏移量 */ position: absolute; /* 將父元素移出文檔流 */ top: -320px; /* 向下移動 */ left: -320px; /* 向右移動 */ }&lt;/code&gt;</pre> <p>是的!我們已經(jīng)得到了一個相當(dāng)令人信服的云朵。</p> <p>渲染到瀏覽器中的圖像對云朵的描繪相當(dāng)不錯——但是,我不確定……這朵云真的能體現(xiàn)云仙女涅菲勒嗎?我相信我們可以做得更好!</p> <h3 id="使用圖層表達(dá)深度">使用圖層表達(dá)深度</h3> <p>這就是我們想要的:</p> <p>從這張照片中云朵的深度、紋理和豐富性來看,有一點很清楚:宙斯上過美術(shù)學(xué)校。至少,他一定讀過《設(shè)計的普遍原則》,其中闡述了一個強(qiáng)大而看似普通的概念:</p> <blockquote> <p>[…] 照明偏差在深度和自然感的解釋中起著重要作用,并且可以通過設(shè)計師以各種方式進(jìn)行操作……使用光暗區(qū)域之間的對比度來改變深度的外觀。</p> </blockquote> <p>這段話為我們提供了一個線索,說明我們?nèi)绾尾拍艽蟠蟾倪M(jìn)我們自己生成的云朵代碼。我們可以通過將不同形狀、大小和顏色的圖層堆疊在一起,來渲染出與參考圖像中的云朵高度相似的云朵。這只需要根據(jù)需要多次調(diào)用我們的濾鏡即可。</p> <pre class="brush:php;toolbar:false">&lt;code&gt;&lt;svg height=&quot;0&quot; width=&quot;0&quot;&gt;&lt;filter&gt;&lt;feturbulence basefrequency=&quot;0.012&quot; numoctaves=&quot;4&quot; type=&quot;fractalNoise&quot;&gt;&lt;/feturbulence&gt;&lt;fedisplacementmap in=&quot;SourceGraphic&quot; scale=&quot;170&quot;&gt;&lt;/fedisplacementmap&gt;&lt;/filter&gt;&lt;filter&gt;&lt;feturbulence basefrequency=&quot;0.012&quot; numoctaves=&quot;2&quot; type=&quot;fractalNoise&quot;&gt;&lt;/feturbulence&gt;&lt;fedisplacementmap in=&quot;SourceGraphic&quot; scale=&quot;150&quot;&gt;&lt;/fedisplacementmap&gt;&lt;/filter&gt;&lt;filter&gt;&lt;feturbulence basefrequency=&quot;0.012&quot; numoctaves=&quot;2&quot; type=&quot;fractalNoise&quot;&gt;&lt;/feturbulence&gt;&lt;fedisplacementmap in=&quot;SourceGraphic&quot; scale=&quot;100&quot;&gt;&lt;/fedisplacementmap&gt;&lt;/filter&gt;&lt;/svg&gt;&lt;/code&gt;</pre> <p>應(yīng)用我們的圖層將使我們有機(jī)會探索<code>feTurbulence并實現(xiàn)其多功能性。我們將選擇可用的更平滑的類型:fractalNoise,并將numOctaves調(diào)高到6。

<code><feturbulence basefrequency="n" numoctaves="6" type="fractalNoise"></feturbulence></code>

這意味著什么?現(xiàn)在,讓我們重點關(guān)注baseFrequency屬性。以下是我們增加n的值時得到的結(jié)果:

諸如湍流、噪聲、頻率倍頻程之類的詞語可能顯得奇怪甚至令人困惑。但是別擔(dān)心!將這個濾鏡的效果比作聲波實際上是完全準(zhǔn)確的。我們可以將低頻(baseFrequency=0.001)與低沉的噪聲聯(lián)系起來,并將高頻(baseFrequency=0.1)與更高、更清晰的音調(diào)聯(lián)系起來。

我們可以看到,對于積云般的效果,baseFrequency的值可能舒適地位于~0.005和~0.01范圍內(nèi)。

使用numOctaves添加細(xì)節(jié)

遞增numOctaves允許我們以極其精細(xì)的細(xì)節(jié)來渲染圖像。這需要大量的計算,因此請注意:高值會嚴(yán)重影響性能。除非你的瀏覽器戴著頭盔和護(hù)膝,否則盡量避免提高這個值。

好消息是,我們不需要將這個值調(diào)得太高就能產(chǎn)生細(xì)節(jié)和精細(xì)度。如上圖所示,我們可以將numOctaves值設(shè)置為4或5。

結(jié)果如下

使用seed屬性實現(xiàn)無限變化

關(guān)于seed屬性有很多內(nèi)容需要說明,因為它暗示了幕后發(fā)生的魔法。但是,就我們的目的而言,seed的效用可以用四個字概括:“不同的值,不同的形狀”。

Perlin噪聲函數(shù)(前面提到過)使用此值作為其隨機(jī)數(shù)生成器的起點。選擇不包含此屬性將默認(rèn)seed為零。但是,如果包含此屬性,無論我們賦予seed什么值,都不需要擔(dān)心性能問題。

上面的GIF代表了seed提供的一些功能。請記住,每一朵云都是一個分層的復(fù)合云。(雖然我已經(jīng)調(diào)整了每個圖層的屬性,但我保持了它們各自的seed值一致。)

在這里,仔細(xì)觀察參考圖像,我已經(jīng)將3個云<div>(不透明度不同)疊加到一個基礎(chǔ)<code><div>上。通過反復(fù)試驗和輸入任意<code>seed值,我最終得到了一個類似于照片中云朵形狀的形狀。

天馬行空

當(dāng)然,認(rèn)為我們繪制到瀏覽器上的<div>會優(yōu)于宙斯的涅菲勒,那將是狂妄自大。然而,我們能夠從CSS和SVG濾鏡中挖掘出越多的奧秘,我們就越有能力創(chuàng)造出視覺上令人驚嘆的東西,并且與雷神最初的創(chuàng)造高度相似。然后,我們可以繼續(xù)進(jìn)行進(jìn)一步的實驗! <p>反射霧氣</p> <p>高層卷云</p> <p>在本文中,我們只是涉足了一個充滿力量和復(fù)雜性的海洋。SVG濾鏡通??雌饋砹钊瞬恢肭译y以接近。</p> <p>然而,就像A Single Div項目中的示例或Diana Smith的繪畫技巧一樣,一種輕松愉快的實驗方法總是會帶來驚人的結(jié)果!</p> <h4 id="成就解鎖-涅菲勒云朵生成器">成就解鎖!涅菲勒云朵生成器</h4> <p>我相信你們很多人很樂意深入了解制作云朵所需的所有技術(shù)細(xì)節(jié),但可能更喜歡一些更方便在項目中使用云朵的方法。我開發(fā)了一個小工具來幫助生成云朵并實驗形狀和變化。</p> <p>生成云朵!</p> <p>有任何問題、建議或意見?請在Twitter上聯(lián)系我,或在此帖中發(fā)表評論。</p> <p><small>非常感謝Amelia Bellamy-Royds對本文提出的寶貴建議。</small></p> </div>

以上是用SVG和CSS繪制逼真的云的詳細(xì)內(nèi)容。更多信息請關(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)容,請聯(lián)系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

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

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動畫 CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動畫 Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過HTML和CSS實現(xiàn)簡單動畫;2.使用多個點的自定義旋轉(zhuǎn)器,通過不同延遲時間實現(xiàn)跳動效果;3.在按鈕中添加旋轉(zhuǎn)器,通過JavaScript切換類來顯示加載狀態(tài)。每種方法都強(qiáng)調(diào)了設(shè)計細(xì)節(jié)如顏色、大小、可訪問性和性能優(yōu)化的重要性,以提升用戶體驗。

解決CSS瀏覽器兼容性問題和前綴 解決CSS瀏覽器兼容性問題和前綴 Jul 07, 2025 am 01:44 AM

處理CSS瀏覽器兼容性和前綴問題需理解瀏覽器支持差異并合理使用廠商前綴。1.了解常見問題如Flexbox、Grid支持不一,position:sticky失效,動畫表現(xiàn)不同;2.查閱CanIuse確認(rèn)特性支持情況;3.正確使用-webkit-、-moz-、-ms-、-o-等廠商前綴;4.推薦使用Autoprefixer自動添加前綴;5.安裝PostCSS并配置browserslist指定目標(biāo)瀏覽器;6.構(gòu)建時自動處理兼容性;7.老項目可用Modernizr檢測特性;8.不必追求所有瀏覽器一致,確

顯示:內(nèi)聯(lián),顯示:塊和顯示:內(nèi)聯(lián)塊之間有什么區(qū)別? 顯示:內(nèi)聯(lián),顯示:塊和顯示:內(nèi)聯(lián)塊之間有什么區(qū)別? Jul 11, 2025 am 03:25 AM

Themaindifferencesbetweendisplay:inline,block,andinline-blockinHTML/CSSarelayoutbehavior,spaceusage,andstylingcontrol.1.Inlineelementsflowwithtext,don’tstartonnewlines,ignorewidth/height,andonlyapplyhorizo??ntalpadding/margins—idealforinlinetextstyling

使用CSS剪輯路徑創(chuàng)建自定義形狀 使用CSS剪輯路徑創(chuàng)建自定義形狀 Jul 09, 2025 am 01:29 AM

使用CSS的clip-path屬性可以裁剪元素為自定義形狀,如三角形、圓形缺口、多邊形等,無需依賴圖片或SVG。其優(yōu)勢包括:1.支持circle、ellipse、polygon等多種基本形狀;2.可響應(yīng)式調(diào)整,適配移動端;3.易于動畫化,可結(jié)合hover或JavaScript實現(xiàn)動態(tài)效果;4.不影響布局流,僅裁剪顯示區(qū)域。常見用法如圓形裁剪clip-path:circle(50pxatcenter)和三角形裁剪clip-path:polygon(50%0%,1000%,00%)。注意

造型與CSS不同訪問的鏈接 造型與CSS不同訪問的鏈接 Jul 11, 2025 am 03:26 AM

設(shè)置訪問過鏈接的樣式能提升用戶體驗,尤其在內(nèi)容密集型網(wǎng)站中幫助用戶更好導(dǎo)航。1.使用CSS的:visited偽類可定義已訪問鏈接樣式,如顏色變化;2.注意瀏覽器出于隱私限制僅允許修改部分屬性;3.顏色選擇應(yīng)與整體風(fēng)格協(xié)調(diào),避免突兀;4.移動端可能不顯示該效果,建議結(jié)合其他視覺提示如icon輔助標(biāo)識。

CSS繪畫API是什么? CSS繪畫API是什么? Jul 04, 2025 am 02:16 AM

thecsspaintingapienablesdemimageGenerationinCsssingJavascript.1.developersCreateApaintWorkletClassWithaPaint()method.2.theyregisteritviaregisterpaint()。3.thecustompAntFunctionSthenusitySthenusedisthenusedisthenusedIncerspropertieslikeBacknockforg-image-image.thisallows.thisallowsforderforderynamecvis

如何使用CSS創(chuàng)建響應(yīng)式圖像? 如何使用CSS創(chuàng)建響應(yīng)式圖像? Jul 15, 2025 am 01:10 AM

要使用CSS創(chuàng)建響應(yīng)式圖片,主要可通過以下方法實現(xiàn):1.使用max-width:100%和height:auto讓圖片在保持比例的同時自適應(yīng)容器寬度;2.結(jié)合HTML的srcset和sizes屬性智能加載適配不同屏幕的圖片源;3.利用object-fit和object-position控制圖片裁剪與焦點展示。這些方法共同確保圖片在不同設(shè)備上清晰、美觀地呈現(xiàn)。

什么是常見的CSS瀏覽器不一致? 什么是常見的CSS瀏覽器不一致? Jul 26, 2025 am 07:04 AM

不同瀏覽器對CSS解析存在差異,導(dǎo)致顯示效果不一致,主要包括默認(rèn)樣式差異、盒模型計算方式、Flexbox和Grid布局支持程度及某些CSS屬性行為不一致。1.默認(rèn)樣式處理不一致,解決方法是使用CSSReset或Normalize.css統(tǒng)一初始樣式;2.舊版IE的盒模型計算方式不同,建議統(tǒng)一使用box-sizing:border-box;3.Flexbox和Grid在邊緣情況或舊版本中表現(xiàn)有差異,應(yīng)多測試并使用Autoprefixer;4.某些CSS屬性行為不一致,需查閱CanIuse并提供降級

See all articles