Better Form Inputs for Better Mobile User Experiences
Publikováno: 17.4.2020
Here’s one simple, practical way to make apps perform better on mobile devices: always configure HTML input fields with the correct type
, inputmode
, and autocomplete
attributes. While these three attributes are often discussed in isolation, they make the most sense in the context of mobile user experience when you think of them as a team.
There’s no question that forms on mobile devices can be time-consuming and tedious to fill in, but by properly configuring inputs, we can … Read article “Better Form Inputs for Better Mobile User Experiences”
The post Better Form Inputs for Better Mobile User Experiences appeared first on CSS-Tricks.
Here’s one simple, practical way to make apps perform better on mobile devices: always configure HTML input fields with the correct type
, inputmode
, and autocomplete
attributes. While these three attributes are often discussed in isolation, they make the most sense in the context of mobile user experience when you think of them as a team.
There’s no question that forms on mobile devices can be time-consuming and tedious to fill in, but by properly configuring inputs, we can ensure that the data entry process is as seamless as possible for our users. Let’s take a look at some examples and best practices we can use to create better user experiences on mobile devices.
Using the correct input type
This is the easiest thing to get right. Input types, like email
, tel
, and url
, are well-supported across browsers. While the benefit of using a type, like tel
over the more generic text
, might be hard to see on desktop browsers, it’s immediately apparent on mobile.
Choosing the appropriate type changes the keyboard that pops up on Android and iOS devices when a user focuses the field. For very little effort, just by using the right type, we will show custom keyboards for email, telephone numbers, URLs, and even search inputs.
One thing to note is that both input type="email"
and input type="url"
come with validation functionality, and modern browsers will show an error tooltip if their values do not match the expected formats when the user submits the form. If you’d rather turn this functionality off, you can simply add the novalidate
attribute to the containing form
.
A quick detour into date types
HTML inputs comprise far more than specialized text inputs — you also have radio buttons, checkboxes, and so on. For the purposes of this discussion, though, I’m mostly talking about the more text-based inputs.
There is a type of input that sits in the liminal space between the more free-form text inputs and input widgets like radio buttons: date
. The date
input type comes in a variety of flavors that are well-supported on mobile, including date
, time
, datetime-local
, and month
. These pop up custom widgets in iOS and Android when they are focused. Instead of triggering a specialized keyboard, they show a select-like interface in iOS, and various different types of widgets on Android (where the date
and time
selectors are particularly slick).
I was excited to start using native defaults on mobile, until I looked around and realized that most major apps and mobile websites use custom date pickers rather than native date input types. There could be a couple reasons for this. First, I find the native iOS date selector to be less intuitive than a calendar-type widget. Second, even the beautifully-designed Android implementation is fairly limited compared to custom components — there’s no easy way to input a date range rather than a single date, for instance.
Still, the date input types are worth checking out if the custom datepicker you’re using doesn’t perform well on mobile. If you’d like to try out the native input widgets on iOS and Android while making sure that desktop users see a custom widget instead of the default dropdown, this snippet of CSS will hide the calendar dropdown for desktop browsers that implement it:
::-webkit-calendar-picker-indicator {
display: none;
}
One final thing to note is that date
types cannot be overridden by the inputmode
attribute, which we’ll discuss next.
Why should I care about inputmode?
The inputmode
attribute allows you to override the mobile keyboard specified by the input’s type and directly declare the type of keyboard shown to the user. When I first learned about this attribute, I wasn’t impressed — why not just use the correct type
in the first place? But while inputmode
is often unnecessary, there are a few places where the attribute can be extremely helpful. The most notable use case that I’ve found for inputmode
is building a better number input.
While some HTML5 input types, like url
and email
, are straightforward, input type="number"
is a different matter. It has some accessibility concerns as well as a somewhat awkward UI. For example, desktop browsers, like Chrome, show tiny increment arrows that are easy to trigger accidentally by scrolling.
So here’s a pattern to memorize and use going forwards. For most numeric inputs, instead of using this:
<input type="number" />
…you actually want to use this:
<input type="text" inputmode="decimal" />
Why not inputmode="numeric"
instead of inputmode="decimal"
?
The numeric
and decimal
attribute values produce identical keyboards on Android. On iOS, however, numeric
displays a keyboard that shows both numbers and punctuation, while decimal
shows a focused grid of numbers that almost looks exactly like the tel
input type, only without extraneous telephone-number focused options. That’s why it’s my preference for most types of number inputs.
Christian Oliff has written an excellent article dedicated solely to the inputmode attribute.
Don’t forget autocomplete
Even more important than showing the correct mobile keyboard is showing helpful autocomplete suggestions. That can go a long way towards creating a faster and less frustrating user experience on mobile.
While browsers have heuristics for showing autocomplete fields, you cannot rely on them, and should still be sure to add the correct autocomplete
attribute. For instance, in iOS Safari, I found that an input type="tel"
would only show autocomplete options if I explicitly added a autocomplete="tel"
attribute.
You may think that you are familiar with the basic autocomplete
options, such as those that help the user fill in credit card numbers or address form fields, but I’d urge you to review them to make sure that you are aware of all of the options. The spec lists over 50 values! Did you know that autocomplete="one-time-code"
can make a phone verification user flow super smooth?
Speaking of autocomplete…
I’d like to mention one final element that allows you to create your own custom autocomplete functionality: datalist
. While it creates a serviceable — if somewhat basic — autocomplete experience on desktop Chrome and Safari, it shines on iOS by surfacing suggestions in a convenient row right above the keyboard, where the system autocomplete functionality usually lives. Further, it allows the user to toggle between text and select-style inputs.
On Android, on the other hand, datalist
creates a more typical autocomplete dropdown, with the area above the keyboard reserved for the system’s own typeahead functionality. One possible advantage to this style is that the dropdown list is easily scrollable, creating immediate access to all possible options as soon as the field is focused. (In iOS, in order to view more than the top three matches, the user would have to trigger the select picker by pressing the down arrow icon.)
You can use this demo to play around with datalist
:
And you can explore all the autocomplete options, as well as input type
and inputmode
values, using this tool I made to help you quickly preview various input configurations on mobile.
In summary
When I’m building a form, I’m often tempted to focus on perfecting the desktop experience while treating the mobile web as an afterthought. But while it does take a little extra work to ensure forms work well on mobile, it doesn’t have to be too difficult. Hopefully, this article has shown that with a few easy steps, you can make forms much more convenient for your users on mobile devices.
The post Better Form Inputs for Better Mobile User Experiences appeared first on CSS-Tricks.