上一篇文章,我擼出了一片雲。做爲一個程序員,弄出一片以假亂真的雲雖然頗有成就感,可是怎麼證實這朵雲是寫出來的而不是拍照的卻頗有些困難。並且這種技能樹好像點的有些歪,畢竟從天上拍一張也不難,爲啥要手工寫呢?我做爲一個有遠見(推眼鏡)的程序員,天然不是爲了一朵無規則的雲而大費周章,此次,我要讓雲作到書畫(seyi)雙絕,請稱呼我爲雲工程師。css
按照上次作雲的方法,咱們先把div搞出來html
<div class="cloud" id="cloud-back">天邊一片雲</div>
再把兩個css弄出來git
.cloud { font-size:150px; font-style:oblique; font-weight: 900; position: absolute; top: -42vh; left: -31vw; }
#cloud-back { filter: url(#filter-back); text-shadow:420px 240px 10px #fff; }
和上一章的box-shadow不一樣,文字須要用到的是text-shadow,但參數相似程序員
再用svg把雲的樣子弄出來github
<svg width="0" height="0"> <!--Top Layer--> <filter id="filter-back"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="4" seed="0" /> <feDisplacementMap in="SourceGraphic" scale="40" /> </filter> </svg>
這樣單層的雲就出來了。svg
但這種雲沒有層次感,因此方法也是同樣,用三層從白到黑的來覆蓋,形成明暗的光影效果。url
<div class="cloud" id="cloud-back">天邊一片雲</div> <div class="cloud" id="cloud-mid">天邊一片雲</div> <div class="cloud" id="cloud-front">天邊一片雲</div>
.cloud { font-size:150px; font-style:oblique; font-weight: 900; position: absolute; top: -42vh; left: -31vw; } #cloud-back { filter: url(#filter-back); text-shadow:420px 240px 10px #fff; } #cloud-mid { filter: url(#filter-mid); text-shadow:410px 250px 12px rgba(158, 168, 179, 0.3); } #cloud-front { filter: url(#filter-front); text-shadow:410px 250px 14px rgba(0, 0, 0, 0.2); }
其中主要調整text-shadow的color屬性調整文字陰影的顏色(color),作到雲的層次感,而後再調整svgspa
<svg width="0" height="0"> <!--Top Layer--> <filter id="filter-back"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="4" seed="0" /> <feDisplacementMap in="SourceGraphic" scale="40" /> </filter> <filter id="filter-mid"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="2" seed="0"/> <feDisplacementMap in="SourceGraphic" scale="45" /> </filter> <filter id="filter-front"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="2" seed="0"/> <feDisplacementMap in="SourceGraphic" scale="50" /> </filter> </svg>
調整svg的參數和上一章同樣,主要是SourceGraphic的值,文字是有固定形狀的,因此這個值不能太大,不然形狀腐蝕的太厲害,那就看不清楚字了,三層疊加,就成了這個樣子。3d
這樣看起來就比較真實了。code
剛纔那種方法其實和上一章畫雲的方法沒啥區別,只是把box-shadow換成了text-shadow而已,我以爲字都作了,不妨來個雲圖試試。
《雲圖》是由華納兄弟影片公司製做的劇情片,由沃卓斯基姐弟(他們不是兄弟嗎?)與湯姆·提克威聯合執導,是一部到如今都算譭譽參半的科幻電影,我當年是衝着《黑客帝國》導演沃卓斯基兄弟(但爲何她們如今是姐妹,好萊塢真亂)看的,看完後徹底一副不明覺厲的感受,反正就是沒看懂,因此咱們開始畫雲圖(本句上下文沒有任何關聯,只是都叫雲圖)。
我仍然打算按照老套路來,搞個圖片先,我用的是透明底的剪影圖片,這種樣子的
固然,我原圖用的是白顏色的,只是爲了讓你們看到,用了photoshop的截圖,上了黑顏色。html的代碼仍然用box-shadow,一切輕車熟路。
<img src="girl1.png" class="cloud" id="cloud-blur-back" />
.cloud { position: absolute; } #cloud-blur-back { box-shadow:5px 2px 6px #000 }
還沒等我用上svg,就發現效果是這樣子的。
陰影是針對圖片這個方框的,和我想象的有很大出路啊。看來此路不通。難道我只能放棄?
----------------------------一個漫長搜索谷歌的分割線--------------------
終於讓我找了一個更好的辦法,那就是直接用svg,拋棄掉目前全部的shadow樣式。仍然是圖片。
<img src="girl1.png" class="cloud" id="cloud-blur-back" />
#cloud-blur-back { filter: url(#filter-blur-back); }
我使用svg的feGaussianBlur filter
<svg width="0" height="0"> <filter id="filter-blur-back"> <feGaussianBlur in="SourceGraphic" stdDeviation="4" /> </filter> </svg>
feGaussianBlur其實和咱們以前用的feTurbulence和feDisplacementMap師出同門,都是svg的filter,看名字中有blur,就知道是作模糊化的。並且參數也很簡單,就是in和stdDeviation。
咱們看下效果如何:
效果不錯哦。並且不像以前用shadow的方法,還要把原體移除窗口外,只顯示陰影,這個方便多了。我繼續輕車熟路的把feTurbulence加上,想看下雲化的效果。
<svg width="0" height="0"> <filter id="filter-blur-back"> <feGaussianBlur in="SourceGraphic" stdDeviation="4" /> <feTurbulence type="fractalNoise" baseFrequency="0.02" numOctaves="5" seed="0"/> <feDisplacementMap in="SourceGraphic" scale="30" /> </filter> </svg>
毫無效果,場面一度很尷尬
結果只有feGaussianBlur 的模糊化效果,feTurbulence的效果一點都沒有,看來前路有坑啊。
--------------------------一個漫長的各類嘗試的分割線--------------------
終於,我找到了解決辦法,把feGaussianBlur 和feTurbulence分拆成兩個filter,代碼是這樣的。
<svg width="0" height="0"> <filter id="filter-blur-back"> <feGaussianBlur in="SourceGraphic" stdDeviation="4" /> </filter> <filter id="filter-div-back"> <feTurbulence type="fractalNoise" baseFrequency="0.02" numOctaves="5" seed="0"/> <feDisplacementMap in="SourceGraphic" scale="30" /> </filter> </svg>
filter-blur-back和filter-div-back的順序不一樣,效果也會有不一樣:
#cloud-blur-back { filter: url(#filter-blur-back) url(#filter-div-back); }
filter-blur-back在前,filter-div-back在後
#cloud-blur-back { filter: url(#filter-div-back) url(#filter-blur-back) ; }
filter-blur-back在後,filter-div-back在前
上面那種看起來更象雲一些,咱們就用這種啦。我繼續個人雲圖創做,把三層效果加上,完整的代碼是這樣的
<html> <head> <style type="text/css"> body { width: 100vw; height: 100vw; background: linear-gradient(165deg, #527785 0%, #7FB4C7 100%); padding: 1%; } .cloud { position: absolute; } #cloud-blur-back { filter: url(#filter-blur-back) url(#filter-div-back); } #cloud-blur-mid { transform:scale(0.95); filter: brightness(90%) url(#filter-blur-mid) url(#filter-div-back); left: 1vw; top: 1vw; } #cloud-blur-front { transform:scale(0.9); filter: brightness(80%) url(#filter-blur-front) url(#filter-div-back); left: 1vw; top: 1vw; } </style> </head> <body> <img src="girl1.png" class="cloud" id="cloud-blur-back" /> <img src="girl1.png" class="cloud" id="cloud-blur-mid" /> <img src="girl1.png" class="cloud" id="cloud-blur-front" /> <svg width="0" height="0"> <filter id="filter-blur-back"> <feGaussianBlur in="SourceGraphic" stdDeviation="3" /> </filter> <filter id="filter-div-back"> <feTurbulence type="fractalNoise" baseFrequency="0.02" numOctaves="5" seed="0"/> <feDisplacementMap in="SourceGraphic" scale="30" /> </filter> <filter id="filter-blur-mid"> <feGaussianBlur in="SourceGraphic" stdDeviation="4" /> </filter> <filter id="filter-div-mid"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="3" seed="0" /> <feDisplacementMap in="SourceGraphic" scale="25" /> </filter> <filter id="filter-blur-front"> <feGaussianBlur in="SourceGraphic" stdDeviation="5" /> </filter> <filter id="filter-div-front"> <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="2" seed="0" /> <feDisplacementMap in="SourceGraphic" scale="20" /> </filter> </svg> </body> </html>
最後看到的效果以下:
爲了調節層次感,我加上了縮放的調節,transform:scale()。
爲了調節三層的明暗,我加上了filter: brightness()來調節圖片使其變暗。
請你們欣賞下我搞的幾張圖(就這破玩意我能換圖玩一下午)。
這些圖片須要白色透明底的png圖片,我都是從阿里巴巴的矢量圖標庫找的,裏面有不少這種圖,你們能夠本身試試,也能夠去調調參數,會有不一樣的效果。