Posicionamento com CSS: estático, absoluto, relativo e fixo

Quem está chegando agora ao mundo dos padrões web[bb] costuma se ver às voltas com duas propriedades do CSS[bb], que são fundamentais quando se deseja construir layouts sem tabelas: float e position. Neste texto vou falar um pouco sobre esta última.

Escrevo este texto motivado por um tópico sobre o assunto na lista webstandards-br. Vamos então ao que interessa.

Existem quatro tipos de posicionamento em CSS: estático, relativo, absoluto e fixo. Vamos tratar cada um separadamente.

Posicionamento estático

O posicionamento estático é definido pelo valor static da propriedade position. Assim: elemento { position: static }. Bem, na verdade o posicionamento padrão pra qualquer elemento é o estático, portanto não é necessário declará-lo explicitamente em seu CSS.

Um elemento posicionado estaticamente segue o fluxo normal dos elementos da página, ou seja, se posiciona abaixo do elemento imediatamente anterior e acima do imediatamente posterior, quando nenhum destes está posicionado de outra forma que não a estática.

Como já foi dito, o posicionamento estático é o padrão, portanto não precisa ser muito explicado. Você pode ver o comportamento dos elementos posicionados estaticamente no exemplo 1: posicionamento estático

Posicionamento relativo

O posicionamento relativo é definido pelo valor relative da propriedade position. Assim: elemento { position:relative }.

Quando posicionamos um elemento relativamente ele é posicionado de acordo com sua própria posição. Confuso? A princípio sim, mas vamos entender quais as vantagens disso.

As propriedades top, right, bottom e left têm efeito sobre elementos posicionados relativamente, ao contrário do que acontece com o posicionamento estático. E qual a diferença entre usar margin e usar uma das propriedades citadas acima? A diferença é que margin acrescenta seu valor ao tamanho do elemento. Confira o efeito do posicionamento relativo no exemplo 2: posicionamento relativo.

Mas a função mais importante do posicionamento relativo é definir o elemento como “posicionado”. Explico isso melhor logo abaixo.

Posicionamento absoluto

O posicionamento absoluto é definido pelo valor absolute da propriedade position. Assim: elemento{ position:absolute }.

O que costuma confundir os menos experientes é que o posicionamento absoluto é, de fato, relativo. Deu um nó na cabeça? Ainda não? Pois bem, continuemos.

Quando um elemento é posicionado absolutamente, sua posição é computada de acordo com a posição do elemento “posicionado” mais próximo, que o contém. Elemento “posicionado” é qualquer elemento que tenha seu posicionamento definido como relativo, absoluto ou fixo. Quando não há nenhum elemento “posicionado”, a posição é computada com relação ao elemento body, quando o documento for HTML (incluindo documentos XHTML[bb] enviados como text/html) ou html, quando o documento for XHTML de fato (enviado como application/xhtml+xml). Além disso, o elemento é removido do fluxo normal da página.

A teoria pode um pouco confusa mas a prática é bem simples. Veja no exemplo 3: elemento posicionado absolutamente dentro de um posicionado relativamente e no exemplo 4: elemento posicionado absolutamente dentro de um posicionado estaticamente.

Nunca é demais dizer que as propriedades top, right, bottom e left se aplicam a elementos posicionados absolutamente, bem como a qualquer elemento definido como “posicionado”.

Posicionamento fixo

O posicionamento fixo é definido pelo valor fixed da propriedade position. Assim: elemento { position:fixed }.

Quando um elemento é definido como posicionamento fixo, sua posição é computada com relação à parte visível do User Agent (em geral, o browser) em que a página está sendo exibida.

Infelizmente o Internet Explorer[bb] 6 não suporta o posicionamento fixo.

Acredito que não é necessária nenhuma explicação mais extensa sobre o posicionamento fixo. Veja o seu uso no exemplo 5: posicionamento fixo (lembrando que este exemplo não vai funcionar no Internet Explorer).

