当前位置:   article > 正文

button按钮样式_前端动画专题(三):撩人的按钮特效

动画按钮样式button
本文来自「心谭博客」的《动画设计·按钮特效》,更多文章放在了Github 欢迎交流和Star

特效一览

滑箱

920ae0661e9a14766b381e535af7768b.gif

果冻

f9d7ac9822e56328a405bff17bb61611.gif

脉冲

76e8ca2d7ea2ea3363160c52f90cef21.gif

闪光

ce938b8decffa2aec89913ceb08a9bb6.gif

气泡

19a1b98ececb0fb607185fdce30b6ae4.gif

滑箱特效

效果图

920ae0661e9a14766b381e535af7768b.gif

原理

因为 button 元素可以使用 before/after 伪元素,所以借助伪元素,可以实现动态图中的遮盖层。

为了避免回流重绘,滑箱的运动方向是垂直方向,所以使用scaleY属性。对于动画的方向,需要借助transform-origin改变动画原点。

代码实现

html:

<button>xin-tan.com</button>

css:

  1. button {
  2. outline: none;
  3. border: none;
  4. z-index: 1;
  5. position: relative;
  6. color: white;
  7. background: #40a9ff;
  8. padding: 0.5em 1em;
  9. }
  10. button::before {
  11. content: "";
  12. z-index: -1;
  13. position: absolute;
  14. top: 0;
  15. bottom: 0;
  16. left: 0;
  17. right: 0;
  18. background-color: #fa541c;
  19. transform-origin: center bottom;
  20. transform: scaleY(0);
  21. transition: transform 0.4s ease-in-out;
  22. }
  23. button:hover {
  24. cursor: pointer;
  25. }
  26. button:hover::before {
  27. transform-origin: center top;
  28. transform: scaleY(1);
  29. }

果冻特效

效果图

f9d7ac9822e56328a405bff17bb61611.gif

原理和代码

果冻特效可以分割成 5 个部分,所以无法简单通过 transition 来实现,要借助animation。并且动画触发的时间点是鼠标移入的时候,因此 animation 要在:hvoer中声明。

  1. button {
  2. z-index: 1;
  3. color: white;
  4. background: #40a9ff;
  5. outline: none;
  6. border: none;
  7. padding: 0.5em 1em;
  8. }
  9. button:hover {
  10. cursor: pointer;
  11. animation: jelly 0.5s;
  12. }

下面开始编写 jelly 动画的特效。这个动画可以分解为 4 个部分:「初始 => 挤高 => 压扁 => 回到初始状态」。挤高 和 压扁这里都是通过scale来实现的,代码如下:

  1. @keyframes jelly {
  2. 0%,
  3. 100% {
  4. transform: scale(1, 1);
  5. }
  6. 33% {
  7. transform: scale(0.9, 1.1);
  8. }
  9. 66% {
  10. transform: scale(1.1, 0.9);
  11. }
  12. }

更进一步

上面的动态已经仿真不错了,如果将 4 部分变成 5 部分:「初始 => 挤高 => 压扁 => 挤高 => 回到初始状态」。视觉上会有一种弹簧的特效,就像手压果冻后的效果:

  1. @keyframes jelly {
  2. 0%,
  3. 100% {
  4. transform: scale(1, 1);
  5. }
  6. 25%,
  7. 75% {
  8. transform: scale(0.9, 1.1);
  9. }
  10. 50% {
  11. transform: scale(1.1, 0.9);
  12. }
  13. }

脉冲特效

效果图

76e8ca2d7ea2ea3363160c52f90cef21.gif

原理和代码

首先,还是去掉 button 的默认样式。注意设置 button 的z-index属性并且让其生效,要保证其大于 ::beforez-index 属性,防止 dom 元素被伪元素覆盖

  1. button {
  2. position: relative;
  3. z-index: 1;
  4. border: none;
  5. outline: none;
  6. padding: 0.5em 1em;
  7. color: white;
  8. background-color: #1890ff;
  9. }
  10. button:hover {
  11. cursor: pointer;
  12. }

剩下的就是设置伪元素。因为脉冲特效给人的感觉是“镂空”放大。因此,变化对象是 border 属性。而镂空的效果,是通过透明背景来实现的。

  1. button::before {
  2. content: "";
  3. position: absolute;
  4. z-index: -1;
  5. top: 0;
  6. left: 0;
  7. bottom: 0;
  8. right: 0;
  9. border: 4px solid #1890ff;
  10. transform: scale(1);
  11. transform-origin: center;
  12. }

