支付和地址表单最佳实践

通过帮助用户尽可能快速轻松地填写地址和支付表单,最大限度地提高转化率。

精心设计的表单可以帮助用户并提高转化率。一个小小的修复就能带来很大的改变!

这是一个简单的支付表单示例,演示了所有最佳实践

这是一个简单的地址表单示例,演示了所有最佳实践

清单

使用有意义的 HTML

使用为这项工作构建的元素和属性

  • <form><input><label><button>
  • typeautocompleteinputmode

这些启用了内置浏览器功能,提高了可访问性,并为您的标记添加了含义。

按预期方式使用 HTML 元素

将您的表单放在 <form> 中

您可能很想不用 <form> 包裹您的 <input> 元素,而纯粹使用 JavaScript 处理数据提交。

不要这样做!

HTML <form> 使您可以访问所有现代浏览器中强大的一组内置功能,并且可以帮助您的网站对屏幕阅读器和其他辅助设备具有可访问性。<form> 还简化了为 JavaScript 支持有限的旧版浏览器构建基本功能,以及即使代码出现故障也能启用表单提交,并且对于实际禁用 JavaScript 的少量用户也是如此。

如果您有多个用于用户输入的页面组件,请确保将每个组件都放在其自己的 <form> 元素中。例如,如果您在同一页面上有搜索和注册,请将每个都放在其自己的 <form> 中。

使用 <label> 来标记元素

要标记 <input><select><textarea>,请使用 <label>

通过为 label 的 for 属性赋予与 input 的 id 相同的值,将 label 与 input 关联起来。

<label for="address-line1">Address line 1</label>
<input id="address-line1" …>

为单个输入使用单个 label:不要尝试仅使用一个 label 来标记多个输入。这对浏览器最有效,对屏幕阅读器也最有效。点击或单击 label 会将焦点移动到与其关联的 input,并且当label或 label 的input获得焦点时,屏幕阅读器会宣布 label 文本。

使按钮有帮助

为按钮使用 <button>!您也可以使用 <input type="submit">,但不要使用 div 或其他一些充当按钮的随机元素。按钮元素提供可访问的行为、内置的表单提交功能,并且可以轻松设置样式。

为每个表单提交按钮提供一个值,说明它的作用。对于结账的每个步骤,使用描述性的行动号召,以显示进度并使下一步显而易见。例如,在您的送货地址表单上,将提交按钮标记为继续支付,而不是继续保存

考虑在用户点击或单击提交按钮后禁用它,尤其是在用户进行支付或下订单时。许多用户会重复单击按钮,即使它们工作正常。这可能会搞乱结账并增加服务器负载。

另一方面,不要因为缺少或无效的用户输入而禁用提交按钮。例如,不要仅仅因为缺少或无效的内容而使保存地址按钮保持禁用状态。这无助于用户,他们可能会继续点击或单击按钮并认为它已损坏。相反,如果用户尝试提交包含无效数据的表单,请向他们解释哪里出错了以及如何修复它。这在移动设备上尤其重要,在移动设备上,数据输入更加困难,并且当用户尝试提交表单时,屏幕上可能看不到丢失或无效的表单数据。

充分利用 HTML 属性

让用户轻松输入数据

使用适当的 input type 属性在移动设备上提供正确的键盘,并启用浏览器内置的基本验证。

例如,对电子邮件地址使用 type="email",对电话号码使用 type="tel"

Two screenshots of
  Android phones, showing a keyboard appropriate for entering an email address (using type=email)
  and for entering a telephone number (with type=tel).
适用于电子邮件和电话的键盘。

对于日期,请尽量避免使用自定义 select 元素。如果未正确实施,它们会破坏自动填充体验,并且在旧版浏览器上不起作用。对于出生年份等数字,请考虑使用 input 元素而不是 select,因为手动输入数字可能比从长下拉列表中选择更容易且不易出错,尤其是在移动设备上。使用 inputmode="numeric" 以确保移动设备上使用正确的键盘,并通过文本或占位符添加验证和格式提示,以确保用户以适当的格式输入数据。

使用 autocomplete 提高可访问性并帮助用户避免重新输入数据

