我正在尝试使用 CSS 过滤器。
我想同时使用模糊和灰度,但我似乎无法在同一张图像上同时使用两者?
在这里查看小提琴...
http://jsfiddle.net/joshmoto/fw0m9fzu/1/
.blur {
filter: blur(5px);
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
}
.grayscale {
filter: grayscale(1);
-webkit-filter: grayscale(1);
-moz-filter: grayscale(1);
-o-filter: grayscale(1);
-ms-filter: grayscale(1);
}
.blur-grayscale {
filter: blur(5px) grayscale(1);
-webkit-filter: blur(5px) grayscale(1);
-moz-filter: blur(5px) grayscale(1);
-o-filter: blur(5px) grayscale(1);
-ms-filter: blur(5px) grayscale(1);
}
因为它是一个名为
filter
的属性,所以每次您想要向其添加样式时,您都会覆盖它。
幸运的是,您可以在某些属性(例如背景图像和滤镜)中添加多种样式! 要实现此功能,您必须将所有过滤器样式放在一个空格分隔的过滤器属性中。
.grayscale.blur {
filter: blur(5px) grayscale(1);
}
另一种灵活的解决方案是故意创建一个“div soup”并在 html 堆栈中设置不同的过滤器。 例如
<div class='demo__blurwrap' style='filter: blur(5px);'>
<div class="demo__graywrap" style='filter: grayscale(1);'>
<img src="awesome_image.jpeg" alt="">
</div>
</div>
编辑:刚刚意识到我刚刚用变换编写了这个版本,但同样的想法也适用。
另一个解决方案是 CSS 变量。我不会说这是理想的,但这是一个很好的实验。主要缺点是您需要声明很多变量,有默认的长规则
transform
并且嵌套转换肯定会中断。
// Added just for fun
setInterval(() => {
yes_this_works_and_one_of_many_reasons_ids_are_bad.classList.toggle('translate');
}, 1000);
setInterval(() => {
yes_this_works_and_one_of_many_reasons_ids_are_bad.classList.toggle('scale');
}, 1500);
:root {
--scale: 1;
--translate: 0px;
}
.box {
background: blue;
width: 20px;
height: 20px;
transform:
scale(var(--scale))
translate(var(--translate), var(--translate));
transition: transform .3s;
}
.box.translate {
--translate: 20px;
}
.box.scale {
--scale: 3;
}
<div
id='yes_this_works_and_one_of_many_reasons_ids_are_bad'
class='box scale translate'
></div>
最后,如果您要使用 JavaScript 渲染样式,您可以使用 getCompulatedStyle 读取当前应用的过滤器,并添加更多样式。
还有一篇相关文章 - 这更多地适用于动画,但许多浏览器尚未支持:附加动画
还有另一篇关于 css-tricks 的相关文章:Houdini
我正在尝试在 vanilla CSS 中创建实用程序类,这会很有帮助,但看起来无法通过这种方式完成。
<img class="brightness-20 image-grayscale-100">
.brightness-20 {
filter:brightness(20%);
}
.image-grayscale-100 {
filter: grayscale(100%);
}
我不确定他们为什么不创建一个更具体的属性,例如:
filter-brightness: 20%; filter-grayscale: 100%
经过更多工作,我想出了这个解决方案:
/*Initalize Variables No Adjustments*/
:root {
--blur:0px;
--contrast:100%;
--brightness:100%;
--contrast:100%;
--dropshadow:0px 0px 0px black;
--grayscale:0%;
--hue-rotate:0deg;
--invert:0%;
--opacity:100%;
--saturate:100%;
--sepia:0%;
}
/*Apply Defult Variables To Image*/
.filter {
filter: blur(var(--blur)) contrast(var(--contrast)) brightness(var(--brightness)) contrast(var(--contrast)) drop-shadow(var(--dropshadow)) grayscale(var(--grayscale)) hue-rotate(var(--hue-rotate)) invert(var(--invert)) opacity(var(--opacity)) saturate(var(--saturate)) sepia(var(--sepia));
}
/*Override Defults*/
.brightness-20 {
--brightness:20%;
}
.image-grayscale-100 {
--grayscale: 100%;
}
由于到目前为止,这似乎在answers中缺失,并且仅在评论中提到,因此以下是有效的:
简单组合多个以空格分隔的过滤器,如:
filter: grayscale() blur(5px);
另请参阅此处。
我正在用这个。
/* Multiple filters */
backdrop-filter: url(filters.svg#filter) blur(4px) saturate(150%);
如果这适用于您的情况,您可以在父元素上使用过滤器类。如果您要应用任意数量的类,您可以使用 javascript 创建包含的
div
。
<div class="blur">
<div class="grayscale">
<img />
</div>
</div>