动画启动时间是鼠标移入,border 上变化的是颜色变淡和大小变小,透明度也逐渐变成 0。

  1. button:hover::before {
  2. transition: all 0.75s ease-out;
  3. border: 1px solid#e6f7ff;
  4. transform: scale(1.25);
  5. opacity: 0;
  6. }

⚠️ transition 和 transform 是放在hover状态下的伪元素,目的是让动画瞬间回到初始状态。

闪光特效

效果图

ce938b8decffa2aec89913ceb08a9bb6.gif

原理和代码

实现上依然是借助伪元素,闪光特效更多注重的是配色,动画方面实现的核心是利用rotate来实现「倾斜」的效果,利用translate3d来实现「闪动」的效果。

  1. button {
  2. outline: none;
  3. border: none;
  4. z-index: 1;
  5. position: relative;
  6. color: white;
  7. background: #262626;
  8. padding: 0.5em 1em;
  9. overflow: hidden;
  10. --shine-width: 1.25em;
  11. }
  12. button::after {
  13. content: "";
  14. z-index: -1;
  15. position: absolute;
  16. background: #595959;
  17. /* 核心代码:位置一步步调整 */
  18. top: -50%;
  19. left: 0%;
  20. bottom: -50%;
  21. width: 1.25em;
  22. transform: translate3d(-200%, 0, 0) rotate(35deg);
  23. /* */
  24. }
  25. button:hover {
  26. cursor: pointer;
  27. }
  28. button:hover::after {
  29. transition: transform 0.5s ease-in-out;
  30. transform: translate3d(500%, 0, 0) rotate(35deg);
  31. }

⚠️translate3d除了避免重绘回流,还能启用 GPU 加速,性能更高。但之前为了方便讲述,一般使用的是translate属性。

气泡特效

效果图

19a1b98ececb0fb607185fdce30b6ae4.gif

原理和代码

首先,还是禁用 button 元素的默认样式,并且调整一下配色:

  1. button {
  2. outline: none;
  3. border: none;
  4. cursor: pointer;
  5. color: white;
  6. position: relative;
  7. padding: 0.5em 1em;
  8. background-color: #40a9ff;
  9. }

由于 button 的伪元素层级是覆盖 button 的,所以要设置 z-index 属性,防止伪元素遮盖显示。毕竟只想要背景色的遮盖,字体不需要遮盖。在上面的样式中添加:

  1. button {
  2. z-index: 1;
  3. overflow: hidden;
  4. }

最后处理的是伪元素的变化效果。特效是从中心向四周蔓延,所以应该让其居中。

对于大小变化,还是利用scale属性。

因为是圆形,所以将border-radius设置为 50%即可。

  1. button::before {
  2. z-index: -1;
  3. content: "";
  4. position: absolute;
  5. top: 50%;
  6. left: 50%;
  7. width: 1em;
  8. height: 1em;
  9. border-radius: 50%;
  10. background-color: #9254de;
  11. transform-origin: center;
  12. transform: translate3d(-50%, -50%, 0) scale(0, 0);
  13. transition: transform 0.45s ease-in-out;
  14. }
  15. button:hover::before {
  16. transform: translate3d(-50%, -50%, 0) scale(15, 15);
  17. }

换个方向?

示例代码中的气泡特效是从中间向四周扩散,如果想要从左上角向右下角扩散呢?例如下图所示:

7499b88e0108cb02373c03825108d110.gif

处理过程很简单,只需要改变一下气泡的初始位置即可

  1. button::before {
  2. z-index: -1;
  3. content: "";
  4. position: absolute;
  5. width: 1em;
  6. height: 1em;
  7. border-radius: 50%;
  8. background-color: #9254de;
  9. /* 变化位置的代码 */
  10. top: 0;
  11. left: 0;
  12. transform-origin: center;
  13. transform: scale3d(0, 0, 0);
  14. transition: transform 0.45s ease-in-out;
  15. /* *********** */
  16. }
  17. button:hover::before {
  18. transform: scale3d(15, 15, 15);
  19. }

参考链接

  • 《transform-origin: 改变动画原点》
  • 《Increase Your Site’s Performance with Hardware-Accelerated CSS》
  • 《css3 变量》

更多文章

  • 动画设计·字体特效
  • 动画设计·输入框特效
  • 动画设计·按钮特效
  • 动画设计·Loader特效·基础篇
  • 动画设计·Loader特效·进阶篇
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/92724
推荐阅读
相关标签
  

闽ICP备14008679号