使用适当的 autocomplete 值使浏览器能够通过安全地存储数据和自动填充 inputselecttextarea 值来帮助用户。这在移动设备上尤其重要,并且对于避免高表单放弃率至关重要。Autocomplete 还提供了多项可访问性优势

如果表单字段有适当的 autocomplete 值可用,您应该使用它。MDN Web 文档 提供了完整的值列表以及如何正确使用它们的说明。

稳定的值

账单地址

默认情况下,将账单地址设置为与送货地址相同。通过提供编辑账单地址的链接(或使用 summarydetails 元素)而不是在表单中显示账单地址来减少视觉混乱。

Example checkout page showing link to change billing address.
添加一个链接以查看账单。

对账单地址使用适当的 autocomplete 值,就像对送货地址一样,这样用户就不必多次输入数据。如果您在不同部分中具有相同名称的输入框的不同值,请在 autocomplete 属性中添加前缀词。

<input autocomplete="shipping address-line-1" ...>
...
<input autocomplete="billing address-line-1" ...>

帮助用户输入正确的数据

尽量避免因为客户“做错了事”而“责备”他们。相反,通过帮助用户在问题发生时解决问题,帮助用户更快更轻松地填写表单。在结账过程中,客户试图为您的公司提供产品或服务的资金,您的工作是帮助他们,而不是惩罚他们!

您可以将约束属性添加到表单元素,以指定可接受的值,包括 minmaxpattern。元素的有效性状态根据元素的值是否有效自动设置,:valid:invalid CSS 伪类也是如此,它们可用于设置具有有效或无效值的元素的样式。

例如,以下 HTML 指定了 1900 年到 2020 年之间的出生年份的输入。使用 type="number" 将输入值限制为仅数字,范围在 minmax 指定的范围内。如果您尝试输入超出范围的数字,则输入将被设置为无效状态。

以下示例使用 pattern="[\d ]{10,30}" 来确保有效的支付卡号,同时允许空格

现代浏览器还对类型为 emailurl 的输入执行基本验证。

在表单提交时,浏览器会自动将焦点设置在具有问题或缺少必填值的字段上。无需 JavaScript!

Screenshot of a sign-in form in Chrome on desktop showing browser prompt and focus for an invalid email value.
浏览器内置的基本验证。

在线验证并在用户输入数据时向用户提供反馈,而不是在用户单击提交按钮时提供错误列表。如果您需要在表单提交后在服务器上验证数据,请列出找到的所有问题,并清楚地突出显示所有具有无效值的表单字段,并在每个有问题字段旁边显示一条消息,说明需要修复的内容。检查服务器日志和分析数据中常见的错误,您可能需要重新设计表单。

您还应该使用 JavaScript 在用户输入数据时和表单提交时执行更强大的验证。使用 约束验证 API已得到广泛支持)以使用内置浏览器 UI 添加自定义验证,以设置焦点并显示提示。

使用 JavaScript 进行更复杂的实时验证中了解更多信息。

帮助用户避免遗漏必填数据

在必填值的输入框上使用 required 属性

当提交表单时,现代浏览器会自动提示并将焦点设置在缺少数据的 required 字段上,您可以使用 :required 伪类来突出显示必填字段。无需 JavaScript!

在每个必填字段的标签上添加星号,并在表单的开头添加注释以解释星号的含义。

简化结账

注意移动商务差距!

想象一下,您的用户有一个疲劳预算。用完它,您的用户就会离开。

您需要减少摩擦并保持专注,尤其是在移动设备上。许多网站在移动设备上获得更多流量,但在桌面设备上获得更多转化,这种现象被称为移动商务差距。客户可能只是更喜欢在桌面设备上完成购买,但较低的移动转化率也是不良用户体验的结果。您的工作是最大限度地减少移动设备上丢失的转化,并最大限度地提高桌面设备上的转化。研究表明,提供更好的移动表单体验存在巨大的机会。

最重要的是,用户更可能放弃看起来很长、很复杂且没有方向感的表单。当用户在较小的屏幕上、分心或匆忙时,尤其如此。尽可能少地索要数据。

