背景
基本概念
CSS filter
屬性將模糊或顏色偏移等圖形效果應用於元素形成濾鏡,濾鏡通常用於調整影像,背景和邊框的渲染。它的值可以為 filter
函式 <filter-function>
或使用 url
新增的svg濾鏡。
filter: <filter-function> [<filter-function>]* | none
filter: url(file.svg#filter-element-id)
<filter-function>
可以用於 filter
和 backdrop-filter
屬性。它的資料型別由下列過濾器函式之一指定。每個函式需要一個引數,如果引數無效,則濾鏡不會生效。以下是對濾鏡函式含義的解釋:
blur()
:模糊影像brightness()
:讓影像更明亮或更暗淡contrast()
:增加或減少影像的對比度drop-shadow()
:在影像後方應用投影grayscale()
:將影像轉為灰度圖hue-rotate()
:改變影像的整體色調invert()
:反轉影像顏色opacity()
:改變影像透明度saturate()
:超飽和或去飽和輸入的影像sepia()
:將影像轉為棕褐色
用法示例
/* 使用SVG filter */
filter: url("filters.svg#filter-id");
/* 使用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%);
/* 多個filter */
filter: contrast(175%) brightness(3%);
/* 不使用filter */
filter: none;
/* 全域性變數 */
filter: inherit;
filter: initial;
filter: unset;
應用案例
更加智慧的陰影效果
在給元素新增陰影的時候,我們一般採用 box-shadow
屬性,通過 box-shadow(x偏移, y偏移, 模糊大小, 陰影大小, 色值, inset)
的語法形式很容易為元素新增陰影效果,但 box-shadow
也有一個缺點,就是在給透明圖片新增陰影效果時,無法穿透元素,只能新增到透明圖片元素的盒模型上。這個時候,filter
屬性的 drop-shadow
方法就能很好的解決這個問題,用它新增的陰影可以穿透元素,而不是新增到元素的盒模型邊框上。
drop-shadow
新增的陰影除了可以穿透透明元素外,陰影效果和 box-shadow
是相同的,如果瀏覽器支援硬體加速的話,使用 filter
新增的陰影效果會更加逼真。
drop-shadow
語法如下(它除了不支援設定 inset
,其他和 box-shadow
是完全相同的):
filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);
如:
filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));
下圖是分別使用 box-shadow
和 filter: drop-shadow
為透明元素新增陰影的對比:
<img class="box-shadow" src="futurama.png" />
<img class="drop-shadow" src="futurama.png" />
.box-shadow {
box-shadow: 1px 1px 15px rgba(0, 0, 0, .5);
}
.drop-shadow {
filter: drop-shadow(1px 1px 15px rgba(0, 0, 0, .5));
}
元素、網頁置灰
發生重大災害事故或其他哀悼日時,國企政府網站往往有網頁全部置灰的需求。或者很多網頁中有滑鼠 hover
懸浮到灰色元素上時變成彩色的樣式效果。此時就可以使用 filter
屬性的 grayscale
方法實現,它可以調整元素灰度,通過給頁面元素設定 filter: grayscale(100%)
就可將頁面元素置灰。以下示例中,body
標籤下有 h1
和 img
標籤,未新增 filter
樣式前如下所示。
<body>
<h1 class="title">FUTURAMA</h1>
<img class="img" width="500" src="./images/futurama.png" />
</body>
現在我們給 body
元素新增一個 .gray
類,<body class="gray">
就可實現整個網頁置灰效果。
.gray {
filter: grayscale(100%);
}
為了相容 IE8
等其他低版本瀏覽器,我們可以加上瀏覽器字首和 svg
濾鏡。?
.gray {
-webkit-filter: grayscale(1);
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
filter: grayscale(100%);
}
在做緊急置灰網頁需求時,上線一段時間往往需要撤掉這個功能,我們還可以在首次上線時新增以下類似的方法,來控制置灰效果的自動上下線時間,這樣到達預定時間就可自動撤去,不用走兩次施工流程。?
(function setGray() {
var endTime = Date.parse("Apr 06 2077 00:00:01");
var timestamp = Date.parse(new Date());
if (timestamp <= endTime) {
document.querySelector('html').classList.add('gray');
}
})();
元素強調、高亮
brightness
方法實現元素高亮的效果,可以應用到選單欄、圖片列表 hover
效果,來強調滑鼠當前懸浮或選中的內容。下面是對一組按鈕選單欄新增 brightness
和 saturate
兩個方法,通過改變亮度和飽和度來高亮元素。
<div class="container">
<a class="button">?</a>
<a class="button">?</a>
<a class="button">?</a>
<a class="button dark">?</a>
<a class="button dark">?</a>
<a class="button dark">?</a>
<a class="button disabled">?</a>
<a class="button disabled">?</a>
<a class="button disabled">?</a>
</div>
.container {
margin: 40px;
}
.button {
padding: 0.5em 0.5em;
background: #E0E0E0;
border-radius: 3px;
}
.button.dark {
background: #333;
}
.button:hover:not(.disabled) {
cursor: pointer;
border-radius: 3px;
filter: brightness(110%) saturate(140%);
}
.button.disabled {
filter: grayscale(100%);
}
毛玻璃效果
毛玻璃(Frosted glass
)效果,顧名思義就是類似半透明毛玻璃的效果,在 iOS
系統、Windows 10
等系統 UI
中有廣泛應用,使用毛玻璃效果可以增強視覺體驗。在 《CSS揭祕》
等著作中也有系統講解,下面是我對分別使用 filter: blur
和 backdrop-filter: blur
兩種方法實現這種效果的總結。
有兩個含有相同類名 glass
的 div
元素,它們分別被新增兩個類 glass-by-filter
和 glass-by-backdrop-filter
來區分兩種方法。
<div class="glass glass-by-filter"></div>
<div class="glass glass-by-backdrop-filter"></div>
通用樣式,設定毛玻璃元素的大小、圓角等基本樣式:
.glass {
height: 300px;
width: 300px;
border: 1px groove #EFEFEF;
border-radius: 12px;
background: rgba(242, 242, 242, 0.5);
box-shadow: 0 0.3px 0.7px rgba(0, 0, 0, 0.126),
0 0.9px 1.7px rgba(0, 0, 0, 0.179), 0 1.8px 3.5px rgba(0, 0, 0, 0.224),
0 3.7px 7.3px rgba(0, 0, 0, 0.277), 0 10px 20px rgba(0, 0, 0, 0.4);
}
filter: blur
方法,給元素新增了一個 ::before
偽類設定 blur
方法並將其置於底層實現毛玻璃效果。
.glass-by-filter {
z-index: 1;
box-sizing: border-box;
position: relative;
}
.glass-by-filter::before {
content: "";
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
z-index: -1;
background: inherit;
filter: blur(10px);
}
backdrop-filter: blur
直接在元素上新增 blur
方法實現毛玻璃效果。
.glass-by-backdrop-filter {
backdrop-filter: blur(10px);
}
實現效果如下圖所示(左:filter
、右:backdrop-filter
):
閱讀擴充套件:毛玻璃邊框效果:https://css-tricks.com/blurred-borders-in-css
藝術照!甚至可以實現簡易版 insatagram
復古、版畫、油畫、漫畫、液化、老照片、性冷淡、莫蘭迪、賽博朋克、旺達幻視風格通通都可以實現!
通過結合使用 filter
的所有方法,可以搭配出任意自己想要的效果。以下是一個簡單的 filter
方法調節器,可以調整每個方法的值,同時實時展示圖片的濾鏡效果。如下圖所示。
頁面主要程式碼如下,控制區 #imageEditor
是一個 form
表單,表單每一行分別控制一種filter方法的值,展示區 #imageContainer
內部包含一個 img
元素,產生的 filter
濾鏡作用在該元素上。
<form id="imageEditor">
<p>
<label for="gs">Grayscale</label>
<input id="gs" name="gs" type="range" min="0" max="100" value="0">
</p>
<p>
<label for="blur">Blur</label>
<input id="blur" name="blur" type="range" min="0" max="10" value="0">
</p>
<p>
<label for="br">Exposure</label>
<input id="br" name="br" type="range" min="0" max="200" value="100">
</p>
<p>
<label for="ct">Contrast</label>
<input id="ct" name="ct" type="range" min="0" max="200" value="100">
</p>
<p>
<label for="huer">Hue Rotate</label>
<input id="huer" name="huer" type="range" min="0" max="360" value="0">
</p>
<p>
<label for="opacity">Opacity</label>
<input id="opacity" name="opacity" type="range" min="0" max="100" value="100">
</p>
<p>
<label for="invert">Invert</label>
<input id="invert" name="invert" type="range" min="0" max="100" value="0">
</p>
<p>
<label for="saturate">Saturate</label>
<input id="saturate" name="saturate" type="range" min="0" max="500" value="100">
</p>
<p>
<label for="sepia">Sepia</label>
<input id="sepia" name="sepia" type="range" min="0" max="100" value="0">
</p>
<input type="reset" form="imageEditor" id="reset" value="Reset" />
</form>
<div id="imageContainer" class="center">
<img src="futurama.png">
</div>
function editImage() {
var gs = $("#gs").val(); // grayscale
var blur = $("#blur").val(); // blur
var br = $("#br").val(); // brightness
var ct = $("#ct").val(); // contrast
var huer = $("#huer").val(); // hue-rotate
var opacity = $("#opacity").val(); // opacity
var invert = $("#invert").val(); // invert
var saturate = $("#saturate").val(); // saturate
var sepia = $("#sepia").val(); // sepia
$("#imageContainer img").css(
"filter", 'grayscale(' + gs+
'%) blur(' + blur +
'px) brightness(' + br +
'%) contrast(' + ct +
'%) hue-rotate(' + huer +
'deg) opacity(' + opacity +
'%) invert(' + invert +
'%) saturate(' + saturate +
'%) sepia(' + sepia + '%)'
);
$("#imageContainer img").css(
"-webkit-filter", 'grayscale(' + gs+
'%) blur(' + blur +
'px) brightness(' + br +
'%) contrast(' + ct +
'%) hue-rotate(' + huer +
'deg) opacity(' + opacity +
'%) invert(' + invert +
'%) saturate(' + saturate +
'%) sepia(' + sepia + '%)'
);
}
// 當input值發生變化時即時應用濾鏡
$("input[type=range]").change(editImage).mousemove(editImage);
現在只是實現了濾鏡的實時預覽,後續待實現功能包括支援複雜的 svg
濾鏡模版、匯出下載等,完成這些步驟,以後照片新增濾鏡再也不用下載其他 APP?
了。例項完整版程式碼:https://codepen.io/dragonir/pen/abJmqxM
節省空間,提高網頁載入速度
實踐證明,同一圖片減小亮度和對比度及色相飽和度之後的體積與原圖相比,可以減小很大一部分體積空間 2M
左右的圖片經過弱化後儲存,就可以壓縮到 1M
左右。在網頁中我們可以使用經過 弱化
的圖片,然後通過 CSS filter
將其還原。這樣就可以達到壓縮資源體積,提升網頁載入速度、提高使用者體驗的目的。
具體操作可閱讀以下教程:
對比度交換技術:使用
CSS filter
提高影像效能 https://css-tricks.com/contrast-swap-technique-improved-image-performance-css-filters
相容性
從 caniuse
查詢結果可以看出,css filter
屬性在現代瀏覽器中的支援性已經很好了,除了 IE
瀏覽器之外,其他瀏覽器中大多可以正常使用,必要時可新增瀏覽器核心字首。但是官網也有以下3個issue 提示,相信後續隨著瀏覽器的升級,這些問題也會被逐步修復:
- 在 Safari 瀏覽器中,如果子元素具有動畫效果,則不會被應用濾鏡。
- 目前沒有瀏覽器支援
drop-shadow
濾鏡的spread-radius
方法。 - 在
Edge
瀏覽器中如果元素或子元素被設定了負值z-index
,則無法應用濾鏡。
總結
本篇文章只是簡單列舉了幾種使用 CSS filter
常用的頁面效果,其實 filter
的每一種內建方法都可以有無限可能的擴充套件應用,如 invert
反轉色同樣也可以應用到 hover
效果上、調整網頁sepia
褐色值可以實現護眼效果等。只要發揮想象力和創造力,filter
都可以在實踐中得到很好的應用。
以下一些例子就是很好的應用,大家有興趣可以擴充閱讀學習:
- 毛玻璃效果 https://codepen.io/KazuyoshiGoto/pen/nhstF
- 破碎玻璃效果 https://codepen.io/bajjy/pen/vwrKk
- 使用filter實現的hover效果 https://codepen.io/nxworld/details/ZYNOBZ
- 反色按鈕 https://codepen.io/monkey-company/pen/zZZvRp
- 老照片 https://codepen.io/dudleystorey/pen/pKoqa
- 高階版filter編輯器:https://codepen.io/stoumann/pen/MWeNmyb
最後附上一張用上面濾鏡編輯器調出來的 復古莫蘭迪色性冷淡油畫效果
濾鏡圖片。(哇塞,這也太哇塞了吧,CSS
絕絕子 yyds?
)
文章地址:https://www.cnblogs.com/dragonir/p/14807272.html 作者:dragonir