Skip to content

The inputmode Attribute

Global Attribute

The inputmode attribute provides a hint to browsers about what type of virtual keyboard to display on mobile devices and tablets. Unlike the type attribute, inputmode focuses solely on keyboard optimization without affecting validation or input semantics.

<element inputmode="value">Content</element>
ValueKeyboard TypeBest For
noneNo keyboardCustom keyboard implementations
textStandard QWERTYGeneral text input (default)
decimalNumber pad with decimal pointPrices, measurements (12.99)
numericNumber pad onlyPIN codes, quantities (1234)
telTelephone keypadPhone numbers
searchSearch-optimized keyboardSearch queries (may include suggestions)
emailEmail keyboardEmail addresses (with @)
urlURL keyboardWeb addresses (with .com, /)
Result
Result
Result
<!-- type affects validation AND keyboard -->
<input type="number"> <!-- Only allows numbers, shows number keyboard -->
<!-- inputmode only affects keyboard -->
<input type="text" inputmode="numeric"> <!-- Allows any text, shows number keyboard -->

Use inputmode when:

  • You need flexible input validation
  • The type attribute is too restrictive
  • You want better mobile UX without type constraints
<!-- Credit card with spaces/dashes -->
<input type="text" inputmode="numeric" placeholder="1234 5678 9012 3456">
<!-- Phone with formatting -->
<input type="text" inputmode="tel" placeholder="+1 (555) 123-4567">
<!-- Currency with symbol -->
<input type="text" inputmode="decimal" placeholder="$99.99">
<!-- Good: Numeric keyboard for numbers -->
<input type="text" inputmode="numeric" placeholder="Quantity">
<!-- Good: Decimal for prices -->
<input type="text" inputmode="decimal" placeholder="Price">
<!-- Good: Email keyboard for email -->
<input type="email" inputmode="email">
<!-- Bad: Text keyboard for numbers -->
<input type="text" inputmode="text" placeholder="Phone">
<!-- Show number keyboard but validate format -->
<input
type="text"
inputmode="numeric"
pattern="[0-9]{16}"
placeholder="Card number">
<!-- Decimal input with validation -->
<input
type="text"
inputmode="decimal"
pattern="[0-9]+\.?[0-9]*"
placeholder="Amount">
<input
type="text"
inputmode="numeric"
autocomplete="cc-number"
placeholder="Card number">
<input
type="tel"
inputmode="tel"
autocomplete="tel"
placeholder="Phone">
<!-- ZIP code: numeric is better than tel -->
<input type="text" inputmode="numeric" placeholder="ZIP Code">
<!-- Verification code: numeric keyboard -->
<input type="text" inputmode="numeric" placeholder="6-digit code">
<!-- Price -->
<input type="text" inputmode="decimal" placeholder="0.00">
<!-- Credit card -->
<input type="text" inputmode="numeric" autocomplete="cc-number">
<!-- CVV -->
<input type="text" inputmode="numeric" maxlength="4" autocomplete="cc-csc">
<!-- Phone -->
<input type="tel" inputmode="tel">
<!-- Email -->
<input type="email" inputmode="email">
<!-- Website -->
<input type="url" inputmode="url">
<!-- Quantity (whole numbers) -->
<input type="text" inputmode="numeric" min="1">
<!-- Weight (decimal) -->
<input type="text" inputmode="decimal" placeholder="0.0 kg">
<!-- Temperature -->
<input type="text" inputmode="decimal" placeholder="98.6°F">
<!-- PIN code -->
<input type="text" inputmode="numeric" maxlength="4" placeholder="PIN">
<!-- Postal code -->
<input type="text" inputmode="numeric" placeholder="12345">
<!-- Product code -->
<input type="text" inputmode="numeric" placeholder="SKU">
const input = document.getElementById('myInput');
// Set inputmode
input.inputMode = 'numeric';
input.setAttribute('inputmode', 'numeric');
// Get current value
console.log(input.inputMode); // "numeric"
// Change dynamically based on input
input.addEventListener('focus', () => {
if (input.value.includes('.')) {
input.inputMode = 'decimal';
} else {
input.inputMode = 'numeric';
}
});
PlatformSupportNotes
iOS Safari12.2+Full support
Android Chrome67+Full support
Desktop browsersIgnoredNo virtual keyboard
<!-- WRONG: type="number" is restrictive -->
<input type="number" placeholder="1234 5678">
<!-- Can't type spaces or dashes! -->
<!-- RIGHT: text + inputmode for flexibility -->
<input type="text" inputmode="numeric" placeholder="1234 5678">
<!-- Can format however you want -->