使访客结账成为默认选项

对于在线商店来说,减少表单摩擦的最简单方法是使访客结账成为默认选项。不要强迫用户在购买前创建帐户。不允许访客结账被认为是购物车遗弃的主要原因。

Reasons for shopping cart abandonment during checkout.
来自 baymard.com/checkout-usability

您可以在结账后提供帐户注册。届时,您已经拥有设置帐户所需的大部分数据,因此用户应该可以快速轻松地创建帐户。

显示结账进度

您可以通过显示进度并清楚说明下一步需要做什么,使您的结账流程感觉不那么复杂。下面的视频展示了英国零售商 johnlewis.com 如何实现这一点。

显示结账进度。

您需要保持势头!对于付款的每个步骤,使用页面标题和描述性按钮值,以清楚地说明现在需要做什么,以及下一步结账步骤是什么。

为表单按钮提供有意义的名称,以显示下一步是什么。

在表单输入框上使用 enterkeyhint 属性来设置移动键盘回车键标签。例如,在多页表单中使用 enterkeyhint="previous"enterkeyhint="next",在表单中的最终输入框中使用 enterkeyhint="done",在搜索输入框中使用 enterkeyhint="search"

Two screenshots of an address form on Android showing how the enterkeyhint input attribute changes the enter key button icon.
Android 上的回车键按钮:“下一步”和“完成”。

enterkeyhint 属性在 Android 和 iOS 上受支持。您可以从 enterkeyhint 说明器中了解更多信息。

使用户可以轻松地在结账流程中来回跳转,轻松调整订单,即使他们处于最终付款步骤也是如此。显示订单的完整详细信息,而不仅仅是有限的摘要。使用户能够从付款页面轻松调整商品数量。您在结账时的首要任务是避免中断向转化迈进的进度。

消除干扰

通过消除视觉混乱和产品促销等干扰来限制潜在的退出点。许多成功的零售商甚至从结账中删除了导航和搜索。

Two screenshots on mobile showing progress through johnlewis.com checkout. Search, navigation and other distractions are removed.
搜索、导航和其他干扰已从结账中删除。

保持旅程的专注。现在不是诱使用户做其他事情的时候!

Screenshot of checkout page on mobile showing distracting promotion for FREE STICKERS.
不要分散客户完成购买的注意力。

对于回访用户,您可以通过隐藏他们不需要看到的数据来进一步简化结账流程。例如:以纯文本形式显示送货地址(而不是在表单中),并允许用户通过链接更改它。

Screenshot of 'Review order' section of checkout page, showing text in plain text, with links to change delivery address, payment method and billing address, which are not displayed.
隐藏客户不需要看到的数据。

使姓名和地址输入变得容易

仅询问您需要的数据

在您开始编写姓名和地址表单代码之前,请确保了解需要哪些数据。不要询问您不需要的数据!降低表单复杂性的最简单方法是删除不必要的字段。这也对客户隐私有好处,并且可以降低后端数据成本和责任。

使用单个姓名输入

除非您有充分的理由分别存储名字、姓氏、尊称或其他姓名部分,否则允许用户使用单个输入来输入他们的姓名。使用单个姓名输入可以使表单不那么复杂,启用剪切和粘贴,并使自动填充更简单。

特别是,除非您有充分的理由不这样做,否则不要费心为前缀或称谓(如夫人、博士或勋爵)添加单独的输入框。用户可以随意将其与他们的姓名一起输入。此外,honorific-prefix autocomplete 当前在大多数浏览器中不起作用,因此添加姓名前缀或称谓字段会破坏大多数用户的地址表单自动填充体验。

启用姓名自动填充

对全名使用 name

<input autocomplete="name" ...>

如果您确实有充分的理由拆分姓名部分,请确保使用适当的 autocomplete 值

  • honorific-prefix
  • given-name
  • nickname
  • additional-name-initial
  • additional-name
  • family-name
  • honorific-suffix

允许国际姓名

您可能想要验证您的姓名输入,或限制姓名数据允许的字符。但是,您需要尽可能不对字母表进行限制。被告知您的姓名“无效”是很粗鲁的!

