巧用 CSS3 filter(濾鏡) 屬性

原文鏈接:CSS3 filter(濾鏡) 屬性

效果預覽

filter: grayscale(100%);

image
image
image
image

定義和使用

filter 屬性定義了元素(通常是<img>)的可視效果(例如:模糊與飽和度)。

默認值 none
繼承 no
動畫支援 是。詳細可查閱 CSS 動畫
版本 CSS3

瀏覽器支援

表格中的數字表示支援該方法的第一個瀏覽器的版本號。

緊跟在數字後面的 -webkit- 為指定瀏覽器的前綴。

屬性 filter
image 18.0 -webkit-
image 不支援
image 35.0
image 6.0 -webkit-
image 15.0 -webkit-

注意: 舊版 Internet Explorer 瀏覽器(4.0 to 8.0) 支援的非標準 “filter” 屬性已被廢棄。 IE8 及更低版本瀏覽器通常使用 opacity 屬性。

CSS 語法

filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();

Filter 函數

注意: 濾鏡通常使用百分比 (如:75%), 當然也可以使用小數來表示 (如:0.75)。

Filter 描述
none 默認值,沒有效果。
blur(px) 給影像設置高斯模糊。”radius”一值設定高斯函數的標準差,或者是螢幕上以多少像素融在一起, 所以值越大越模糊;
如果沒有設定值,則默認是0;這個參數可設置css長度值,但不接受百分比值。
brightness(%) 給圖片應用一種線性乘法,使其看起來更亮或更暗。如果值是0%,影像會全黑。值是100%,則影像無變化。
其他的值對應線性乘數效果。值超過100%也是可以的,影像會比原來更亮。如果沒有設定值,默認是1。
contrast(%) 調整影像的對比度。值是0%的話,影像會全黑。值是100%,影像不變。值可以超過100%,意味著會運用更低的對比。若沒有設置值,默認是1。
drop-shadow(h-shadow v-shadow blur spread color) 給影像設置一個陰影效果。陰影是合成在影像下面,可以有模糊度的,可以以特定顏色畫出的遮罩圖的偏移版本。 函數接受<shadow>(在CSS3背景中定義)類型的值,除了 “inset” 關鍵字是不允許的。該函數與已有的 box-shadow box-shadow 屬性很相似;不同之處在於,通過濾鏡,一些瀏覽器為了更好的性能會提供硬體加速。<shadow>參數如下:
<offset-x> <offset-y>(必須)
這是設置陰影偏移量的兩個 <length>值。 <offset-x>設定水平方向距離, 負值會使陰影出現在元素左邊。 <offset-y>設定垂直距,負值會使陰影出現在元素上方,查看<length>可能的單位,如果兩個值都是0, 則陰影出現在元素正後面 (如果設置了 <blur-radius> and/or <spread-radius>,會有模糊效果)。
<blur-radius> (可選)
這是第三個code <length>值。 值越大,越模糊,則陰影會變得更大更淡。不允許負值 若未設定,默認是0 (則陰影的邊界很銳利)。
<spread-radius> (可選)
這是第四個 值。 正值會使陰影擴張和變大,負值會是陰影縮小。若未設定,默認是0 (陰影會與元素一樣大小)。
注意: Webkit , 以及一些其他瀏覽器 不支援第四個長度,如果加了也不會渲染。
<color> (可選)
查看 <color>該值可能的關鍵字和標記。若未設定,顏色值基於瀏覽器。在Gecko (Firefox), Presto (Opera)和Trident (Internet Explorer)中, 會應用colorcolor屬性的值。另外, 如果顏色值省略,WebKit中陰影是透明的。
grayscale(%) 將影像轉換為灰度影像。值定義轉換的比例。值為100%則完全轉為灰度影像,值為0%影像無變化。值在0%到100%之間,則是效果的線性乘子。若未設置,值默認是0。
hue-rotate(deg) 給影像應用色相旋轉。”angle”一值設定影像會被調整的色環角度值。值為0deg,則影像無變化。若值未設置,默認值是0deg。該值雖然沒有最大值,超過360deg的值相當於又繞一圈。
invert(%) 反轉輸入影像。值定義轉換的比例。100%的價值是完全反轉。值為0%則影像無變化。值在0%和100%之間,則是效果的線性乘子。 若值未設置,值默認是0。
opacity(%) 轉化影像的透明程度。值定義轉換的比例。值為0%則是完全透明,值為100%則影像無變化。值在0%和100%之間,則是效果的線性乘子,也相當於影像樣本乘以數量。 若值未設置,值默認是1。該函數與已有的opacity屬性很相似,不同之處在於通過filter,一些瀏覽器為了提升性能會提供硬體加速。
saturate(%) 轉換影像飽和度。值定義轉換的比例。值為0%則是完全不飽和,值為100%則影像無變化。其他值,則是效果的線性乘子。超過100%的值是允許的,則有更高的飽和度。 若值未設置,值默認是1。
sepia(%) 將影像轉換為深褐色。值定義轉換的比例。值為100%則完全是深褐色的,值為0%影像無變化。值在0%到100%之間,則是效果的線性乘子。若未設置,值默認是0;
url() URL函數接受一個XML文件,該文件設置了 一個SVG濾鏡,且可以包含一個錨點來指定一個具體的濾鏡元素。
例如:
filter: url(svg-url#element-id)
initial 設置屬性為默認值,可參閱: CSS initial 關鍵字
inherit 設置屬性為默認值,可參閱: CSS inherit 關鍵字

實例

初始圖片如下:

模糊實例

圖片使用高斯模糊效果:

img { -webkit-filter: blur(5px); /* Chrome, Safari, Opera */ filter: blur(5px); }
效果如下:
image
注意: Internet Explorer 不支援 filter 屬性。

Brightness 函數實例

使圖片變亮:
img { -webkit-filter: brightness(200%); /* Chrome, Safari, Opera */ filter: brightness(200%); }
效果如下:
image

Contrast 函數實例

調整影像的對比度:

img { -webkit-filter: contrast(200%); /* Chrome, Safari, Opera */ filter: contrast(200%); }
效果如下:
image

drop-shadow 函數實例

給影像設置一個陰影效果:

img { -webkit-filter: drop-shadow(8px 8px 10px red); /* Chrome, Safari, Opera */ filter: drop-shadow(8px 8px 10px red); }

效果如下:
image

Grayscale 函數實例

將影像轉換為灰度影像:

img { -webkit-filter: grayscale(50%); /* Chrome, Safari, Opera */ filter: grayscale(50%); }
效果如下:
image

hue-rotate() 函數實例

給影像應用色相旋轉:
img { -webkit-filter: hue-rotate(90deg); /* Chrome, Safari, Opera */ filter: hue-rotate(90deg); }
效果如下:
image

Invert 函數實

反轉輸入影像:

img { -webkit-filter: invert(100%); /* Chrome, Safari, Opera */ filter: invert(100%); }
效果如下:
image

Opacity 函數實例

轉化影像的透明程度:

img { -webkit-filter: opacity(30%); /* Chrome, Safari, Opera */ filter: opacity(30%); }
效果如下:
image

Saturate 函數實

轉換影像飽和度:

img { -webkit-filter: saturate(800%); /* Chrome, Safari, Opera */ filter: saturate(800%); }
效果如下:
image

Sepia 函數實例

將影像轉換為深褐色:

img { -webkit-filter: sepia(100%); /* Chrome, Safari, Opera */ filter: sepia(100%); }
效果如下:
image

複合函數

使用多個濾鏡,每個濾鏡使用空格分隔。

注意: 順序是非常重要的 (例如使用 grayscale() 後再使用 sepia()將產生一個完整的灰度圖片)。

img { -webkit-filter: contrast(200%) brightness(150%); /* Chrome, Safari, Opera */ filter: contrast(200%) brightness(150%); }
效果如下:
image

所有濾鏡實例

使用多個濾鏡,每個濾鏡使用空格分隔。

注意: 順序是非常重要的 (例如使用 grayscale() 後再使用 sepia()將產生一個完整的灰度圖片)。

`

注意: Internet Explorer 不支援 filter 屬性。

Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple
Pineapple

`

效果如下:
image

一些常見效果

1 電影效果
濾鏡中的 brightness 用於調整影像的明暗度。默認值是1;小於1時影像變暗,為0時顯示為全黑影像;大於1時影像顯示比原圖更明亮。
我們可以通過調整 背景圖的明暗度 和 文字的透明度 ,來模擬電影謝幕的效果。

<div class="container">
  <div class="ethan"></div>
  <div class="p-t">
    <p>如果生活中有什麼使你感到快樂,那就去做吧</p>
    <br>
    <p>不要管別人說什麼</p>
  </div>
</div>
.ethan{
    height: 100%;
    width: 100%;
    position: absolute;
    background: url('./images/movie.webp') no-repeat;
    background-size: cover;
    /* forwards當動畫完成後,保持最後一幀的狀態 */
    animation: fade-away 2.5s linear forwards;   
}
.p-t{
    position: absolute;
    line-height: 55px;
    color: #fff;
    font-size: 36px;
    text-align: center;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
    opacity: 0;
    animation: show 2s cubic-bezier(.74,-0.1,.86,.83) forwards;
}
/* 背景圖的明暗度動畫 */
@keyframes fade-away {    
    30%{
        filter: brightness(1);
    }
    100%{
        filter: brightness(0);
    }
}
/* 文字的透明度動畫 */
@keyframes show{        
    20%{
        opacity: 0;
    }
    100%{
        opacity: 1;
    }
}

效果如下:
在這裡插入圖片描述

2 模糊效果
在下面的單詞卡片中,當滑鼠hover到某一張卡片上時,其他卡片背景模糊,使用戶焦點集中到當前卡片。

<ul class="cards">
    <li class="card">
      <p class="title">Flower</p>
      <p class="content">The flowers mingle to form a blaze of color.</p>
    </li>
    <li class="card">
      <p class="title">Sunset</p>
      <p class="content">The sunset glow tinted the sky red.</p>
    </li>
    <li class="card">
      <p class="title">Plain</p>
      <p class="content">The winds came from the north, across the plains, funnelling down the valley. </p>
    </li>
 </ul>

實現的方式,是將背景加在 .card 元素的偽類上,當元素不是焦點時,為該元素的偽類加上濾鏡。

.card:before{
    z-index: -1;
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    border-radius: 20px;
    filter: blur(0px) opacity(1);
    transition: filter 200ms linear, transform 200ms linear;
}
/*
    這裡不能將濾鏡直接加在.card元素,而是將背景和濾鏡都加在偽類上。
    因為,父元素加了濾鏡,它的子元素都會一起由該濾鏡改變。
    如果濾鏡直接加在.card元素上,會導致上面的文字也變模糊。
*/
/* 通過css選擇器選出非hover的.card元素,給其偽類添加模糊、透明度和明暗度的濾鏡  */
.cards:hover > .card:not(:hover):before{    
    filter: blur(5px) opacity(0.8) brightness(0.8);
}
/* 對於hover的元素,其偽類增強飽和度,尺寸放大  */
.card:hover:before{
    filter: saturate(1.2);  
    transform: scale(1.05);
}

效果如下:
在這裡插入圖片描述

3 褪色效果
褪色效果可以打造出一種懷舊的風格。下面這組照片牆,我們通過sepia濾鏡將影像基調轉換為深褐色,再通過降低 飽和度 saturate 和 色相旋轉 hue-rotate 微調,模擬老照片的效果。

.pic{
    border: 3px solid #fff;
    box-shadow: 0 10px 50px #5f2f1182;
    filter: sepia(30%) saturate(40%) hue-rotate(5deg);
    transition: transform 1s;
}
.pic:hover{
    filter: none;
    transform: scale(1.2) translateX(10px);
    z-index: 1;
}

效果如下:
在這裡插入圖片描述

Tags: