Layout
Uma visão geral dos vários métodos de layout que você deve escolher ao construir um componente ou layout de página.

Imagine que você está trabalhando como desenvolvedor e um colega designer lhe entrega um design para um novo site. O design tem todos os tipos de layouts e composições interessantes: layouts bidimensionais que levam em consideração a largura e altura da janela de visualização, bem como layouts que precisam ser fluidos e flexíveis. Como você decide a melhor maneira de estilizá-los com CSS?
O CSS nos oferece várias maneiras de resolver problemas de layout, em um eixo horizontal, eixo vertical ou até mesmo ambos. Escolher o método de layout correto para um contexto pode ser difícil e, frequentemente, você pode precisar de mais de um método de layout para resolver seu problema. Para ajudar com isso, nos módulos a seguir, você aprenderá sobre os recursos exclusivos de cada mecanismo de layout CSS para informar essas decisões.
Layout: uma breve história #
Nos primórdios da web, designs mais complexos do que um simples documento eram dispostos com elementos <table>
. Separar o HTML dos estilos visuais ficou mais fácil quando o CSS foi amplamente adotado pelos navegadores no final dos anos 90. O CSS abriu a porta para os desenvolvedores poderem mudar completamente a aparência de um site sem jamais tocar no HTML. Esse novo recurso inspirou projetos como The CSS Zen Garden, criado para demonstrar o poder do CSS e encorajar mais desenvolvedores a aprendê-lo. O CSS também evoluiu conforme nossas necessidades de web design e tecnologia dos navegadores. Você pode ler como o layout CSS e nossa abordagem ao layout evoluíram ao longo do temponeste artigo de Rachel Andrew .
Layout: o presente e o futuro #
O CSS moderno tem ferramentas de layout excepcionalmente poderosas. Temos sistemas dedicados para layout e vamos dar uma olhada de alto nível no que temos à nossa disposição antes de nos aprofundarmos em mais detalhes nos próximos módulos sobre o Flexbox e o Grid.
Compreendendo a propriedade display
#
A propriedade display
faz duas coisas. A primeira coisa que ela faz é determinar se a caixa à qual se aplica atua como embutida ou em bloco.
.my-element {
display: inline;
}
Os elementos embutidos se comportam como palavras em uma frase. Eles ficam lado a lado na direção inline. Elementos como <span>
e <strong>
, que normalmente são usados para estilizar pedaços de texto dentro de elementos como <p>
(parágrafo), são embutidos por padrão. Eles também preservam os espaços em branco circundantes. Você não pode definir uma largura e altura explícitas em elementos embutidos. Qualquer margem de nível de bloco e preenchimento serão ignorados pelos elementos circundantes.
.my-element {
display: block;
}
Os elementos de bloco não ficam lado a lado. Eles criam uma nova linha para si próprios. A menos que seja alterado por outro código CSS, um elemento de bloco se expandirá para o tamanho da dimensão embutida, portanto, abrangendo toda a largura em um modo de escrita horizontal. A margem em todos os lados de um elemento de bloco é respeitada.
.my-element {
display: flex;
}
A propriedade display
também determina como os filhos de um elemento devem se comportar. Por exemplo, definir a propriedade display
para display: flex
torna a caixa uma caixa em nível de bloco e também converte seus filhos em itens flexíveis. Isso habilita as propriedades flex que controlam o alinhamento, a ordem e o fluxo.
Flexbox e Grid #
Existem dois mecanismos principais de layout que criam regras de layout para vários elementos, flexbox e grid. Eles compartilham semelhanças, mas são projetados para resolver diferentes problemas de layout.
Flexbox #
.my-element {
display: flex;
}
O Flexbox é um mecanismo de layout para layouts unidimensionais. Layout em um único eixo, horizontal ou verticalmente. Por padrão, o Flexbox irá alinhar os filhos do elemento um ao lado do outro, na direção inline, e esticá-los na direção do bloco, de forma que todos tenham a mesma altura.
Os itens permanecerão no mesmo eixo e não serão quebrados quando ficarem sem espaço . Em vez disso, eles tentarão se espremer na mesma linha que os outros. Esse comportamento pode ser alterado usando as propriedades `align-items`, `justify-content` e `flex-wrap`. O Flexbox também converte os elementos filhos em **flex items**, o que significa que você pode escrever regras sobre como eles se comportam dentro de um flex container. Você pode alterar o alinhamento, a ordem e a justificação de um item individual. Você também pode alterar como ele diminui ou aumenta usando a propriedade `flex`.my-element div {
flex: 1 0 auto;
}
A propriedade flex
é uma abreviação de flex-grow
, flex-shrink
e flex-basis
. Você pode expandir o exemplo acima assim:
.my-element div {
flex-grow: 1;
flex-shrink: 0;
flex-basis: auto;
}
Os desenvolvedores fornecem essas regras de baixo nível para sugerir ao navegador como o layout deve se comportar quando for desafiado pelo conteúdo e pelas dimensões da janela de visualização. Isso o torna um mecanismo muito útil para o web design responsivo.
Grid #
.my-element {
display: grid;
}
Grid é semelhante em muitas maneiras ao flexbox, mas é projetado para controlar layouts de múltiplos eixos em vez de layouts de eixo único (espaço vertical ou horizontal). O Grid permite que você escreva regras de layout em um elemento que tenha display: grid
e apresente alguns novos primitivos para estilo de layout, como as funções repeat()
e minmax()
. Uma unidade de grade útil é a fr
- que é uma fração do espaço restante - você pode construir grades tradicionais de 12 colunas, com uma lacuna entre cada item, com 3 propriedades CSS:
.my-element {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1rem;
}
.my-element :first-child {
grid-row: 1/3;
grid-column: 1/4;
}
As propriedades grid-row
grid-column
instruem o primeiro elemento na grade a se estender até o início da quarta coluna, a partir da primeira coluna e, em seguida, se estender até a terceira linha, a partir da primeira linha.
Layout de fluxo #
Se não estiver usando grade ou flexbox, seus elementos serão exibidos em fluxo normal. Existem vários métodos de layout que você pode usar para ajustar o comportamento e a posição dos itens quando em fluxo normal.
Bloco inline #
Lembra-se de como os elementos ao redor não respeitam a margem do bloco e o preenchimento em um elemento inline? Com o inline-block
, você pode fazer com que isso aconteça.
p span {
display: inline-block;
}
Usar inline-block
fornece a você uma caixa que possui algumas das características de um elemento de nível de bloco, mas ainda flui embutido com o texto.
p span {
margin-top: 0.5rem;
}
Flutuadores #
Se você tem uma imagem dentro de um parágrafo de texto, não seria útil que o texto envolvesse a imagem como você vê nos jornais? Você pode fazer isso com flutuadores.
img {
float: left;
margin-right: 1em;
}
A propriedade float
instrui um elemento a "flutuar" na direção especificada. A imagem neste exemplo é instruída a flutuar para a esquerda, o que permite que os elementos irmãos se "embrulhem" em torno dela. Você pode instruir um elemento a flutuar para a left
, right
ou inherit
.
Layout de várias colunas #
Se você tem uma lista muito longa de elementos, como uma lista de todos os países do mundo, isso pode resultar em muita rolagem e perda de tempo para o usuário. Ele também pode criar espaços em branco excessivos na página. Com o CSS multicolunas, você pode dividir essa lista em várias colunas para ajudar com esses dois problemas.
<h1>Todos os países</h1>
<ul class="countries">
<li>Argentina</li>
<li>Ilhas Aland</li>
<li>Albânia</li>
<li>Argélia</li>
<li>Samoa Americana</li>
<li>Andorra</li>
…
</ul>
.countries {
column-count: 2;
column-gap: 1em;
}
Isso divide automaticamente essa longa lista em duas colunas e adiciona uma lacuna entre as duas colunas.
.countries {
width: 100%;
column-width: 260px;
column-gap: 1em;
}
Posicionamento #
Por último nesta visão geral dos mecanismos de layout está o posicionamento. A propriedade position
muda como um elemento se comporta no fluxo normal do documento e como ele se relaciona com outros elementos. As opções disponíveis são relative
, absolute
, fixed
e sticky
com o valor padrão sendo static
.
.my-element {
position: relative;
top: 10px;
}
Este elemento é deslocado 10 px para baixo com base em sua posição atual no documento, visto que está posicionado em relação a si mesmo. Adicionar position: relative
a um elemento também o torna o bloco que contém qualquer elemento filho com position: absolute
. Isso significa que seu filho agora será reposicionado para este elemento específico, em vez do pai relativo superior, quando ele tiver uma posição absoluta aplicada a ele.
.my-element {
position: relative;
width: 100px;
height: 100px;
}
.another-element {
position: absolute;
bottom: 0;
right: 0;
width: 50px;
height: 50px;
}
Quando você define a position
como absolute
, ele quebra o elemento do fluxo de documento atual. Isso significa duas coisas:
- Você pode posicionar este elemento onde quiser, usando
top
,right
,bottom
eleft
em seu pai relativo mais próximo. - Todo o conteúdo em torno de um elemento absoluto reflui para preencher o espaço restante deixado por esse elemento. Um elemento com um valor de
position
fixed
se comporta de maneira semelhante aoabsolute
, com seu pai sendo o elemento raiz<html>
. Os elementos de posição fixa permanecem ancorados no canto superior esquerdo com base nos valorestop
,right
,bottom
eleft
que você definir. Você pode obter os aspectosfixed
e ancorados de aspectos fixos e os aspectos mais previsíveis de homenagem ao fluxo de documentosrelative
usandosticky
. Com esse valor, conforme a janela de visualização rola além do elemento, ela permanece ancorada nos valorestop
,right
,bottom
eleft
que você definiu.