乐趣区

关于前端:CSS-filter-有哪些神奇用途

背景

基本概念

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-shadowfilter: 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 标签下有 h1img 标签,未增加 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 成果,来强调鼠标以后悬浮或选中的内容。上面是对一组按钮菜单栏增加 brightnesssaturate 两个办法,通过扭转亮度和饱和度来高亮元素。

<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: blurbackdrop-filter: blur 两种办法实现这种成果的总结。

有两个含有雷同类名 glassdiv 元素,它们别离被增加两个类 glass-by-filterglass-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/blurre…

艺术照!甚至能够实现简易版 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/p…

节俭空间,进步网页加载速度

实践证明,同一图片减小亮度和对比度及色相饱和度之后的体积与原图相比,能够减小很大一部分体积空间 2M 左右的图片通过弱化后保留,就能够压缩到 1M 左右。在网页中咱们能够应用通过 弱化 的图片,而后通过 CSS filter 将其还原。这样就能够达到压缩资源体积,晋升网页加载速度、进步用户体验的目标。

具体操作可浏览以下教程:

对比度替换技术:应用 CSS filter 进步图像性能 https://css-tricks.com/contra…

兼容性

caniuse 查问后果能够看出,css filter 属性在古代浏览器中的支持性曾经很好了,除了 IE 浏览器之外,其余浏览器中大多能够失常应用,必要时可增加浏览器内核前缀。然而官网也有以下 3 个 issue 提醒,置信后续随着浏览器的降级,这些问题也会被逐渐修复:

  • 在 Safari 浏览器中,如果子元素具备动画成果,则不会被利用滤镜。
  • 目前没有浏览器反对 drop-shadow 滤镜的 spread-radius 办法。
  • Edge 浏览器中如果元素或子元素被设置了 负值 z -index,则无奈利用滤镜。

总结

本篇文章只是简略列举了几种应用 CSS filter 罕用的页面成果,其实 filter 的每一种内置办法都能够有有限可能的扩大利用,如 invert 反转色同样也能够利用到 hover 成果上、调整网页 sepia 褐色值能够实现护眼成果等。只有施展想象力和创造力,filter 都能够在实践中失去很好的利用。

以下一些例子就是很好的利用,大家有趣味能够拓展浏览学习:

  • 毛玻璃成果 https://codepen.io/KazuyoshiG…
  • 破碎玻璃成果 https://codepen.io/bajjy/pen/…
  • 应用 filter 实现的 hover 成果 https://codepen.io/nxworld/de…
  • 反色按钮 https://codepen.io/monkey-com…
  • 老照片 https://codepen.io/dudleystor…
  • 高级版 filter 编辑器:https://codepen.io/stoumann/p…

最初附上一张用下面滤镜编辑器调进去的 复旧莫兰迪色性冷淡油画成果 滤镜图片。(哇塞,这也太哇塞了吧,CSS 绝绝子 yyds🤣

文章地址:https://segmentfault.com/a/11… 作者:dragonir

退出移动版