如何用一行代碼實現網頁變灰效果?

今天是 2020 年 4 月 4 日,星期六,清明節。

我們的國家經歷了非常慘痛的時刻,很多英雄在救助他人的路上倒下,更有很多烈士英雄保衛人民的安危遇難,今天全國下降半旗,北京時間 10 點全國默哀三分鐘,來致敬英雄們。同時今天一切公共娛樂活動也都會停止,包括直播、綜藝、影視、遊戲等等。

我在這裡也向全國抗擊新冠肺炎疫情鬥爭犧牲的烈士和逝世的同胞表達深切的哀悼,向所有抗戰在疫情前線的工作和醫護人員致敬。我們每一個人的平安面前,都是英雄的人牆。

網站變灰

今天大家可以看到很多很多網站包括主頁和內容也都已經變成了灰色,比如百度、B 站、愛奇藝、CSDN 等等。

如何用一行代碼實現網頁變灰效果?

CSDN

如何用一行代碼實現網頁變灰效果?

愛奇藝

如何用一行代碼實現網頁變灰效果?

大家可以看到全站的內容都變成灰色了,包括按鈕、圖片等等。這時候我們可能會好奇這是怎麼做到的呢?

有人會以為所有的內容都統一換了一個 CSS 樣式,圖片也全換成灰色的了,按鈕等樣式也統一換成了灰色樣式。但你想想這個成本也太高了,而且萬一某個控件忘記加灰色樣式了豈不是太突兀了。

其實,解決方案很簡單,只需要幾行代碼就能搞定了。

實現

我們選擇一個網站,比如 B 站吧,打開瀏覽器開發者工具。

審查一下網頁的源代碼,我們可以發現在 html 的這個地方多了一個疑似的 class,叫做 gray,gray 中文即灰色。

如何用一行代碼實現網頁變灰效果?

變灰效果

其 CSS 內容為:

<code>html.gray {    
-webkit-filter: grayscale(.95);
}/<code>

我們將其取消,就能發現網站的顏色就能重新還原回來了。

如何用一行代碼實現網頁變灰效果?

還原效果

果然是這個樣式在起作用,而且是全局的效果,因為它是作用在了 html 這個節點之上的。

另外看看 CSDN,它也是用的這個 CSS 樣式,其內容為:

<code>html {    
-webkit-filter: grayscale(100%);
\t-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
\t-o-filter: grayscale(100%);
filter: grayscale(100%);
\tfilter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
}/<code>

這個實現看起來兼容性會更好一些。

因此我們可以確定,通過一個全局的 CSS 樣式就能將整個網站變成灰色效果。

分析

那麼這裡我們就來詳細瞭解一下這究竟是一個什麼樣的 CSS 樣式。

這個樣式名叫做 filter,搜下 MDN 的官方介紹,其鏈接為:https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter。

官方介紹內容如下:

filter CSS 屬性將模糊或顏色偏移等圖形效果應用於元素。濾鏡通常用於調整圖像,背景和邊框的渲染。

CSS 標準裡包含了一些已實現預定義效果的函數。你也可以參考一個 SVG 濾鏡,通過一個 URL 鏈接到 SVG 濾鏡元素 (SVG filter element[1])。

其實就是一個濾鏡的意思。

官方有一個 Demo,可以看下效果,如圖所示。

如何用一行代碼實現網頁變灰效果?

Demo

比如這裡通過 filter 樣式改變了圖片、顏色、模糊、對比度等等信息。

其所有用法示例如下:

<code>/* URL to SVG filter */
filter: url("filters.svg#filter-id");
/* <filter-function> values */

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%);
/* Multiple filters */
filter: contrast(175%) brightness(3%);
/* Global values */
filter: inherit;
filter: initial;
filter: unset;/<filter-function>/<code>

各個用法介紹大家可以參考官方的文檔說明:https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter

比如這裡如果我們可以使用 blur 設置高斯模糊,用法如下:

<code>filter: blur(radius)/<code>

給圖像設置高斯模糊。radius 一值設定高斯函數的標準差,或者是屏幕上以多少像素融在一起,所以值越大越模糊;如果沒有設定值,則默認是 0;這個參數可設置絕對像素值,但不接受百分比值。

可以達成這樣的效果:

如何用一行代碼實現網頁變灰效果?

效果

再說回剛才的灰色圖像,這裡其實就是設置了 grayscale,其用法如下:

<code>filter: grayscale(percent)/<code>

將圖像轉換為灰度圖像。值定義轉換的比例。percent 值為 100% 則完全轉為灰度圖像,值為 0% 圖像無變化。值在 0% 到 100% 之間,則是效果的線性乘子。若未設置,值默認是 0。另外除了傳遞百分比,還可以傳遞浮點數,效果是一樣的。

如:

<code>filter: grayscale(1)filter: grayscale(100%)/<code>

都可以將節點轉化為 100% 的灰度模式。

所以一切到這裡就清楚了,如果我們想要把全站變成灰色,再考慮到各瀏覽器兼容寫法,可以參考下 CSDN 的寫法:

<code>.gray {
-webkit-filter: grayscale(100%);
\t-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
\t-o-filter: grayscale(100%);
filter: grayscale(100%);
\tfilter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
}/<code>

這樣想要變灰的節點只需要加上 gray 這個 class 就好了,比如加到 html 節點上就可以全站變灰了。

最後呢,看一下瀏覽器對 filter 這個樣式的兼容性怎樣,如圖所示:

如何用一行代碼實現網頁變灰效果?

兼容性

這裡我們看到,這裡除了 IE,其他的 PC、手機端的瀏覽器都支持了,Firefox 的 PC、安卓端還單獨對 SVG 圖像加了支持,可以放心使用。

總結

本篇文章簡單介紹了一下今天觀察到的網站變灰的實現,也學習了 filter 的更詳細的用法,希望有幫助。

References

[1] SVG filter element: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/filter


分享到:


相關文章: