整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

今天全国哀悼日,手把手教你一段css让全站变灰



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

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

filter: grayscale 使用可以调整元素的灰度值

.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站为例:

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


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

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


我去Google查阅了相关资料,发现:

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

我们可以联想出fixed是相对于html根容器来定位的,如果在body上设置了filter则会创建一个新的定位基准,而页面滚动时将body滚动出了屏幕外,则body内所有子孙元素的fixed将产生不符合预期的效果。

如何解决呢?

解决方案1

影响全站的方法我们可以将该样式应用到根元素html上,即使创建了新的定位基准元素,也不会对子孙元素产生不符合预期的影响。

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来识别浏览器类型与版本,做出对应的处理

参考资料地址:http://www.majas-lapu-izstrade.lv/cross-browser-grayscale-ie11/

小程序下的问题

微信小程序我尝试加在page上但是fixed还是失效了,只能使用第二种方法去加样式,大家如果有解决方案可以评论提出来大家一起讨论一下~

CSS3 filter MDN 地址:https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter


推荐CSS3学习资料文章

《关于前端CSS写法104个知识点汇总(一)》

《关于前端CSS写法104个知识点汇总(二)》

《妙用CSS变量,让你的CSS变得更心动》

《你未必知道的49个CSS知识点》

《手把手整理CSS3知识汇总【思维导图】》

《拒绝JavaScript,这三个CSS技巧你一定用的上》


作者:tiutiu
转发链接:https://juejin.im/post/5e86e221e51d4546ce27b99c

么是 VitePress?

VitePress 是 VuePress 的下一代框架,是基于 Vue3+Vite 构建的静态站生成器。

原先的 VuePress 是基于 Webpack 构建,本地启动开发一个只有几个简单页面的文档站点需要等待的时间让人难以忍受。即使是HMR热更新也需要几秒钟的时间才能在浏览器中显示出来。

从根本上说,这是因为 VuePress 是 webpack 的一个应用程序。即使只有两页,这也是一个完整的 webpack 项目(包括所有的主题源文件)正在编译。当项目有很多页面时,情况会变得更糟:每个页面都必须先完全编译,然后服务器才能显示内容!

Vite 很好地解决了这些问题:几乎立即启动服务器,只按需编译正在服务的页面,以及闪电般的快速 hmr。所以基于 Vue3 和 Vite 的 VitePress 诞生了。

VitePress 的优势

  1. VitePress 是 VuePress 的下一代框架,所以它有 VuePress 的所有优点;
  2. 具有 Vite 的速度, 开发服务器启动快,热更新快,构建快,只按需编译正在服务的页面;
  3. 利用 Vue 3 做的一些优化, JS 负载更容易解析,hydration 也变得更快。
  4. 容易上手,VitePress 更多的是主观性的并且配置很少。
  5. VitePress 是面向未来的:VitePress 仅适用于支持原生 ES 模块导入的浏览器,鼓励使用没有经过转换的原生 JavaScript 以及主题化中使用 CSS 变量。

总之,体验舒适,性能好,才有竞争力。开源字节基于vitepress推出官方技术文档,帮助大家做一些系统化的学习来提升自我的认知效率,从而提高我们的自我独立性。

如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/107.html

号用于每日更新前端最新面试题,React、Vue、小程序、JavaScript、HTML5、CSS、uniapp、ES6、前端工程化、性能优化等热点面试题~~~

欢迎关注,面试题刷起来~~升职加薪不是梦~~

