Layout

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 . Uma linha do tempo mostrando como o CSS evoluiu ao longo dos anos, do começo em 1996 até 2021

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. Um diagrama mostrando todos os diferentes tamanhos de uma caixa e onde cada seção de dimensionamento começa e termina 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.

<iframe allow="camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;" loading="lazy" src="https://codepen.io/web-dot-dev/embed/rNjxmor?height=300&theme-id=light&default-tab=css%2Cresult&editable=true" style="height: 100%; width: 100%; border: 0;" title="Pen rNjxmor by web-dot-dev on Codepen"

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.
Este exemplo acima mostra um layout de eixo único. Enquanto o flexbox trata principalmente os itens como um grupo, a grade oferece controle preciso sobre sua colocação em duas dimensões. Podemos definir que o primeiro item nesta grade ocupa 2 linhas e 3 colunas: ```css .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.

<iframe allow="camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;" loading="lazy" src="https://codepen.io/web-dot-dev/embed/VwPaLMg?height=300&theme-id=light&default-tab=result&editable=true" style="height: 100%; width: 100%; border: 0;" title="Pen VwPaLMg by web-dot-dev on Codepen"

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.

<iframe allow="camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;" loading="lazy" src="https://codepen.io/web-dot-dev/embed/gOgrpzO?height=500&theme-id=light&default-tab=result&editable=true" style="height: 100%; width: 100%; border: 0;" title="Pen gOgrpzO by web-dot-dev on Codepen"

.countries {
    width: 100%;
    column-width: 260px;
    column-gap: 1em;
}
Em vez de definir o número de colunas em que o conteúdo é dividido, você também pode definir uma largura mínima desejada, usando `column-width`. À medida que mais espaço é disponibilizado na janela de visualização, mais colunas serão criadas automaticamente e, à medida que o espaço é reduzido, as colunas também reduzem. Isso é muito útil em contextos de web design responsivo. ### 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` . ```css .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. ```css .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: 1. Você pode posicionar este elemento onde quiser, usando `top`, `right`, `bottom` e `left` em seu pai relativo mais próximo. 2. 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 ao `absolute` , com seu pai sendo o elemento raiz `` . Os elementos de posição fixa permanecem ancorados no canto superior esquerdo com base nos valores `top` , `right` , `bottom` e `left` que você definir. Você pode obter os aspectos `fixed` e ancorados de aspectos fixos e os aspectos mais previsíveis de homenagem ao fluxo de documentos `relative` usando `sticky` . Com esse valor, conforme a janela de visualização rola além do elemento, ela permanece ancorada nos valores `top` , `right` , `bottom` e `left` 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. ### Check your understanding

Test your knowledge of layout

What 2 things does the display property do?

Determines inline or block or none.
The layout engine needs to know if this box be full width or not and does it need a new line.
Determines the grid layout frame.
The display property can set display to grid but it doesn't have anything to do with a layout frame.
Determines how the children should behave.
Flexbox and grid have opinions and new features for their children.
Determines if the box should scroll.
That's the overflow property.

To flow multiple paragraphs into columns, which CSS property is best for this task?

display: grid
While grid could put multiple paragraphs into columns, those columns would be their own columns, not flowing together from one to the next.
column-count
Paragraphs will flow from the end of one column into the start of the next, like a magazine or newspaper will do.
display: flex
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.
float
Try again!

What does it mean if a block is out of flow?

It's stuck on the side of the river.
Context is CSS here, not geography.
It's been given a top or left position value.
Having these properties alone do not pull a box out of flow.
It's no longer positioned based on its siblings positions.
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
It must be opted into with flex-wrap: wrap or repeat(auto-fit, 30ch).
False
Flexbox and Grid have special wrapping features that need additional styles to apply.