SVG扩散特效

78 篇文章 2 订阅
17 篇文章 0 订阅
<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值