<template>
<div class="title">扩散特效</div>
<!-- 可以通过讲宽高设置为0,实现应用滤镜效果,但不隐藏SVG元素 -->
<svg class="hideSVG">
<defs>
<!-- 这是一个 SVG 内发光效果示例(内发光可以设置颜色,内阴影一般只有黑色) -->
<!-- SVG 的内阴影滤镜与 box-shadow 不同点 -->
<!-- box-shadow 以CSS 盒子模型为标准,所以所有的发光、阴影效果都是方形的(圆角贴合除外) -->
<!-- SVG 的滤镜是以 SVG 几何元素为边界进行的,所以形状是不固定的 -->
<filter id="innershadow" x0="-50%" y0="-50%" width="200%" height="200%">
<feComponentTransfer in=SourceAlpha>
<feFuncA type="table" tableValues="1 0" />
</feComponentTransfer>
<feGaussianBlur stdDeviation="3" />
<feOffset dx="0" dy="0" result="offsetblur" />
<feFlood flood-color="#0d619d" result="color" />
<feComposite in2="offsetblur" operator="in" />
<feComposite in2="SourceAlpha" operator="in" />
<feMerge>
<feMergeNode in="SourceGraphic" />
<feMergeNode />
</feMerge>
</filter>
</defs>
</svg>
<!-- 有了 filter,在项目的任意一个地方都可以使用 -->
<!-- 因为 SVG 的作用于 属于 DOM 层,不在 js 的文件作用于中,所以 SVG 的元素属性是全局的 -->
<!-- 注意在创建滤镜的时候不要重名 -->
<svg viewBox="0 0 100 100" class="SVG">
<!-- 滤镜效果可以写在其他位置,但是所在SVG元素不能隐藏 -->
<!-- 可以通过给 SVG 几何元素设置样式来编写 keyframes 动画 -->
<!-- 但由于 SVG 几何元素 的中心点位置并不是元素中心,所以动画需要手动设置位置 -->
<polygon class="item" filter="url(#innershadow)" points="50,0 93.3,25 93.3,75 50,100 6.7,75 6.7,25 " />
<polygon class="item delay-1s" filter="url(#innershadow)" points="50,0 93.3,25 93.3,75 50,100 6.7,75 6.7,25 " />
<polygon class="item delay-2s" filter="url(#innershadow)" points="50,0 93.3,25 93.3,75 50,100 6.7,75 6.7,25 " />
</svg>
<br><br>
</template>
<script setup>
</script>
<style lang="less" scoped>
.title {
padding: 5px 10px;
margin-bottom: 10px;
font-size: 16px;
border-bottom: 1px solid #999;
}
.hideSVG {
width: 0;
height: 0;
}
.SVG {
height: 100px;
}
.item {
animation: diffusion linear infinite 3s;
/* 设置元素缩放的中心点 */
transform-origin: 50% 50% 0;
/* 因为内阴影是滤镜实现的,所以背景色不能为透明(背景有颜色才能基于背景实现滤镜,没有颜色则应用不了滤镜) */
fill: #000;
fill-opacity: 0.4;
transform: scale(0);
&.delay-1s {
animation-delay: 1s;
}
&.delay-2s {
animation-delay: 2s;
}
}
@keyframes diffusion {
/* 扩散其实就是从透明,中心点缩放为0,到不透明,缩放为100% 的过程 */
0% {
opacity: 0;
transform: scale(0);
}
/*
// 中间插入两个关键帧,用于更改动画的视觉效果,
// 原理跟动画曲线类似,但是由于关键帧可以单独控制每个属性的过程,
// 相对比较简单一些。
*/
30% {
opacity: 1;
transform: scale(0.3);
}
90% {
opacity: 1;
transform: scale(0.9);
}
100% {
opacity: 0;
transform: scale(1);
}
}
</style>
12-21
1285
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)