登录和注册表单的11个HTML最佳实践

原文:11 HTML best practices for login & sign-up forms

原作者:Andrey Sitnik

翻译已获原文作者许可,禁止转载和商用

大多数网站都有登录或注册表单;它们是业务转换的关键部分。然而,即使是流行的站点也没有实现本文中提到的11个最佳实践,并且至少有一个错误。所以,阅读这篇文章,然后检查你的表单,并通过使用HTML技术来改善你的用户体验。

一般来说,登录和登录表单都非常简单。对于大多数网站来说,它们只有两个输入框和一个提交按钮。但是,即使这么简单的HTML结构,许多网站仍然有一些小错误。

由于这种类型的表单很简单,并且有很多出错的可能,因此它们提供了一个很好的学习环境,既可以学习一些新的HTML特性,也可以掌握使用任何类型的表单生成最佳用户体验所需的技能。

考虑无密码流程替代电子邮件/密码

在我们开始实践之前,注意: 在本文中,我们将使用经典的电子邮件/密码表单作为示例。然而,就安全性而言,密码实际上是让用户登录的最糟糕的方式,而且这种方法有许多众所周知的弱点。让我们快速看几个:

  1. 这份关于2018年verizon数据泄露的报道 的报告称,超过70%的人在不同网站上重复使用密码。攻击者可能会在一个网站的一些泄露数据中找到跨网站共享的密码,并用它来窃取另一个网站的帐户。此外,与我们将在下面讨论的无密码选项相比,将2FA作为解决方案实现会降低用户体验。
  2. 用户经常忘记密码,重置密码需要花费太多时间。根据传输安全公司的这份报告,55%的用户因为登录过程过于复杂而放弃使用网站。

如果你想改进你的登录表单,第一步应该是考虑无密码流程。

以下是我目前最喜欢的无密码实现:

  1. 不要使用DIY实现,而是使用安全的、设计良好和维护良好的第三方解决方案,比如Auth0或Amazon Cognito。对于我们的几个客户项目,包括具有最高安全性要求的项目,我们使用了其中一种方法进行身份验证。
  2. 苹果和谷歌提出的新密钥标准。纽约时报的这篇演示和文章解释了它是如何工作的,以及为什么它更好。
  3. 实现带有登录链接的电子邮件(许多用户在每次登录时都使用记住密码功能)。

您还可以组合这些选项,例如,为使用新浏览器的用户使用passkey,为没有passkey的用户使用登录链接。

解决了这些问题后,让我们继续讨论登录和注册表单的11个最佳实践。(在阅读时,请记住,几乎所有这些指导方针也适用于任何类型的表单。)

1. 设置 autocomplete

- <input type="email">
+ <input type="email" autocomplete="username">
- <input type="password">
+ <input type="password" autocomplete="current-password"><button>Login</button>

密码管理器是降低电子邮件/密码表单安全风险的唯一选择(但即使它们也不能避免所有风险)。这就是为什么给密码管理器一个辅助是很重要的。

标签有一个非常有用的autocomplete属性。它还允许密码管理器区分登录表单(current-password)和注册表单(new-password)。

让我们一起来看看:

  <label>New password:
-   <input type="password">
+   <input type="password" autocomplete="new-password"></label><label>Confirm password:
-   <input type="password">
+   <input type="password" autocomplete="new-password"></label><button>Sign Up</button>

如果你不知道你在做什么,不要设置autocomplete="off" !这样做可能会降低用户体验。只有当我们需要隐藏非常敏感的数据(比如医疗网站上的“症状”字段)时,我们才应该使用这个设置。

2. 设置type="email"

  <label>E-mail:
-   <input type="text" autocomplete="username">
+   <input type="email" autocomplete="username"></label>

登录表单最常见的错误之一是在e-mail字段中使用type="text"而不是type="email"。为什么这个属性很重要?

  1. 浏览器会在一个自动完成的弹出框中提示用户的电子邮件地址(即使用户是第一次打开一个网站)。
  2. 在触摸设备上,用户将会被提示使用一个专门为输入电子邮件而设计的、更舒适的键盘。
  3. 它支持内置的电子邮件验证。

如果你不喜欢浏览器内置的验证,不要设置type="text"。相反,使用novalidate属性。

3. 所有可点击项都应该使用<button><a>,而不是<div><span>

- Forgot your password? <span>Reset it here</span>.
+ Forgot your password? <a href="/restore">Reset it here</a>.- <div>Login</div>
+ <button>Login</button>