Bem, acho que é isso. Qualquer dúvida ou se notarem que esqueci de mencionar algo importante, podem comentar. E se quiserem ler um texto realmente bom sobre esse assunto, o Relatively absolute do Tommy Olsson (que, infelizmente, parou de blogar) é o melhor que eu conheço.

Leia também:

63 Comentários sobre “Posicionamento com CSS: estático, absoluto, relativo e fixo”

Faça um comentário

Muito esclarecedora as informações que você colocou neste post, gostei. Parabéns.


Lembrando que o patch do Dean Edwards corrige o posicionamento fixo no IE:

http://dean.edwards.name/IE7/

É uma pena o patch todo ser pesado…. poderia existir algo específico só para o position: fixed.


Para quem está começando é um ótimo post, muito esclarecedor! ;)


prefiro posicionar com margin, padding e floats.
o codigo fica mais limpo, na minha opinião.


#5 | André

pois é, mas com floats há limitações, assim como há limitações com position. poderia rolar um post mostrando as difrenças.


Muito bom, não conhecia a função Fixed pena que só funciona no IE.

Parabéns.


Mto bom cara, finalmente consegui entender direito como funciona a propriedade position, vlw T+


#8 | Luiz

ÓÓÓtimo! Muito bom! bem básico mas fundamental para construção de layouts avançados em css!
Parabéns!!


#9 | Rodrigo

Muito bom mesmo seu post.
Agora sim sei usar top e left com position absolute.
Abraços…


#10 | Marcos

Eu achei meio fraco os comentarios, pode ate parecer bom mas pra quem ja conhece , agora pessoas leigas que nem eu nao entendem nada por exemplo eu li uma vez que o posicionamento absoluto era medido do inicio da pagina lado esquerdo tipo top : 0px; left:0px isso seria a medida inicial pra usar o aboluto, mas como eu nao entendo muito bem queria explicações melhores se possivel com imagens mostrando as pocições em relação aos cantos da pagina etc…, valeu


Finalmente compreendi o absoluto e relativo..heh


#12 | Helder

Graças ao artigo, consegui resolver um problema q ocorria no site q desenvolvo. Muito bom!
Só ocorreu o seguinte, ao colocar uma div com position absolute dentro de uma th q tenha position relative, no Firefox a div fica no alto da página, no IE a div fica posicionada dentro da th. Pra resolver isso, criei uma div dentro da th..depois coloquei uma div dentro dessa outra div, assim como está no exemplo do artigo..(será q fui claro??)
Qual será dos dois browsers está correto e seguindo o padrão? (creio q seja o firefox…)

Parabéns pelo artigo!


#13 | cucamonga

eita! Agora eu entendi esse birosca! Obrigado!

[]s

Cuca


#14 | Nephisto!

boa, rapaz!
Eu sempre precisei desses pequenos esclarecimentos. Agora sou uma nova pessoa. huaHUAhuaA

Valeu!


#15 | alaro

entendi foi nada !


#16 | Gevã

Foi mal, mas também não entendi!


#17 | Júlio Cesar

PARABÉNS !!!!!!!!!!!!!!!

Uma explicação simples para uma tema que há muito tempo buscava uma explicação.


Muito bom!
Deu o caminho das pedras para que quiser se aprofundar nessas propriedades. ;)


#19 | Giu

Grande Dt.Css.

Ajudou pacas!

Gracias!


#20 | webdcarlos

Achei interessante, mas como sugestão: apresentar um tutorial prático seria mais efetivo em termos didáticos.


Olá Pessoal. Matéria boa, mas não cosegui uma luz para resolver 2 problemas em http://www.muzy.com.br/contato.htm

1- No Mozilla o layer (DIV) não fica alinhado ao centro, só no IE funciona.

2- Tem um Flash transparente no layer que está sob uma table que possui vários INPUTS. Não conseguimos clicar nos INPUTS.

