Como evitar burn-in em sites para TVs

Você já desenvolveu algum hotsite ou webapp para televisores (agenda para aeroportos, rodoviárias, etc.)? Se sim, pode ser que nem tenha sido pensada a questão do burn-in.

Mas que negócio é esse?

Burn-in ou “pixel fantasma” ocorre quando elementos iguais são exibidos estaticamente por muito tempo.

Como demonstrado na imagem acima, logos de emissoras tinham este problema desde as TVs de tubo. Atualmente elas modificaram a exibição dos seus logos para que em um tempo definido ele mude. Seja piscando e reaparecendo, exibindo somente as bordas, etc.

Ao exibir este mesmo padrão por um longo período, os pixels que geram esta imagem começam a “envelhecer”. Assim, eles perdem a capacidade de gerar outros elementos, fixando-os na tela, com outros pixels tentando ser exibidos por cima. Daí “fantasma”.

Se você é da época de usar capa no monitor pra não amarelar, deve lembrar dos screensavers (protetores de tela) da Microsoft. Serviam exatamente pra isso – Eles ainda existem, mas sem muita utilidade, já que os monitores se aperfeiçoaram com o tempo.

O screensaver “labirinto” do Windows, um dos mais famosos do seu tempo;

Para saber mais sobre Burn-in, acesse: https://www.showmetech.com.br/smart-tv-efeito-burn-in/

Ok, e eu – desenvolvedor – com isso?

Talvez você nem precise se preocupar, mas melhor saber disso antes do que depois de dar problema, não é? Pra isso, você pode usar o script do tutorial abaixo, que usa javascript puro (vanilla) e jQuery (foi usada a versão 3.3.1). No fim, confira o código completo e um link para o demo.

Passo 1: Vamos criar as variáveis que vão guardar as nossas cores primárias (RGB), o tempo entre um e outro (delay) e o tempo que ele dura na tela (delayScroll):

  1. var cores = ['#FF0000','#00FF00','#0000FF'],
  2.     cor = 0,
  3.     delay = 5000,
  4.     delayScroll = 1000;

Passo 2: Agora vamos criar a variável que vai gerar o elemento na tela:

var $div_burnin = $('').attr('id','div_burnin');

Depois vamos inserir alguns estilos na nossa div. Ela é um elemento de 1px de largura, posicionado de forma absoluta (“flutuante”), iniciando no topo esquerdo e com a mesma altura da tela do navegador. Note que ela possui uma cor de fundo inicial, para evitar ficar invisível:

  1. $div_burnin.css({
  2.   'background-color': '#FF00FF',
  3.   'width': '1px',
  4.   'height': $(document).height()+'px',
  5.   'position': 'absolute',
  6.   'top': 0,
  7.   'left': 0,
  8.   'display': 'none'
  9. });

Por fim, incluiremos (appendTo) a nossa div no corpo do documento via javascript, pra não termos de modificar nenhum arquivo HTML:

$div_burnin.appendTo('body');

Passo 3: Criaremos agora uma função simples que usa a função setTimeout do javascript para fazer o loop.

Essa função usa a variável criada no passo 1, “cor“, que lá começou definida como 0 (zero). Ela vai ser pré-incrementada (++cor), e dividida por 3 (a quantidade de cores que temos no vetor “cores“), para haver aleatoriedade.

Depois, inserimos os novos estilos na nossa div, e usaremos a função animate para movimentá-la pela tela.

O evento setTimeout ocorre no fim mas ainda dentro da função, para que sempre que ela for chamada, o loop ocorra novamente.

Também chamamos o setTimeout duas vezes: uma dentro e outra fora da função, para que a função seja iniciada na primeira vez que a página for executada.

  1. function evitarBurnIn(){
  2.   cor = ++cor % 3;
  3.   var CorAleatoria = cores[cor];
  4.  
  5.   $div_burnin.css({
  6.     'left': 0,
  7.     'background-color': CorAleatoria,
  8.   });
  9.  
  10.   //exibe a div, que vinha oculta
  11.   $div_burnin.show();
  12.  
  13.   $div_burnin.animate({
  14.     'left':$(window).width()+'px'
  15.   },
  16.   delayScroll, function(){
  17.    //oculta a div novamente
  18.     $(this).hide();
  19.   });
  20.  
  21.   //executa novamente a funcao, depois do tempo definido (delay)
  22.   setTimeout(evitarBurnIn,delay);
  23. }
  24.  
  25. //inicia a funcao
  26. setTimeout(evitarBurnIn,delay);

Código completo:

* O código abaixo foi reduzido propositalmente mas possui a mesma estrutura.

  1. var cores = ['#FF0000','#00FF00','#0000FF'], cor = 0, delay = 5000, delayScroll = 1000;
  2.  
  3. var $div_burnin = $('').attr('id','div_burnin').css({
  4.  'background-color':'#FF00FF',
  5.  'width':'1px',
  6.  'height':$(document).height()+'px',
  7.  'position':'absolute',
  8.  'top':0,
  9.  'left':0,
  10.  'display':'none'
  11. }).appendTo('body');
  12.  
  13. function evitarBurnIn(){
  14.  cor = ++cor % 3;
  15.  var rCor = cores[cor];
  16.  $div_burnin.css({
  17.   'left': 0,
  18.   'background-color': rCor,
  19.  }).show().animate({
  20.   'left':$(window).width()+'px'
  21.  },delayScroll,function(){
  22.   $(this).hide();
  23.  });
  24.  setTimeout(evitarBurnIn,delay);
  25. }
  26.  
  27. setTimeout(evitarBurnIn,delay);

Demonstração do script:

https://codepen.io/dimaspante/full/wjQaXm/

Whatsapp