前言

Hello!小伙伴!
首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
哈哈 自我介绍一下
昵称:海轰
标签:程序猿一只|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过国奖、省奖等,已保研。目前正在学习C++/Linux(真的真的太难了~)
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
日常分享:微信公众号【海轰Pro】记录生活、学习点滴,分享一些源代码或者学习资料,欢迎关注~

效果展示


思路

上面效果可以概括为:

  • 鼠标未停留时:button背景与body保持一致(以黑色为例),文字为蓝色,同时button四周一条蓝色的线条一直围绕button旋转
  • 鼠标停留时:button按钮背景变为蓝色,其中文字变为黑色,同时产生阴影、倒影

根据效果图可以得出实现的一些思路:

  • 背景颜色的变化使用hover就可以实现
  • 难点在于四周的线条
  • 这里海轰的解决办法是分为上下左右四条线,赋予每一条线一个动画,通过延时达到类似一条线的效果

这里使用的蓝色:

  • 蓝色:#03e9f4

Demo代码

HTML

<!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"><link rel="stylesheet" href="style.css"><title>Document</title>
</head>
<body><button class="btn"><span></span><span></span><span></span><span></span>Haihong Pro</button>
</body>
</html>

CSS

html,body{margin: 0;height: 100%;
}
body{display: flex;justify-content: center;align-items: center;background: black;
}
.btn{width: 300px;height: 120px;font-family: 'Lato', sans-serif;font-weight: 500;font-size: 36px;color: #03e9f4;/* 字符间的距离 */letter-spacing: 2px;background: transparent;border: none;position: relative;overflow: hidden;transition: 0.5s;
}
.btn:hover{background: #03e9f4;color: black;box-shadow: 0 0 5px #03e9f4,0 0 25px #03e9f4,0 0 50px #03e9f4,0 0 200px #03e9f4;/* 倒影 */
-webkit-box-reflect:below 1px linear-gradient(transparent, #0005);
}
.btn span{position: absolute;content: '';
}
.btn span:nth-child(1){top: 0;left: 0;width: 100%;height: 4px;animation: animate1 1s linear infinite;background: linear-gradient(90deg,transparent,#03e9f4);
}
@keyframes animate1{0%{left: -100%;}50%,100%{left: 100%;}
}.btn span:nth-child(2){top: -100%;right: 0;width: 4px;height: 100%;background: linear-gradient(180deg,transparent,#03e9f4);animation: animate2 1s linear infinite;animation-delay: 0.25s;
}
@keyframes animate2{0%{top: -100%;}50%,100%{top: 100%;}
}.btn span:nth-child(3){bottom: 0;right: 0;width: 100%;height: 4px;background: linear-gradient(270deg,transparent,#03e9f4);animation: animate3 1s linear infinite;animation-delay: 0.55s;
}
@keyframes animate3{0%{right: -100%;}50%,100%{right: 100%;}
}.btn span:nth-child(4){bottom: -100%;left: 0;width: 4px;height: 100%;background: linear-gradient(360deg,transparent,#03e9f4);animation: animate4 1s linear infinite;animation-delay: 0.75s;
}
@keyframes animate4{0%{bottom: -100%;}50%,100%{bottom: 100%;}
}

原理解释

这里还是主要讲讲四周线条的动画效果吧

四条线条的初始位置如下:

注:

  • 这里将颜色改为红色,线条宽度为20px,便于观察
  • 这里说的初始位置是指动画开始时的初始位置

以一条线条(第一条)的动画为例

其css设置为:绝对定位 position:absolute top=0 left=0

初始位置如图:

第一条线条动画需要实现的效果

  • 线条头部从button最左端开始移动
  • 平行向右移动
  • 最终停下位置为:线条尾部到达button最右端

最初位置:

最终位置:

根据上述思路,编写动画代码

.btn span:nth-child(1){top: 0;left: 100%;width: 100%;height: 20px;animation: animate1 1s linear infinite; background: linear-gradient(90deg,transparent,red);
}
// 动画:从左到右
@keyframes animate1{0%{left: -100%;}50%,100%{left: 100%;}

效果如下:


我们的需求是:线条只需要在button区域进行动画,其他区域用户不可见

解决办法也很简单:button中设置:overflow: hidden;

效果如下:

同理,再分别对其他三条边进行设置就可以了

第二条线效果:


第三条线效果:

第四条线条效果:

疑点详解

疑点1

估计细心的小伙伴会注意到

  • 动画animate1延迟为0
  • 动画animate2延迟为0.25s
  • 动画animate3延迟为0.5s
  • 动画animate4延迟为0.75s

为什么会这样设置呢?

emmm 这里就说说海轰自己的理解吧

首先,我们将每一个动画的时间都位置为了 1s

为了达到连贯的效果,也就是:

  • 线条1头部到达button最右端时,线条2头部恰好从button最上端向下开始移动
  • 线条2头部到达button最下端时,线条3头部恰好从button最右端向左开始移动
  • 线条3头部到达button最左端时,线条4头部恰好从button最下端开始向上移动
  • 线条4头部到达button最上端时,线条1头部恰好从button最左端开始向右移动
  • 依次循环


从上述的效果描述中,我们可以得知,从线条4头部到达最上端时,线条1恰好又进行第二次动画

也就是每次动画间隔了1s

每条线运行的时间又相同,所以在button上移动的时间也是相同的

均为 1s/4=0.25s

也就是说:线条1头部从button最左端到最右端,耗时0.25s

简单的理解:

每隔1s线条1就要出发一次
为了得到连贯效果,必须要求1s之内,其他3条线都跑完button三条边
而跑完每一条边需要的时间又是一样的(这个是通过ambition设置的)
从而得出 每一条边需要 1s/4 = 0.25s

此时,线条2才开始动画,也就需要延时0.25s

同理,线条3、4 的延时也就累计就可以了

疑点2

为什么动画设置是0%-50%呢

@keyframes animate1{0%{left: -100%;}50%,100%{left: 100%;}
}

从疑点1的解答中,我们可以发现,每条线在button边运行的时间只能为0.25s

线条从开始到结束,需要耗时 1s(也就是从0%-100%)

/* 假设这样设置 */
@keyframes animate1{0%{left: -100%;}100%{left: 100%;}
}

因为移动速度为匀速(动画属性设置了)

所以到50%需要耗时0.5s

也就是说:线条1运行在button上的时间为:0.5s

这与我们需要的0.25s就有区别

那么需要怎么办呢?

哈哈,这里我们将动画属性修改一下:

@keyframes animate1{0%{left: -100%;}50%,100%{left: 100%;}
}

啥意思呢?

简单理解就是只用了一半的时间(0.5s)就从开始状态运行到了最终状态(0%-100%)

那么从0%-50%就只需要0.25s了

注:这里海轰说的估计不是很好理解,但是自己心里知道咋回事,不太会描述,不懂的小伙伴可以查查ambition的介绍

符合要求!

结语

学习来源:

https://codepen.io/bhadupranjal/pen/vYLZYqQ

css只会一点点,学习之余从喜欢看一些大神级别的css效果展示,根据源码一点一点学习知识点,文中有不对的地方,欢迎指出~

「HTML+CSS」--自定义按钮样式【004】相关推荐

  1. html的自定义按钮,「HTML+CSS」--自定义按钮样式【003】

    效果展示 思路 上面效果可以概括为:鼠标未停留时:青色(渐变)背景,正中文字为白色,button四角做了圆角处理 鼠标停留时:浅青色背景从上至下,依次覆盖button 鼠标离开button时:浅青色背 ...

  2. 「HTML+CSS」--自定义加载动画【027】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  3. 「HTML+CSS」--自定义加载动画【047】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  4. css笔记——css 实现自定义按钮

    css实现自定义按钮的样式实际上很早就有了,只是会用的人不是很多,里面涉及到了最基础的css写法,在火狐中按钮还是会显示出来,这时需要将i标签的背景设置为白色,同时z-index设置比input高一些 ...

  5. CSS 滚动条: 自定义滚动条样式

    CSS 滚动条: 自定义滚动条样式 文章目录 CSS 滚动条: 自定义滚动条样式 前言 正文 overflow & ::-webkit-scrollbar 实际效果(自定义滚动条.隐藏滚动条) ...

  6. 使用RAD Studio 10 Seattle创建自定义按钮样式

    在RAD Studio 10 Seattle中,我们对IDE中的集成样式设计器进行了许多增强.在今天的帖子中,我想我将介绍使用RAD Studio 10 Seattle创建自己的自定义按钮样式的步骤. ...

  7. html css调用自定义字体,css怎么自定义字体样式?

    在CSS中,可以通过@font-face规则来指定一个用于显示文本的自定义字体.@font-face规则允许网页开发者为其网页指定自定义的字体, 通过这种自定义字体的方式,可以消除对用户电脑字体的依赖 ...

  8. html编辑器不支持自定义样式,百度编辑器自定义按钮样式问题(写在cssRules不起做用)?...

    UE.registerUI('dialog',function(editor,uiName){ //创建dialog var dialog = new UE.ui.Dialog({ //指定弹出层中页 ...

  9. 手机浏览器网址_「效率集」自定义网址导航高级功能介绍

    「效率集」是国内仅有的几家提供了个性自定义导航的网站,功能比hao123强,用户体验优于百度导航首页,且支持聚合搜索,方便用户从不同渠道(网页,微博,微信公众号,知乎,维基百科)获取信息:方便用户在网 ...

最新文章

  1. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
  2. WebVie打开woffice文档
  3. 异常信息: java.lang.ClassNotFoundException: org.aspec
  4. MyBatis之PageHelper分页操作
  5. 转:Excel导入SQL数据库完整代码
  6. pstack命令学习
  7. java自动gc_具有Java 7中自动资源管理功能的GC
  8. 【PostgreSQL-9.6.3】函数(1)--数值型函数
  9. SpringBoot 中 @Transactional 的使用
  10. java未完成的标记,eclipse中的任务标记(TODO、FIXME、XXX)
  11. 自组织特征映射网络1
  12. 叫我大掌柜怎么改地区
  13. Pycharm typo PEP 8
  14. 【MM系列】SAP MM物料账在制品承担差异功能及配置
  15. 物联网毕设 -- 基于STM32的心率检测
  16. GameMaker如何导入JSON文件
  17. 用迭代法求a的平方根
  18. android 远程代码,如何通过代码远程解锁Android手机
  19. arduino 与java通信_在Java应用程序与Arduino Uno之间建立串口连接
  20. 手机模拟器之争:Genimotion在左,海马玩在右

热门文章

  1. 创建一个网站需要多少预算?
  2. 科目二边距30cm有什么技巧
  3. Android使用AIUI快速搭建智能助手
  4. Arduino自助饮料机程序
  5. 编码器类型原理知识汇总(增量式/绝对式/绝对值)
  6. ICTCLAS的Python3实现
  7. 电脑蓝屏怎么解决0x0000007b,解决电脑蓝屏问题
  8. [C程序设计]请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。
  9. 3d可视化设备产品场景展示更加直观形象
  10. 【计算机网络】(5)ping的过程分析+icmp协议