互动

手机等小屏设备通常配有触摸屏。笔记本电脑和桌面电脑等大屏设备通常配有鼠标或触控板等硬件。人们很容易将小屏幕与触控操作等同起来,将大屏幕与指针操作等同起来。

但现实情况更为复杂。部分笔记本电脑具有触摸屏功能。用户可以与触摸屏或触控板(或两者兼有)进行互动。同样,您也可以将外接键盘或鼠标与平板电脑等触摸屏设备搭配使用。

请使用 CSS 中的媒体功能,而不是尝试根据屏幕尺寸推断输入机制。

指针

您可以使用 pointer 媒体功能测试三个可能的值:nonecoarsefine

如果浏览器报告的 pointer 值为 none,则表示用户可能正在使用键盘与您的网站互动。

如果浏览器报告的 pointer 值为 coarse,则表示主要输入机制不太准确。触摸屏上的手指属于粗略指针。

如果浏览器报告的 pointer 值为 fine,则表示主要输入机制能够进行精细控制。鼠标或触控笔是理想的指针。

您可以调整界面元素的大小,以适应 pointer 值。请尝试在不同类型的设备上访问此网站,看看界面如何自适应。

在此示例中,按钮针对粗略指针进行了放大:

button {
  padding: 0.5em 1em;
}
@media (pointer: coarse) {
  button {
    padding: 1em 2em;
  }
}

您也可以缩小元素以适应精细指针,但请谨慎操作:

错误做法
@media (pointer: fine) {
  button {
    padding: 0.25em 0.5em;
  }
}

即使用户有能够进行精细控制的主要输入机制,在缩减交互元素的大小之前,也请三思。Fitts 定律仍然适用。即使使用精细的光标,也需要更专注地瞄准较小的目标。无论使用哪种指针设备,更大的目标区域对所有用户都有益。

任意指针

pointer 媒体功能用于报告主要输入机制的精细程度。但许多设备具有多个输入机制。用户可能同时使用触摸屏和鼠标与您的网站互动。

any-pointer 不同于 pointer 媒体功能,因为它会报告是否有任何指针设备通过了测试。

any-pointer 值为 none 表示没有可用的指针设备。

any-pointer 值为 coarse 表示至少有一个指针设备的准确性不高。但这可能不是主要的输入机制。

如果 any-pointer 值为 fine,则表示至少有一个指针设备能够进行精细控制。但再次强调,这可能不是主要的输入机制。

由于 any-pointer 媒体查询会在任何输入机制通过测试时报告正例结果,因此浏览器可能会同时报告 any-pointer: fineany-pointer: coarse 的结果。在这种情况下,媒体查询的顺序很重要。最后一个将优先。

在此示例中,如果设备同时具有精细输入机制和粗略输入机制,则系统会应用粗略样式。

@media (any-pointer: fine) {
  button {
    padding: 0.5em 1em;
  }
}
@media (any-pointer: coarse) {
  button {
    padding: 1em 2em;
  }
}

悬停

hover 媒体功能用于报告主要输入机制能否悬停在元素上。这通常表示屏幕上有某种光标,由鼠标或触控板控制。

与区分精细指针和粗略指针的 pointer 媒体功能不同,hover 媒体功能是二进制功能。如果主要输入设备能够悬停在元素上,则会报告值 hover。否则,值为 none

在此示例中,某些补充图标会在悬停时显示,但前提是主要输入设备能够悬停在元素上。

button .extra {
  visibility: visible;
}
@media (hover: hover) {
  button .extra {
    visibility: hidden;
  }
  button:hover .extra {
    visibility: visible;
  }
}

如果您将鼠标悬停在该按钮上,系统就会显示该图标。但是,如果您使用键盘按 Tab 键找到该按钮,该图标仍会保持不可见状态。使用键盘时,您是在聚焦,而不是悬停。连接了鼠标的桌面设备将报告主要输入机制能够悬停,这是正确的。但是,在连接鼠标的情况下,任何使用键盘的用户都无法获享 :hover 样式的优势。因此,最好将 :hover:focus 样式组合使用,以涵盖这两种互动。

button .extra {
  visibility: visible;
}
@media (hover: hover) {
  button .extra {
    visibility: hidden;
  }
  button:is(:hover, :focus) .extra {
    visibility: visible;
  }
}