链接会改变当前页面,我们应该对所有链接使用<a>。按钮不会改变页面的URL,只会改变当前页面的状态;我们应该对所有按钮使用<button>

<span onClick={…}>相比,使用<a>标签有很多好处。例如,用户可以在新选项卡中打开链接,或者在单击之前查看新的URL。

通过使用<button>而不是<div>,你可以让你的网站更容易访问,并改善键盘用户体验:屏幕阅读器会告诉用户什么时候他们正在处理一个按钮;按钮将具有:focus状态,以改进键盘用户体验。

此外,我们应该使用<button>来显示/隐藏密码功能;不要忘记aria-label标签,如果你使用的是一个图标按钮:

<button type="button" aria-label="Show password"><div class="eye-icon">
</button>

这里还有一点:<a><button>也很适合用于开发目的。通过对交互元素使用<a>/<button>,你可以更容易地为所有的交互元素创建一个CSS选择器:

button, a {cursor: pointer; /* Using pointer is controversial, this is just an example */
}

4. 用<form>包裹字段和提交<button>

- <div>
+ <form><label>Email: <input type="email" autocomplete="username"></label><label>Password: <input type="password" autocomplete="current-password"></label>
+   <button>Login</button>
+ <form>
- </div>
- <button>Login</button>

确保将所有表单的字段及其提交<button>包装在<form>标签中。只有当字段位于< form >标签内并且只有一个提交按钮时,使用Enter提交表单才有效。(此外,使用屏幕阅读器的用户会喜欢这种实现提供的更好的导航。)

5. 避免使用placeholder替代<label>

- <input placeholder="E-mail" type="email" autocomplete="username">
+ <label>
+   E-mail:
+   <input type="email" autocomplete="username">
+ </label>

创建placeholder属性是为了显示输入的示例,而不是为了描述该输入。因此,我完全不建议将它用作<label>标记的替代品。此外,当用户输入数据时,占位符值将被隐藏,并且它们还经常存在对比度问题。

这对于简短的电子邮件+密码表单来说不是那么明显,但在较大的表单中占位符的问题就很明显了。

6. 用<label>标签包装复选框输入

- <input type="checkbox"> I agree with the privacy policy
+ <label>
+   <input type="checkbox"> I agree with the privacy policy
+ </label>

默认情况下,复选框输入的尺寸非常小,因此只能检测到很小的点击区域。这意味着用户需要更多的时间来精确地将光标放置在需要的位置。但是,如果复选框输入被包装在<label>标签中,那么单击其文本也会改变复选框的值。(另外,请注意,每个单独的复选框输入都需要自己的<label>标记。)

这样做的时候,最好添加一个清晰的悬停效果,让用户知道他们可以点击文本来触发输入:

label:hover {background: oklch(0 0 0 / 10%);
}

7. 添加一个可见焦点状态

- *:focus {
-   outline: none;
- }
+ button:focus-visible, a:focus-visible, input:focus-visible {
+   outline: 5px solid oklch(60% 0.15 252);
+ }

在我们的应用程序中,我们经常忘记或忽略键盘用户体验。但是当涉及到表单时,一般来说,每个用户都会使用键盘。我们需要考虑如何从键盘访问UI。

第一步是添加对比度:focus状态以突出显示当前字段。用户将使用他们的周边视觉来确定焦点被移动的位置。Sara Soueidan写了一个很棒的指南,解释了如何使:focus指示器清晰可见。

在为输入字段和按钮创建:focus状态之后,也将其添加到<a>标记中。这是改善网站键盘可访问性的第一小步。

永远不要在你的应用中禁用:focus状态。

另一个提示:如果您开发SPA并且想在单击菜单项后移除:focus状态,请使用:focus-visible

8. 为屏幕阅读器标记无效字段

  <input type="email" autocomplete="username"
-         class="invalid">
+         required aria-invalid="true" aria-errormessage="email-error"><div id="email-error">Enter a valid email address</div>

aria-invalidaria-errormessage展示屏幕阅读器用户的验证错误。

另一个注意事项:通过使用required属性警告屏幕阅读器用户关于必填字段也很不错。如果您不喜欢浏览器内置的required验证,请确保在实现自己的验证时使用aria-required属性。

9. 防止在用户输入中间进行验证

- input.addEventListener('keyup', () => {
-   if (validate(input)) {
-     markValid(input)
-   } else {
-     markInvalid(input)
-   }
- })
+ input.addEventListener('input', () => {
+   if (validate(input)) {
+     markValid(input)
+   }
+ })
+ input.addEventListener('change', () => {
+   if (validate(input)) {
+     markValid(input)
+   } else {
+     markInvalid(input)
+   }
+ })

