使用 button 的 5 个理由

简介: 使用 button 的 5 个理由

button 是平时使用最广泛的一个 HTML 元素了,只要有点击交互的地方都推荐使用这个。但是,仍然有大部分网站使用的还是div,比如某博,所到之处几乎都是 div

image.png

既然是按钮,为什么不直接使用button呢?这里介绍一下使用 button 的 5 个理由


一、禁用特性


button支持禁用。这也是表单元素的通性,直接设置disabled属性可以达到禁用的效果

<button disabled>按钮</button>


而且,这种禁用不仅可以禁用鼠标点击,也会禁用键盘访问,是真正意义上的禁用

image.png

如果需要改变禁用用的样式,需要通过:disabled伪类,而不是disabled属性

button:disabled{
}
/*不推荐*/
button[disabled]{
}


因为有时候 button 被禁用,不一定来源于自身,有可能是因为父级元素,比如fieldset

<fieldset disabled>
    <button>按钮</button>
    <button>按钮</button>
</fieldset>


image.png

可以看到,当fieldset被禁用时,所包含的表单元素全部都被禁用,这些表单元素本身是没有disabled属性的,所以要禁用一个按钮,一定要通过:disabled伪类


另外在 div 中,一般通过 pointer-events: none;来实现,不过这种只能禁用掉鼠标行为

div.disabled{
  pointer-events: none;
}


当然对于 div来说,这个方式已经足够,因为 div 本身也不会被聚焦到


二、盒子模型和居中特性


button的默认盒子属性是 border-box,进一步扩展开来,几乎所有表单元素的盒子属性都是 border-box


所以,在给按钮设置具体尺寸的时候就不需要再设置这个了

button{
  padding: 5px 10px;
  width: 100%;
  box-sizing: border-box; /* 不需要 */
}


image.png

然后,button中默认是垂直水平居中的。


介于几乎所有的按钮都是居中的设计,所以,你无需设置任何居中属性就能达到水平垂直居中的效果

button{
  width: 100px;
  height: 100px;
  text-align: center;  /* 不需要 */
  line-height: 50px;  /* 不需要 */
}


image.png

三、键盘访问


button支持键盘访问。当使用 tab键进行焦点切换时,会有明显的焦点提示(outline)。而且在聚焦状态,通过键盘 enter 或者 space键可以触发按钮的点击事件


(下面是键盘操作,使用 tab 聚焦,然后通过 enter 或者 space键触发点击)

image.png

所以,为了保持键盘访问的可见性,最好不要这么做

button{
  outline: 0; /* 最好不要这么做 */
}


默认情况下,这个 outline只会在键盘聚焦时出现,而鼠标点击聚焦不会出现,如果需要改变聚焦的颜色,可以仅仅改变 outline-color,这样不会影响浏览器默认的出现时机

button{
  outline-color: salmon;
}


image.png