即使主要输入设备能够悬停在元素上,也要小心隐藏在悬停互动后面的信息。信息的发现性会降低。请勿使用悬停来隐藏重要信息或重要界面元素。

任何悬停

hover 媒体查询仅报告主要输入机制。某些设备具有多种输入机制:触摸屏、鼠标、键盘、触控板。

就像 any-pointer 会报告任何输入机制一样,如果任何可用的输入机制都能够悬停在元素上,any-hover 将为 true。

如果您决定反转上例中的逻辑,可以将悬停样式设为默认样式,然后在 any-hover 的值为 none 时移除这些样式。

button .extra {
  visibility: hidden;
}
button:hover .extra,
button:focus .extra {
  visibility: visible;
}
@media (any-hover: none) {
  button .extra {
    visibility: visible;
  }
}

如果设备没有能够悬停的输入机制,则额外的图标始终可见。

虚拟键盘

用户使用光标和手指探索界面,但在输入信息时,他们需要使用键盘。如果用户的设备连接了实体键盘,则没问题,但如果用户使用的是触摸屏设备,则情况会稍微复杂一些。这些设备提供屏幕虚拟键盘。

输入类型

与实体键盘不同,虚拟键盘可以根据预期的输入进行量身定制。如果您提供预期输入的信息,设备便可提供最合适的虚拟键盘。

HTML5 输入类型是描述 input 元素的绝佳方式。type 属性接受 emailnumbertelurl 等值。

  <label for="email">Email</label>
  <input type="email" id="email">
  <label for="number">Number</label>
  <input type="number" id="number">
  <label for="tel">Tel</label>
  <input type="tel" id="tel">
  <label for="url">URL</label>
  <input type="url" id="url">

输入法

Browser Support

  • Chrome: 66.
  • Edge: 79.
  • Firefox: 95.
  • Safari: 12.1.

Source

借助 inputmode 属性,您可以精细控制虚拟键盘。例如,如果有一个 input type 的值为 number,您可以使用 inputmode 属性来区分整数和小数。

如果您要询问整数(例如某人的年龄),请使用 inputmode="numeric"

<label for="age">Age</label>
<input type="number" id="age" inputmode="numeric">

如果您要询问包含小数位的数字(例如价格),请使用 inputmode="decimal"

<label for="price">Price</label>
<input type="number" id="price" inputmode="decimal">

自动补全

没有人喜欢填写表单。作为设计师,您可以让用户自动填写表单字段,从而改善用户体验。autocomplete 属性提供了一系列选项,可用于改进联系表单、登录表单和结账表单。

<label for="name">Name</label>
<input type="text" id="name" autocomplete="name">
<label for="country">Country</label>
<input type="text" id="country" autocomplete="country">
<label for="email">Email</label>
<input type="email" id="email" autocomplete="email">

这些 HTML 属性(typeinputmodeautocomplete)是表单字段中新增的一些小属性,但对用户体验有很大影响。通过预测和响应用户的设备功能,您可以赋予用户强大的能力。如需了解更深入的信息,我们提供了一门专门帮助您了解表单的课程。

本课程的下一部分将介绍一些常见的界面模式

检查您的理解情况

测试您对互动相关知识的掌握情况

您应使用哪项功能,而不是尝试根据屏幕尺寸推断用户的输入类型?

CSS 媒体功能
例如 @media (pointer: coarse)@media (-any-pointer: coarse)
使用 JavaScript 的 prompt() 向用户询问
直接询问不太理想。
CSS 媒体类型 handheld
此属性已在媒体查询 4 中废弃。

@media (pointer)@media (any-pointer) 有什么不同?

任何指针都包括将手指用作指针的操作。
指针已将触控作为输入类型。
指针不包括鼠标等设备。
指针包括作为输入设备的鼠标。
当其他非主要输入(例如触控笔)通过测试时,任何指针都会报告 true。
any-pointer 会查询所有设备输入类型,以查找任何匹配项。

哪些输入类型会向用户显示更合适的虚拟键盘?

type="url"
键盘将提供按钮来支持输入网址。
type="tel"
键盘将提供按钮来支持输入电话号码。
type="number"
键盘将提供仅支持输入数字的按钮。
type="email"
键盘将提供按钮来支持输入电子邮件地址。