Obrigado a todos!


#22 | Maycon Felici

Belíssimo post, bem detalhado.

Depois de algumas horas pesquisando sobre este assunto encontrei alguns links interessantes, segue este para quem quiser ler algo mais.

http://www.autisticcuckoo.net/archive.php?id=2004/12/07/relatively-absolute


[…] Excelente biblioteca JavaScript para adicionar o efeito de drag and drop em imagens e layers (como o autor chama os divs posicionados com posicionamento absoluto) […]


Tiago Henrique em relação ao posicionamento Fixed, ele funciona no Firefox tb, eu fiz alguns teste, mas pra ficar tudo blz temos que utilizar em conjunto com o parametro zindex


Vi os comentários do amigo falando do posicionamento absoluto. Para explicar um pouco melhor para ele.

As divs que são posicionadas absolutamente tem sua posição relativa ao “container” onde estão posicionadas.

O container pode ser uma outra div, parágrago, ou tabela de acordo com o “box model”.

Ex:

teste

Coloque este código num html e abra no seu browser preferido (o meu é o firefox) e você verá que a div interna vai estar posicionada na tela assim: top: 60 pixels, left: 60 pixels.

Se você quiser ver isto em ação coloque uma borda nas divs:

teste

Acho que mastigado assim vai ser mais fácil de se entender.

Abraços de Minas

João Prado


#26 | thay

perfeito


#27 | Antonio Tadeu

Quanto esse miserável do IE vai virar um broswer de verdade e fazer o fixed funcionar ?!?!? Raios !!!


Muito simples e útil este seu artigo. Acabei de solucionar um problema de posicionamento com a sua ajuda.
Parabéns.


#29 | Ricardo

Achei muito fraco, não ficou claro.
Na verdade confundiu mais do que ajudou.
De qualquer forma vlw pela intenção.


#30 | Fernando

Muito bom!
Esclareceu muitas dúvidas, mas ainda não consegui resolver todas as minhas s com absolute ou relative…
Se começo com 760px de div e depois de um cabeçalho preciso quebrar em duas divs uma do lado da outra… uma de 160 e outra de 600, sendo que a de 160 vai ser um menu vertical e a de 600 um texto… e logo abaixo do texto no fim da página um traço e outras informações seguindo o padrão de 600px… ?


#31 | Juliana

Não gostei.Muito pobre esse site.


Não vou negar que eu estou me apaixonando por CSS, mas eu AMO TABELAS. As coisas ficam onde quero, do jeito que quero e o melhor, EM QUALQUER BROWSER. Um bando de malucos inventam um padrão de posicionamento “conceitual” ridículo e extremamente complexo, chato, temperamental. E O QUE É PIOR, cada fabricante de browser interpreta as regras WebStandards do SEU JEITO, e nós meros programadores, somos obrigados a ter 2, 3 browsers abertos para testar em cada um e ENCHENDO a CSS de HACKS. Mas para piorar o fabricante concerta o defeito em seu broswer do nada e aquele HACK que consertava a página passa a esculhambá-la. A VERDADE NUA E CRUA É QUE O CSS TEM TODOS OS SEUS MÉRITOS. MAS A TABELA POSICIONA DEFINITIVAMENTE.


Só para citar um exemplo, tente VOCÊ (isto é, 99,9999999% dos desingers) criar um layout de 3 colunas com a MESMA ALTURA com DIVS, uma do lado da outra com CONTEÚDO LÍQUIDO (altura do conteúdo variável nas 3 divs) sendo que TODAS vão ficar na MESMA ALTURA da MAIOR (use um background-color diferente para cada div). Mas faça isso com seu conhecimento (???) de CSS, sem sair fuçando a internet à procura de “milagres” prontos. Garanto que com tabela qualquer um faz.


