利用径向渐变做酷炫的按钮闪光效果

最近公司事情不多,就研究下自己感兴趣的东西

前置知识:需要理解径向渐变   径向渐变的连写各个属性的含义    边框背景,边框背景连写各个属性的含义

效果就是点击之后,会开启边框背景一个光点,然后移动的过程,不能上传视频,大家自己下载代码在本地看效果吧

本不想用js实现,最开始想到的是动画方式,在每个阶段改变border-image-source里径向渐变的圆心位置,但是发现不能成功,用的是连写的方式,后来猜想是不是连写方式不支持,我又把边框背景的每个属性进行拆分,动画的时候只改变border-image-source的值,发现也不行,测试代码如下(连写版,猜想是因为我们的动画要改变的是径向渐变的圆心位置,而圆心位置是相对于元素而言的,但是并没有类似background-position这样的属性去单独改变圆心位置,只能重新去设置这个属性,所以不能用动画实现,希望有知道的大佬能告知真正的原因)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    * {
        padding: 0;
        margin: 0;
    }
    body {
        background:#000
    }
    #box {
        margin: 100px auto;
        width: 200px;
        height: 100px;
        border:1px solid transparent;
        /* 如果使用动画不要使用连写方式 ,js不使用连写不生效,不知道为啥*/
        /* border-image-source: radial-gradient(20% 100%  at 0px 0px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1)); */
        /* border-image-slice: 1;
        border-image-width: 1px;
        border-image-outset: 0;
        border-image-repeat: stretch; */
        color:#fff;
        line-height: 100px;
        text-align: center;
        /* border-image:radial-gradient(20% 100%  at 0px 0px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch; */
        /* border-image:radial-gradient(20% 100%  at 200px 0px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch; */
        /* border-image:radial-gradient(20% 100%  at 200px 100px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch; */
        /* border-image:radial-gradient(20% 100%  at 0px 100px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch; */
        
    }

</style>
<body>
    <div id="box">
        点我试试!
    </div>
</body>
<script>
    let flag = false
    let timer
    let index = 0
    let box = document.getElementById('box')
    box.addEventListener('click',function(e){
        flag = !flag    
        
        if(flag){
            // 随后的时间里,让圆心动起来
            // e.target.style.borderImage = `radial-gradient(20% 75% at 0px 0px ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch `;
            timer = setInterval(() => {
                // debugger
                index+=1
                if(index<=200){
                    // e.target.style.borderImageSource =  `radial-gradient(20% 100%  at ${index}px ${widthHeight.top}px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1));`
                    e.target.style.borderImage = `radial-gradient(20% 75% at ${index}px 0px ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch `;
                } else if(index >200 && index < 300){
                    // e.target.style.borderImageSource =  `radial-gradient(20% 100%  at ${200}px ${300-index}px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1));` 
                    e.target.style.borderImage = `radial-gradient(20% 75% at 200px ${index-200}px ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch `;
                } else if(index >=300 && index <500){
                    // e.target.style.borderImageSource =  `radial-gradient(20% 100%  at ${100}px ${500-index}px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1));` 
                    e.target.style.borderImage = `radial-gradient(20% 75% at ${500-index}px 100px ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch `;
                } else if(index>=500 && index <=600){
                    // e.target.style.borderImageSource =  `radial-gradient(20% 100%  at ${0}px ${600-index}px  ,rgba(255,255,255,0.7),rgba(255,255,255,0.1));` 
                    e.target.style.borderImage = `radial-gradient(20% 75% at 0px ${600-index}px ,rgba(255,255,255,0.7),rgba(255,255,255,0.1) ) 1 / 1px / 0px stretch `;
                } else if(index >600){
                    // clearInterval(timer)
                    index=0
                }
                
            }, 1);
        } else {
            clearInterval(timer)
        }
    })
</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值