使用css和js给按钮添加微交互的几种方式
使用css和js给按钮添加微交互的几种方式
在现实世界中,当我们轻弹或按下某些东西时,它们会发出咔嗒声,例如电灯开关。有些东西会亮起或发出蜂鸣声,这些响应都是“微交互”,让我们知道我们何时成功完成了某件事。在本文中,我们将学习向网页按钮添加微交互的几种简单方法。
什么是微交互
微交互是用户界面上的小交互或动画。当用户执行操作时,它们向用户提供即时反馈。微交互可以保持用户的参与度并可以改善他们的整体体验。
微交互的一些示例包括我们与某人在线聊天时的打字指示器、下载的进度条以及刷新页面时的加载指示器。
按钮是网站上最常见的交互元素之一,它们可以执行一系列任务,例如切换、提交、删除、关闭、选择(通过单选按钮、选项按钮或选择菜单)等。
基本样式
<style>* {margin: 0;padding: 0}body {height: 100vh;display: flex;align-items: center;justify-content: center;}
</style>
有弹性的微交互
我们可以使用 CSS的transform属性创建一个 3D 按钮,单击它时该按钮会弹起。
<button class="btn"><span class="text">提交</span></button>
对于此示例,我们在<button>中嵌套了一个<span>. 通常,创建按钮时不需要这样做,但我们需要它来创建按钮的最终 3D 外观。
.btn {position: relative;background: #004958;border-radius: 15px;border: none;cursor: pointer;
}.text {display: block;padding: 15px 45px;border-radius: 15px;background: #00c2cb;font-size: 1.5rem;font-weight: 500;color: #42455a;transform: translateY(-6px);transition: transform ease 0.1s;
}.btn:active .text {transform: translateY(-2px);
}

带边框动画的按钮
有多种方法可以为按钮的边框设置动画,因此我们将展示几个示例。
简单的边框微交互
让我们从简单的事情开始。通常,如果我们想向任何元素添加边框,我们会使用border 属性。但是在CSS中,也有outline属性,这俩非常相似。它在元素周围添加轮廓。轮廓会覆盖它们所应用的元素,这意味着它们是围绕边框绘制的。
它们甚至以相同的方式声明。以下是带有轮廓和边框的按钮示例:
button {border: 3px solid cyan;outline: 3px solid red;
}
下面的屏幕截图显示了它的样子:

轮廓不会影响主元素(在本例中为按钮)的尺寸,并且它们可以重叠其他内容或元素。我们还可以使用outline-offset属性更改他们的位置。
正偏移值会将轮廓向外推,远离边框。负值将起到相反的作用。因此,例如,如果我们想隐藏轮廓,我们需要为其指定边框宽度的负值。这就是我们为按钮创建微交互的动画:
<button class="btn">提交</button>
button {border: none;position: relative;padding: 15px 45px;background: transparent;border-radius: 10px;border: 2px solid #00c2cb;outline: 2px solid #00c2cb;outline-offset: -2px;font-size: 1.5rem;color: #00c2cb;font-weight: 500;cursor: pointer;transition: outline-offset 200ms ease;
}button:hover {outline-offset: 3px;
}
button:active{transform: scale(0.95);
}

带有伪元素的按钮悬停效果
我们将使用::before和::after伪元素以及inset属性来创建一些漂亮的边框动画。
我们将逐步设置我们的样式,先设置button样式:
button {position: relative;background: transparent;padding: 15px 45px;border-radius: 15px;border: none;font-size: 1.5rem;color: #e0ffff;font-weight: 500;cursor: pointer;z-index: 1;
}
把insert添加到::before该按钮的伪元素中。它的值为0px 50px,因此它仅适用于 y 轴(inset属性将元素水平和垂直地推离其父元素)
button::before {content: '';position: absolute;inset: 0px 50px;background: #42455a;transition: inset 350ms ease;z-index: -1;
}
::after伪元素将覆盖::before伪元素,留下一个inset大小的间隙,从而创建一个边框。
button::after {content: '';position: absolute;inset: 3px;border-radius: 10px;background: #22232e;z-index: -1;
}
为了获得最终的外观,我们将添加<button>元素添加overflow: hidden。这将删除方角并完成该按钮的微交互。
整体代码:
button {position: relative;overflow: hidden;background: transparent;padding: 15px 45px;border-radius: 15px;border: none;font-size: 1.5rem;color: #e0ffff;font-weight: 500;cursor: pointer;z-index: 1;
}
button:active{transform: scale(0.95);
}
button::before{content: '';position: absolute;inset: -3px 50px;background: #42455a;transition: inset 350ms ease;z-index: -2;
}
button:hover::before{inset: -20px 0px;background: #00c2cb;
}
button::after{content: '';position: absolute;inset: 3px;border-radius: 10px;background: #22232e;z-index: -1;
}

