Como fazer o banner LGPD do zero (com JavaScript)

Sabe aquela barrinha que aparece em todo site avisando sobre cookies? Vou mostrar como ela funciona por dentro e como criar a sua do zero com JavaScript puro.


Você já entrou em algum site e aquela barrinha aparece na parte de baixo da tela: "utilizamos cookies para melhorar sua experiência, saiba mais, política de privacidade, ok". Você clica em ok, ela some, você entra novamente no site no dia seguinte e ela não aparece mais.

Isso é o banner LGPD. E nesse post vou mostrar como fazer um do zero.

Antes de qualquer coisa, preciso deixar claro: não sou advogado. A LGPD é uma lei extensa com muitas obrigações que vão além de colocar uma barrinha no site. O que vou focar aqui é a parte técnica, o algoritmo de exibição, o código, e o que precisa acontecer nos bastidores quando o usuário aceita.

O algoritmo

Antes de escrever qualquer linha, vale entender o que esse negócio precisa fazer.

Quando o usuário entra no site, o código verifica se existe algum registro salvo no navegador dele indicando que ele já aceitou os termos. Se existir, não faz nada, o banner não aparece. Se não existir, exibe o banner.

Quando o usuário clica em aceitar, três coisas precisam acontecer: o banner sai da tela, você faz uma requisição para o seu servidor registrando aquele aceite, e você salva uma identificação no localStorage do navegador para que o banner não apareça de novo.

Simples assim.

Criando a estrutura

A ideia aqui é criar um arquivo JavaScript independente que, quando adicionado a qualquer página com uma única tag <script>, já faz tudo funcionar automaticamente. Sem precisar mexer no HTML da página.

O primeiro passo é verificar se já tem algo salvo no localStorage:

const lsContent = localStorage.getItem('lgpd');
 
if (!lsContent) {
  // exibe o banner
}

Se não tiver nada salvo, entra no bloco e exibe o banner.

Montando o HTML e o CSS

O banner em si é uma div com posição fixa na parte de baixo da tela. Do lado esquerdo fica o texto explicativo com o link para a política de privacidade. Do lado direito fica o botão de aceitar.

.lgpd-base {
  position: fixed;
  left: 20px;
  right: 20px;
  bottom: 20px;
  padding: 20px;
  background-color: #518000;
  color: white;
  font-size: 15px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
 
.lgpd-base a {
  color: white;
}
 
.lgpd-base button {
  background-color: #04a600;
  border: 0;
  color: white;
  cursor: pointer;
  padding: 10px 30px;
}

Esse CSS é simples e funciona. Você pode ajustar as cores para a identidade visual do seu projeto.

O HTML do banner fica assim:

<div class="lgpd-base">
  <div class="lgpd-left">
    Nós utilizamos cookies para melhorar sua experiência do usuário.
    Para conferir detalhadamente todos os cookies utilizados,
    leia nossa <a href="#">política de privacidade</a>.
  </div>
  <div class="lgpd-right">
    <button>Ok</button>
  </div>
</div>

Movendo tudo para o JavaScript

Para que o arquivo JavaScript seja autossuficiente, tanto o HTML quanto o CSS precisam ser gerados por ele. O CSS você injeta via uma tag <style> criada por script, ou coloca direto no arquivo CSS separado e referencia no script. O HTML vira uma template string:

const lgpdHTML = `
  <style>
    /* seu css aqui */
  </style>
  <div class="lgpd-base">
    ...
  </div>
`;

Para exibir na tela:

document.body.innerHTML += lgpdHTML;

Depois disso, você seleciona o botão e adiciona o evento de clique:

const lgpdArea = document.querySelector('.lgpd-base');
const lgpdButton = lgpdArea.querySelector('button');
 
lgpdButton.addEventListener('click', async () => {
  lgpdArea.remove();
 
  // faz a requisição para o servidor
  // salva no localStorage
});

A parte que mais importa: o registro no servidor

Aqui está o ponto que muita gente pula e não deveria.

Quando o usuário clica em aceitar, não basta remover o banner da tela e salvar algo no localStorage. A LGPD exige que você, enquanto responsável pelo site, tenha um registro comprovando que aquele usuário consentiu com a coleta de dados, com data, hora e identificação.

O localStorage é só para o navegador dele não mostrar o banner de novo. O registro legal precisa estar no seu servidor.

Então o fluxo completo dentro do clique fica assim:

lgpdButton.addEventListener('click', async () => {
  lgpdArea.remove();
 
  try {
    const response = await fetch(lgpdURL, { method: 'POST' });
    const data = await response.json();
 
    localStorage.setItem('lgpd', data.id);
  } catch (err) {
    // se a requisição falhar, você decide o que fazer
  }
});

O seu servidor recebe essa requisição, salva o IP, a data, a hora, e gera um identificador único para aquela visita. Esse ID volta para o JavaScript e é salvo no localStorage. Da próxima vez que o usuário entrar, o script encontra esse ID salvo e não exibe mais o banner.

Se o cara abrir uma aba anônima, o localStorage está limpo, o banner aparece de novo, um novo registro é gerado no servidor. É assim que funciona, e está correto que seja assim.

O que o servidor precisa fazer

Isso é trabalho de backend e varia muito dependendo da stack que você usa. Mas o mínimo que precisa acontecer quando a requisição chega é:

  • Capturar o IP do usuário
  • Salvar a data e hora do consentimento
  • Gerar um identificador único para aquela visita
  • Retornar esse identificador para o JavaScript

Essa informação no banco de dados é o que te protege juridicamente. Sem ela, você só tem um banner bonito que não serve para muita coisa do ponto de vista legal.

Conclusão

O banner em si é simples de fazer. Uma tarde de código e está pronto. O que exige mais atenção é entender que a parte visual é só a ponta do processo, e que sem o registro no servidor o resto não tem valor real.

Se você precisar mostrar para um cliente que o site está em conformidade com a LGPD, o banner sozinho não fecha essa conversa. Mas é um começo, e entender como ele funciona por dentro te coloca num patamar bem melhor para implementar o restante.

Copia o código, testa, adapta para o seu projeto e vai em frente.