Leiaute
📽 Veja esta vídeo-aula no Youtube
Flex
Historicamente diversas técnicas foram utilizadas para criação de leiautes em HTML/CSS. Utilizaremos neste curso a técnica de leiaute flexível, através da especificação flex.
Nesse método sempre temos os papéis do flex container (recipiente) e dos flex items (itens). Todos os elementos itens devem ser filhos do elemento container.
Ao atribuir display: flex
ao flex container ele se comporta como um elemento em nível de bloco e seus filhos são agora flex items. Podemos mudar seu comportamentos alterando propriedades do container e dos itens.
Ex.:
Marcação:
<div class="meu-container">
<div>Item 1</div>
<div id="meu-item-especial">Item 2</div>
<div>Item 3</div>
</div>
Estilo:
.meu-container {
display: flex;
/* estilização do flex-container */
}
.meu-container > * {
/* estilização de todos os flex-items */
}
#meu-item-especial {
/* estilização de um flex-item específico */
}
Comportamento de flex-items
Veja o seguinte exemplo:
Dois itens foram criados, e posicionados lado-a-lado, com o tamanho definido de acordo com seu conteúdo. Itens flex buscam ocupar o menor tamanho possível sem quebras de linha.
Perceba que ao adicionar mais itens, eles se redimensionam para caber no container:
Caso não seja possível, eles vazam:
A principal ideia aqui é que os elementos fluem pelo eixo principal, no caso o eixo das linhas (row
).
Podemos controlar o eixo de fluxo através de flex-flow
, que pode ser row
(linhas) ou column
(colunas):
Também podemos usar flex-flow
para controlar o vazamento. Se indicarmos wrap
os itens podem quebrar a “linha” (na verdade, o eixo principal).
Alinhamento no eixo principal
Podemos usar o alinhamento (ou justificação) para indicar como os itens se distribuem no espaço vazio em relação ao eixo principal.
Usamos a propriedade do container justify-content
com os seguintes valores:
Veja estes exemplos:
Alinhamento no eixo transversal
Caso os itens tenham alturas distintas entre si, ou não ocupem toda a altura do container, podemos acabar com espaços não ocupados no eixo transversal ao eixo principal. Nesse caso, alinhamos os itens usando a propriedade do container align-items
com os seguintes valores:
Veja estes exemplos:
Caso tenhamos quebra no eixo principal podemos controlar o espaço livre entre as “linhas” usando align-content
:
Veja estes exemplos:
Propriedades dos flex-items
Podemos configurar os itens individualmente, se necessário.
Veja este exemplo:
Agora, são configurados no container os alinhamentos em ambos os eixos:
E então, os segundo e quarto itens recebem uma alteração no alinhamento do eixo secundário através da propriedade align-self
(equivalente a align-items
mas exclusiva dos itens).
Controlando o tamanho ocupado pelos itens
Veja o exemplo a seguir:
Digamos que queremos ocupar todo o espaço disponível no container, em ambos os eixos. A maneira mais fácil de obter esse comportamento é usando a propriedade flex
dos itens, com o valor 1
.
Podemos ajustar a taxa de crescimento proporcionalmente em relação aos demais usando valores maiores em flex
:
Percebam que 0
fez o terceiro item não crescer de maneira alguma. Dizemos que ele é inflexível.
Caso o espaço não seja suficiente, podemos controlar também a taxa de redução dos elementos. Veja o exemplo:
Ao segundo item foi dito para não crescer, mas reduzir se necessário (usando flex: 0 1;
ou flex: initial;
):
Ao segundo item foi dito crescer e reduzir, conforme necessário (usando flex: 1 1;
ou flex: auto;
):
Ao segundo item foi tornado totalmente inflexível, e foi indicada uma medida base (200px) para o eixo principal (usando flex: 0 0 200px;
ou flex: none; flex-basis: 200px;
):
Caso tenhamos quebra em mais de uma “linha”, para ocupar todos os espaços em todas as linhas precisamos torná-los totalmente flexíveis e usar uma medida base auto
, como em flex: 1 1 auto;
:
Elementos HTML semânticos
Ao criar leiautes, era comum na era HTML versão 4 fazer todos os elementos com div
s e utilizar classes e identificadores com nomes indicando sua função na página.
<div id="cabecalho"></div>
<div id="menu"></div>
<div id="conteudo">
<div class="post"></div>
<div class="post"></div>
<div class="post"></div>
</div>
<div id="rodape"></div>
Com o advento do HTML5 foram criadas tags semânticas com o mesmo comportamento de div
(ou span
), porém com semânticas comuns à maioria dos sites, facilitando assim a sua identificação. Sempre use tags semânticas quando possível.
<header></header>
<nav></nav>
<main>
<article></article>
<article></article>
<article></article>
</main>
<footer></footer>
<article>
<header>
<h1></h1>
</header>
<div>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<p></p>
</div>
</article>
Há por volta de 100 tags semânticas no HTML. As mais comuns:
Em nível de bloco:
header
- cabaçalho de um documento ou seçãofooter
- rodapé de um documento ou seçãomain
- principal conteúdo do documentosection
- seção do documentoh1
ah6
- título de seçãoarticle
- conteúdo independentenav
- área de navegação com linksaside
- conteúdo periférico, não diretamente relacionado ao principal
Em nível de linha:
a
- âncora (link)abbr
- abreviaçãob
- atenção ao texto (bring attention)cite
- citação a trabalho de terceiro (bibliografia, por exemplo)code
- código (como em linhas de programação, por exemplo)del
- texto excluídoem
- ênfasei
- expressão idiomática (termos técnicos, por exemplo)ins
- texto incluídokbd
- texto a ser escrito no teclado, teclas de atalho, etc.mark
- texto marcado (com um marca texto, por exemplo)q
- texto de autoria de terceiros
- texto riscadosmall
- texto em letras miúdasstrong
- texto importantesub
- subscritosup
- sobrescritotime
- datas e horasu
- texto não-articulado (com erro de grafia, por exemplo)var
- variável matemática ou de programação
Muitos desses elementos são estilizados na folha de estilos do navegador (user agent stylesheet), devendo se tomar cuidado para mantê-los consistentes entre todos os usuários.