公祭日到了,网站整页变灰怎么做

2026-09-05 技术分享

公祭日、重大哀悼,整站要先铺一层灰。这版走两条路:Chrome / Firefox / Edge 用 CSS filter,IE9 及以下用 grayscale.js。

嵌入项目时,按后面「公共样式里怎么开整站置灰」那节,把滤镜挂到 html 上。

网页置灰用到哪些文件

图片1.png

现代浏览器只引 gray.css 就够。grayscale.js 只给 IE9 及以下,用条件注释包住,别跟 CSS 滤镜叠两次。

图片2.png

业务就这几个名字,后面会反复碰到:

1、filter: grayscale(100%):现代浏览器整页变灰

2、filter: gray:老 IE 认的写法

3、<!--[if lte IE 9]>:只有 IE9 及以下会吃到这段

4、grayscale(document.body):老 IE 里对节点跑一遍去饱和

<!--[if lte IE 9]> 是给 IE 看的条件注释,不是说明文字,去掉老 IE 就灰不了。

CSS 滤镜怎么写成各家浏览器都认

滤镜挂在 html 上,子节点一起变灰,不用每个图片、每个色块写一遍。

图片3.png

我第一次看也卡了一下。说白了吧:filter 只能留住最后一条。现代浏览器认 grayscale(100%),把 gray 盖掉;IE9 不认 grayscale(),还停在前面的 filter: gray。两条都要写,顺序别反。

-webkit- 给老 Chrome / Safari,-moz-、-ms-、-o- 跟着写,图的是「各家内核都带一刀」。这坑我见过不止一次:只写一条 filter,某台内核不吃,页还是彩的。

100% 是全灰。写成 80% 还能透出一点颜色,公祭页一般用满。

IE9 为什么还要调 grayscale.js

CSS grayscale() IE9 不认。filter: gray 有的环境能把页面颜色压灰,图片、背景图不一定跟得上。所以条件注释里再引 grayscale.js,对 document.body 跑一次。

图片4.png

说白了:脚本里两条退路。浏览器没有 canvas,就上 IE 的 progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);有 canvas,就把图片像素和 color / backgroundColor 算成灰度再写回去。外链图跨域读不了像素,库会跳过,别指望 CDN 上的图在老 IE 里也被处理。

条件注释只有 IE9 及以下当 HTML 看。Chrome 把整段当注释扔掉,所以现代浏览器不会再跑一遍脚本,灰不会叠两层。

哀悼结束要恢复彩色,现代浏览器用类名摘掉滤镜;老 IE 调 grayscale.reset(document.body)。

公共样式里怎么开整站置灰

接入项目时:公共 CSS 写上 html 那段滤镜,布局文件里补 IE 条件注释。栏目、banner 不用改。活动结束去掉 html-gray;老 IE 再调 grayscale.reset(document.body),彩色才会回来。

公共样式和条件注释的完整示例

公共 CSS 加上滤镜(或单独一个 gray.css 在活动期间引入):

图片5.png

公共头:

图片6.png

活动开关写在公共脚本里。本例用 needGray,接到后台开关时换成接口返回值。

图片7.png

html-gray 加在 <html> 上,整站一起灰。只灰某一块,就把滤镜写到那个容器上,grayscale() 也改传那个节点,别再传 document.body。

灰度和作用范围改哪里

1、灰度:本例 100%,一打开就是全灰;要留一点彩色改成 80%、60%。filter: gray 没有百分比,老 IE 只有全灰。

2、挂哪:本例挂 html,整页一起变。只灰头图、不灰按钮,把选择器改成那一块。

3、开关:用 html-gray 这类名控制,活动结束去掉 class。老 IE 对应 grayscale.reset(document.body)。

4、脚本:grayscale.js 只放在 lte IE 9 里,别给现代浏览器再跑一遍。

接入时这几处别漏:filter: gray 写在 grayscale(100%) 前面;条件注释别删;滤镜挂 html 才是整站灰。


案例下载
下载demo本地运行
技术分享