LPL Ban/Pick 选人阶段的遮罩效果是如何实现的?

简介: LPL Ban/Pick 选人阶段的遮罩效果是如何实现的?

最近 S11 LPL 春季赛开赛,在看比赛的过程中,我发现新赛季的 Ban/Pick 选人阶段,出现了一种新的,有意思的遮罩效果,如下图所示:

32680b6c93d64187a1d8f54dd4c18b0e_tplv-k3u1fbpfcp-zoom-1.png


当然,它是一个动态的效果,当选人的过程中,会有一种呼吸的效果:


36344b9c22a744c4beacf07fa31cc3f3_tplv-k3u1fbpfcp-zoom-1.gif


Gif 图有点糊,总的而言,就是一种接近迷雾的遮罩效果。并且,他是能够动态变化的。

本文将探究,在 CSS 中,我们应该如何去实现类似的效果。


实现烟雾化遮罩效果



首先,我们来尝试实现这样一个动态遮罩:

12186130f55345b6bd315dde73de87f4_tplv-k3u1fbpfcp-watermark.gif


假设没有模糊的边缘,及烟雾化的效果,它其实就是一个渐变:


<div></div>
div {
    width: 340px;
    height: 180px;
    border: 2px solid #5b595b;
    background: linear-gradient(
        rgba(229, 23, 49, 1),
        rgba(229, 23, 49, .9) 48%,
        transparent 55%,
    );
}


经由上述代码,我们可得到:

77b63937a9524264b2ae72b17ee74bb1_tplv-k3u1fbpfcp-zoom-1.png


好吧,看着确实平平无奇,我们如何利用它,得到一个雾化的效果呢?


提到烟雾,聪明的同学应该能想到滤镜,当然,是 SVG 的 <feturbulence> 滤镜。


没错,又是它,<feturbulence> 确实太有意思了,我最近的两篇关于它的文章 -- Amazing!!CSS 也能实现烟雾效果?Amazing!!CSS 也能实现极光? 可以一并阅读。


<feturbulence> 的 type="fractalNoise" 在模拟云雾效果时非常好用。该滤镜利用 Perlin 噪声函数创建了一个图像,能够实现半透明的烟熏或波状图像,用于实现一些特殊的纹理。


这里,我们利用 <feturbulence> 滤镜简单处理一下上述图形:


<div></div>
<svg width="0">
  <filter id="filter">
    <feTurbulence id="turbulence" type="fractalNoise" baseFrequency=".03" numOctaves="20" />
    <feDisplacementMap in="SourceGraphic" scale="30" />
  </filter>
</svg>

CSS 中,可以利用 filter: url() 对对应的元素引入该滤镜:


