关于css:使用-mask-实现视频弹幕人物遮罩过滤

62次阅读

共计 2517 个字符,预计需要花费 7 分钟才能阅读完成。

常常看一些 LOL 较量直播的小伙伴,必定都晓得,在一些弹幕网站(Bilibili、虎牙)中,当人物与弹幕呈现在一起的时候,弹幕会“ 奇妙 ”的躲到人物的上面,看着十分的智能。

简略的一个截图例子:

其实,这里是使用了 CSS 中的 MASK 属性实现的。

mask 简略用法介绍

之前在多篇文章都提到了 mask,比拟具体的一篇是 — 微妙的 CSS MASK,本文不对 mask 的基本概念做过多解说,向下浏览时,如果对一些 mask 的用法感到纳闷,能够再去看看。

这里只简略介绍下 mask 的根本用法:

最根本,应用 mask 的形式是借助图片,相似这样:

{
    /* Image values */
    mask: url(mask.png);                       /* 应用位图来做遮罩 */
    mask: url(masks.svg#star);                 /* 应用 SVG 图形中的形态来做遮罩 */
}

当然,应用图片的形式后文会再讲。借助图片的形式其实比拟繁琐,因为咱们首先还得筹备相应的图片素材,除了图片,mask 还能够承受一个相似 background 的参数,也就是突变。

相似如下应用办法:

{mask: linear-gradient(#000, transparent)                      /* 应用突变来做遮罩 */
}

那该具体怎么应用呢?一个非常简单的例子,上述咱们发明了一个从彩色到通明渐变色,咱们将它使用到理论中,代码相似这样:

上面这样一张图片,叠加上一个从通明到彩色的突变,

{background: url(image.png) ;
    mask: linear-gradient(90deg, transparent, #fff);
}

利用了 mask 之后,就会变成这样:

这个 DEMO,能够先简略理解到 mask 的根本用法。

这里失去了应用 mask 最重要论断: 增加了 mask 属性的元素,其内容会与 mask 示意的突变的 transparent 的重叠局部,并且重叠局部将会变得通明。

值得注意的是,下面的突变应用的是 linear-gradient(90deg, transparent, #fff),这里的 #fff 纯色局部其实换成任意色彩都能够,不影响成果。

CodePen Demo — 应用 MASK 的根本应用

应用 mask 实现人物遮罩过滤

理解了 mask 的用法后,接下来,咱们使用 mask,简略实现视频弹幕中,弹幕碰到人物,主动被暗藏过滤的例子。

首先,我简略的模仿了一个召唤师峡谷,以及一些根本的弹幕:

不便示意,这里应用了一张动态图,示意了召唤师峡谷的地图,并非真的视频,而弹幕则是一条一条的 <p> 元素,和理论状况统一。伪代码大略是这样:

<!-- 地图 -->
<div class="g-map"></div>
<!-- 包裹所有弹幕的容器 -->
<div class="g-barrage-container">
    <!-- 所有弹幕 -->
    <div class="g-barrage">6666</div>
    ...
    <div class="g-barrage">6666</div>
</div>

为了模仿理论状况,咱们再用一个 div 增加一个理论的人物,如果不做任何解决,其实就是咱们看视频关上弹幕的感触,人物被视频所遮挡:

留神,这里我增加了一个人物亚索,并且用 animation 模仿了简略的静止,在静止的过程中,人物是被弹幕给遮挡住的。

接下来,就能够请出 mask 了。

咱们利用 mask 制作一个 radial-gradient,使得人物左近为 transparent,并且依据人物静止的 animation,给 mask 的 mask-position 也增加上雷同的 animation 即可。最终能够失去这样的成果:

.g-barrage-container {
    position: absolute;
    mask: radial-gradient(circle at 100px 100px, transparent 60px, #fff 80px, #fff 100%);
    animation: mask 10s infinite alternate;
}

@keyframes mask {
    100% {mask-position: 85vw 0;}
}

实际上就是给搁置弹幕的容器,增加一个 mask 属性,把人物所在的地位标识进去,并且依据人物的静止一直的去变换这个 mask 即可。咱们把 mask 换成 background,原理一看就懂。

  • 把 mask 替换成 background 示意图:

background 通明的中央,即 mask 中为 transparent 的局部,理论就是弹幕会被暗藏遮罩的局部,而其余红色局部,弹幕不会被暗藏,正是完满的利用了 mask 的个性。

其实这项技术和视频自身是无关的,咱们只须要依据视频计算须要屏蔽掉弹幕的地位,失去相应的 mask 参数即可。如果去掉背景和静止的人物,只保留弹幕和 mask,是这样的:

须要明确的是,应用 mask,不是将弹幕局部给遮挡住,而是利用 mask,指定弹幕容器之下,哪些局部失常展现,哪些局部通明暗藏

最初,残缺的 Demo 你能够戳这里:

CodePen Demo — mask 实现弹幕人物遮罩过滤

理论生产环境中的使用

当然,下面咱们简略的还原了利用 mask 实现弹幕遮罩过滤的成果。然而理论状况比上述的场景简单的多,因为人物英雄的地位是不确定的,每一刻都在变动。所以在理论生产环境中,mask 图片的参数,其实是由后端实时对视频进行解决计算出来的,而后传给前端,前端再进行渲染。

对于使用了这项技术的直播网站,咱们能够审查元素,看到包裹弹幕的容器的 mask 属性,每时每刻都在发生变化:

返回回来的其实是一个 SVG 图片,大略长这个样子:

这样,依据视频人物的实时地位变动,一直计算新的 mask,再实时作用于弹幕容器之上,实现遮罩过滤。

最初

本文到此结束,心愿对你有帮忙 :),本文介绍了 CSS mask 的一个理论生产环境中,十分有意义的一次实际,也表明很多新的 CSS 技术,使用切当,还是能给业务带来十分无益的帮忙的。

想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 — iCSS 前端趣闻 ????

更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。

如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。

正文完
 0