有记 MSNC.CN有记 MSNC.CN
2024-06-13收录 152关注

今天要给大家分享的是一个很不错的CSS发光按钮,一共有6种不同的发光动画特效。

首先来看一看效果:

转动

滑动

闪烁

波动

搏动

脉冲

如果你觉得效果还比较满意,那么请往下看,看看这些个花里胡哨的动画都是怎么实现的。

要实现CSS的发光动画,无外乎是对以下几种CSS技术的组合使用:

  • box-shadow 属性

  • filter 属性

  • text-shadow 属性

  • SVG滤镜

  • CSS动画(@keyframes)或过渡(transition)

  • 混合模式(Blend Modes)

本文这个发光按钮主要采用了CSS动画属性以及mask-image属性,发光层其实就是自定义的遮罩层。

转动发光动画

首先来看看第一个转动发光动画的CSS代码:

@-webkit-keyframes spin {
    0% {
        --mask: 0deg;
    }
    100% {
        --mask: 360deg;
    }
}

@keyframes spin {
    0% {
        --mask: 0deg;
    }
    100% {
        --mask: 360deg;
    }
}

这里--mask是一个自定义属性,定义了发光遮罩层的角度属性:

@property --mask {
    syntax: "";
    inherits: false;
    initial-value: 33deg;
}

这里我们可以看到,整个按钮的发光遮罩层角度从0-360不停变换,这样就可以出现边缘光影不停旋转的视觉效果。

这里大家注意到一个细节没,同样的动画属性为什么要写两遍,其中一个属性前缀加了“-webkit”?这里我对新手解释一下:

CSS前缀 -webkit 是用来指定只针对使用了WebKit引擎(如Chrome,Safari)的浏览器的样式规则的。这个前缀是为了让开发者能够使用最新的CSS特性,而不用担心老版本的浏览器兼容性问题。如果你只关心WebKit浏览器,你可以省略不带前缀的规则,只保留 -webkit 前缀的版本。但通常为了兼容更多的浏览器,开发者会同时提供带前缀和不带前缀的版本。

为节省篇幅,文章后面的示例代码中我都省略了-webkit。

滑动发光动画

大家肯定会猜,上一个是改变发光遮罩层的角度,这个是不是改变位置就可以了?

答对了,你真是个大聪明,上代码吧:

@keyframes wipe {
    0% {
                mask-position: 200% center;
    }
    100% {
                mask-position: 0% center;
    }
}

是不是很简单

闪烁发光动画

这个怎么说呢,比较复杂,但又没那么复杂,说它复杂,主要是因为你得设计好不同动画帧之间的渲染效果,才能出来自然流畅的闪烁动画,不像前面那两种指定0%和100%即可。

但其实也简单,只不过是在不同的动画帧之间改变遮罩层的透明度而已:

@keyframes flicker {
  0% { opacity:0.1; mask-image:none;}
  1% { opacity:1; }
  2% { opacity:0.5; }
  3% { opacity:0.1; }
  4% { opacity:0.7; }
  5% { opacity:1; }
  7% { opacity:0.7; mask-image: linear-gradient(90deg, transparent 15%, black 45%, black 55%, transparent 85%);}
  8% { opacity:0.1; }
  10% { opacity:0.4; }
  13% { opacity:1; }
  15% { opacity:0.1;mask-image: linear-gradient( 45deg, rgba(0,0,0,0.4) 25%, transparent 45%, black 65%, black 90%, transparent 100%);}
  17% { opacity:0.8;}
  19% { opacity:0.3; }
  21.5% { opacity:0; }
  23% { opacity:1; }
  39% { opacity:0.7; }
  45% { opacity:0.2; }
  49% { opacity:0.9; }
  52% { opacity:0.7;}
  53.5% { opacity:0.2; mask-image: linear-gradient(90deg, black 15%, black 45%, rgba(0,0,0,0.4) 75%, transparent 85%);}
  57% { opacity:0.8; }
  63% { opacity:1; }
  75% { opacity:.85; }
  77% { opacity:1; }
  80% { opacity:.9; }
  82% { opacity:.95; }
  83% { opacity:.85; }
  86% { opacity:1; }
  89% { opacity:.85; }
  91% { opacity:1; }
  92% { opacity:.9; }
  100% { opacity:1; }
}

波动发光动画

波动发光和滑动发光的原理其实是一样的,不同的是,波动效果除了需要改变遮罩层的位置外,还需要改变遮罩层的大小,形成波形的视觉效果:

button:not([disabled])[data-effect=wave] .shimmer {
     mask-image: linear-gradient(90deg, transparent 15%, black 45%, black 55%, transparent 85%);
     mask-size: 200% 200%;
     mask-position: center;
     animation: wipe 3s linear infinite both -0.5s;
}

搏动和脉冲效果

这两种发光效果其实是同一类的,严格来说都属于脉冲动画,最终的效果就像心脏搏动一样。

其原理也是改变遮罩层的透明度:

搏动效果

@keyframes pulse {
    0%, 90%, 100% {
        opacity: 0;
    }
    20% {
        opacity: 1;
    }
}

脉冲效果

@keyframes pulse2 {
    0% {
        opacity: 0;
    }
    8% {
        opacity: 1;
    }
    14% {
        opacity: 0;
    }
    20% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}

源码下载:点击这里


THE END
MSNC.CN