如何把握好 transition 和 animation 的时序,创作描边按钮特效

效果预览

在线演示

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。


https://codepen.io/comehope/pen/mKdzZM


可交互视频教程


此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。


请用 chrome, safari, edge 打开观看。


https://scrimba.com/p/pEgDAM/cgnk6Sb


源代码下载


本地下载

每日前端实战系列的全部源代码请从 github 下载:


https://github.com/comehope/front-end-daily-challenges


代码解读


定义 dom,标准的导航模式:

<nav><ul><li>Home</li></ul>
</nav>

居中显示:

body {margin: 0;height: 100vh;display: flex;align-items: center;justify-content: center;background-color: black;
}

定义文本和按钮边框样式:

nav ul {padding: 0;
}nav ul li {color: white;list-style-type: none;font-size: 32px;font-family: sans-serif;text-transform: uppercase;width: 12em;height: 4em;border: 1px solid rgba(255, 255, 255, 0.2);text-align: center;line-height: 4em;letter-spacing: 0.2em;
}

用 before 伪元素定义上边框和右边框,其中边框颜色因会多次被用到,所以采用变量:

:root {--color: dodgerblue;
}nav ul li::before {content: '';position: absolute;;width: 0;height: 0;visibility: hidden;top: 0;left: 0;border-top: 1px solid var(--color);border-right: 1px solid var(--color);
}

类似地,用 after 伪元素定义右边框和下边框:

nav ul li::after {content: '';position: absolute;;width: 0;height: 0;visibility: hidden;bottom: 0;right: 0;border-bottom: 1px solid var(--color);border-left: 1px solid var(--color);
}

设计边框入场的动画效果,按上、右、下、左的顺序依次显示边框,为了方便调整动画的速度设置了与时间相关的变量:

:root {--time-slot-length: 0.1s;--t1x: var(--time-slot-length);--t2x: calc(var(--time-slot-length) * 2);--t3x: calc(var(--time-slot-length) * 3);--t4x: calc(var(--time-slot-length) * 4);
}nav ul li:hover::before,
nav ul li:hover::after {width: 100%;height: 100%;visibility: visible;
}nav ul li:hover::before {transition:visibility 0s,width linear var(--t1x),height linear var(--t1x) var(--t1x);
}nav ul li:hover::after {transition: visibility 0s var(--t2x),width linear var(--t1x) var(--t2x),height linear var(--t1x) var(--t3x);
}

设计边框出场的动画效果,与入场的顺序相反:

nav ul li::before {transition:height linear var(--t1x) var(--t2x),width linear var(--t1x) var(--t3x),visibility 0s var(--t4x);
}nav ul li::after {transition:height linear var(--t1x),width linear var(--t1x) var(--t1x),visibility 0s var(--t2x);
}

让按钮文字在描边期间变色:

nav ul li {transition: var(--t4x);
}nav ul li:hover {color: var(--color);
}

最后,在描边结束后,在按钮四周增加一个脉冲动画,加强动感:

nav ul li:hover {animation: pulse ease-out 1s var(--t4x);
}@keyframes pulse {from {box-shadow: 0 0 rgba(30, 144, 255, 0.4);}to {box-shadow: 0 0 0 1em rgba(30, 144, 255, 0);}
}

大功告成!

原文地址:https://segmentfault.com/a/1190000015089396


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PHREAK算法实现Drools 6性能

Drools 6引入了新的惰性匹配算法。 该算法的详细信息已在之前的两个博客中介绍: RIP RETE时间获得PHREAKY 基于PHREAK堆栈的评估和向后链接 第一篇文章讨论了性能以及为什么算法的批处理和惰性方面难以比较。 “性能的最后一点。 通常,使用PHREAK的单…

PAT 1131 Subway Map

题目链接&#xff1a; https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 思路&#xff1a; 说多了都是泪&#xff0c; Dijstra超时&#xff0c;采用dfs 利用map<pair<int,int>,int>&#xff0c;表示两个点和他们中间的地铁线号 每次…

专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

1、为什么要对 Vue CLI 进行大规模修改&#xff1f; 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版&#xff0c;这种拉模版的方式有几个问题&#xff1a; &#xff08;1&#xff09; 在单个模版里面同时支持太多选项会导致模版本身变得极其复杂和难以维护&#x…

java秒杀时间与服务器时间_Javascript实现秒杀倒计时(时间与服务器时间同步)...

现在有很多网站都在做秒杀商品&#xff0c;而这其中有一个很重要的环节就是倒计时。关于倒计时&#xff0c;有下面几点需要注意&#xff1a;1.应该使用服务器时间而不是本地时间(本地时间存在时区不同、用户自行设置等问题)。2.要考虑网络传输的耗时。3.获取时间时可直接从AJAX…

Python3.5-20190501-廖老师的

python是一门解释型\脚本语言(和js特别像,如果同时学习js和python完全搅浑了.) 在运行py时候是一句一句翻译成cpu识别的机器码,所以速度比较慢.而C程序是运行前直接编译成CPU能执行的机器码&#xff0c;所以非常快. 学习python,就需要安装python.安装的同时会有一个解释器,就是…

如何用纯 CSS 创作一个冒着热气的咖啡杯