对于验证,请避免使用仅匹配拉丁字符的正则表达式。仅限拉丁字符会排除姓名或地址包含非拉丁字母表中字符的用户。请改为允许 Unicode 字母匹配,并确保您的后端安全地支持 Unicode 作为输入和输出。现代浏览器很好地支持正则表达式中的 Unicode。

不要
<!-- Names with non-Latin characters (such as Françoise or Jörg) are 'invalid'. -->
<input pattern="[\w \-]+" ...>
执行
<!-- Accepts Unicode letters. -->
<input pattern="[\p{L} \-]+" ...>
Unicode 字母匹配与仅限拉丁字母匹配的比较。

允许各种地址格式

在设计地址表单时,请记住地址格式的多样性,即使在同一个国家/地区内也是如此。请注意不要对“正常”地址做出假设。(如果您对此表示怀疑,请查看 英国地址怪异之处!

使地址表单更灵活

不要强迫用户尝试将其地址挤入不适合的表单字段中。

例如,不要坚持在单独的输入框中填写门牌号和街道名称,因为许多地址不使用这种格式,并且不完整的数据可能会破坏浏览器自动填充功能。

对于 required 地址字段要格外小心。例如,英国大城市的地址没有郡,但许多网站仍然强制用户输入郡。

使用两个灵活的地址行可以很好地适用于各种地址格式。

<input autocomplete="address-line-1" id="address-line1" ...>
<input autocomplete="address-line-2" id="address-line2" ...>

添加匹配的标签

<label for="address-line-1">
Address line 1 (or company name)
</label>
<input autocomplete="address-line-1" id="address-line1" ...>

<label for="address-line-2">
Address line 2 (optional)
</label>
<input autocomplete="address-line-2" id="address-line2" ...>

您可以尝试重新混合和编辑下面嵌入的演示。

考虑使用单个 textarea 作为地址

对于地址来说,最灵活的选择是提供单个 textarea

textarea 方法适用于任何地址格式,并且非常适合剪切和粘贴——但请记住,它可能不符合您的数据要求,并且如果用户以前只使用带有 address-line1address-line2 的表单,则可能会错过自动填充功能。

对于 textarea,请使用 street-address 作为自动完成值。

这是一个表单示例,演示了如何使用单个 textarea 来填写地址

将地址表单国际化和本地化

根据您的用户所在的位置,地址表单尤其需要考虑 国际化和本地化

请注意,地址组成部分的命名以及地址格式各不相同,即使在同一种语言中也是如此。

    ZIP code: US
 Postal code: Canada
    Postcode: UK
     Eircode: Ireland
         PIN: India

如果表单不适合您的地址或没有使用您期望的词语,可能会让人感到恼火或困惑。

对于您的网站来说,为多个地区定制 地址表单可能是必要的,但使用技术来最大化表单的灵活性(如上所述)可能就足够了。如果您不本地化您的地址表单,请务必了解应对各种地址格式的关键优先事项:* 避免对地址组成部分过于具体,例如坚持要求填写街道名称或门牌号。* 在可能的情况下,避免将字段设置为 required。例如,许多国家的地址没有邮政编码,而农村地址可能没有街道或道路名称。* 使用包容性命名:“国家/地区”,而不是“国家”;“邮政编码”,而不是“邮编”。

保持灵活性!上面的 简单地址表单示例 可以进行调整,以便在许多地区“足够好地”工作。

考虑避免使用邮政编码地址查找

一些网站使用服务根据邮政编码查找地址。对于某些用例来说,这可能是明智的,但您应该意识到潜在的缺点。

邮政编码地址建议并非适用于所有国家/地区——在某些地区,邮政编码可能包含大量潜在地址。

邮政编码可能包含大量地址!

用户很难从长长的地址列表中进行选择——尤其是在移动设备上,如果他们很匆忙或有压力。让用户利用自动填充功能,只需单击或点击一下即可填写完整的地址,可能更容易且更不容易出错。

单个姓名输入框可以实现一键(单击)地址输入。

简化支付表单

支付表单是结账过程中最关键的部分。糟糕的支付表单设计是 购物车放弃的常见原因细节决定成败:小的故障可能会促使用户放弃购买,尤其是在移动设备上。您的工作是设计表单,使其尽可能方便用户输入数据。

帮助用户避免重新输入支付数据

确保在支付卡表单中添加适当的 autocomplete 值,包括支付卡号、卡片上的姓名以及到期月份和年份

  • cc-number
  • cc-name
  • cc-exp-month
  • cc-exp-year

这使浏览器能够通过安全地存储支付卡详细信息并正确输入表单数据来帮助用户。如果没有自动完成功能,用户可能更倾向于保留支付卡详细信息的纸质记录,或者不安全地将支付卡数据存储在他们的设备上。

避免对支付卡日期使用自定义元素

如果设计不当,自定义元素 可能会通过破坏自动填充功能来中断支付流程,并且在旧版浏览器上无法使用。如果所有其他支付卡详细信息都可以通过自动完成功能获得,但用户被迫找到他们的实体支付卡来查找到期日期,因为自动填充功能不适用于自定义元素,那么您很可能会失去一笔销售。考虑使用标准 HTML 元素来代替,并相应地设置它们的样式。

Screenshot of payment form showing custom elements for card expiry date that interrupt autofill.
自动完成功能填充了所有字段——除了到期日期!

对支付卡和电话号码使用单个输入框

对于支付卡和电话号码,请使用单个输入框:不要将号码分成几部分。这使得用户更容易输入数据,使验证更简单,并使浏览器能够自动填充。考虑对其他数字数据(如 PIN 码和银行代码)也这样做。

Screenshot of payment form showing a credit card field split into four input elements.
不要对信用卡号使用多个输入框。

仔细验证

您应该在实时和表单提交之前验证数据输入。一种方法是在支付卡输入框中添加 pattern 属性。如果用户尝试提交包含无效值的支付表单,浏览器将显示警告消息并将焦点设置在输入框上。无需 JavaScript!

但是,您的 pattern 正则表达式必须足够灵活,以处理 支付卡号长度范围:从 14 位数字(或可能更少)到 20 位(或更多)。您可以从 LDAPwiki 了解更多关于支付卡号结构的信息。

允许用户在输入新的支付卡号时包含空格,因为数字在实体卡片上就是这样显示的。这对用户更友好(您不必告诉他们“他们做错了什么”),不太可能中断转化流程,并且在处理之前删除数字中的空格非常简单。

在一系列设备、平台、浏览器和版本上进行测试

在用户最常用的平台上测试地址和支付表单尤为重要,因为表单元素的功能和外观可能会有所不同,并且视口大小的差异可能会导致定位问题。BrowserStack 支持 针对开源项目的免费测试,可在各种设备和浏览器上进行。

Screenshots of a payment form, payment-form.glitch.me, on iPhone 7 and 11. The Complete Payment button is shown on iPhone 11 but not 7
iPhone 7 和 iPhone 11 上的同一页面。
减小较小移动视口的内边距,以确保 完成支付 按钮不会被隐藏。

实施分析和 RUM

在本地测试可用性和性能可能很有帮助,但您需要真实世界的数据才能正确了解用户如何体验您的支付和地址表单。

为此,您需要分析和真实用户监控——实际用户体验的数据,例如结账页面加载需要多长时间或支付完成需要多长时间

  • 页面分析:每个包含表单的页面的页面浏览量、跳出率和退出率。
  • 交互分析目标渠道事件 指示用户在哪里放弃您的结账流程以及他们在与您的表单交互时采取了哪些操作。
  • 网站性能以用户为中心的指标 可以告诉您您的结账页面加载是否缓慢,如果是,则原因是什么。

当与服务器日志、转化数据和 A/B 测试结合使用时,页面分析、交互分析和真实用户性能测量变得尤其有价值,使您能够回答诸如折扣代码是否增加了收入,或者表单布局的更改是否提高了转化率等问题。

反过来,这为您提供了优先考虑工作、做出更改和奖励成功的坚实基础。

持续学习

照片由 @rupixenUnsplash 上拍摄。