Adorei o artigo do Bruno Torres ! Aprendi muita coisa sobre posicionamento. Apesar do meu código continuar bugado !
Este “Ricardo Muniz” falou tudo !
Eu também adoro CSS, mas pra posicionar a estrutura de um site nada melhor do que uma tabela mesmo !


#35 | elieser

parabéns cara! Ainda bem que temos gente como você e ferramentas de busca como o google !

Muito bom o seu tutorial, escrito de forma clara e objetiva.

Meus sinceros parabéns !!!!


#36 | Brunna Casati

É… Simples e boa a explicação, mas mesmo assim eu boiei um pouco… O melhor a fazer é ver o código fonte dos exemplos mesmo, e nada de preguiça… ^_^


#37 | Edu Ottaviani

Achei bem legal o post, acho que talvez para quem está começando tenha ficado um pouco obscura a idéia, mas eu achei interessante. Só queria acrescentar uma coisa, no post fala que não funciona no iE, mas não dá soluções. Vi nesse site:tagsoup.com/cookbook/css/fixed/ , que é possivel posicionar um elemento como fixed em ie, ocultando as barras de rolagem do body e usando uma div (overflow:scroll) para simular o body da página, assim, usando um elemento posicionado absolutamente, este, ficaria estático na página.

Acho que seria interessante comentar sobre isso, inclusive as vantagens e desvantagens dessa gambiarra.

Abraços


#38 | Júnio

Muito bom o artigo, muito bom mesmo.-Obrigado!!!!


Muito bom seu tópico,
estava ficando desesperado e doido aqui já por usar um position absolute dentro de um div estático e vendo os absolute tudo acima do topo.

já tava pirando aqui, pois realmente tu acertou de prima mesmo, pq isso so pega iniciante e eu sou um deles.

mais to aprendendo, chegou a hora de compreender o position de vez.

agora eu vi se eu tivesse colocado na div-onde se encontrava os elementos absolute, deixado ela como relative tinha acertado a posicao e nada ia escapar

você não tem idéia de como foi útil pra min isso, e muito bem explicado porque todos endereços links americanos onde estava pesquisando num tava conseguindo chegar nesse tipo de explicação que vc deu.

te agradeço mto
obrigado.
..abraços .


#40 | Arlindo Junior

Show de bola !


Estou tentando escapar das tabelas. Depois de ter ficado completamente cego, há uns dois anos, resolvi retomar o webdesign que fora meu hobby. Me vi desempregado e sabia que poderia fazer alguma coisa. Mas quando fui retomar a brincadeira, para a minha surpresa tudo mudou com tableless. Eu tinha encontrado o Flash como solução ideal, leve e fica sempre perfeito em qualquer máquina. Mas sem enxergar eu mesmo não posso desenhar, muito menos navegar.

Ironias do destino? De volta ao velho e bom bloco de notas.

?Este artigo me ajudou muito. Mas quero fazer um menu fixo também para Internet Explorer com popUps… O popUp funcionou, mas tudo rola com a ppágina.

Adivinhem: estou construindo uma página acessível! Não é fácil! O principal é que os itens do menu possam ser abertos pelo teclado. Consegui fazer isto disparando o script através de um link… O problema é que a página é recarregada.

Oops… saí do tema.


[…] de remédio, flores e desenhos, eles não precisam necessariamente estar no início do seu arquivo. Use CSS para posicioná-los e deixe no início o que for mais importante: seu menu, textos introdutórios, resumo de links com […]


[…] você ler ainda este aqui sobre posicionamento e mais um sobre hack, certamente terá um bom entendimento para enfrentar os problemas mais […]


#44 | Leonardo

Achei interessante o artigo, eu fiz alguns testes aqui na minha máquina e achei que seria bom colocar as minhas conclusões pra ajudar os que não entenderam.

