共计 4471 个字符,预计需要花费 12 分钟才能阅读完成。
最近有个小伙伴问我,在某个网站看到一个应用 SVG 实现的炫彩三角边框动画,问是否应用 CSS 实现:
很有意思的一个动画成果,立马让我想起了我在 CSS 奇思妙想边框动画 一文中介绍的边框动画,十分的相似:
其外围就是利用了角向突变(conic-gradient
),而后将图案的核心区域通过笼罩遮罩一个小号的图形实现。
然而,这个三角形动画里有两个难点:
- 整个图形是个三角形
在 CSS 中,咱们可比拟轻松的实现矩形与圆形,然而三角形这里无疑会辣手很多。
- 整个边框还附带暗影,并且暗影还是在边框的两侧
这里看似不简单,实则困难重重,如果采纳上述的办法,将图案的核心区域通过笼罩遮罩一个小号的图形实现镂空,那么另外一侧的暗影如何产生?即使应用 drop-shadow
,也会被笼罩的内侧图形给遮挡住。
当然,CSS 还是能够实现这个图形的,本文就将解说如何应用 CSS 实现上述炫彩三角边框动画。
通过角向突变实现主体动画
首先,咱们还是须要借助角向突变 conic-gradient
实现整个动画的主体。
<div></div>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
div {
width: 260px;
height: 260px;
background: conic-gradient(from var(--angle), hsl(162, 100%, 58%), hsl(270, 73%, 53%), hsl(162, 100%, 58%));
animation: rotate 3s infinite linear;
}
@keyframes rotate {
to {--angle: 360deg;}
}
外围就仅仅只是一个角向突变图案,配合 CSS @Property,让整个成果旋转起来:
当然,如果这里感觉 CSS @Property 不好了解或者放心兼容性问题,能够替换成利用伪元素实现同样的图形,而后进行 transform: rotate()
旋转,成果一样。
基于矩形图形失去三角形
OK,接下来,咱们须要基于矩形图形失去三角形图形,对于外圈的三角形,咱们能够通过 clip-path
切割失去,也十分的简略:
div {
width: 260px;
height: 260px;
background: conic-gradient(from var(--angle), hsl(162, 100%, 58%), hsl(270, 73%, 53%), hsl(162, 100%, 58%));
animation: rotate 3s infinite linear;
+ clip-path: polygon(0 100%, 100% 100%, 50% 0);
}
即可失去如下成果:
这样,咱们就失去了一个实心的三角形。接下来须要先方法把外部给掏空。
最简略的思路就是,通过叠加一个小一号的图形在两头,色彩和背景色统一即可:
残缺的代码你能够戳这里 — CodePen Demo — Pure CSS Linear Triangle
然而,这样做有两个致命问题:
- 如果背景色不是实色而是渐变色,这个办法就生效了
- 这个办法实现的三角形边框内侧无奈增加暗影成果
这两个缺点都是不可承受的,所以咱们必须寻找真正可能镂空两头的形式,镂空实现后,它的核心得是通明的。
因而,这里咱们得应用 mask。
不过应用 mask 基于这样一个图形再实现一个小一号的三角形是比拟麻烦的,咱们相当于要实现这样一个镂空三角形图形,示意图如下:
这样一个图形,配合 clip-path
,就能失去一个三角形边框图形,啥意思呢,我这里制作了一个动图示意:
右边是利用 mask
实现遮罩后的图形,左边是利用 clip-path
切割后的图形,它们的成果叠加在一起,就能实现一个边框三角形。
当然,这里须要对 mask 把握的比拟深刻,要应用 mask 切割一个外部镂空的三角形示意图如下:
OK,残缺的代码是这样:
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
div {
width: 260px;
height: 260px;
background: conic-gradient(from var(--angle), hsl(162, 100%, 58%), hsl(270, 73%, 53%), hsl(162, 100%, 58%));
clip-path: polygon(0 100%, 100% 100%, 50% 0);
mask:
linear-gradient(117deg, #000 55%, transparent 55%, transparent),
linear-gradient(-117deg, #000 55%, transparent 55%, transparent),
linear-gradient(#000, #000);
mask-position: 0 0, 130px 0, 0 250px;
mask-size: 130px 250px, 130px 250px, 100% 10px;
mask-repeat: no-repeat;
animation: rotate 3s infinite linear;
}
@keyframes rotate {
to {--angle: 360deg;}
}
咱们就失去了一个外部镂空的三角形边框了:
利用 drop-shadow 增加上光影
最初一步就比较简单了,因为上述三角形曾经是一个镂空图形,这里间接应用 drop-shadow
给元素加上一层光影成果即可,不过因为应用了 clip-path
,间接在原元素上增加的 drop-shadow
无奈展现,这个好解决,咱们只须要多套一层构造,将 drop-shadow
增加到父元素上即可:
<div class="g-container">
<div class="g-triangle"></div>
</div>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
.g-container {
width: 260px;
height: 260px;
filter: drop-shadow(0 0 5px hsl(162, 100%, 58%)) drop-shadow(0 0 10px hsl(270, 73%, 53%));
}
.g-triangle {
width: 260px;
height: 260px;
background: conic-gradient(from var(--angle), hsl(162, 100%, 58%), hsl(270, 73%, 53%), hsl(162, 100%, 58%));
clip-path: polygon(0 100%, 100% 100%, 50% 0);
mask:
linear-gradient(117deg, #000 55%, transparent 55%, transparent),
linear-gradient(-117deg, #000 55%, transparent 55%, transparent),
linear-gradient(#000, #000);
mask-position: 0 0, 130px 0, 0 250px;
mask-size: 130px 250px, 130px 250px, 100% 10px;
mask-repeat: no-repeat;
animation: rotate 3s infinite linear;
}
@keyframes rotate {
to {--angle: 360deg;}
}
这里又是一个小技巧,drop-shadow
是能够反复增加多个的,这里增加的两个暗影色彩就是 conic-gradient()
里设置的色彩,最终,咱们就失去了题图所示成果:
残缺的代码你能够戳这里 — CodePen Demo — Pure CSS Glowing Triangle
应用 clip-path 剪切环形三角形
下面利用了 clip-path
剪切外三角形,mask
镂空内三角形,经揭示,其实 clip-path
能够单独裁剪出一个环形三角形。
上述代码也能够简化成:
<div class="g-container">
<div class="g-triangle"></div>
</div>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
.g-container {
width: 260px;
height: 260px;
filter: drop-shadow(0 0 5px hsl(162, 100%, 58%)) drop-shadow(0 0 10px hsl(270, 73%, 53%));
}
.g-triangle {
width: 200px;
height: 200px;
clip-path:
polygon(
50% 0%,
0% 100%,
8% 100%,
50% 15%,
88% 93%,
7% 93%,
7% 100%,
100% 100%
);
background: conic-gradient(from var(--angle), hsl(162, 100%, 58%), hsl(270, 73%, 53%), hsl(162, 100%, 58%));
animation: rotate 3s infinite linear;
}
@keyframes rotate {
to {--angle: 360deg;}
}
成果一样:
残缺的代码你能够戳这里 — CodePen Demo — Pure CSS Glowing Triangle
这里有必要解说一下,应用 clip-path
切割一个环形图案,是能够做到的。假如,咱们须要一个正方形环形,其点程序如下:
{clip-path: polygon(0% 0%,0% 100%,25% 100%,25% 25%,75% 25%,75% 75%,25% 75%,14% 100%,100% 100%,100% 0%);
}
即可失去:
同理,须要失去一个三角形环形,只须要 7 个点即可:
{clip-path: polygon(50% 0%,0% 100%,13% 100%,50% 20%,85% 90%,8% 90%,8% 100%,100% 100%);
}
成果如下:
这里有个很好用的工具,辅助制作 clip-path
图形,感兴趣能够试下:CSS clip-path Editor
最初
理解上述残缺代码,你可能还须要补齐一些根底 CSS 常识,能够按需点进去理解:
- clip-path:微妙的 CSS shapes(CSS 图形)
- CSS @property 自定义属性:CSS @property,让不可能变可能
- 利用 drop-shadow 生成不规则图形的光源及边框: 妙用 drop-shadow 实现线条光影成果
好了,本文到此结束,心愿本文对你有所帮忙 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 — iCSS 前端趣闻 😄
更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。
如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。