b站全灰,但我一下把它弄回來了——css 濾鏡
- 2019 年 12 月 17 日
- 筆記
前言
今天(12月13日)是國家公祭日?️?
今天打開b站,看見一片灰色。

首先,職業下意識就打開了控制台。為什麼呢?是想看看怎麼實現的,是css自定義屬性嗎?是引入一份css嗎?是預處理器修改全局變數嗎?結果,打開控制台,瀏覽了一下,最後定位發現在於一行css程式碼,關掉就變成彩色了
filter: grayscale(100%);
於是乎,我們馬上來看看filter這個濾鏡效果具體還有什麼值可選
效果預覽
趕緊的,寫個腳本遍歷所有的屬性,並都看看效果:
const url = "https://www.baidu.com/img/[email protected]"; let html = ""; [ { name: "灰度100%", style: "grayscale(100%)" }, { name: "模糊5px", style: "blur(5px)" }, { name: "3倍亮度", style: "brightness(300%)" }, { name: "200%對比度", style: "contrast(200%)" }, { name: "200%飽和度", style: "saturate(200%)" }, { name: "色相旋轉180度", style: "hue-rotate(180deg)" }, { name: "100%反色", style: "invert(100%)" }, { name: "50%透明度", style: "opacity(50%)" }, { name: "陰影", style: "drop-shadow(10px 5px 5px #f00)" }, { name: "100%透明度", style: "opacity(100%)" }, { name: "褐色程度70%", style: "sepia(70%)" } ].forEach(({ name, style }) => { html += `<div>${name}-${style}: <img src=${url} style="filter: ${style}" /></div><br />`; }); document.body.innerHTML = html; 複製程式碼
預覽效果:

可支援多個濾鏡結合哦
開始發揮想像力
毛玻璃效果
看見模糊的效果,是不是馬上就想到mac上炫酷的毛玻璃效果。於是,我們來複現一下:

實現方法:先鋪滿全螢幕背景,然後承載主要內容的元素半透明,且有一個偽元素,此偽元素也是有一個background-attachment: fixed
的背景,並且把它加上blur即可實現
.bg, .container::before { background-image: url("http://img2.imgtn.bdimg.com/it/u=1737072847,1699534261&fm=26&gp=0.jpg"); background-repeat: no-repeat; background-size: cover; background-attachment: fixed; } .bg { top: 0; left: 0; right: 0; bottom: 0; position: absolute; z-index: -1; } .container::before { content: ""; filter: blur(20px); z-index: -1; } .container { background: rgba(0, 0, 0, 0.5); color: #fff; font-size: 30px; /* 用transform會悲劇哦 */ left: calc(50% - 250px); top: calc(50% - 200px); } .container, .container::before { width: 500px; height: 400px; position: absolute; border-radius: 8px; }
- background-attachment: fixed。這個可以使得背景相對於視窗是固定的,否則一般情況下,圖片會從你的盒子左上角開始,而不是像圖中的效果一樣
- calc(50% – 250px)居中: 使用transform的話,偏移會導致偽元素的背景和內容不統一,調起來也麻煩,直接calc最快
剩下html程式碼就很簡單了:
<main class="bg"></main> <section class="container"> i am lhyt </section> 複製程式碼
模糊陰影
平時可能多數是使用box-shadow
實現一個簡單的陰影,但是blur也可以哦。在一張圖下面,還是放這張圖,然後加上blur模糊,再偏移一點點,不就是一個陰影了(彩色陰影哦)

.shadow, .shadow::before { width: 500px; height: 400px; background: url("http://img2.imgtn.bdimg.com/it/u=1737072847,1699534261&fm=26&gp=0.jpg") no-repeat; background-size: cover; } .shadow { position: relative; } .shadow::before { content: ""; display: block; position: absolute; filter: blur(20px); z-index: -1; top: 20px; left: 20px; }
如果fliter再加上brightness(0.5)
,那就是一個黑色陰影了。html就只有一個元素,沒什麼好說的。
自動顏色逐漸變化
還記得windows的一些屏保嗎,它們的顏色一直在改變。通過色相旋轉hue-rotate
,css濾鏡也可以實現這個效果

@keyframes auto_change_color { from { filter: hue-rotate(0); } to { filter: hue-rotate(360deg); } } .container { background-image: url("http://img2.imgtn.bdimg.com/it/u=1737072847,1699534261&fm=26&gp=0.jpg"); background-repeat: no-repeat; background-size: cover; position: absolute; top: 0; left: 0; right: 0; bottom: 0; animation: auto_change_color 5s linear infinite; }
從抽象到具象
通過修改前面的模糊度,加上一些偏移、對比度變化動畫,可以實現一個圖片拼接且逐漸從抽象到具象的效果:

@keyframes shadow_move { from { top: 400px; left: 400px; filter: blur(20px); } to { top: 0; left: -250px; filter: blur(0); } } @keyframes container_move { from { top: 0; filter: blur(20px); left: 0; } to { top: 200px; left: 400px; filter: blur(0); } } @keyframes body_contrast { from { filter: contrast(20); } to { filter: contrast(1); } } .shadow, .shadow::before { width: 250px; height: 400px; background: url("http://img2.imgtn.bdimg.com/it/u=1737072847,1699534261&fm=26&gp=0.jpg") no-repeat; background-size: cover; } .shadow { position: relative; animation: container_move 20s infinite ease; background-position-x: -250px; } .shadow::before { content: ""; display: block; position: absolute; z-index: -1; animation: shadow_move 20s infinite ease; } body { animation: body_contrast 20s infinite ease; }
閃電
平時生活中的閃電,一般是從一股很細的光到一股很粗的電光。這個過程,使用brightness可以模擬。下面我們做一個閃電劈下來的效果

@keyframes lighting { from { filter: brightness(0); } to { filter: brightness(100%); } } @keyframes light { from { filter: brightness(100%); } to { filter: brightness(300%); } } .light { background: url("https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3951629719,2497770173&fm=26&gp=0.jpg") no-repeat; width: 463px; height: 400px; animation: lighting 0.5s linear infinite; } .container { background-image: url("http://img0.imgtn.bdimg.com/it/u=2309502909,4210960075&fm=26&gp=0.jpg"); background-repeat: no-repeat; background-size: cover; width: 300px; height: 300px; animation: light 0.5s linear infinite; position: absolute; left: 250px; }
html:
<body> <section style="filter: contrast(20); background-color: #000"> <div class="light"></div> </section> <section style="filter: contrast(20); background-color: #000"> <div class="container"></div> </section> </body> 複製程式碼