Ofereça uma experiência imersiva em tela cheia para vários casos de uso, incluindo sites interativos, jogos e streaming de aplicativos ou área de trabalho remota.
Com cada vez mais usuários passando a maior parte do tempo no navegador, sites, jogos, streaming de desktop remoto e streaming de aplicativos altamente interativos se esforçam para oferecer uma experiência imersiva em tela cheia. Para isso, os sites precisam de acesso a teclas especiais e atalhos de teclado enquanto estão no modo de tela cheia, para que possam ser usados na navegação, em menus ou em jogos. Alguns exemplos de teclas que podem ser necessárias são Esc, Alt + Tab, Cmd + ` e Ctrl + N.
Por padrão, essas chaves não estão disponíveis para o aplicativo da Web porque são capturadas pelo navegador ou pelo sistema operacional subjacente. A API Keyboard Lock permite que sites usem todas as teclas disponíveis permitidas pelo SO host (consulte Compatibilidade com navegadores).

Como usar a API Keyboard Lock
A interface Keyboard
da API Keyboard oferece funções que alternam a captura de pressionamentos de teclas do teclado físico, além de obter informações sobre o layout do teclado do usuário.
Pré-requisito
Há dois tipos de tela cheia disponíveis em navegadores modernos: iniciada por JavaScript usando a API Fullscreen e iniciada pelo usuário usando um atalho de teclado. A API Keyboard Lock só está disponível quando a tela cheia iniciada por JavaScript está ativa. Confira um exemplo de tela cheia iniciada por JavaScript:
await document.documentElement.requestFullscreen();
Detecção de recursos
É possível usar o seguinte padrão para verificar se a API de bloqueio do teclado é compatível:
if ('keyboard' in navigator && 'lock' in navigator.keyboard) {
// Supported!
}
Bloquear o teclado
O método lock()
da interface Keyboard
retorna uma promessa depois de ativar a captura de pressionamentos de tecla para qualquer uma ou todas as teclas do teclado físico. Esse método só pode capturar chaves que recebem acesso do sistema operacional subjacente. O método lock()
usa uma matriz de um ou mais códigos de tecla para bloquear. Se nenhum código de chave for fornecido, todas as chaves serão bloqueadas. Uma lista de valores de código de tecla válidos está disponível na especificação UI Events KeyboardEvent code Values (em inglês).
Capturar todas as chaves
O exemplo a seguir captura todas as teclas pressionadas.
navigator.keyboard.lock();
Capturar teclas específicas
O exemplo a seguir captura as teclas W, A, S e D. Ele captura essas teclas, não importa quais modificadores sejam usados com o pressionamento. Considerando um layout QWERTY dos EUA, o registro de "KeyW"
garante que W, Shift + W, Control + W, Control + Shift + W e todas as outras combinações de modificadores de tecla com W sejam enviadas ao app. O mesmo se aplica a "KeyA"
, "KeyS"
e "KeyD"
.
await navigator.keyboard.lock([
"KeyW",
"KeyA",
"KeyS",
"KeyD",
]);
Você pode responder às teclas pressionadas capturadas usando eventos de teclado.
Por exemplo, este código usa o evento onkeydown
:
document.addEventListener('keydown', (event) => {
if ((event.code === 'KeyA') && !(event.ctrlKey || event.metaKey)) {
// Do something when the 'A' key was pressed, but only
// when not in combination with the command or control key.
}
});
Como desbloquear o teclado
O método unlock()
desbloqueia todas as chaves capturadas pelo método lock()
e retorna de forma síncrona.
navigator.keyboard.unlock();
Quando um documento é fechado, o navegador sempre chama unlock()
de maneira implícita.
Demonstração
Teste a API Keyboard Lock executando esta demonstração. Confira o código-fonte. Ao clicar no botão "Entrar em tela cheia" abaixo, a demonstração será iniciada em uma nova janela para que possa entrar no modo de tela cheia.
Considerações sobre segurança
Uma preocupação com essa API é que ela pode ser usada para extrair todas as chaves e (em conjunto com a API Fullscreen e a API PointerLock) impedir que o usuário saia da página da Web. Para evitar isso, a especificação exige que o navegador ofereça uma maneira de o usuário sair do bloqueio do teclado, mesmo que todas as teclas sejam solicitadas pela API. No Chrome, essa saída de emergência é um toque longo (dois segundos) na tecla Esc para sair do bloqueio do teclado.
Links úteis
- Rascunho de especificação
- Repositório do GitHub
- Entrada do ChromeStatus
- Bug de rastreamento do Chrome
- Códigos de tecla para teclados padrão
Agradecimentos
Este artigo foi revisado por Joe Medley e Kayce Basques. A especificação do bloqueio do teclado foi criada por Gary Kacmarcik e Jamie Walch. Imagem principal de Ken Suarez no Unsplash.