几种通过阴影来弱化背景的CSS方法

 2016-10-08 09:10   网页设计   标签:css   1288    发表评论

很多时候,我们需要一层半透明的遮罩层来把后面的一些整体调暗,以便凸显某个特定的UI元素,引导用户关注。比如下图。这个效果最常见的实现方法就是增加一个额外的HTML元素用于遮挡背景,然后为它添加一些样式:

HTML常规方案

.overlay{/* 用于遮挡背景 */position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8);
}
.lightbox{/* 需要吸引用户注意的元素 */position:absolute;z-index:1;
}

这个方法稳定可靠,但要增加一个额外的HTML元素,这意味着该效果无法由CSS单独实现。这不是一个很严重的问题,但对我们来说又的确是个麻烦事。不过我们有其他的方法来做。

伪元素方案

我们可以用伪元素来消除额外的HTML元素,比如:

body.dimmed::before{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background:rgba(0,0,0,.8);
}

这个办法的确有一定改善,因为我们直接在CSS层面使用这个效果。不过问题来了,这个方法的可移移植性还不够好,因为<body>元素上可能有其他需求已经占用了::before元素;而且在这个效果时,我们往往还需要一点JavaScript来给<body>添加dimmed这个类。

如果遮罩层交给这个元素自己的::before伪元素来实现,就可以弥补这些不足了。给伪元素设置z-index:-1;,就可以让它出现在元素的背后,尽管这解决了可移植性的问题。但无法对遮罩层的Z轴进行细化控制。它可能会出现在这个元素之后,但也可能出现在这个元素的父元素之后。

这个方法还有一个问题,伪元素无法绑定独立的JavaScript事件处理函数。当遮罩层由一个独立的元素来实现时,我们可以给它绑定事件处理函数。当弹出层自己的伪元素来实现遮罩时,就需要判断用户到底点了弹出层还是遮罩层,这就变得相当辣手了。

box-shadow方案

对于简单的应用场景来说,我们可以利用box-shadow来达到调暗背景的效果:box-shadow的扩张参数可以把元素的投影向各个方向延伸放大。具体做法就是生成一个巨大的投影,不偏移也不模糊,简单地模拟出遮罩层的效果:

box-shadow:0 0 0 999px rgba(0,0,0,.8);

这个初步的解决方案有一个明显的问题,就是无法在较大的屏幕分辨率(>2000px)下正常工作。我们要么加大数字来缓解这个问题,要么换用视口单位来一劳永逸解决它。

这里我们用到了最适合的vmax单位。1vmax相当于1vw个1vh两者中的较大值。100vw等于这个视口的宽度,100vh就是视口的高度。因此,满足我们需求的最小值就是50vmax。

box-shadow:0 0 0 50vmax rgba(0,0,0,.8);

这个技巧非常简洁易用,但它存在两个非常严重的问题,从而制约了其使用场景:

第一,由于遮罩层的尺寸与视口相关,而不是与页面相关,当我们滚动页面时,遮罩层的边缘就露出来了,除非给它加上positon:fixed;这个样式,或者页面并没有长到需要滚动的程度。

第二,当一个独立的元素(或伪元素)来实现遮罩层时,这个遮罩层不仅可以从视觉上把用户的注意力引导到关键元素上,还可以放置用户与页面的其他部分发生交互,因为遮罩层会捕获所有的指针事件。box-shadow并没有这个能力,因此它只能在视觉上起到引导注意力的作用,却无法阻止鼠标交互。这一点是否可以接受,取决于你的具体需求。

box-shadow方案(不完全兼容)

如果你想引导用户关注一个元素就是一个模态的<dialog>元素(它可以用showModal()方法显示出来),那么根据浏览器的默认样式,它会自带一个遮罩层。借助::backdrop伪元素,这个原生的遮罩层可以设置样式的:

dialog::backdrop{background:rgba(0,0,0,.8);
}

不过可惜的是,在文章发表时这个兼容性还很不友好。