最好不要改变整个outline,这样会导致不管是键盘聚焦还是鼠标点击聚焦都会出现 outline(一般设计都不喜欢鼠标点击有outline

/* 最好不要这么做 */
button:focus{
  outline: 1px solid salmon;
}


如果想完全控制键盘聚焦的样式,可以使用这个伪类:focus-visible,兼容性略差

button:focus-visible{
  outline: 5px solid salmon;
}

image.png

四、表单特性


button具备一些表单特性。合理使用这些特性,不需要 js 也能实现很多交互,比如这样一个表单

<form>
    <label>用户: </label><input name="user" required><br>
    <label>密码: </label><input name="password" type="password" required><br>
    <button type="submit">登录</button>
    <button type="reset">重置</button>
</form>


其中,type="submit"天然支持表单提交,也就是触发 formsubmit 事件,而且也支持回车登录,这样体验就非常好了,输完用户名密码,可以直接敲击回车登录。


type="reset"可以执行表单的重置,注意这里是重置,而不是清空,可能理解成还原会更好。然后这个特性之前已经这篇文章中得到了应用:CSS 实现搜索相关交互

image.png

如果不使用 button,你可能需要更多的javascript来实现类似的功能,而且还有可能出现不为人知的 bug


五、屏幕阅读


button默认支持屏幕阅读访问。比如使用macOS自带的旁白,在读到一个按钮时,可以很清楚的明白这是一个按钮还有内部的文本

image.png

如果是一个 div,如果想达到这样的效果,可能需要


  1. 为了使 div聚焦,需要添加 tabindex=0属性
  2. 为了使div被识别成按钮,需要添加role="button"属性

有时候还有更极端的情况,直接使用背景图作为按钮,没有文字,还需要以下操作

  1. 为了使div能够被识别内容,需要添加 aria-label属性
<div tabindex="0" role="button" aria-label="登录2">登录</div>


这样屏幕阅读基本就能正常访问了

image.png

没错,文章开头的做法就是这样的,再来回顾一下这些茫茫多的属性

image.png

既然要这么麻烦,为何不直接用 button呢?


六、为何不使用button


以下是我个人的一些猜想


  1. button 在各个浏览器的样式表现不一致
  2. button 不能包含某些标签或者会导致无效,比如a标签
  3. 历史原因,以前就用 div实现了,不想折腾
  4. 不知道button有这么多好用的特性
  5. 不在乎这些,能实现就行,我的 js 非常强
  6. 实际项目中不需要键盘访问或者屏幕阅读
  7. 某些第三方组件库的封装


七、总结和说明


以上从样式和功能上介绍了原生 button元素的几个特性,同时还猜想了一些没有使用button的原因,下面总结一下:


  1. button支持禁用特性,通过:disabled伪类自定义禁用样式
  2. button默认盒子模型是border-box
  3. button内默认水平垂直居中
  4. button支持键盘访问,在聚焦状态下可以通过enter或者space触发点击事件
  5. button键盘聚焦的outline可以通过outline-color修改颜色,也可以通过:focus-visible自定义键盘聚焦样式
  6. button在表单中支持enter提交表单
  7. button在表单中有重置功能
  8. button默认支持屏幕阅读


虽然有这么多好用的特性,但是实际开发中还是有很多原因没有使用。不过不管以前如何如何,从现在开始,只要碰到"按钮",第一优先选择button就可以了,不用做过多修饰,就能在不知不觉中提升用户体验。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发

相关文章
|
11月前
|
缓存
301状态码和302状态码的区别是什么?
301与302均为HTTP重定向状态码,核心区别在于:301表示资源永久迁移,浏览器会缓存新地址并更新书签,适用于域名更换、路径重构等场景;302表示临时跳转,原URL仍有效,浏览器每次请求都会验证,常用于未登录跳转或临时维护。此外,302可能将POST请求转为GET,若需保持方法不变,应使用307。
1712 2
|
3月前
|
JSON Java API
京东商品详情API接口开发指南(含Java/Python实现)
京东开放平台商品详情查询接口,支持单/批量SKU查询(最多20个),返回含标题、价格、图片、促销等结构化JSON数据;具备签名验签、HTTPS加密、高并发安全机制。需先申请API权限并配置密钥。(239字)
|
5月前
|
前端开发 JavaScript 安全
前端组件库——Naive UI知识点大全(二)
教程来源 https://hllft.cn/category/tech-trends.html Naive UI是专为Vue 3打造的高质量开源组件库,提供90+开箱即用组件。本文详解中后台核心组件:NButton(多态/状态/尺寸灵活)、NDataTable(虚拟滚动+固定列)、NForm(声明式验证)、Message/Dialog/Notification反馈体系,以及NGrid/NSpace布局方案,并深入解析其TypeScript驱动、零CSS变量的主题定制与暗黑模式支持。
|
6月前
|
Shell Windows
鼠标右键管理,鼠标右键功能如何更改?鼠标右键选项太多怎么处置呢?
这是一款绿色单文件Windows右键菜单管理工具,支持文件、文件夹、桌面、回收站等全场景右键项增删改;界面简洁,操作只需勾选/取消,实时刷新生效;还支持按文件类型定制及Shell高级扩展,兼顾新手与进阶用户需求。(239字)
879 1
|
8月前
|
人工智能 弹性计算 关系型数据库
阿里云中小企业权益扶持:云产品特惠及专项补贴等政策解读
阿里云2026年中小企业扶持政策,涵盖算力补贴、出海支持、AI赋能三大核心权益。政策面向初创及成长型企业,提供最高5亿元算力补贴、10万元出海资源抵扣金及4万元AI技术+资源支持。本文梳理了实名认证、权益申领、资源使用等全流程,附典型案例与注意事项。
814 6
|
10月前
|
搜索推荐 数据可视化 数据库
用Python轻松打造专业PPT:自动化生成演示文稿全攻略
本文介绍如何用Python的python-pptx库自动化生成PPT,涵盖环境搭建、文本、图片、图表插入,以及批量生成与模板应用技巧。通过代码高效创建格式统一、内容丰富的演示文稿,大幅提升职场效率,适合报告、教学等场景,让PPT制作从繁琐变为智能。
3752 1
|
8月前
|
人工智能 自然语言处理 Java
改造智能客服的实操心得:从重复应答到智能协同
本文分享基于JBoltAI对传统客服系统进行低侵入式AI改造的实战经验,涵盖意图识别、智能检索、跨系统联动、会话总结四大场景,实现不重构系统即可提升客服效率与用户体验,为Java技术栈企业智能化升级提供可落地参考。
494 0
|
9月前
|
canal 消息中间件 关系型数据库
配置数据同步环境
本文介绍如何配置Canal+MQ实现MySQL数据同步。首先开启MySQL主从复制并启用Binlog行模式,创建Canal专用用户;接着部署Canal服务,配置其通过RabbitMQ发送数据变更消息;再设置监听的数据库表及动态Topic路由;最后在RabbitMQ中创建交换机与队列绑定,完成数据同步链路。修改指定表数据后,Canal捕获Binlog并将更新消息发送至MQ队列,供下游系统消费,实现高效、可靠的数据同步。
|
11月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
419 4
|
12月前
|
人工智能 自然语言处理 算法
现代AI工具深度解析:从GPT到多模态的技术革命与实战应用
蒋星熠Jaxonic,AI技术探索者,深耕代码生成、多模态AI与提示词工程。分享AI工具架构、实战应用与优化策略,助力开发者提升效率,共赴智能编程新纪元。

热门文章

最新文章