侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

用纯CSS实现镂空效果的示例代码

前端  /  管理员 发布于 7年前   406

近来研究了一下镂空效果。

background-clip: text

背景被裁剪为文字的前景色。第一次是在 CSS-Tricks 看到的这个用法: 在 CSS-Tricks 网站上,这个玩意用得到处都是。

这样,做简单的图片背景镂空效果便不再困难了。关键代码只有几行。

.wrapper {  /* ... */  background-image: url("/path/to/your/image");  background-clip: text; /* ! */  color: transparent;    /* ! */}

就这几行,视觉上会就会有大变化。前后对比:

另外,这里有个比上面更实用的Demo

background-clip 既然是“background”家族的,那它天生和图片、渐变打的交道多。不过,我们做镂空总不会都是图片、渐变这种吧。如果我们想做视频、文字,甚至更复杂的 DOM 元素的镂空效果呢?

单刀直入: CSS mask 属性

这应该是最直接能想到的方法了。毕竟名字里就带个“mask”,谁能忽略呢?

CSS mask-* 系列属性是在 CSS Masking Module Level 1 中定义的。这个规范也定义了为很多人熟知的 clip 和 clip-path 属性,换句话说,这个CSS 模块包括遮罩和剪裁两部分。

第一个例子

虽然是一个新的属性,但设置 mask 属性并不难。下面就是我们的第一个例子。

<div class="masked" />
.masked {  height: 100px;  width: 100px;  background: linear-gradient(red, orange, yellow, lightgreen, blue, purple, red);  mask: url("https://github.githubassets.com/pinned-octocat.svg");}

就是下面的效果啦。

上面的用法还是很简单的,我们指定了一个 mask 参数,它的值是一张 从GitHub盗的 SVG图片。于是多彩的渐变就被 裁剪 遮罩成了那只著名的猫。

mask-* 大家族

mask 属性实际上是诸多 mask-* 的缩写:

mask-imagemask-repeatmask-positionmask-clipmask-originmask-size-mask-typemask-compositemask-mode

有没有 background-* 的即视感?没错,里面的不少属性都是和 backgorund / border 一致的,而且它们的作用也是一致的,只不过 background-* 用在背景上,而 mask-* 用在遮罩层上而已——用在背景上的奇技淫巧搬到 mask 的世界里还能接着用!比如实现这样的效果:

.masked {  height: /* ... */;  width: /* ... */;  background: /* ... */;  mask-image: url(https://github.githubassets.com/pinned-octocat.svg);  mask-size: 5em;  mask-position: center;  /* 如果你心情好,加个动画也没问题的 */}

进一步控制遮罩效果

可能读者已经发现了, mask-* 家族里有几张生面孔。这也好理解: mask 这么强大的特性,完完全全地抄 background-* 岂不可惜了。

mask-mode

mask-mode 用来指定具体的遮罩方式。

mask-type CSS 属性设置 mask-image 被用于“亮度型”的遮罩还是“不透明度”型的遮罩。 mask-mode: alaph 表示使用不透明度(即alaph通道)作为 mask value, mask-mode: luminance 表示使用亮度值作为 mask value。

那,遮罩值 / mask value 又是什么?mask value 表示被遮罩的元素被遮罩的程度。mask value 越大,被遮罩区域会更偏向于显露,mask value 最大的时候,那个区域就完全不透明了。举个例子:

<div class="mode">ABCDEFG</div>
.mode {  height: 200px;  width: 300px;  /* and more */  mask-image: linear-gradient(to left, black, yellow);  mask-mode: luminance; /* or alaph ? */}

左边是遮罩图片,中间是 luminance 右边使用 alaph 。这里的图片是不透明的,所以将一个恒不透明的图片在 alaph 模式下作为遮罩,其结果是没有遮罩效果。但是图片是有亮度变化的,所以 luminance 下的被遮罩元素就呈现出透明度的变化了。

一般 luminance 模式慢一点点,因为每一个像素点的亮度值需要根据 RGB 三个通道的值计算出来。

mask-composite

指定当有多个遮罩图片叠加起来的时候,如何处理遮罩效果。一些属性值的效果依赖于 mask-image 的层级次序。

用MDN 提供的这个 CodePen 来感受一下

关于 mask 的知识就讲到这里,更具体更准确的说明还是 要到 MDN 看一看 。

混合模式

这应该是最为神奇的一种方法了。使用PS的时候,经常会看见“混合模式”这个词。还记得多年前我初次使用 Photoshop 的时候还很好奇“混合模式”是什么东西,顿时让我对 Photoshop 充满了敬畏之情。不过,当年的敬畏归敬畏,现在这里说的“混合模式”还是蛮好理解的。

所谓的“混合模式”,是指当一种当层重叠时计算像素最终颜色值的方法。每种混合模式接收前景颜色值和背景颜色值(分别为顶部颜色和底部颜色)作为输入,执行一些计算并输出最后要显示在屏幕上的颜色值。最终的可见的颜色是对层中的每个重叠像素执行混合模式计算所得的结果。 说白了,混合模式确定了把一层叠加到另一层上去会得到什么结果。

在 CSS 中,可以使用 mix-blend-mode 来指定混合模式。

你可能会问了,平时也没有用什么“混合模式”这种东西,所以 blend-mode 的默认值是 none 吗?可不是。其实,这种最常见的 上层把下层“遮住”了的情况也属于一种混合模式,叫 normal ,它本质上是一种只保留前景颜色值而完全抛弃背景颜色值的混合模式。

这里我们只讨论实现镂空效果用到的混合模式 —— screen 。这种混合模式有一个特性,前景层是黑色导致最终可见的颜色直接是背景层的颜色,前景层是白色导致最终可见的颜色直接是白色。

相信你已经搞不明白这和镂空有什么关系了,下面举个例子看一下。

现在,我们有一个 <video> ,以及一个“白底黑字”的Logo浮层。

我们在浮层框上加上下面的 CSS:

.logo {    /* ... ... */    mix-blend-mode: screen;}

就变成了下面的样子:

 

去这个 Demo,看具体代码和效果

齿轮图标确实是变为镂空的了。不过,为什么呢?

先来明确一件事:把浮层置于视频之上,浮层是“前景”,视频是“背景”。先来看浮层的白色部分,因为把白色置于任何颜色之上都得到白色,所以白色部分被保留;而因为黑色置于任何颜色之上都得到下层的颜色,所以黑色部分呈现镂空效果。

但是这样的实现比较 Hack,因为这里只使用了黑白两色,如果使用其它的颜色作为浮层的 background-color ,得到的就不会像是镂空的效果了,这时还是得请上面的 mask 家族出场。不过,单单对于白底的情况, mix-blend-mode 不失为一个可行的解法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    关于CSS引入方式的详细见解小结
    下一条:
    使用智能 CSS 基于用户滚动位置应用样式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客