几种通过阴影来弱化背景的CSS方法相关推荐

  1. 文字阴影(HTML、CSS)

    文字阴影(HTML.CSS) <!DOCTYPE html> <html lang="en"><head><meta charset=&q ...

  2. 盒子阴影(HTML、CSS)

    盒子阴影(HTML.CSS) <!DOCTYPE html> <html lang="en"><head> <meta charset=& ...

  3. 【面试题】CSS 中几种最常用的水平垂直居中的方法

    目录 CSS 中几种最常用的水平垂直居中的方法 一.使用 margin:auto 二.使用 position:absolute 三.使用弹性布局 四.文本水平对齐和行高 五.使用网格布局 CSS 中几 ...

  4. css里面li标签怎么加图片_分享三种给li标签添加图标的方法

    我们在页面布局时,经常会用到li标签,单独使用li标签比较单调,有时候为了页面效果,需要加入图片,那怎么在li标签中添加图片呢?这篇文章就和大家分享三种给li标签添加图标的方法,希望对你有用. 1.使 ...

  5. 几种常用编程语言的编程思想和方法 转

    搞软件的人,编程语言的掌握是基本功,如果单单是学习语法,最慢的一周之内也应该可以搞定(个人认为 语法层面c++是最复杂的).不幸的是,软件的本质是逻辑,解决方案的设计是要借助某种解决问题或编程的思想的 ...

  6. jQuery CSS 操作 - css() 方法

    实例 设置 <p> 元素的颜色: $(".btn1").click(function(){$("p").css("color", ...

  7. li 字多出了省略号_文字溢出自动显示省略号css方法 -

    文字样式(Text Style)是一组可随图形保存的文字设置的集合,这些设置可包括字体设置以及特殊效果等.文字样式在不同的软件环境下显示的方式也会不一样.下面就来分享一下html中如何让文字竖排?总结 ...

  8. flex vue 垂直居中居上_推荐几种在移动端实现垂直居中的方法

    推荐几种在移动端实现垂直居中的方法. 方法1:table-cell html结构 垂直居中 CSS.box1{ display: table-cell; vertical-align: middle; ...

  9. oracle 视图去重复,CSS_Oracle几种查找和删除重复记录的方法总结,平时工作中可能会遇到当试图 - phpStudy...

    Oracle几种查找和删除重复记录的方法总结 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删 ...

最新文章

  1. ASP.NET MVC 过滤器(一)
  2. AWS S3宕机的启发: 云必须分散化
  3. sql server死锁的查询和解除
  4. 【python数据挖掘课程】十九.鸢尾花数据集可视化、线性回归、决策树花样分析
  5. 通过七牛云建立私有图床
  6. CSNN: An Augmented Spiking based Framework with Perceptron-Inception
  7. 【编码】-整数排序-2016.08.10
  8. python指定时间执行程序_如何在特定时间执行程序
  9. SQL 四舍五入 同时取规定小数位的数值
  10. 用SQL语句创建学生表
  11. Natas.4744幽灵王病毒的分析
  12. wince 播放器 最终版本
  13. Win10 系统时间错误
  14. 大众点评全球吃货地图 五一海外游神器
  15. springboot集成solr实现全局搜索系列
  16. iOS动画之大雪纷飞
  17. 冲激响应(impulse response)
  18. 使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能
  19. ffmpeg将mp3转m4a文件
  20. 职场小白新建SSM项目

热门文章

  1. B端产品经理基本工作流程
  2. 为什么大家觉得软件开发难学?
  3. 卡方线性趋势检验_统计学第七章 卡方检验【R语言实现】
  4. matlab误触键盘导致光标变成黑色方块的解决办法
  5. 唐骏:先做人再做事偶尔作作秀
  6. lightning接口_作为弟中弟的lightning数据线,苹果为什么就是不换呢?
  7. Django搭建个人博客:用户的注册
  8. 大数据存储:扩展Hadoop的十大要点
  9. Linux常用命令 经典版
  10. 电信L2-python考题1-完美字符串