巧用 CSS 实现炫彩三角边框动画
作者:chokcoco
来源:SegmentFault 思否社区
最近有个小伙伴问我,在某个网站看到一个使用 SVG 实现的炫彩三角边框动画,问能否使用 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;
}
}
![](https://filescdn.proginn.com/325fa10c7e386a59d263a2fbd0b55e12/e58dc395c3d884c9e722d7e1067c6d27.webp)
基于矩形图形得到三角形
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);
}
![](https://filescdn.proginn.com/38f28d49ae32a6f180aa1e910c0a49d8/1c66a497f1f950514087138507c53f2a.webp)
![](https://filescdn.proginn.com/4620e65acc4f55a9ea14b9a64073c7ef/b31445dfa1d96626f68b91aa3b06c474.webp)
如果背景色不是实色而是渐变色,这个方法就失效了 这个方法实现的三角形边框内侧无法添加阴影效果
![](https://filescdn.proginn.com/2bc1433b0a2ba8f147c9d9078b11225c/ee1a262001d53c5f007359b72408b2c9.webp)
![](https://filescdn.proginn.com/8afd4b696354852eb824868f3116ed00/1b5d02610c3a9e72d2735e198a5fdf4e.webp)
![](https://filescdn.proginn.com/2c78e776a140f26a5b97ebd6c85c8346/039e0e3cb24a94631e3dc32a3092de6a.webp)
@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;
}
}
![](https://filescdn.proginn.com/44dbebfdd500288eb03df9e379d60e64/e6d2f52e9cd7327d6214c71614935505.webp)
利用 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;
}
}
![](https://filescdn.proginn.com/176fe10a8cff0cf6ba53c490ed33d3cb/4113a141ef25a5084a2a375aafc11b75.webp)
使用 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;
}
}
![](https://filescdn.proginn.com/176fe10a8cff0cf6ba53c490ed33d3cb/4113a141ef25a5084a2a375aafc11b75.webp)
![](https://filescdn.proginn.com/d835d78818718d0c8f08c107b570f015/41bf087bf15f0085b59cd0d648b75fb1.webp)
{
clip-path: polygon(0% 0%,0% 100%,25% 100%,25% 25%,75% 25%,75% 75%,25% 75%,14% 100%,100% 100%,100% 0%);
}
![](https://filescdn.proginn.com/71ba18c8831744e59d83660bf85c7931/0fbcfd3fef5e71b3f2c7513448263e33.webp)
{
clip-path: polygon(50% 0%,0% 100%,13% 100%,50% 20%,85% 90%,8% 90%,8% 100%,100% 100%);
}
![](https://filescdn.proginn.com/825c3c12320a7d077c16482787bf6168/eb4f70585f79109648141b1f6c8c5f1a.webp)
clip-path:奇妙的 CSS shapes(CSS图形)
CSS @property 自定义属性:CSS @property,让不可能变可能
利用 drop-shadow 生成不规则图形的光源及边框: 妙用 drop-shadow 实现线条光影效果
![](https://filescdn.proginn.com/ba095ec474a604990dd1f5ee4f5d5579/fdd760804d6c9f557f785f1af1c6d2b0.webp)
评论