当用户在表单中输入数据时,我们不想让错误动画分散他们的注意力或让他们感到困惑,所以不要在用户还没有完成输入之前显示不是有效邮箱的错误。

作为一种解决方案,在用户完成输入后(通过移动到另一个控件或提交表单),使用change而不是keyup进行验证。当然,我们仍然可以使用input/keyup,但只能隐藏输入过程中的错误。

下面是关于内联表单验证的一个很好的指南。

  1. 防止表单发送两次
form.addEventListener('submit', () => {submit.disabled = true// Fix for Firefox. It persists the dynamic disabled state without this hack.submit.autocomplete = 'off'// We are using setTimeout for page-reload submit.// For AJAX, use await and try-finally to enable submit the button again.setTimeout(() => {button.disabled = false}, 2000)
})

用户经常会不小心双击而不是单击。因此,为了防止显示一些服务器错误,最好在表单提交时禁用该按钮。

  1. 使用AJAX时,要考虑网络延迟和服务器/网络错误
  form.addEventListener('submit', async () => {
-   await fetch(…)
+   try {
+     showLoader()
+     await fetch(…)
+   } catch (e) {
+     showError(e)
+   } finally {
+     hideLoader()
+   }})

对于每个AJAX请求,我们应该始终考虑两件事:

  1. 向用户显示加载状态。在本地开发期间,您有0毫秒的延迟,但是真实用户在服务器响应之前将有几秒钟的延迟,因此用户应该在单击提交按钮后看到某种反馈。
  2. 处理网络和服务器错误。你不会在本地开发中看到这种情况,但在生产环境中,每个用户都可能遇到WiFi连接失败或服务器出现Error 500错误;为它们做好准备,并向用户显示一些适当的文本。

注意:对于授权表单,最好通过页面重载提交表单,因为它会将用户的token保存到httpOnly-cookie并更新web应用中的所有存储。

总结

  1. 设置autocomplete输入字段
  2. 为输入字段选择正确的type
  3. 所有可点击的元素都应该使用<button><a>,而不是<div><span>
  4. <form>标签内包裹输入字段和提交 <button>
  5. 使用<label>描述<input>标签,避免placeholder
  6. <label>标签内包装复选框
  7. 为UI设置可视:focus状态
  8. 为屏幕阅读器标记无效字段
  9. 阻止在输入中间进行验证
  10. 阻止表单发送两次
  11. 考虑网络延迟和服务器/网络错误

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

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

相关文章

ubuntu 18.04 磁盘太满无法进入系统

安装了一个压缩包&#xff0c;装了一半提示磁盘空间少导致安装失败。我也没在意&#xff0c;退出虚拟机打算扩展硬盘。等我在虚拟机设置中完成扩展操作&#xff0c;准备进入虚拟机内部进行操作时&#xff0c;发现登录不进去了 shift 登入GUN GRUB设置项的问题 网上都是在开机…

Yarn与Zookeeper学习

YARN学习 1.YARN是什么&#xff1f; yarn 分配运行资源 mapReduce的运行平台 2.YARN运行过程&#xff1a; 客户端与ResourceManager交互&#xff0c;生成临时配置文件(Application)ResourceManager根据Application信息生成Task然后生成MapReduceApplicationMaster(简称AM)AM…

如何解决创建vue项目后没有webpack.config.js(vue.config.js)文件

◼️ webpack.config.js文件没有的原因 Vue 项目中 vue.config.js 文件就等同于 webpack 的 webpack.config.js。 vue-cli3 之后创建的时候并不会自动创建 vue.config.js&#xff0c;因为这个是个可选项&#xff0c;所以一般都是需要修改 webpack 的时候才会自己创建一个 vue…

“5G+工业互联网”20个典型应用场景

目录 1、工业研发设计&#xff08;2个应用场景&#xff09; 1&#xff09;协同研发设计 2&#xff09;生产单元模拟 2、生产运行&#xff08;5个应用场景&#xff09; 1&#xff09;远程设备操控 2&#xff09;设备协同作业 3&#xff09;精准动态作业 4&#xff09;柔…

dbus-send和dbus-monitor命令详解

1. 概述 D-Bus 是 Linux 上的一种进程间通信方式&#xff0c;内部使用 socket 技术实现。是 freedesktop.org 专案的一部分&#xff0c;其设计目的是使Linux桌面环境&#xff08;如GNOME与KDE等&#xff09;提供的服务标准化。 应用程序可以在总线上注册 D-Bus 服务&#xff…

