你所不知道的 CSS 實用濾鏡技巧與細節

本文主要介紹 CSS 濾鏡的不常用用法,希望能給讀者帶來一些干貨!

OK,下面直接進入正文。本文所描述的濾鏡,指的是 CSS3 出來后的濾鏡,不是 IE 系列時代的濾鏡,語法如下,還未接觸過這個屬性的可以先簡單到 MDN — filter 了解下:

{
    filter: blur(5px);
    filter: brightness(0.4);
    filter: contrast(200%);
    filter: drop-shadow(16px 16px 20px blue);
    filter: grayscale(50%);
    filter: hue-rotate(90deg);
    filter: invert(75%);
    filter: opacity(25%);
    filter: saturate(30%);
    filter: sepia(60%);
 
    /* Apply multiple filters */
    filter: contrast(175%) brightness(3%);
 
    /* Global values */
    filter: inherit;
    filter: initial;
    filter: unset;
}

基本用法

先簡單看看幾種濾鏡的效果:


圖片

你可以通過 hover 取消濾鏡,觀察該濾鏡的效果。

簡單來說,CSS 濾鏡就是提供類似 PS 的圖形特效,像模糊,銳化或元素變色等功能。通常被用于調整圖片,背景和邊界的渲染。本文就會圍繞這些濾鏡展開,看看具體能怎么使用或者玩出什么花活。

常用用法

既然是標題是你所不知道的技巧與細節,那么比較常用的一些用法就不再贅述,通常我們見得比較多的 CSS 濾鏡用法有:

使用 filter: blur() 生成毛玻璃效果
使用 filter: drop-shadow() 生成整體陰影效果
使用 filter: opacity() 生成透明度

如果對上面的技巧不是很了解,可以稍稍百度谷歌一下,下文將由淺及深,介紹一些不大常見的濾鏡的具體用法及一些小細節:

contrast/brightness — hover 增亮圖片

通常頁面上的按鈕,都會有 hover/active 的顏色變化,以增強與用戶的交互。但是一些圖片展示,則很少有 hover 的交互,運用 filter: contrast() 或者 filter: brightness() 可以在 hover 圖片的時候,調整圖片的對比圖或者亮度,達到聚焦用戶視野的目的。

brightness表示亮度,contrast 表示對比度。
當然,這個方法同樣適用于按鈕,簡單的 CSS 代碼如下:

.btn:hover,
.img:hover {
    transition: filter .3s;
    filter: brightness(1.1) contrast(110%);
}
圖片

blur — 生成圖像陰影

通常而言,我們生成陰影的方式大多是 box-shadow 、filter: drop-shadow() 、text-shadow 。但是,使用它們生成陰影是陰影只能是單色的。

有讀者同學會問了,你這么說,難道還可以生成漸變色的陰影不成?
額,當然不行。

這個真不行,但是通過巧妙的利用 filter: blur 模糊濾鏡,我們可以假裝生成漸變色或者說是顏色豐富的陰影效果。

假設我們有下述這樣一張頭像圖片:


圖片

下面就利用濾鏡,給它添加一層與原圖顏色相仿的陰影效果,核心 CSS 代碼如下:

.avator {
    position: relative;
    background: url($img) no-repeat center center;
    background-size: 100% 100%;
    
    &::after {
        content: "";
        position: absolute;
        top: 10%;
        width: 100%;
        height: 100%;
        background: inherit;
        background-size: 100% 100%;
        filter: blur(10px) brightness(80%) opacity(.8);
        z-index: -1;
    }
}

其簡單的原理就是,利用偽元素,生成一個與原圖一樣大小的新圖疊加在原圖之下,然后利用濾鏡模糊 filter: blur() 配合其他的亮度/對比度,透明度等濾鏡,制作出一個虛幻的影子,偽裝成原圖的陰影效果。

嗯,最重要的就是這一句 filter: blur(10px) brightness(80%) opacity(.8);。