效果预览 在线演示 按下右侧的“点击预览”按钮在当前页面预览&#xff0c;点击链接全屏预览。https://codepen.io/zhang-ou/pen/xjXxoz可交互视频教程此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。请用 chrome, safari, edge 打开观看。…

FC冒险岛java版_冒险岛单机版

游戏概述冒险岛单机版是一款非常好玩的横版动作RPG游戏&#xff0c;游戏难度很适中&#xff0c;冒险岛单机版采用了与其他Q版2D游戏不同的横向卷轴的移动方式&#xff0c;场景高低落差的设计&#xff0c;整个画面层次感设计算是一级&#xff0c;喜欢这类手柄闯关游戏的玩家快来…

通过小程序实现网站扫码登录!每年都可以省 300 块...代替微信开放平台和服务号的登陆模式!

我们知道&#xff0c;要接入微信登陆有两种方式 1、微信开放平台2、微信服务号 这两种方式均可生成带参数的二维码&#xff0c;然后扫码获取用户基本信息的&#xff0c;所以我们可以在网站上用这两种方式开发网站的扫码登录&#xff0c;也是现在很多网站的通用做法。 微信开…

WAR文件与具有嵌入式服务器的Java应用程序

大多数服务器端Java应用程序&#xff08;例如&#xff0c;面向Web或面向服务的&#xff09;都希望在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这无非是具有标准目录布局的ZIP归档文件&#xff0c;其中包含运行时所需的所有库和应用程序级依赖…

easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程

一、Easypanel软件简介&#xff1a;Easypanel是一款虚拟主机管理工具&#xff0c;它支持php(windows系统还支持asp、asp.net)、磁盘配额、在线文件管理、在线web软件安装&#xff0c;是一款集虚拟主机、ftp、mysql等功能为一体的管理系统&#xff0c;本身还集成了kangle web服务…

游戏、脑洞大开1(密码简单破译)

“二八”妙龄写密码&#xff0c;看谁聪明“爱死他”。 密文&#xff1a;766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62 注意&#xff1a;&#xff08;1&#xff09;此题由正心41上课的同学做 &#xff08;2&#xff09;第一个提交&#xff0c;答案&#xff1a…

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中&#xff0c;项目中有个发帖功能&#xff0c;选择主题图片。如下&#xff1a; 利用原始的文件上传处理&#xff0c;虽然通过原始js语句能实时显示上传图片&#xff0c;但是这样的话会涉及很多兼容问题。使用ajax技术&#xff0c;实现选择性删除所选图片功能…

php redis.dll php5.6,在Windows 64位下为PHP5.6.14安装redis扩展

一.php安装redis扩展1.使用phpinfo()查看当前版本的信息2.根据PHP版本号&#xff0c;编译器版本号和CPU架构选择php_redis-2.2.5-5.6-nts-vc11-x64.zip和php_igbinary-1.2.1-5.5-nts-vc11-x64.zip下载地址&#xff1a;http://windows.php.net/downloads/pecl/snaps/redis/2.2.5…

matrix derivatives

来源&#xff1a;cs229 stanford Machine Learning Notes转载于:https://www.cnblogs.com/pertinencec/p/10082965.html

Project Student:维护Webapp(只读)

这是Project Student的一部分。 其他职位包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成和JPA标准查询 。 当我开始这个项目时…

教务管理及教材订购系统设计文档

教务管理及教材订购系统设计文档目录 一、概述 1.1 开发背景 1.2 使用技术 1.3运行环境 1.4 设计目标 1.4.1权限管理 1.4.2信息管理 1.4.3选课管理 1.4.4 成绩管理 1.4.5教材订购 二、功能分析划分 2.1信息管理 2.1.1班级信息管理 2.1.2专业信息管理 2.1.3课程信息管理 2.1.4学…

php 复制行,phpstorm怎么快速复制当前行?

qq_花开花谢_0PhpStorm 默认快捷键ctrlj 插入活动代码提示ctrlaltt 当前位置插入环绕代码altinsert 生成代码菜单Shift Enter 新一行ctrlq 查看代码注释ctrld 复制当前行ctrly 删除当前行ctrlalty 刷新项目缓…

Project Student:维护Webapp(可编辑)

这是Project Student的一部分。 其他帖子包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成 &#xff0c; JPA标准查询和维护Webap…

金蝶云php webapi,K/3 Cloud Web API销售出库单PHP完整示例【分享】

按照惯例&#xff0c;先上图【销售出库单】保存&#xff0c;如图&#xff1a;已经打印出 登陆请求及登陆成功&#xff0c;保存请求及保存成功的返回信息。如下代码&#xff0c;是完全可以直接进行运行的代码&#xff0c;具体详见代码中注释。[code]//K/3 Cloud 业务站点地址$cl…

JavaFX自定义控件– Nest Thermostat第2部分

自从我开始创建Nest恒温器FX自定义控件以来&#xff0c;已经有一段时间了&#xff01; 因此&#xff0c;上次&#xff0c;如Gerrit Grunwald所建议&#xff0c;我花了一些时间用inkscape复制Nest恒温器设计&#xff0c;这是构建JavaFX版本的第一步。 今天&#xff0c;我想与大…