ABSOLUTE: veja no dicionário, e verá algo como INDEPENDENTE, LIVRE. Ou seja, absolute é completamente livre dos outros elementos, ele se posiciona apenas em relação ao canto superior-esquerdo do seu browser(esqueça esse negocio dele se basear no por que não é verdade). Exeto quanto o elemento absolute está dentro de um elemento relative, sendo assim, ele se basea em relação ao canto esquerdo-superior do elemento relative.

RELATIVE: O que é relativo, é relativo à alguma coisa. isso quer dizer que o elemento relative irá se basear no canto superior-esquerdo de seu elemento pai, caso ele seja o único elemento da página, ele se basea no .

Espero ter ajudado.


#45 | Leonardo

REMAKE DO COMENTARIO ACIMA, POR QUE NAO SAIU A PALAVRA BODY ONDE EU QUERIA QUE SAÍSSE!!!

ABSOLUTE: veja no dicionário, e verá algo como INDEPENDENTE, LIVRE. Ou seja, absolute é completamente livre dos outros elementos, ele se posiciona apenas em relação ao canto superior-esquerdo do seu browser(esqueça esse negocio dele se basear no BODY por que não é verdade). Exeto quanto o elemento absolute está dentro de um elemento relative, sendo assim, ele se basea em relação ao canto esquerdo-superior do elemento relative.

RELATIVE: O que é relativo, é relativo à alguma coisa. isso quer dizer que o elemento relative irá se basear no canto superior-esquerdo de seu elemento pai, caso ele seja o único elemento da página, ele se basea no BODY.

Espero ter ajudado.


Leonardo, já que você comentou usando um email falso, aqui vai a resposta que tentei enviar pra você:

“Exeto quanto o elemento absolute está dentro de um elemento relative”
Isso é errado, porque o comportamento de um elemento dentro de um outro relative ou absolute é o mesmo. Ou seja, se ele estiver dentro de um elemento posicionado (ou seja, não estático), ele se comporta dessa forma.

“isso quer dizer que o elemento relative irá se basear no canto superior-esquerdo de seu elemento pai”
Errado também. Ele vai se basear na posição que ele teria se fosse estático. A diferença é que ele passa a aceitar top, left, bottom e right e passa a conter outros elementos posicionados.


#47 | Leonardo

Bruno Torres, primeiramente desculpe pelo e-mail invalido, eu coloco assim por que blogs geralmente são fontes de spam.

Bom, gostaria de escrever aqui todos os testes que eu fiz, mas isso é impossivel porque os comentários não aceitam tags, então vou lhes mandar por e-mail usando meu servico de e-mail valido.

para isso preciso saber o seu e-mail…


#48 | Leonardo

Bruno Torres.

Refiz meus testes e encontrei algumas falhas, realmente pude comprovar que você está certo, desculpe a vergonha que eu passei.

Mas isso tudo foi bom, porque agora eu sei EXATAMENTE o que é e como utilizar o absolute e relative, e lhe agradeço muito por isso.

Erros nos meus testes:

- Refiz um teste usando um elemento DIV ABSOLUTE a uma determinada posição e um elemento DIV STATIC. nesse teste eu aumentei a “margin-left” do elemento BODY para 300px. Ví que o DIV STATIC acompanhou o BODY, mas o DIV ABSOLUTE não acompanhou. Por isso eu pensei que o ABSOLUTE não era baseado no BODY.
Mas então eu apliquei no BODY o position:relative e left:300px (ao invés do margin-left). Dessa forma o DIV ABSOLUTE realmente acompanhou o elemento BODY, embora mantendo a determinada posição que eu lhe pus. Com esse teste eu pude comprovar que o ABSOLUTE realmente se baseia no BODY.

- Refiz outro teste usando um DIV RELATIVE que se posionava logo abaixo de um DIV STATIC. Pus esse DIV RELATIVE em uma certa posição, tirei um printscreen e medi (em pixels) no paintbrush. Pude comprovar que ele se desloca exatamente a partir de sua posição se fosse STATIC.

Palmas para o Bruno Torres, ele estava certo o tempo todo!


