1. 程式人生 > >天邊一朵雲-徒手用html生成一朵雲,很真的那種

天邊一朵雲-徒手用html生成一朵雲,很真的那種

     《天邊一朵雲》是由蔡明亮執導,李康生、陳湘琪領銜主演的劇情電影,情節很文藝,攝影很露骨,屬於那種你看了後完全沒有擼點的色情片。看完本片後,我很後悔,所以我打算自己用html弄出天邊一片雲(本句上下文沒有任何關聯,只有沒擼點這方面一樣)

        雲的特點就是模糊,琢磨不定,所以我的入手點就是陰影,讓我們開始擼程式碼,上帝說要有個div,就有了一個div

<div id="cloud-circle"></div>

為了div有個伴,就從div的身體裡拆下肋骨,變成了css

	body {
  width: 100vw;
  height: 100vw;
  background: cornsilk;
  padding: 1%;
}

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

其實就是畫了一個圓,然後用box-shadow加了個陰影,box-shadow的引數說明如下:

其中最後一個引數inset沒寫,模糊靠的是blur引數。看到的效果如下:

好像和雲的形象距離比較遠,這時候要svg的filter出場了:

<svg width="0" height="0"> 
  <filter id="filter">
    <feTurbulence type="fractalNoise" baseFrequency=".01" numOctaves="10" />
    <feDisplacementMap in="SourceGraphic" scale="10" />
  </filter>
</svg>

在上面的CSS裡面加上這個filter

#cloud-circle {
    width: 180px;
    height: 180px;
    background: coral;
    border-radius: 50%;
    filter: url(#filter);/*看這裡看這裡*/
    box-shadow: 200px 200px 50px 0px #000;
}

看到的效果是這樣的

在filter的腐蝕下,cloud-circle這個div的面容變的憔悴了,(女同胞們,用手機攝像頭濾鏡是沒有好下場的!)。這裡我們要講下filter。SVG使用<filter>元素來定義濾鏡。它的濾鏡其實有很多,效果各異,具體的內容可以看這裡。我們用的是濾鏡中的feTurbulence,該濾鏡利用Perlin噪聲函式建立了一個影象。它實現了人造紋理比如說雲紋、大理石紋的合成。看到雲紋了沒有,我們要的就是它。具體的引數不說了,大家可以自己去這裡看,我們主要用SourceGraphic這個引數,這個引數值越大,對影象的腐蝕性越強,我看180這個數字挺吉利,就用它試下:

<feDisplacementMap in="SourceGraphic" scale="10" />

效果如下:

這愁雲慘霧的樣子就有些象了,但這個背景顏色不對,我這又不是沙城暴,不能是黃色的啊,調成藍天

  background: linear-gradient(165deg, #527785 0%, #7FB4C7 100%);

看,沙城暴過去了,藍天來了

不過雲彩一般是長條的,我們把那個圓形(如果大家還記得這個貨最開始一個圓的話)拉長,變成一個長橢圓形。

#cloud-circle {
	  /*拉長width和height的比例*/
    width: 500px;
  	height: 275px;
    background: coral;
    border-radius: 50%;
    filter: url(#filter);
    box-shadow: 200px 200px 50px 0px #000;
}

效果就變成這樣啦

這兩貨你儂我儂的,靠的太緊了,桔色這傢伙還壓在別人黑小姐身上,太不純潔了,拆散拆散。

#cloud-circle {
    width: 500px;
  	height: 275px;
    background: coral;
    border-radius: 50%;
    filter: url(#filter);
    box-shadow: 400px 400px 60px 0px #fff; /* 拉大陰影的位移位置,改變陰影的顏色 */
    position: absolute; /* 改成絕對定位 */
    top: -320px; /* 向上移一點 */
    left: -320px; /* 向左移一點 */
}

於是,猴急的橙色男士被移出了視窗,看不見了,黑小姐變成了白小姐了。

我終於成功的拆散了他們,心情很是舒暢,一朵白雲就這麼做出來了。但看她單薄的樣子,一副二次元的模樣,我覺得很不滿意,我不是宅男啊,不喜歡紙片人,我要讓她有立體感,咋辦呢,這時候,要祭出一張原理圖,讓大家知道我也是有理論知識的。

看,一朵有層次的雲其實是真的靠層次來體現的,三層合一就是一朵有白有黑,前凸後翹的立體雲了,我們開始擼程式碼,先來三層雲:

<div class="cloud" id="cloud-back"></div>
<div class="cloud" id="cloud-mid"></div>
<div class="cloud" id="cloud-front"></div>

然後各自擁有自己的filter

<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="170" />
    </filter>
       <filter id="filter-mid">
        <feTurbulence type="fractalNoise"  baseFrequency="0.012" numOctaves="2" 
seed="0"/>
      <feDisplacementMap  in="SourceGraphic" scale="150" />
    </filter>
    <filter id="filter-front">
        <feTurbulence type="fractalNoise" baseFrequency="0.012" numOctaves="2" 
seed="0"/>
      <feDisplacementMap  in="SourceGraphic" scale="100" />
    </filter>
</svg>

裡面主要變化就在SourceGraphic,之前講過,這個引數越大,腐蝕性越強。另外css也要做下修改:

.cloud {
  width: 500px;
  height: 275px;
  border-radius: 50%;
  position: absolute;
  top: -35vh;
  left: -25vw;
}

#cloud-back {
  filter: url(#filter-back);
  box-shadow: 300px 300px 30px -20px #fff;
}

#cloud-mid {
  filter: url(#filter-mid);
  box-shadow: 300px 340px 70px -60px rgba(158, 168, 179, 0.5);
    left: -25vw;
}

#cloud-front {
  filter: url(#filter-front);
  box-shadow: 300px 370px 60px -100px rgba(0, 0, 0, 0.3);
    left: -25vw;
}

主要是針對三層雲的顏色和陰影大小位置做了些調整,最終的結果就出來了。

一朵怎麼看怎麼象真的雲就出現了。程式碼大家可以去這裡看

最後,如果大家看完了《天邊一片雲》這部電影,對西瓜這種水果會有