翻譯:瘋狂的技術宅
原文: https://www.creativebloq.com/...
本文首發微信公衆號:jingchengyideng
歡迎關注,天天都給你推送新鮮的前端技術文章css
自21世紀初以來,SVG就存在了,但仍有一些有趣的方法去用它。在本教程中,重點將放在 SVG 的濾鏡上 —— 但不僅是將它們應用於 SVG 圖像,我將向你展現如何將它們應用於任何常規頁面的內容上。html
實際上咱們是經過告訴 CSS 濾鏡所擁有的 ID,而後再把濾鏡應用於 SVG 的方式來實現。使用一樣的方法,濾鏡也能夠用於常規文本。關於這一點的好處在於,你能夠輕鬆的爲文本添加一些出彩的特效,之前只能經過使用 Photoshop 濾鏡並保存爲圖像來實現。使用SVG濾鏡,文本仍然是可訪問並可選的,由於它只是頁面上的常規文本元素。前端
這裏的代碼將爲文本建立一個置換貼圖,這個貼圖還包含一個 alpha 貼圖,使其看起來像水同樣,並符合咱們頁面的主題。而後建立另外一個濾鏡,使菜單顯示爲水斑點,它們會稍微粘在一塊兒,但會隨着它們向遠處移動而分開。這也是爲了和特定頁面的主題保持一致,並展現了將 SVG 濾鏡用於其餘內容的兩種創造性方法。程序員
首先,你須要從上面的連接下載項目文件。以後將項目文件夾 start 拖到代碼 IDE 上,而後打開 index.html 頁面。你將會看到一些已經寫好的頁面內容。接下來建立標題部分,這裏將包含受 SVG 濾鏡影響的標題。在 body 標籤內添加代碼。面試
<div class="bg"> <div class="middle"> <h2 class="headline">Underwater Adventure Park</h2> <div class="intro_block">
如今標題已完成,全部文本都已就緒。若是你此刻在瀏覽器中查看頁面,將看到一個帶有一些文本的圖像。當前標題仍然是沒有樣式的,接下來爲它設置樣式並應用 SVG 濾鏡。segmentfault
<h3 class="subhead">Experience the Ocean <br>Like Never Before</h3> <p class="intro">Underwater Adventure Park is an experience unlinke anything you have ever had. Travel to the depths of the Ocean and walk among the Sea Life!</p> </div> </div> </div>
SVG 代碼能夠添加到頁面的任何位置,可是由於它不會被用戶直接看到,因此最好將它放在閉合 body 標籤以前的最底部。 SVG 濾鏡產生一些波紋效果。請注意,濾鏡具備 ID —— 這使 CSS 可以把它應用到頁面上的另外一個元素。瀏覽器
<svg xmlns="http://www.w3.org/2000/svg"> <filter id="displacementFilter"> <feTurbulence type="turbulence" baseFrequency="0.004" numOctaves= "2" result="turbulence" /> </filter> </svg>
如今轉到 page.css 文件,咱們的新 CSS 會添加到全部其它CSS代碼的頂部。這裏的 SVG 被設置爲根本不顯示在頁面上。爲 h2 標記設置相對應的字體的字體。微信
svg { display: none; } h2 { font-size: 5.5vw; font-family: 'Crete Round', serif; }
把 line-height 設置爲零,由於稍後標題將被加上動畫效果,因此控制頁面上的縮放很重要。它設定了 padding 值,使其周圍可以有適量的空間,顏色也會改變。ide
.headline { line-height: 0; display: inline-block; padding: 70px; color: #ccffff;
SVG 將用於替換標題文本svg
在完成 headline 類後,下一行將 SVG 中的 displacementFilter ID應用於文本。 translate3d 確保用硬件加速去處理文本。把 scale 稍微改變一點,以確保當發生位移時看起來是正確的。
filter: url(#displacementFilter); transform: translate3d(0, 0, 0); transform: scaleY(1.8) rotateY(-2deg); }
如今文本被替換了
若是在此階段測試濾鏡,則波紋效果會徹底取代文本。這很容易解決。回到 index.html 頁面中的濾鏡代碼。這樣將應用波紋和源圖形(即文本),並將其應用爲位移濾鏡。嘗試改變波紋的頻率和振幅。
<feDisplacementMap in2="turbulence" in=" SourceGraphic" scale="30" xChannelSelector="R" yChannelSelector="G" result="disp" />
使用高斯模糊來柔化文本
水邊效果的邊緣看起來有點扎眼。這能夠用高斯模糊來解決。在置換貼圖後面添加代碼。當你刷新頁面時,它確實模糊了文本,但位移也消失了。一樣這些問題能夠在實現效果的過程當中被修復。
<feGaussianBlur in="SourceGraphic" stdDeviation="15" result="blr" />
把模糊和位移進行組合,能夠得到更使人愉悅的效果
在以前的高斯模糊下面添加複合線。你將看到會把模糊和位移效果結合在一塊兒,而且還爲文本建立了水潤的半透明效果。它的邊緣已經在某種程度上變得柔和了,可是這還不夠。若是能把最初的模糊效果加入到這裏效果會很好。
<feComposite in="blr" in2="disp" operator="in" result="comp" />
經過合併操做,它看起來會更好
合併操做使前面的效果與模糊效果合併。如今看上去與背景圖像很搭,就好像光線穿過了水面同樣。對於文原本說它仍然是可選擇的,而且是頁面的一部分,這點和在 Photoshop 中做出的效果徹底不同。
<feMerge result="final"> <feMergeNode in="blr" /> <feMergeNode in="comp" /> </feMerge>
回到 page.css 文件並添加關鍵幀,以下所示。這將會把字體大小從零垂直寬度擴展到 5.5 垂直寬度。把它應用於標題後,文本會在屏幕上放大並被放置到位。隨着文本的移動,位移也會隨着長度的變化而變化,產生水紋效果。
@keyframes scaler { from { font-size: 0vw; } to { font-size: 5.5vw; } }
替換 h2 以引入一些動畫
以前在步驟 4 中添加了 h2 樣式。使用下面這段新代碼替換舊代碼,這段代碼將爲標題添加四秒的 CSS 動畫。動畫中止會停留在最後一個關鍵幀上。保存文件並在瀏覽器中測試,檢查文本是否到位。
h2 { line-height: 0; font-size: 0vw; animation-name: scaler; animation-duration: 4s; animation-fill-mode: forwards; font-family: 'Crete Round', serif; }
接下來讓咱們用另一個 SVG 濾鏡建立一個水斑動畫。將如下導航內容添加到正文代碼的最頂部,也就是本教程第一步中開始的標題以前。這將在一個圓內建立一個看上去像漢堡🍔的菜單圖標。
<nav class="menu"> <input type="checkbox" href="#" class= "menu-open" name="menu-open" id="menu- open" /> <label class="menu-open-button" for="menu-open"> <span class="hamburger hamburger-1"></span> <span class="hamburger hamburger-2"></span> <span class="hamburger hamburger-3"></span> </label>
如今添加其他的導航元素。咱們使用 Font Awesome 開源圖標庫,該庫已被添加到 head 部分,以便使用該庫的CDN連接。每一個菜單圓形元素都有一個圖標。
<a href="#" class="menu-item"> <i class="fa fa-car"></i> </a> <a href="#" class="menu-item"> <i class="fa fa-ship"></i> </a> <a href="#" class="menu-item"> <i class="fa fa-map"></i> </a> <a href="#" class="menu-item"> <i class="fa fa-suitcase"></i> </a> </nav>
接着爲這個效果添加另外一個濾鏡。在SVG中,在先前添加的濾鏡標記代碼的後面添加如下代碼。這裏的效果用和前面很是類似的方式創建起來。這將使菜單看起來像粘稠的液體同樣分開。
<filter id="shadowed-blob"> <feGaussianBlur in="SourceGraphic" result="blur" stdDeviation="20" /> <feColorMatrix in="blur" mode= "matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7" result="blob" /> <feGaussianBlur in="blob" stdDeviation="3" result="shadow" /> <feColorMatrix in="shadow" mode= "matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -0.2" result="shadow" />
此處添加了濾鏡的剩餘部分,這將完成菜單項上的效果。並添加液體斑點效果。添加完代碼後保存文件,而後切換到 'design.css' 文件。
<feOffset in="shadow" dx="0" dy="2" result="shadow" /> <feComposite in2="shadow" in="blob" result="blob" /> <feComposite in2="blob" in="SourceGraphic" result="mix" /> </filter>
CSS 代碼也能夠添加到其它文件中,可是爲了將全部導航 CSS 放在同一個地方,咱們仍是把下面的代碼寫到 design.css 中。這裏的濾鏡會被用於菜單,這是一個固定的菜單,會始終顯示在屏幕上。
.menu { filter: url(「#shadowed-blob"); position: fixed; padding-top: 20px; padding-left: 80px; width: 650px; height: 150px; box-sizing: border-box; font-size: 20px; text-align: left; }
當菜單打開時,菜單圖標被設置爲不可見。而後建立每一個菜單項的懸停元素,以便當用戶將鼠標懸停在上面時進行更改。當菜單項返回其原始位置時,菜單的每一個子項都會有 0.4 秒的變換時間。
.menu-open { display: none; } .menu-item:hover { background: #47959f; color: #b2f0f8; } .menu-item:nth-child(3), .menu-item:nth- child(4), .menu-item:nth-child(5), .menu- item:nth-child(6) { transition-duration: 400ms; }
更改菜單圖標的 z-index 以將其置於頂部
經過更改其 z-index,菜單圖標高於其餘元素。當用戶將鼠標懸停在菜單上時,菜單會滑出,單擊菜單後其上的三條橫線會變爲 「X」,表示收起菜單。
.menu-open-button { z-index: 2; transition-timing-function: cubic- bezier(0.175, 0.885, 0.32, 1.275); transition-duration: 400ms; transform: scale(1.1, 1.1) translate3d (0, 0, 0); cursor: pointer; } .menu-open-button:hover { transform: scale(1.2, 1.2) translate3d (0, 0, 0); }
第一個菜單項其實是菜單的第三個子項,由於它前面還有一個複選框和漢堡包樣式的圖標。添加這一項可以使第一個菜單元素在用戶單擊菜單後移動到位。每一個菜單元素都會以稍長的時間移出。
.menu-open:checked + .menu-open-button { transition-timing-function: linear; transition-duration: 400ms; transform: scale(0.8, 0.8) translate3d (0, 0, 0); } .menu-open:checked ~ .menu-item { transition-timing-function: cubic- bezier(0.165, 0.84, 0.44, 1); } .menu-open:checked ~ .menu-item:nth-child(3) { transition-duration: 390ms; transform: translate3d(110px, 0, 0); }
以不一樣的速度移動菜單元素以得到更加流暢的效果
剩餘的菜單元素以不一樣的速度移出來。這使得菜單元素可以在動畫的早期階段粘在一塊兒,在這裏用了 SVG 濾鏡提供的斑點液體外觀。添加下列代碼後保存文件並在瀏覽器中查看完成的結果。
.menu-open:checked ~ .menu-item:nth-child(4) { transition-duration: 490ms; transform: translate3d(220px, 0, 0); } .menu-open:checked ~ .menu-item:nth-child(5) { transition-duration: 590ms; transform: translate3d(330px, 0, 0); } .menu-open:checked ~ .menu-item:nth-child(6) { transition-duration: 690ms; transform: translate3d(440px, 0, 0); }