div {
    ...
    filter: url(#smoke);
}


作用了滤镜的元素的效果:

46eff8fcfc7f4b57bd96e50056b86d7a_tplv-k3u1fbpfcp-zoom-1.png


由于我给元素加了边框,整个边框也被雾化了,这不是我们想要的,可以使用伪元素改造一下,边框作用于容器,使用伪元素实现渐变,将滤镜作用于伪元素:


div {
    position: relative;
    width: 340px;
    height: 180px;
    border: 2px solid #5b595b;
    &::before {
        content: "";
        position: absolute;
        left: 0;
        top: 0;
        right: 0;
        bottom: 0;
        background: linear-gradient(
            30deg,
            rgba(229, 23, 49, 1),
            rgba(229, 23, 49, .9) 48%,
            transparent 55%,
        );
        filter: url(#smoke);
    }
}


改造后的效果如下:

a34db6b4c83c4744b361c7b0d59d5372_tplv-k3u1fbpfcp-zoom-1.png


好,又接近了一步,但是四周有很多瑕疵没有被填满。问题不大,我们改变一下定位的 top \ left\ right \ bottom,让伪元素超出父容器,父容器设置 overflow: hidden 即可:


div {
    ....
    overflow: hidden;
    &::before {
        ....
        left: -20px;
        top: -10px;
        right: -20px;
        bottom: -20px;
        background: linear-gradient(
            30deg,
            rgba(229, 23, 49, 1),
            rgba(229, 23, 49, .9) 48%,
            transparent 55%,
        );
        filter: url(#smoke);
    }
}


调整之后,看看效果:


5d17236c486940ddb9b1f46a31d1e0e1_tplv-k3u1fbpfcp-zoom-1.png

有点那感觉了,下一步,只需要让烟雾元素动起来,为了让整个效果连贯(由于 SVG 动画本身不支持类似 animation-fill-mode: alternate 这种特性),我们还是需要写一点 JavaScript 代码,控制动画的整体循环。


大概的代码是这样:


const filter = document.querySelector("#turbulence");
let frames = 1;
let rad = Math.PI / 180;
let bfx, bfy;
function freqAnimation() {
    frames += .35;
    bfx = 0.035;
    bfy = 0.015;
    bfx += 0.006 * Math.cos(frames * rad);
    bfy += 0.004 * Math.sin(frames * rad);
    bf = bfx.toString() + " " + bfy.toString();
    filter.setAttributeNS(null, "baseFrequency", bf);
    window.requestAnimationFrame(freqAnimation);
}
window.requestAnimationFrame(freqAnimation);


这段代码做的事情,其实只有一个,就是让 SVG 的 #turbulence 滤镜的 baseFrequency 属性,在一个区间内无限循环,仅此而已。通过改变 baseFrequency,让整个烟雾不断变化。


至此,我们就得到了一幅完整的,会动的烟雾遮罩:

5397a608f79f43c2944c635871f065ef_tplv-k3u1fbpfcp-watermark.gif


补充下框内的图片,就能得到一开始给出的效果图效果:


c7bce574d1124fec8ea6a85bf445da44_tplv-k3u1fbpfcp-watermark.gif


完整的代码,你可以戳这里 -- CodePen Demos -- LPL BAN PICK MASK Effect

实现呼吸状态的遮罩效果



在上述基础上,再加入呼吸的效果,其实就非常简单了。


我们只需要去改变渐变的一个位置即可,方法非常多,这里我给一个较为优雅但是兼容性可能没那么好的方法 -- CSS @property。


简单改造上述代码:


@property --per {
    syntax: "<percentage>";
    inherits: false;
    initial-value: 22%;
}
div::before {
    ...
    background: linear-gradient(
        30deg,
        #ff0020,
        rgba(229, 23, 49, .9) var(--per),
        transparent calc(var(--per) + 8%),
    );
    filter: url(#smoke);
    animation: change 2s infinite ease-out;
}
@keyframes change {
    50% {
        --per: 18%;
    }
}


这样,呼吸效果就实现了:

9dc6a460a5134b09bc8662164a014cb4_tplv-k3u1fbpfcp-zoom-1.gif

完整的代码,你可以戳这里 -- CodePen Demos -- LPL BAN PICK MASK Effect

目录
相关文章
|
2月前
Force Yc团队最新第五次创作引导页源码
Force Yc团队最新第五次创作引导页源码 此源码可以播放自己的音乐 无法播放视频背景!~ 音乐修改:music 音乐名称:bgm.mp3 LOGO修改:images 图片名字:top-logo.mp4 文本修改:index.html Notepad++编辑
43 10
Force Yc团队最新第五次创作引导页源码
|
6月前
|
Java 开发者 Windows
🎉告别抓狂!Smart Input自动切换输入法来啦🚀
🎉告别抓狂!Smart Input自动切换输入法来啦🚀
462 0
|
6月前
复现sci顶刊中的画中画(局部细节放大)
复现sci顶刊中的画中画(局部细节放大)
412 0
|
6月前
|
程序员 API
Compose:警惕Loop(遍历),图文并茂带你深度释疑,解决的不仅是性能问题
Compose:警惕Loop(遍历),图文并茂带你深度释疑,解决的不仅是性能问题
131 0
聊天框(番外篇)—如何实现@功能的整体删除
上一篇文章中,我们已经初步实现了聊天输入框,但其@功能是不完善的,例如无法整体删除、无法获取除用户名以外的数据(假设用户名不是唯一的)。有问题就要想办法解决,在网上百度了一圈后,倒是有一些收获。本文就着重解决@的整体删除以及获取额外数据。
1109 0
聊天框(番外篇)—如何实现@功能的整体删除
YOLOv7默默更新了Anchor-Free | 无痛再涨1.4个mAP
YOLOv7默默更新了Anchor-Free | 无痛再涨1.4个mAP
393 0
【PR】如何做一个图片动画出场
【PR】如何做一个图片动画出场
158 0
【PR】如何做一个图片动画出场
|
算法 机器人 大数据
只需看一眼,伯克利最新机器人就可以copy你的动作!
通过观察另一个人的做法来学习一项新技能,即模仿的能力,是人类和动物智力的关键部分。我们能让机器人做同样的事情吗?
1393 0
|
容器 内存技术
【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条
原文:【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条   这一章讲解FluidMoveBehavior的另一个应用,这是一个绝对原创的做法,目前已经被微软收录在silverlight.net,作者就是烤地瓜本人^^ 。
1075 0