复刻解析一个流光溢彩炫到掉渣的 CSS 动画按钮

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 最近在看 next.js 官网是被引流到 conf 页面,发现上面有一个炫酷的按钮,按钮的边框色彩不断变动给人感觉是光在随着按钮旋转一般,感觉挺酷的,复刻一下讲解下原理。

网络异常,图片无法展示
|


最近在看 next.js 官网是被引流到 conf 页面,发现上面有一个炫酷的按钮,按钮的边框色彩不断变动给人感觉是光在随着按钮旋转一般,感觉挺酷的,复刻一下讲解下原理。

结构复刻

先复刻下结构,原版有非常多的 DOM 节点,而且按钮什么的都是通过定位去放到框里的,很容易在元素偏移时导致按钮跑出边框,咱复刻归复刻,顺路给他优化优化:

<div class="shining-gradient-svg_wrapper">
    <div class="shining-gradient-svg_gradient shining-gradient-svg_rainbowGradient">
        <div class="shining-gradient-svg_childWrapper">
            <button class="cta-button_root reset_reset" type="button">
                <div class="avatar_avatarContainer">
                    <img
                        src="https://avatars.githubusercontent.com/ZxBing0066"
                        width="24"
                        height="24"
                        decoding="async"
                        class="avatar_avatar"
                    />
                </div>
                Go and explore
                <svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
                    <path
                        d="M3.3335 8H12.6668"
                        stroke="white"
                        stroke-linecap="round"
                        stroke-linejoin="round"
                        stroke-width="1.5"
                    ></path>
                    <path
                        d="M8 3.33331L12.6667 7.99998L8 12.6666"
                        stroke="white"
                        stroke-linecap="round"
                        stroke-linejoin="round"
                        stroke-width="1.5"
                    ></path>
                </svg>
            </button>
        </div>
    </div>
</div>
复制代码

按钮中间空空荡荡会影响观感,所以我连内部的头像、文字、图标就一起复刻了。原版边框和按钮为同级,我这里改造下将按钮嵌入进去,所以后续代码与原版并不一致,但是自适应程度会好很多,不需要写死宽高、固定定位。

流光复刻

外层的样式随便写一下,为了让光彩更漂亮我们背景一样选择黑色,毕竟大白天的极光哪有晚上看起来好看。

:root,
body {
    height: 100%;
    background-color: #000;
}
.shining-gradient-svg_wrapper {
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    height: 100%;
}
复制代码

还有按钮的样式就随便抄一下,就一些 border-radiusflex 啥的,这里不贴了。

研究了下他的边框流光效果,发现其实并不是 borderoutline 一类的东西,而是 background,然后通过 -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); 使用 mask 将内容区域进行遮挡,导致看起来只剩下一个边框。