信号——进程间最古老的通信方式之一

文章目录 信号信号的5种默认处理动作查看core文件中的错误信息常见函数killraiseabortalarmsetitime 信号 SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAPSIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERMSIGS…

R语言 PCA筛选变量

#PCA-筛选变量 X <- data[,2:415] pca <- prcomp(X, center TRUE, scale. TRUE) # 进行主成分分析 summary(pca) # 查看各个主成分的解释方差比例 library(factoextra) #碎石图依赖-fviz fviz_eig(pca,addlabelsT) #碎石图 X_selected <- pca$x[,1:20] # 选择前n个主…

饮用水、地下水除砷的方法——砷吸附树脂

砷&#xff08;As&#xff09;为非人体必需元素&#xff0c;既不溶解于水又不溶解于酸&#xff0c;在自然界有三价无机态 As(III)、五价无机态 As(V)以及有机砷MMA(甲基胂酸)、DMA(二甲基胂酸)、TMA(三甲基胂酸)等。 砷在水体中主要以三价和五价的无机酸形式存在&#xff0c;三…

CDN、P2P、PCDN的区别是什么

本篇文章为大家介绍一下与网络加速有关的几个重要概念&#xff0c;一起了解一下CDN,P2P和PCDN究竟是什么吧&#xff01; 1. CDN CDN即Content Delivery Network&#xff0c;中文全称为内容分发网络。 如果内容离用户远&#xff0c;用户可能无法获得及时的响应&#xff0c;那…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码&#xff0c;窥kafka设计之道&#xff08;上&#xff09;》 留下了kafka设计上比较优秀的一个点&#xff1b;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存&#xff0c;就可以降低JVM GC的执…

任务的创建与删除

Q: 什么是任务&#xff1f; A: 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 比如&#xff1a; 玩游戏&#xff0c;打篮球&#xff0c;开车&#xff0c;都可以视为任务。 Windows 系统中的 MarkText 、谷歌浏览器、记事本&#xff0…

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

开源视频监控管理平台国标GB28181视频EasyCVR电子地图功能展示优化

视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频监控综合管理平台EasyCVR可提供的视频能力包括&#…

基于JavaSE的手机库存管理系统

1、项目背景 基于JavaSE完成如下需求&#xff1a; 功能需求&#xff1a; 1、查询库存量 2、可以修改库存中不同品牌手机的个数 3、退出系统 实现步骤&#xff1a; 1、把List当做库房 2、把手机存放在库房中 3、使用封装的方法区操作仓库中的手机 2、项目知识点 面向对象 集合…

AI Chat 设计模式:9. 命令模式

本文是该系列的第九篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 介绍下命令模式A.1Q.2 详细说说命令模式适用于啥场景呢A.2Q.3 举一个命令模式的例子&a…

基于SpringBoot的开源项目/demo汇总

一些基于SpringBoot的开源项目&#xff0c;方便大家学习&#xff0c;参考。持续更新&#xff0c;排名不分先后。也欢迎贡献&#xff08;回复此贴&#xff09;。 1、GitHub - Tencent/APIJSON: &#x1f3c6; 零代码、全功能、强安全 ORM 库 &#x1f680; 后端接口和文档零代码…

Wireshark抓包分析教程(ubuntu版本)

安装 first&#xff0c;多亏我们的C知道&#xff0c;成功安装了wireshark&#xff0c; Steps are as following&#xff1a; 添加wireshark的软件源(PPA:personal package archive(档案)) sudo apt-add-repository ppa:wireshark-dev/stable ppa:wireshark-dev/stable 是一个…

C++语法(26)--- 特殊类设计

C语法&#xff08;25&#xff09;--- 异常与智能指针_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131537799?spm1001.2014.3001.5501 目录 1.特殊类设计 1.设计一个类&#xff0c;不能被拷贝 C98 C11 2.设计一个类&#xff0c;只能在堆上…

echarts制作多个纵轴的折线图

代码 <script type"text/javascript"> $(function (){var myChart echarts.init(document.getElementById(main));option {color: ["#9bbb59","#0B438B","#4141F1","#F81945","#4bacc6","#F89E19&q…

Python 电商API 开发最佳实践

一、简介 当你打卡了一家北京最具有地中海特色的餐厅&#xff0c;当我们在餐厅点餐时&#xff0c;服务员会给我们一份菜单&#xff0c;菜单上列出了所有可供选择的菜品和饮料。我们可以在菜单上选择我们想要的食物和饮料&#xff0c;然后告诉服务员我们的选择。服务员会根据我…