前言

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+CSS」--自定义按钮样式【002】

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

  2. 「HTML+CSS」--自定义按钮样式【003】

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

  3. 「HTML+CSS」--自定义按钮样式【001】

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

  4. [HTML/CSS]uploadify自定义按钮样式

    概述 在项目中经常用到uploadify上传插件,但是FLASH按钮的外观往往跟我们网页的设计的主题色不太搭配.这时就需要对其样式进行修改. 样式文件是uploadify.css. 打开这个文件后,你 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. js add Struct to ArrayBuffer

    使用struct-buffer为ArrayBuffer添加结构体 $ npm i struct-buffer 1. 创建结构体 import { DWORD, string_t, StructBuff ...

  2. nodejs 调用win32 api

    video 教程文件 win32 api >node -v v12.16.1 >npm install -g node-gyp >npm i @saleae/ffi >node ...

  3. CentOS 7.6.1810 运行pupperteer

    故障排除 安装puppeteer,使用cnpm 解决依赖 $ yum -y update $ yum install -y pango libXcomposite libXcursor libXdam ...

  4. 以代码为剑、数学为犁,SPC构建NGK算力生态体系

    人类创造工具,工具反过来也改变着人类.以区块链为核心的货币革命率先吹响了对金融世界重塑的号角.以代码为剑.数学为犁,区块链构建了新的网路信任体系,这是一切的开始.基于此,NGK区块链技术将赋能实体产业 ...

  5. Google单元测试框架gtest之官方sample笔记1--简单用例

    1.0 通用部分 和常见的测试工具一样,gtest提供了单体测试常见的工具和组件.比如判断各种类型的值相等,大于,小于等,管理多个测试的测试组如testsuit下辖testcase,为了方便处理初始化 ...

  6. Hive安装与配置——2.3.5版本

    Hive安装配置 Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据.它架构在Hadoop之上,提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行,使查询和分 ...

  7. E百科 | 基于MEC的边缘AI服务

    简介: 阿里云边缘计算团队付哲解读5G下热门场景:边缘AI.作者:阿里云付哲,计算机科学与技术专业博士后,在流量检测.资源调度领域有深入研究,其论文<Astraea: Deploy AI Ser ...

  8. Echart饼图旋转

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...

  9. 手把手教你SpringBoot2整合Redis

    此文仅为初学java的同学学习,大佬请勿喷,文末我会附上完整代码包供大家参考 redis的搭建教程此处略过,大家自行百度,本文的教程开始: 一.先在pom.xml中添加相关依赖 <!--redi ...

  10. uni-app创建项目

    下载 HBuilderX   下载地址(https://www.dcloud.io/hbuilderx.html) HBuilderX是通用的前端开发工具,但为uni-app做了特别强化. 创建uni ...