.shining-gradient-svg_wrapper {
    --full-gradient: radial-gradient(#c42d01 0%, #c42d01 10%, #fcf26e 40%, #00e754 60%, #00eef4 70%, #0070f3 100%);
}
.shining-gradient-svg_gradient:before {
    content: '';
    position: absolute;
    z-index: -1;
    inset: calc(var(--b) * -1);
    height: 100%;
    width: 100%;
    background: var(--full-gradient);
    background-size: 300% 300%;
    padding: var(--b);
    border-radius: 32px;
    -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
}
复制代码

.shining-gradient-svg_gradient 使用 before 伪元素,将其绝对定位,再通过 insetpadding 将其面积扩大,这里用了一个变量,方便控制溢出背景的大小。然后使用渐变背景,并将尺寸扩大到 3 倍。

再通过 mask-compositemask 进行背景遮照,就可以将渐变背景变得只剩下边框。不过这俩属性兼容并不佳,其实有挺多其它方案来实现相同的效果,比如直接设置按钮区域的背景色,由于按钮区域层级在伪元素之上,中间的背景色直接就被覆盖了。

如果去掉背景截取,我们可以看到效果是这样:

网络异常,图片无法展示
|

感觉还不错的样子。核心样式我们已经复刻完成了,我们再来加上动画。要制造出光线移动的效果,我们只需要慢慢的移动背景,由于渐变色颜色过渡都是循序渐进的,这样在只剩下边框时,就会有一种边框色在流动的感觉。

@keyframes shining-gradient-svg_translateGradient {
    0% {
        background-position: -20% -20%;
    }
    25% {
        background-position: 30% 80%;
    }
    50% {
        background-position: 110% 110%;
    }
    75% {
        background-position: 80% 30%;
    }
    to {
        background-position: -20% -20%;
    }
}
.shining-gradient-svg_gradient:before {
    animation: shining-gradient-svg_translateGradient var(--animation-speed) linear infinite;
    will-change: background-position;
}
复制代码

定义一下 keyframes,之前写过很多篇关于动画内容的,这里就不解释 keyframesanimation 中的属性了,此处可以加上 will-change,可以让浏览器提前知道哪些属性会变动,能有有利于浏览器性能。

演示

某些屏幕边框圆角显示效果较差,为了效果更明显,将边框设置为了 2px。

总结

借助渐变背景色和背景移动动画,我们可以制造出这种边框光在边框中流动的感觉,感觉还是蛮有趣的。果然动画创意才是精髓。

相关文章
|
5月前
|
自然语言处理 前端开发 JavaScript
用 通义灵码 一键生成“水波纹按钮”,连 CSS 动画都不用自己写了!
通义灵码是一款智能编程辅助工具,它可以根据自然语言指令自动生成高质量的代码。例如,只需输入“生成一个按钮,点击时带水波纹动画,模拟 Material Ripple 效果”,它就能生成具备完整交互逻辑、CSS 动画和良好性能的按钮组件。不仅如此,它还支持拓展功能,如长按触发提示、添加图标等,并能自动优化样式适配不同场景。通过通义灵码,开发者可以大幅提升效率,专注于创意实现,而不必纠结于繁琐的代码细节。
|
10月前
|
前端开发 JavaScript
CSS 过渡和动画
CSS过渡和动画是用于为网页元素添加动态效果的两种重要技术
506 143
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
Animation属性 css3为Animation动画提供的几个属性如下: 属性名 属性值 animation-name 指定动画名称,该属性指定一个已有的关键帧定义。 animation-duration 指定动画持续时间。 animation-timing-funtion 指定动画变化速度。 animation-delay 指定动画延迟多长时间才开始执行。 animation-iteration-count 指定动画的循环执行次数。 animation:这是一个复合属性。
219 1
|
11月前
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
227 34
|
11月前
jQuery+CSS3实现404背景游戏动画源码
jQuery+CSS3实现404背景游戏动画源码
176 22
|
12月前
|
JavaScript 前端开发
jQuery和CSS3滑动展开菜单按钮插件
这是一款jQuery和CSS3滑动展开菜单按钮插件。该滑动展开菜单按钮在用户点击主菜单按钮之后,子菜单以滑动的方式依次展开
183 21
纯css3实现的百分比渐变进度条加载动画源码
纯css3实现的百分比渐变进度条加载动画特效源码
219 31
|
Web App开发 移动开发 JavaScript
纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码
这是一款基于纯CSS3+SVG实现的节日庆祝五彩纸屑动画效果源码。画面中左下角是一个圆锥形礼炮卡通效果,呈现出节日庆祝时礼花爆破、五彩纸屑纷飞的动画特效。整体动画效果采用纯css3+svg实现,没有引入任何外部图形或js脚本元素。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
240 6
|
前端开发 JavaScript UED
CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画
本文探讨了CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画,这些效果增强了页面的吸引力和互动性。视差滚动通过不同层次元素的差异化移动,增加了页面的深度感和沉浸感。文章还讨论了实现方法、性能优化及案例分析,旨在为设计师和开发者提供实用指导。
315 7
CSS3制作的聚光灯下倒影文字选装动画特效源码
CSS3聚光灯下倒影文字特效是一段基于CSS3实现的聚光灯下带倒影的文字旋转动画效果代码,具有真实的视觉感,同时文字还会在旋转过程中显示出灯光的反射效果,很有意思,欢迎对此段代码感兴趣的朋友前来下载使用。
144 6

推荐镜像

更多
  • DNS