以下是一些常见的前端面试题和答案,涉及 CSS 的主题:

  1. 请解释一下 CSS 盒模型。
    答案:CSS 盒模型是用来描述元素在页面中占据空间的方式。它由内容区域、内边距、边框和外边距组成。
  2. 请解释一下 CSS 选择器的优先级。
    答案:CSS 选择器的优先级是用来确定哪个规则应用于特定的元素。它由选择器的特殊性、重要性和源代码顺序决定。
  3. 请解释一下 CSS 清除浮动。
    答案:清除浮动是一种技术,用于处理浮动元素引起的父元素高度塌陷的问题。常见的清除浮动的方法包括使用空元素清除浮动、使用 clearfix 类、使用伪元素等。
  4. 请解释一下 CSS 伪类和伪元素的区别。
    答案:CSS 伪类用于选择处于特定状态的元素,如:hover、:active;而伪元素用于创建元素的特定部分,如::before、::after。
  5. 请解释一下 CSS 相对定位和绝对定位的区别。
    答案:相对定位是相对于元素在正常文档流中的位置进行定位,它不会影响其他元素的布局;绝对定位是相对于最近的已定位祖先元素进行定位,或者如果没有已定位的祖先元素,则相对于初始包含块进行定位。
  6. 请解释一下 CSS 选择器的子代选择器和后代选择器的区别。
    答案:子代选择器(>)选择作为某个元素直接子元素的元素;后代选择器(空格)选择作为某个元素后代的所有元素,无论它们是直接子元素还是更深层次的子元素。
  7. 请解释一下 CSS 中的层叠上下文(stacking context)。
    答案:层叠上下文是指在 HTML 文档中的一个三维概念,它决定了元素在 z 轴上的显示顺序和如何相互堆叠。层叠上下文可以通过特定的 CSS 属性(如position、z-index)创建。
  8. 请解释一下 CSS 中的浮动(float)属性。
    答案:浮动是一种布局方式,用于将元素从正常的文档流中移动并使其根据浮动方向对齐。浮动元素会影响周围元素的布局。
  9. 请解释一下 CSS 中的盒子模型和内容溢出(overflow)属性。
    答案:CSS 盒子模型是用来描述元素的布局方式,内容溢出属性用于控制当元素中的内容超过元素框时如何处理溢出的部分。
  10. 请解释一下 CSS 中的媒体查询(media queries)。
    答案:媒体查询是一种在 CSS 中使用媒体类型和特定条件来应用样式的方法。它可以根据设备的特性(如屏幕宽度、像素密度等)动态地调整样式。
  11. 请解释一下 CSS 中的盒子阴影(box-shadow)属性。
    答案:盒子阴影属性用于在元素周围创建一个或多个阴影效果。它可以指定阴影的颜色、模糊半径、偏移量等。
  12. 请解释一下 CSS 中的动画(animation)属性。
    答案:动画属性用于在元素上创建动画效果。它可以定义动画的关键帧、持续时间、延迟等属性。
  13. 请解释一下 CSS 中的弹性布局(Flexbox)。
    答案:弹性布局是一种用于创建灵活的、自适应的布局的 CSS 模块。它通过使用容器和项目的属性来控制元素在主轴和交叉轴上的对齐和分布。
  14. 请解释一下 CSS 中的网格布局(Grid)。
    答案:网格布局是一种二维布局系统,用于将页面划分为行和列,并通过使用容器和项目的属性来控制元素在网格中的位置和大小。
  15. 请解释一下 CSS 中的响应式设计(Responsive Design)。
    答案:响应式设计是一种设计方法,通过使用媒体查询和流动布局等技术,使网站或应用能够在不同的设备和屏幕尺寸上提供最佳的用户体验。
  16. 请解释一下 CSS 中的变量(Variables)。
    答案:CSS 变量是一种用于存储和重用值的机制。它们使用自定义属性(如 --color: red;)来定义,并通过 var() 函数在其他地方引用。
  17. 请解释一下 CSS 中的渐变(Gradients)。
    答案:渐变是一种在元素背景或文本中创建平滑过渡效果的方法。它可以是线性渐变(沿着一条直线方向)或径向渐变(从中心向外扩散)。
  18. 请解释一下 CSS 中的字体图标(Icon Fonts)。
    答案:字体图标是使用字体文件来显示图标的方法。通过将图标设计为字体字符,并将字体文件引入页面,可以使用 CSS 控制图标的样式和大小。
  19. 请解释一下 CSS 中的屏幕阅读器隐藏(Screen Reader Hiding)。
    答案:屏幕阅读器隐藏是一种技术,用于将某些内容隐藏或屏蔽,以使屏幕阅读器用户不会听到或感知到这些内容。
  20. 请解释一下 CSS 中的响应式图像(Responsive Images)。
    答案:响应式图像是一种优化图像显示的方法,使图像能够根据设备的屏幕尺寸和分辨率自动调整大小和加载适当的图像版本。常见的实现方法包括使用 srcset 和 sizes 属性。