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.
.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.Para finalizar #
Há muitas opções e flexibilidade no layout CSS. Para se aprofundar ainda mais no poder do CSS Flexbox e Grid, continue nos próximos módulos.
Test your knowledge of layoutWhat 2 things does the
Determinesdisplay
property do?inline
orblock
ornone
. Determines the grid layout frame. Determines how the children should behave. Determines if the box should scroll.The layout engine needs to know if this box be full width or not and does it need a new line.
The display property can set display to grid but it doesn't have anything to do with a layout frame.
Flexbox and grid have opinions and new features for their children.
That's the
overflow
property.To flow multiple paragraphs into columns, which CSS property is best for this task?
display: grid
column-count
display: flex
float
While grid could put multiple paragraphs into columns, those columns would be their own columns, not flowing together from one to the next.
Paragraphs will flow from the end of one column into the start of the next, like a magazine or newspaper will do.
While flex could put multiple paragraphs into columns, those columns would be their own columns, not flowing together from one to the next like is needed.
Try again!
What does it mean if a block is out of flow?
It's stuck on the side of the river. It's been given atop
orleft
position value. It's no longer positioned based on its siblings positions.Context is CSS here, not geography.
Having these properties alone do not pull a box out of flow.
A box with
position: absolute
for example, is now positioned with x and y coordinates based on the containing block, and not its order with other sibling elements.Flexbox and Grid wrap their children by default?
True FalseIt must be opted into with
flex-wrap: wrap
orrepeat(auto-fit, 30ch)
.Flexbox and Grid have special wrapping features that need additional styles to apply.
Next and previous lessons