Aula 07 - Responsividade CSS
Apresenta recursos que facilitam a responsividade de interfaces web usando CSS
Exemplos de aula
Responsividade
Em primeiro lugar, um layout responsivo exige a adaptação à diferentes dispositivos. Isso significa que um layout apresentado em uma tela maior, como a de um computador desktop, não se aplica diretamente à telas menores, como a de dispositivos móveis. Observe as imagens abaixo:



Além disso, precisamos considerar diferenças de interação do usuário com a aplicação. Dessa forma, responsividade considera não só o tamanho de tela, mas todos os recursos oferecidos por um dispositivo e as formas de uso pelo usuário (ex.: acelerômetro, mouse, teclado, mobilidade...)
Ao definir um layout, uma estratégia comum utilizada é pensar primeiro no desenvolvimento de dispositivos móveis: a de mobile-first. Essa estratégia tem como principal objetivo garantir a usabilidade em dispositivos móveis como smartphones e tablets, garantindo assim uma maior facilidade na adaptação desses modelos para outros dispositivos.
A anotação @media pode ser usada em conjunto com as regras descritas em um documento CSS para limitar a aplicação de uma regra apenas para determinados tipos de dispositivos/telas. Isso auxilia na criação de folhas de estilo responsivas. A sintaxe dessa anotação pode ser descrita da seguinte maneira:
@media not|only mediatype and (mediafeature and|or|not mediafeature){
seletor{
regras...
}
}
Veja o Exemplo .
Limitando a regra à largura de tela de 600px
@media screen and (max-width: 600px) {
.container{
}
}
Aumentando o tamanho da letra para impressão
@media print {
.container{
font-size: 3rem;
}
}
Desabilitando um elemento na impressão
@media print {
.container{
display: none; //use block para mostrar novamente
}
}
Flexbox
O Flexible Box Module, geralmente conhecido como flexbox, é um modelo de layout que permite organizar os elementos de um documento com tamanho e orientações flexíveis. O flexbox foi criado exclusivamente para a web, onde possuímos frequentemente renderizações com diferentes tamanhos e especificações.
A especificação do flexbox foi feita em Outubro de 2017, e desde então é um dos mais eficientes modos de orientar elementos no CSS, podendo ser utilizado juntamente com o modelo CSS Grid.
Os elementos que desejamos organizar através do flexbox devem seguir uma hierarquia básica de:
- Pais (parent ou container)
- Filho (children ou item)
#elemento-pai{
display: flex;
}
.elementos-filhos{
flex-grow: 2;
flex-basis: 10rem;
}
É importante ressaltar que elementos filhos de elementos filhos não são automaticamente alinhados com o flexbox.
displayEssa propriedade define um container flex. Sempre que definimos um elemento pai dessa maneira, todos os seus filhos imediatos serão organizados de acordo com a lógica do flex.
css style.css.container { display: flex; }flex-directionDefine a direção de como os elementos filho serão organizados dentro do elemento pai. Podemos definir o eixo horizontal ou vertical, além de determinar a sequencia dos elementos como
*-reverse(de trás pra frente).css style.css.container { flex-direction: row | row-reverse | column | column-reverse; }flex-wrapPor padrão, os itens flex irão ocupar uma única linha. Podemos permitir que os elementos quebrem linha usando esse atributo.
css style.css.container { flex-wrap: nowrap | wrap | wrap-reverse; }justify-contentDefine o alinhamento dos elementos ao longo do eixo principal (definido por
flex-direction). Isso permite distribuir o espaço vazio de um elemento pai entre todos os elementos filhos.css style.css.container { justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe; }align-itemsDefine o alinhamento dos elementos ao longo do eixo transversal (o eixo contrário ao definido por
flex-direction). Podemos pensar nesse atributo como umjustify-contentpara o eixo secundário.css style.css.container { align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe; }align-contentDefine como o espaço extra do container será distribuído no eixo transversal. É similar ao
justify-content.css style.css.container { align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe; }
orderPor padrão, os itens flex são dispostos na ordem em que aparecem no código (ou na ordem reversa). Em todo caso, podemos definir elementos com ordem estática usando essa propriedade.
css style.css.item { order: 5; /* padrão é 0 */ }flex-growDefine a habilidade de um item flex de aumentar seu tamanho se necessário. Os valores usados para esse atributo usam unidades de proporção. Por exemplo, um item definido como
flex-grow: 2terá tomará o dobro de espaço excedente em comparação com os itens definidos comoflex-grow: 1.css style.css.item { flex-grow: 4; /* padrão é 0 */ }flex-shrinkDefine a habilidade de um item flex de encolher se necessário. Também usa a mesma lógica de proporções que
flex-growcss style.css.item { flex-shrink: 3; /* padrão é 1 */ }flex-basisDefine o valor padrão de um item antes que o espaço excedente do container seja distribuído. Essa propriedade aceita valores em unidades padrão, como
%,remoupx. Também é possível utilizar o valorauto, que usa automaticamente os valores deheightewidthdo item.css style.css.item { flex-basis: | auto; /* default auto */ }align-selfSobreescreve o alinhamento padrão definido pelo container (
align-items).css style.css.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
Mão na Massa
Considere a esta página exemplo. O site utiliza flex para organizar os itens na tela. Observe que o componentes são organizados automaticamente em telas menores (Use o modo de design responsivo do navegador. utilize oCtrl + Shift + M, no firefox). No entanto, alguns melhoramentos podem ser feitos em relação à responsividade nesse tipo de dispositivo. Considere os requisitos abaixo e realize os melhoramentos solicitados:
- Uma nova regra deve ser criada para atender apenas a dispositivos móveis com largura de tela de no máximo
600px - Usando o seletor
.mensagem .conteudo, aplique uma margem da esquerda para2rem. Além disso, deve incluir uma regra chamadaorder: 1; - Usando o seletor
header, insira a regraflex-flow: column; - Usando o seletor
header ul, insira a regradisplay: block; - Usando o seletor
header ul li, altere a margem para2reme o alinhamento do texto para centralizado
As alterações deverão ser realizadas em um arquivo CSS adicional, contendo o seu nome .css, que deverá ser devidamente linkado ao arquivo index.html. Não deve ser realizada nenhuma alteração no arquivo original.css (mas pode e deve ser utilizado como referência nas modificações)
Levando esta página HTML em consideração, implemente alterações usando flexbox e os conteúdos aprendidos até aqui para criar uma página que se pareça ao máximo com este mockup (desktop). A estilização deve ser responsiva e se apresentar em dispositivos móveis adequadamente de acordo com estes mockups (exemplo mobile 01,exemplo mobile 02). Para garantir fidelidade no projeto, você pode seguir as seguntes dicas:
- Você pode usar a letra que preferir. Experimente utilizar uma nova fonte a partir de algum repositório
- Elimine a margem do
bodyusandomargin: 0; - Utilize um tamanho máximo para a seção
alinhamentode 1000 pixels, e aplique a margin0 auto - Utilize um
flex-basispara cada caixa emalinhamentode250px - Justifique o texto dentro das caixas em
descricao - Utilize um
flex-basispara cada caixa emdescricaode200px - Lembre-se: utilizar o flex-basis garante um tamanho mínimo para um elemento, mas é necessário usar o
flex-growse você quer que ele ocupe espaços vazios na sua linha - As imagens deve conter tamanho fixo de 100 pixes por 100 pixels. Utilize a regra
object-fit: cover;para acomodar devidamente a imagem sem distorcer
Utilize imagens de personagens para ilustrar sua página. Você pode utilizar este arquivo de imagens de Game Of Thrones como referência
Exercícios Complementares
Utilizando esta template, altere o CSS usando flexbox para que mostre as noticias da seguinte forma. Adicione também uma letra personalizada do Google Fonts para o seu modelo.
Algumas dicas:
- O tamanho da imagem destaque foi diminuido para 30rem;
- O tamanho das outras imagens está em 15rem;
- O tamanho base de cada
articleé de15rem - Utilize o flexbox para alinhar as caixas de artigos
- Utilize também o flexbox para alinhar os itens dentro dos artigos (talvez seja necessário alterar o HTML)
O modelo deve ficar parecido com este.