Desenvolvimento -
Brincando de Assustar com CSS, HTML e um tiquinho de Javascript
Fotos misteriosas aparecem o tempo todo na internet. A grande maioria já foi provado ser uma farsa. Mas será que é possível criar alguma coisa para assustar nossos amiguinhos e, de quebra, ainda aprender um pouco sobre CSS?
Mas é claro!
Primeiro quero que entrem no site do Vale do Medo e vejam a história sobre essa foto (acima). Após olharem bem para a foto, por alguns segundos, volte aqui para o site para entender a pegadinha.
Essa foto nada mais é do que duas imagens sobrepostas, sendo a de cima um PNG (onde está o homem sem rosto). Porém, a imagem que fica acima é restrita a qualquer ação com o mouse. Já se você tentar imprimir, o CSS vai cuidar para que o PNG não seja impresso. Além disso, tem uma pitada de Javascript (no exemplo, com jQuery), que vai cuidar para ativar o aparecimento e desaparecimento do homem sem rosto.
Criando as imagens
Originalmente foram baixas duas imagens da internet. Uma de um corredor qualquer e outra de um homem vestido todo de azul. As imagens usadas na postagem foram essas abaixo:
Para poder dificultar encontrar a imagem no Google, invertemos a foto original e adicionamos um tom mais sombrio, azulado. Paralelo a isso, encontramos uma foto de um homem todo de azul, também no Google. E trabalhamos essa foto para ficar com um aspecto mais combinado com a foto original.
É importante trabalhar com as duas imagens ao mesmo tempo, mas atento a deixá-las em camadas separadas. Trabalhar em sombras com transparências é fundamental para que a imagem fique mais realista.
Exporte a imagem de fundo em .jpg e a imagem de frente em .png. Como a imagem PNG pode ficar um pouco pesada, dependendo do tamanho da imagem, acesse o site TinyPNG para reduzir ao máximo a imagem PNG.
A imagem PNG vai ter na verdade vai ter as mesmas dimensões que a imagem em JPG, porém com uma área de transparência maior.
Você terá então duas imagens, igual a como se faz em desenhos animados, onde o fundo é separado do objeto a ser animado.
Código HTML
Uma vez criado e separado as imagens, precisamos criar o código HTML. Para isso, devemos criar um container e dentro desta uma imagem, depois mais um outro container ou elemento similar. No nosso caso, usaremos uma div, um p e, claro, um img.
<div class="imagem"> <p><img src="fundo.jpg"/></p> <p> </p> </div>
Esse pequeno trecho é mais do que suficiente.
Código CSS
Já para o CSS precisamos compreender um pouco de hierarquia e pseudo-classes. A div “imagem” será a referência para <p>, onde estará a imagem PNG. Logo, para que seus filhos possam se localizar, será necessário defini-la como relativa. Assim, os filhos que forem definidos como absolutos considerarão o ponto inicial (0, 0) o ponto referencial (x, y) de seu pai. Além disso, devemos colocar no <p> o background image onde ficará nosso PNG, ficando assim:
.imagem{ position: relative; } .imagem p{ margin: 0; } .imagem p:first-child{ position: absolute; width:100%; height:100%; background-image: url('homem.png'); background-size: 100%; pointer-events: none; z-index:10; } .imagem p img{ width: 100%; height: auto; } /*Será aplicado quando a imagem for dar o 'sustinho'*/ .bu{ transform: scale(3); left: 47%; /* O left 48 foi usado porque o homem na imagem está à esquerda*/ /* Adicionar esse espaço foi necessário para centralizá-lo.*/ }
Muita atenção ao pointer-events: none. É esse o atributo que impedirá o botão direito, ou qualquer ação, de funcionar por cima da imagem do homem. Atenção também a pseudo-classe first-child, pois ela determina que o elemento a receber determinado estilo é o primeiro <p>.
Observe que as larguras e tamanhos estão definidos como 100%. O que vai resultar em que o tamanho do conteúdo será relacionado ao tamanho do container.
Porém, como fazer para que a imagem não seja possível imprimir?
Media Queries não são apenas para responsividade de dispositivos móveis. Uma das coisas mais interessantes é poder especificar estilos para impressão. Simplesmente podemos adicionar algumas linhas:
@media print { .postid-265 .imagem > p:first-child{ display: none; } }
Javascript (jQuery)
Agora vamos adicionar um pouquinho de Javascript. Vamos utilizar jQuery porque o WordPress e a grande maioria dos CMS usados para sites já utilizam essa biblioteca.
Preste atenção para que a imagem fique oculta até que ela seja completamente carregada. Isso porque a imagem jpg tenderá, nesse caso, a ser mais pesada do que a PNG. Se as imagens estiverem visíveis antes, é possível que a imagem da mais leve seja mostrada antes da outra, o que vai estragar a sensação de ser uma única imagem.
jQuery(".imagem").hide(); //Esconde a imagem //Mostra a imagem apenas depois que a imagem é carregada jQuery(".postid-859 .imagem img").one("load", function() { jQuery(".postid-859 .imagem").show(); }).each(function() { if(this.complete) $(this).load(); }); //Faz a imagem do homem aparecer, adicionando uma classe a ela //Neste exemplo colocamos pelo scroll para contar apenas quando aparecer a foto $(document).scroll(function() { if ($(this).scrollTop() > jQuery(".postid-859 .imagem").position().top) { setTimeout(function(){ jQuery(".postid-859 .imagem > p:first-child").addClass("bu"); },5000); //5 segundos //Faz a imagem desaparecer logo depois do susto setTimeout(function(){ jQuery(".postid-859 .imagem > p:first-child").hide(); },5800); //5.8 segundos } });
O código inteiro então ficaria:
<div class="imagem"> <div class="imagem"> <p><img src="fundo.jpg"/></p> <p> </p> </div> <style> .imagem{ position: relative; } .imagem p{ margin: 0; } .imagem p:first-child{ position: absolute; width:100%; height:100%; background-image: url('homem.png'); background-size: 100%; pointer-events: none; z-index:10; } .imagem p img{ width: 100%; height: auto; } /*Será aplicado quando a imagem for dar o 'sustinho'*/ .bu{ transform: scale(3); left: 47%; /* O left 48 foi usado porque o homem na imagem está à esquerda*/ /* Adicionar esse espaço foi necessário para centralizá-lo.*/ } @media print { .postid-265 .imagem > p:first-child{ display: none; } } </style> <script> jQuery(".imagem").hide(); //Esconde a imagem //Mostra a imagem apenas depois que a imagem é carregada jQuery(".postid-859 .imagem img").one("load", function() { jQuery(".postid-859 .imagem").show(); }).each(function() { if(this.complete) $(this).load(); }); //Faz a imagem do homem aparecer à frente, adicionando uma classe a ela //Neste exemplo colocamos pelo scroll para contar apenas quando aparecer a foto jQuery(document).scroll(function() { if (jQuery(this).scrollTop() > jQuery(".postid-859 .imagem").position().top) { setTimeout(function(){ jQuery(".postid-859 .imagem > p:first-child").addClass("bu"); },5000); //5 segundos //Faz a imagem desaparecer logo depois do susto setTimeout(function(){ jQuery(".postid-859 .imagem > p:first-child").hide(); },5800); //5.8 segundos } }); </script>
E agora, a imagem finalizada:
Simples, não é?
É uma brincadeira básica, mas ajuda você a pensar logicamente e a conhecer algumas coisinhas legais sobre CSS e Javascript. Deixe seu comentário.