CodePen Demo — filter create shadow(https://codepen.io/Chokcoco/pen/eGYYpo

blur 混合 contrast 產生融合效果

接下來介紹的這個,是本文的重點,模糊濾鏡疊加對比度濾鏡產生的融合效果。讓你知道什么是 CSS 黑科技!

單獨將兩個濾鏡拿出來,它們的作用分別是:

  1. filter: blur(): 給圖像設置高斯模糊效果。
  2. filter: contrast(): 調整圖像的對比度。

但是,當他們“合體”的時候,產生了奇妙的融合現象,通過對比度濾鏡把高斯模糊的模糊邊緣給干掉,利用高斯模糊實現融合效果。

先來看一個簡單的例子:


圖片

仔細看兩圓相交的過程,在邊與邊接觸的時候,會產生一種邊界融合的效果。

上述效果的實現基于兩點:

  1. 圖形是在被設置了 filter: contrast() 的畫布背景上進行動畫的

  2. 進行動畫的圖形被設置了 filter: blur()( 進行動畫的圖形的父元素需要是被設置了 filter: contrast() 的畫布)

意思是,上面兩圓運動的背后,其實是疊加了一張設置了 filter: contrast() 的大白色背景,而兩個圓形則被設置了 filter: blur() ,兩個條件缺一不可。

當然,背景色不一定是白色,我們稍稍修改上面的Demo,簡單的示意圖如下:

圖片

燃燒的火焰

好,上面介紹完原理,下面看看使用這個效果制作的一些強大 CSS 效果,其中最為驚艷的就是使用融合效果制作生成火焰,這個效果我最早是見于 Yusuke Nakaya 這位作者:

圖片

不用懷疑你的眼睛,上述 GIF 效果就是使用純 CSS 實現的。

核心還是 filter: contrast()filter: blur() 配合使用,不過實現的過程也非常有趣,我們需要使用 CSS 畫出一個火焰形狀。

火焰形狀 CSS 核心代碼如下:

 .fire {
 
     width: 0;
 
     height: 0;
 
     border-radius: 45%;
 
     box-sizing: border-box;
 
     border: 100px solid #000;
 
     border-bottom: 100pxsolid transparent;
 
     background-color: #b5932f;
 
     transform: scaleX(.4);
 
     filter: blur(20px) contrast(30);
 
 }

大概是長這樣:

圖片

分解一下過程:

圖片

放在純黑的背景下,就得到了上述圖片的效果。

這里會有個很大的疑問,增加了 filter: blur(20px) contrast(30); 之后,為什么純色黑色和黃色的中間,生成了一條紅色的邊框?

這里我咨詢了幾個設計師、前端同事,得到的答復大概是兩個不同濾鏡的色值處理算法在邊界處疊加作用得到了另外一種顏色。(不一定準確,求賜教),在 PS 里嘗試還原這個效果,但是 PS 沒有 contrast() 濾鏡,得到的效果偏差挺大的。

OK,繼續正文,接下來,我們只需要在火焰 .fire 這個 div 內部,用大量的黑色圓形,由下至上,無規律穿過火焰即可。由于濾鏡的融合效果,火焰效果隨之產生,這里為了方便理解,我把背景色切換成白色,火焰動畫原理一看即懂:

圖片

具體完整實現可以看這里:

CodePen Demo — CSS fire | CSS filter mix(https://codepen.io/Chokcoco/pen/GvbMmE

文字融合動畫

另外,我們可以在動畫的過程中,動態改變元素濾鏡的 filter: blur() 的值。

利用這個方法,我們還可以設計一些文字融合的效果:

圖片
圖片

具體實現你可以看這里:

CodePen Demo — word animation | word filter(https://codepen.io/Chokcoco/pen/jLjNRj

值得注意的細節點

動畫雖然美好,但是具體使用的過程中,仍然有一些需要注意的地方:

  1. CSS 濾鏡可以給同個元素同時定義多個,例如 filter: contrast(150%) brightness(1.5) ,但是濾鏡的先后順序不同產生的效果也是不一樣的;

也就是說,使用 filter: contrast(150%) brightness(1.5)filter: brightness(1.5) contrast(150%) 處理同一張圖片,得到的效果是不一樣的,原因在于濾鏡的色值處理算法對圖片處理的先后順序。

  1. 濾鏡動畫需要大量的計算,不斷的重繪頁面,屬于非常消耗性能的動畫,使用時要注意使用場景。記得開啟硬件加速及合理使用分層技術;

  2. blur() 混合 contrast() 濾鏡效果,設置不同的顏色會產生不同的效果,這個顏色疊加的具體算法本文作者暫時也不是很清楚,使用時比較好的方法是多嘗試不同顏色,觀察取最好的效果;

  3. CSS3 filter 兼容性不算太好,但是在移動端已經可以比較正常的使用,更為精確的兼容性列表,查詢 Can i Use。

原文轉自: https://mp.weixin.qq.com/s/9xFXK1pyrk3x7Z7dY8z9Ag

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容