涟漪微交互
我们将在单击按钮时为其添加涟漪效果。它可以位于按钮内或按钮周围。
我们将使用一些 JavaScript 来创建这种微交互。设置按钮样式后的 JavaScript 代码如下:
let btn = document.querySelectorAll("button");
btn.forEach((btn) => {btn.onclick = function (e) {let x = e.pageX - e.target.offsetLeft;let y = e.pageY - e.target.offsetTop;let ripples = document.createElement("span");ripples.style.left = x + "px";ripples.style.top = y + "px";this.appendChild(ripples);setTimeout(() => {ripples.remove();}, 2000);};
});
click 函数跟踪鼠标单击的 x 和 y 位置并创建一个新<span>元素。每个都<span>代表一个涟漪,之后使用setTimeout()方法在两秒后将其删除。
我们使用 CSS 动画来更改其大小和不透明度。这将产生连锁反应。
button{position: relative;padding: 15px 45px;font-size: 1.5rem;border-radius: 15px;border: none;background: #00c2cb;color: #22232e;overflow: hidden;cursor: pointer;
}
button span {position: absolute;background: #004958;transform: translate(-50%,-50%);pointer-events: none;border-radius: 50%;animation: ripple 2s linear infinite;transition: 0.5s;
}@keyframes ripple {0% {width: 0;height: 0;opacity: 0.5;}100% {width: 500px;height: 500px;opacity: 0;}
}

发光
让按钮在悬停时发光。我们需要伪元素和box-shadow属性的组合。
<button><span class="btn-text">Click me</span></button>
button {display: flex;justify-content: center;align-items: center;background: transparent;position: relative;background: #22232e;border: none;border-radius: 15px;
}
button .btn-text{padding: 14px 45px;font-size: 25px;color: #e0ffff;border: 2px solid rgba(255,255,255,0.1);border-radius: 15px;backdrop-filter: blur(15px);background: rgba(0,73,88,0.05);cursor: pointer;z-index: 1;transition: 0.2s;
}
此时,我们应该有一个看起来很普通的按钮。要在底部添加栏,我们将使用::before伪元素:
button::before {content: '';position: absolute;left: 50%;transform: translateX(-50%);bottom: -5px;width: 25%;height: 10px;background: #00c2cb;border-radius: 10px;transition: .5s;box-shadow: 0 0 10px rgba(0,194,203,0.5);
}
添加box-shadow了就有了发光效果。
为了完成这个微交互,我们将增加悬停时伪元素的大小
button:hover::before {bottom: 0;height: 40%;width: 90%;border-radius: 30px;transition-delay: 0.5s;
}
整体代码:
button {display: flex;justify-content: center;align-items: center;background: transparent;position: relative;background: #22232e;border: none;border-radius: 15px;
}
button .btn-text{padding: 14px 45px;font-size: 25px;color: #e0ffff;border: 2px solid rgba(255,255,255,0.1);border-radius: 15px;backdrop-filter: blur(15px);background: rgba(0,73,88,0.05);cursor: pointer;z-index: 1;transition: 0.2s;
}
button::before{content: '';position: absolute;left: 50%;transform: translateX(-50%);bottom: -5px;width: 25%;height: 10px;background: #00c2cb;border-radius: 10px;transition: .5s;box-shadow: 0 0 10px rgba(0,194,203,0.5);
}
button:hover::before{bottom: 0;height: 40%;width: 90%;border-radius: 30px;transition-delay: 0.5s;
}

