Keyboard
Customizing and accounting for the presence of an on-screen keyboard are two common roadblocks developers face when building mobile apps and PWAs. This guide will provide an introduction to the various tools available for managing the on-screen keyboard in your application.
inputmode
Theinputmode attribute allows developers to specify what type of data might be entered into an input. This will prompt the browser to show a keyboard that includes buttons relevant to what the user may enter. For example,inputmode="email" will display a keyboard with the@ key as well as other optimizations for entering emails.
Sinceinputmode is a global attribute, it can be used on Ionic components such asion-input andion-textarea in addition to regular input elements.
Inputs thatrequire a certain data type should use thetype attribute instead. For example, inputs that require an email should usetype="email" rather than specifying aninputmode. This is because the data that will be entered is always going to be in the form of an email. On the other hand, if the input accepts an email or a username, usinginputmode=”email” is appropriate because the data being entered is not always going to be an email address.
For a list of accepted values, see theinputmode Documentation.
Usage
Theinputmode attribute is supported on devices running Chrome 66+ and iOS Safari 12.2+:https://caniuse.com/#search=inputmode
enterkeyhint
Theenterkeyhint attribute allows developers to specify what type of action label or icon should be shown for the "Enter" key. Usingenterkeyhint lets the user know what will happen when they tap the “Enter” key. The value that should be specified here depends on the context of what the user is doing. For example, if the user is typing into a searchbox, developers should ensure that the input hasenterkeyhint="search".
Sinceenterkeyhint is a global attribute, it can be used on Ionic components such asion-input andion-textarea in addition to regular input elements.
For a list of accepted values, see theenterkeyhint Standard.
Usage
Theenterkeyhint attribute is supported on devices running Chrome 77+ and iOS Safari 13.4+.
Dark Mode
By default the keyboard theme is determined by the OS. For example, if dark mode is enabled on iOS, the keyboard in your app will appear with a dark theme even if your application does not have a dark theme in its CSS.
When running an app in a mobile web browser or as a PWA there is no way to force the keyboard to appear with a certain theme.
When running an app in Capacitor or Cordova, it is possible to force the keyboard to appear with a certain theme. For more information regarding this configuration, see theCapacitor Keyboard Documentation.
Hiding the Accessory Bar
When running any kind of web based application, iOS will show an accessory bar above the keyboard. This allows users to move to the next or previous inputs as well as close the keyboard.
When running an app in a mobile web browser or as a PWA there is no way to hide the accessory bar.
When running an app in Capacitor or Cordova, it is possible to hide the accessory bar. For more information regarding this configuration, see theCapacitor Keyboard Documentation.
Keyboard Lifecycle Events
Detecting the presence of an on-screen keyboard is useful for adjusting the positioning of an input that would otherwise be hidden by the keyboard. For Capacitor and Cordova apps, developers typically rely on native keyboard plugins to listen for the keyboard lifecycle events. For apps running in a mobile browser or as a PWA, developers can use theVisual Viewport API where supported. Ionic Framework wraps both of these approaches and emitsionKeyboardDidShow andionKeyboardDidHide events on thewindow. The event payload forionKeyboardDidShow contains an approximation of the keyboard height in pixels.
Usage
- JavaScript
- Angular
- Angular (Standalone)
- React
- Vue
window.addEventListener('ionKeyboardDidShow',event=>{
const{ keyboardHeight}= event;
// Do something with the keyboard height such as translating an input above the keyboard.
});
window.addEventListener('ionKeyboardDidHide',()=>{
// Move input back to original location
});
import{Platform}from'@ionic/angular';
...
constructor(private platform:Platform){
this.platform.keyboardDidShow.subscribe(event=>{
const{ keyboardHeight}= event;
// Do something with the keyboard height such as translating an input above the keyboard.
});
this.platform.keyboardDidHide.subscribe(()=>{
// Move input back to original location
});
}
import{Platform}from'@ionic/angular/standalone';
...
constructor(private platform:Platform){
this.platform.keyboardDidShow.subscribe(event=>{
const{ keyboardHeight}= event;
// Do something with the keyboard height such as translating an input above the keyboard.
});
this.platform.keyboardDidHide.subscribe(()=>{
// Move input back to original location
});
}
import{ useKeyboardState}from'@ionic/react-hooks/keyboard';
...
const{ isOpen, keyboardHeight}=useKeyboardState();
// Do something with the keyboard height such as translating an input above the keyboard
import{ useKeyboard}from'@ionic/vue';
import{ watch}from'vue';
...
const{ isOpen, keyboardHeight}=useKeyboard();
watch(keyboardHeight,()=>{
console.log(`Is Keyboard Open:${isOpen.value}, Keyboard Height:${keyboardHeight.value}`);
});
For apps running in a mobile web browser or as a PWA, Keyboard Lifecycle Events are only supported on Chrome 62+ and iOS Safari 13.0+.