今天在开发官网的时候,参考了 deno 官网的边框流光样式:

这里记录一下。
梯度渐变的妙用
这里其实是用了梯度渐变 conic-gradient
,他指的是圆锥形变化的梯度:
css
--border-gradient-angle: 0turn;
background-image: conic-gradient(from var(--border-gradient-angle) at 50% 50%, transparent, #70ffaf 14%, transparent 17%)
上面的代码,指的是从第 0 转位置(中间垂直向上)开始,在中心点位置放置渐变,效果如下:

不会用的可以看官方解释 conic-gradient
然后我们加个旋转动画:
css
animation: buttonBorderSpin 9s linear infinite 0ms;
@keyframes buttonBorderSpin {
0% {
--border-gradient-angle: 0turn;
}
100% {
--border-gradient-angle: 1turn;
}
}
这个的意思就是说,线性旋转,旋转一整周(1turn),并周期循环的动画:

伪边框
这样你是不是就有思路了?!
对了,在这个div内部再盖一个div,让他小一号,留出一个伪边框的位置不就行了。
html
<div class="demo">
<div class="demo-content">
旋转流光
</div>
</div>
css
.demo {
background-image: conic-gradient(from var(--border-gradient-angle) at 50% 50%, transparent, #70ffaf 14%, transparent 17%);
background-size: contain;
padding: 1px; // 留出1个像素的位置
animation: buttonBorderSpin 9s linear infinite 0ms;
}
.demo-content {
width: 100%;
height: 100%;
background-color: black;
}
看看效果:

改变旋转点位置看看
上面的例子是扫描线沿着面板中心旋转的,我们将旋转点换一个位置:
css
background-image: conic-gradient(from var(--border-gradient-angle) at 30% -30%, transparent 25%, #70ffaf 75%, transparent);
旋转点定位到了元素外边,相当于外部有个光源找到了内部,会产生一种幻影的效果:

按照同样的方式添加动画和遮罩 content,看看效果:

本文只是给出了开发需要的两种动效,你可以根据自己的需要来设置自己的边框流光样式。
源码:边框流光效果