Veremos como é simples criar um overlay para o body com JavaScript, se você não sabe do que se trata, posso lhe explicar. Sabe aquele feito utilizado pelo Lightbox JS em que o body é revestido por completo, deixando-o translúcido? Então, veremos como produzir este efeito.
Bom, inicialmente, precisaremos da seguinte função:
function getPageSize(){
var xScroll, yScroll;
if (window.innerHeight && window.scrollMaxY) {
xScroll = document.body.scrollWidth;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}
var windowWidth, windowHeight;
if (self.innerHeight) { // all except Explorer
windowWidth = self.innerWidth;
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}
// for small pages with total height less then height of the viewport
if(yScroll < windowHeight){
pageHeight = windowHeight;
} else {
pageHeight = yScroll;
}
Para quem não a conheça, vou explicá-la. Esta função criada pelo Peter-Paul Koch retorna um array com quatro significantes informações na seguinte ordem: largura da página, altura da página, largura do viewport e altura do viewport.
Bom, com essas informações conseguiremos perfeitamente nosso objetivo - overlay para o body - e iremos fazê-lo com esta simples função:
function bodyOverlay() {
var objBody = document.getElementsByTagName('body').item(0);
var sizesPage = getPageSize();
var bodyOverlay = document.createElement("div");
bodyOverlay.setAttribute('id','bodyOverlay');
bodyOverlay.style.height = arrayPageSize[1] + 'px'; // fundo com o tamanho total da página.
if (!document.getElementById('bodyOverlay')) {
objBody.insertBefore(bodyOverlay, objBody.firstChild);
}
}
Ou seja, "pegamos" a tag body, criamos uma tag div definindo dois atributos para ela - id="bodyOverlay" e style="height:tamanho-total-da-pagina" - e finalmente inserimos a tag div no body. Resultando no seguinte código:
<div style="height: 1179px;" id="w3BodyEncobridor"></div>
Para remover o overlay criado, você pode utilizar a seguinte função:
function removerOverlay() {
var bodyOverlay = document.getElementById('bodyOverlay');
if (bodyOverlay) {
bodyOverlay.parentNode.removeChild(bodyOverlay);
}
}
E para finalizar utilizamos estas declarações CSS:
#bodyOverlay {
background-color: #000;
opacity: 0.8;
position: absolute;
top: 0;
left: 0;
width: 100%;
filter:alpha(opacity=80); /* colando em um arquivo separado para o IE. */
}
Façam os testes, e retorne com um feedback. Se tiver alguma dúvida não hesite em perguntar.
[UPDATE] Veja um exemplo deste efeito [/UPDATE]
Muito fera essa técnica! Parabéns pelo post!
Como faço para colocar uma ação de qdo clicar na pagina(qdo ela tiver com o overlay) ele tira o overlay?
vlw pelo tutorial…flw
Olá Diego,
observe o código fonte desta página: http://leandro.w3invent.com.br/apoio/demos/overlay-body-com-javascript-e-dom.htm que verá um exemplo.
Um abraço.
Leandro, muito show seu código, mas gostaria de sua ajuda para uma implementação, utilizo o seu overlay só que carrego outra div por cima, que mostra um resultado ajax…ou seja, quando o resultado ajax ultrapassa o tamanho do site, e desço a barra de rolagem, o fundo não desce…estou aqui pesquisando para mover a div de fundo criada no overlay jundo com o scroll, ou criar ela após o ajax executar… sem sucesso por enquanto! Abraços!
Funciona não mah!!!
Fica uns espaços na lateral e em baixo no IE, se a resolução for reduzida e aparecerem barras de rolagem…..
oi Diego!
como faço p/, ao invés de imagem, carregar um formulario de contato na div translucida?