#49 | Leonardo

Desculpa o Triple-Posting.

Mas só para confirmar…

Absolute: Ele se basea a partir do canto superior-esquerdo do seu elemento PAI, caso não exista elemento PAI, ele se basea no BODY.

Relative: Ele se basea a partir do canto superior-esquerdo de sua posição original do fluxo da página.

Existem exeções?


#50 | André

Estou tendo um problema no IE, se alguém puder ajudar agradeço.
Coloquei dois box dentro de um maior, para dividir o texto
em duas colunas.
A intenção é ter a barra de rolagem no box maior para quando
o texto for maior mesmo.
Mas quando o texto é maior que o box, no IE não aparece
mais a barra de rolagem do box maior. [ no firefox aparece]
Ele faz o scroll, mas sem a barra de rolagem.
Valeu. ABS


[…] O DIV menu precisa ter posicionamento relativo, para “conter” seus filhos, que serão posicionados de maneira absoluta. (leia meu artigo sobre posicionamento com CSS) […]


Muito boa a explicação, dá uma bela luz!
vlw!


[…] no caso o H1, exatamente iguais às da imagem, posicioná-la com posicionamento relativo (leia meu artigo sobre posicionamento, no brunotorres.net) e definir overflow hidden, para que o texto não extrapole os limites, caso o […]


[…] imagem de fundo não é uma imagem de fundo. É um IMG, de 1152 x 915 pixels com posicionamento absoluto, “esticada” via JavaScript (alterando os atributo WIDTH e HEIGHT) caso o tamanho da […]


#55 | João Rodrigo Moreira

Estava fazendo falta um artigo sobre posicionamento bem explicativo e com exemplos fáceis de assimilar. Obrigado Bruno!


#56 | Érika

Estou comecando agora e realmente foi muito esclarecedor.
Resolvi fazer o exercício que o “Ricardo Muniz” propôs no comentário dele e não encontrei dificuldades (ou tvz eu não tenha entendido a complexidade da questão levantada por ele). Mas, o que eu fiz foi estabelecer altura e largura iguais para as três divs, utilizei texto com tamanhos variados para simular o conteúdo líquido e coloquei os background-color diferentes. Depois float:left. O posicionamento ficou direitinho.
Será que é isso??
De qualquer forma, obrigada pelo post. Muito Bom!


#57 | Giuliano

Parabéns pelas informações! Posto muito bom!!!

Infelizmente não consegui resolver meu problema, pois estava inserindo um “position” dentro de um div, que já possuia outro parametro de “position”. Um conflito um pouco complexo para mim.

Mas sou designer e não programador, e esse post esclareceu muita coisa!!! muito didático, parabens!!!


#58 | Daniel Tré

Parabéns,
finalmente eu entendi como posicionar uma div em relação a outra de forma satisfatória!!
Parabéns novamente!



eu abrendi o que é valor absoluto mas eu ainda não aprendi o que é valor relativo… mande mais coisas sobre o que é valor relativo e mais um pouco e valor absoluto.
obrigado


#61 | shalon

“A diferença é que margin acrescenta seu valor ao tamanho do elemento.”

Em relação a esse Posionamento Relativo, poderia me explicar a frase acima?

Aguardo a resposta.

Atenciosamente, Shalon Magdiel


#62 | Thiago

Sinceramente,
não entendi nada…

fiquei mais confuso…
comecei a estudar agora..
e esse post nao me ajudou em nada…


#63 | Leonardo Bento

A pergunta do cálculo foi interessante.
Parabéns pelo exclarecimento, ficou muito fácil.


« XHTML: pensando no futuro?

Mais um cérebro »

Deixe seu comentário

Buscas populares: Ganhar dinheiro, AdSense, Velox, Acessibilidade, IE7, CSS Position, Quero ganhar dinheiro


Veja as estatísticas

uk vpn Mp3sparks