Leandro Vieira Pinho´s Blog

Just another WordPress weblog

Overlay para o body com JavaScript

November 25th, 2006. Published under DOM, css, javascript. 5 Comments.

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]

5 Comments

Edy  on December 13th, 2006

Muito fera essa técnica! Parabéns pelo post!

Diego  on January 27th, 2007

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

leandro  on February 2nd, 2007

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.

Daniel Ribeiro  on September 13th, 2007

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!

Ieeeeeeeeiiiiiii!!  on May 8th, 2008

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….. :P

Leave a Comment