明天全国哀悼日,一段css让全站变灰

为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世通报的深切哀悼,国务院今天发布公告,决定2020年4月4日(明天)举行全国性哀悼活动。在此期间,全国和驻外使馆下半旗致哀,全国中止公共娱乐活动,4月4日10点开始,全国人民默哀3分钟,汽车、火车、舰船鸣笛,防空警报鸣响。css

想到以往默哀日访问网站时发现整站会变成全灰,即想到若是当即开始开发、设计图修改等工做也会消耗大量的时间与精力,那会不会有css能够直接处理全部的元素将他们变灰,随即想到了css3的filter(滤镜),并也证明了这一想法的可行性。html

filter: grayscale 使用能够调整元素的灰度值css3

.gray-filter {
    filter: grayscale(100%);
    -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);
    -webkit-filter: grayscale(1);
}
复制代码

实战

以B站为例:web

在正常的状况下B站这个导航栏滑到下面以后是fixed在页面的顶部的 canvas

但假如你把这段css加到了body上会发生下面这种状况: 小程序

你能够发现它再也不固定在页面的顶部了,而是超出去了屏幕外面,屏幕左下角的小电视人也跑到了页面上半部分去,为何会发生这样的状况呢?

我去Google查阅了相关资料,发现:微信小程序

对于指定了 filter 样式且值不为 none 时,被应用该样式的元素其子元素中若是有 position 为 absolute 或 fixed 的元素,会为这些元素建立一个新的容器,使得这些绝对或固定定位的元素其定位的基准相对于这个新建立的容器。浏览器

咱们能够联想出fixed是相对于html根容器来定位的,若是在body上设置了filter则会建立一个新的定位基准,而页面滚动时将body滚动出了屏幕外,则body内全部子孙元素的fixed将产生不符合预期的效果。微信

如何解决呢?

解决方案1

影响全站的方法咱们能够将该样式应用到根元素html上,即便建立了新的定位基准元素,也不会对子孙元素产生不符合预期的影响。svg

html {
    filter: grayscale(100%);
    -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);
    -webkit-filter: grayscale(1);
}
复制代码

效果:

解决方案2

非全站变灰咱们能够将须要使用filter的元素单独加上

<html>
    <body>
        <div class="gray-filter"></div>
    </body>
</html>

<style> .fixed { position: fixed; top: 100px; left: 100px; height: 100px; width: 100px; background-color: #f00; } .gray-filter { filter: grayscale(100%); -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); -webkit-filter: grayscale(1); } </style>
复制代码

兼容IE的办法

不少小伙伴评论说IE低版本不支持该怎么办因而我Google搜索了一下是有实现办法的 实现办法是引入grayscale.js,Demo下载 grayscale.js Demo

简单查看了该js的源码后发现会将color、background-color、borderColor等属性提取出来后替换成灰色,background-image和图片会使用canvas绘制处理成灰色再替换成处理后的图片源

demo内functions.js则是对判断浏览器userAgent来识别浏览器类型与版本,作出对应的处理

参考资料与demo来源

小程序下的问题

微信小程序我尝试加在page上可是fixed仍是失效了,只能使用第二种方法去加样式,你们若是有解决方案能够评论提出来你们一块儿讨论一下~

相关文章:

CSS3 filter MDN

兼容IE方案的参考资料与demo来源

初次发表文章有问题请多多指教,谢谢!

相关文章
相关标签/搜索