相关文章:
使用css和js给按钮添加微交互的几种方式
使用css和js给按钮添加微交互的几种方式 在现实世界中,当我们轻弹或按下某些东西时,它们会发出咔嗒声,例如电灯开关。有些东西会亮起或发出蜂鸣声,这些响应都是“微交互”,让我们知道我们何时成功完成了某件事。在本文…...
react面试之context的value变化时,内部所有子组件是否变化
上测试代码 // context const state {a: 1,b: 1, } const context createContext(state);export default context; // A组件 const A () > {const { a } useContext(context);return (<div>{a}</div>) } export default A;// B组件 const B () > {cons…...
使用okHttp不走代理问题
背景 某日使用okhttp设置代理并发送爬虫请求时,发现部分url请求没有走代理直接和目标url建立了连接,伪代码如下。初始化okhttpClient时设置了proxySelecter代理,但是调用okhttpClient.newCall请求时并没用调用proxySelecter.select函数获取代…...
python moviepy 自动化音视频处理实践
MoviePy是一个用于视频编辑的Python库。它提供了一种简单且直观的方式来处理视频文件,包括剪辑、合并、裁剪、添加文本、添加音频等操作。使用MoviePy,你可以通过编写Python代码来创建和编辑视频,而无需使用复杂的视频编辑软件。 MoviePy建立…...
聊聊混合动力汽车和纯电骑车的优势和劣势
混合动力汽车和纯电动骑车是两种不同的交通工具,它们都有各自的优势和劣势。本文将分别探讨混合动力汽车和纯电动骑车的优势和劣势,并为文章提供三个备选的好听的标题。 混合动力汽车是一种结合了内燃机和电动机的汽车,它可以同时利用燃油和电…...
算法训练Day39|62.不同路径 ● 63. 不同路径 II
LeetCode:62.不同路径 62. 不同路径 - 力扣(LeetCode) 1.思路 想象成矩阵填格子,两个关键点,初始化和递推公式。 初始化除点(0,0)第一行第一列均为1,递推公式推导dp[i][j] dp[i …...
react中hooks分享
一. HOOKS是什么 在计算机程序设计中,钩子一词涵盖了一系列技术,这些技术用来通过拦截函数调用、消息或在软件组件之间传递的事件来改变或增加操作系统、应用程序或其他软件组件的行为。处理这些被截获的函数调用、事件或消息的代码称为“hook”。 在r…...
LeetCode1207. 独一无二的出现次数
题干 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例1: 输入:arr [1,2,2,1,1,3] 输出:true 解释:在该…...
【maven】构建项目前clean和不clean的区别
其实很简单,但是百度搜了一下,还是没人能简单说明白。 搬用之前做C项目时总结结论: 所以自己在IDE里一遍遍测试程序能否跑通的时候,不需要clean,因为反正还要改嘛。 但是这个项目测试好了,你要打成jar包给…...
Stable Diffusion 硬核生存指南:WebUI 中的 CodeFormer
本篇文章聊聊 Stable Diffusion WebUI 中的核心组件,强壮的人脸图像面部画面修复模型 CodeFormer 相关的事情。 写在前面 在 Stable Diffusion WebUI 项目中,源码 modules 目录中,有一个有趣的目录叫做 CodeFormer,它就是本文的…...
从零开始理解Linux中断架构(24)软中断核心函数__do_softirq
1)概要 __do_softirq函数处理是总是尽可能的执行所有未决软中断。 (1)关闭软中断:在preempt_count设置软中断标志:SOFTIRQ_OFFSET 让in_interrupt检查条件为真,进入软中断处理临界区,后面进来的处理请求,需要检查in_interrupt(),从而达到禁止本cpu上的软中断嵌套的目…...
【云原生】Kubernetes中deployment是什么?
目录 Deployments 更新 Deployment 回滚 Deployment 缩放 Deployment Deployment 状态 清理策略 金丝雀部署 编写 Deployment 规约 Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的 目标状态,而 De…...
sk_buff操作函数学习
一. 前言 内核提供了大量实用的操作sk_buff的函数,在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类:创建,释放和复制socket buffer;操作sk_buff结构中的参数和指针;管理socket b…...
conda create时候出现JSONDecoderError解决方法
起因是我的conda出现了JSONDecoderError,这个我搜了一下是因为某些配置文件错误,所以让我update conda,于是我先用了下面的指令: conda update conda 但是在执行过程中依然会出现 JSONDecoderError的问题,后来参考了这…...
Electron 工具进程utilityProcess 使用中遇到的坑点汇集
简介 这是基于 node.js 中的子进程的概念推出来的,可参考链接:utilityProcess | Electron 官网有一句话非常重要,它提供一个相当于 Node.js 的 child_process.fork API,但使用 Chromium 的 Services API 代替来执行子进程。这句话…...
JdbcTemplate
目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹…...
PROFINET转TCP/IP网关profinet网线接头接法
大家好,今天要和大家分享一款自主研发的通讯网关,捷米JM-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧&…...
【FPGA IP系列】FIFO的通俗理解
FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…...
Kylin v10基于cephadm工具离线部署ceph分布式存储
1. 环境: ceph:octopus OS:Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…...
框架的前置学习-反射
运行java代码要经历的三个阶段 反射,程序框架设计的灵魂,将类的各个组成部分封装成其他对象,这就是反射机制。 框架:半成品的软件,在框架的基础上进行开发,可以简化编码 反射的好处: 可以在…...
探索TMSpeech:解锁Windows本地实时语音转文字的高效工作流
探索TMSpeech:解锁Windows本地实时语音转文字的高效工作流 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录手忙脚乱?还在为在线课程跟不上节奏而烦恼?TMSpeech为你…...
告别重复造轮子:用快马AI一键生成高效开发技能工具库
告别重复造轮子:用快马AI一键生成高效开发技能工具库 作为一名前端开发者,我经常需要重复编写一些基础功能代码。每次新项目开始,都要重新写表单验证、日期格式化这些轮子,既浪费时间又容易出错。最近发现InsCode(快马)平台的AI代…...
蓝桥杯单片机第12届省赛2满分(西风)
1注意S7长短按键冲突问题if(key_down7)//判断是否按下{fs71;//开始计时t1000ms_10;}if(key_up7)//判断是否抬起{if(t1000ms_1>1000)//长按键{fled^1;}else//短按键{f_baofreq;}t1000ms_10;fs70;//停止计时}2获取频率void Timer0_Init(void) //100微秒12.000MHz {AUXR &…...
工业数据 vs. 传统资源:为什么数据才是未来的稀缺资产
从成本投入到战略资产——工业数据能成为"新石油"吗? “Data is the new oil”,数据是新石油这个比喻,最早由英国数学家 Clive Humby 在 2006 年提出。但真正让这一概念深入人心的,是《经济学人》2017 年的封面文章&am…...
C++ 编译模型与工程机制全解析:从 include 到链接与 ABI
关键词:编译、链接、#include、本质、静态库、动态库、ABI 适合人群:有 Java / Android 背景,开始深入理解 C 工程机制的开发者一、为什么一定要理解“编译模型”?很多人写 C 会遇到这些问题:❓ 为什么 include 了还能…...
终极RAID启动指南:Ventoy如何简化复杂存储阵列的系统引导
终极RAID启动指南:Ventoy如何简化复杂存储阵列的系统引导 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 你是否曾为从RAID阵列启动系统而烦恼?传统的BIOS配置和驱动程序加载过…...
Appstore 上架问题汇总--持续更新
一、Guideline 3.2.1(viii) - Business - Other Business Model Issues - Acceptable 问题: We still found the app provides loan services but the domains listed on the apps Product Pages are not clearly under your control or ownership. Since users m…...
从‘RIP’这道题出发,聊聊IDA分析PWN题时新手常踩的3个坑(附正确姿势)
从‘RIP’这道题出发,聊聊IDA分析PWN题时新手常踩的3个坑(附正确姿势) 在CTF竞赛中,PWN题往往是最考验选手底层功力的题型之一。而作为静态分析利器的IDA Pro,虽然功能强大,但新手在使用过程中常常会陷入一…...
Pixel Aurora Engine实战应用:教育类App像素插画素材自动化生产
Pixel Aurora Engine实战应用:教育类App像素插画素材自动化生产 1. 教育类App的像素素材需求 在当今教育类App开发中,视觉素材的质量直接影响用户体验和学习效果。传统设计流程面临三大痛点: 人力成本高:每个插画需要设计师手动…...
Fourier Neural Operator (FNO) 在偏微分方程求解中的核心思想与应用
1. 从传统方法到FNO:偏微分方程求解的进化之路 偏微分方程(PDE)在工程和科学领域无处不在,从天气预报到飞机设计,从量子力学到金融衍生品定价。传统数值解法如有限差分法(FDM)和有限元法&#x…...
