Curso Completo de Desenvolvimento Web
Curso Completo de Desenvolvimento Web
IMPRESSIONADOR
Trilha Frontend moderna – HTML / CSS & JAVASCRIPT
4 MUDAR A DIREÇÃO DO FLEXBOX 023 17 DESAFIO 2 – FLEXBOX NA SEÇÃO COMO AJUDAR 106
5 TAMANHO DOS ELEMENTOS 028 18 DESAFIO 2 – FLEXBOX NA SEÇÃO MINICURSO 109
6 ALINHAMENTO E POSICIONAMENTO DOS ELEMENTOS 039 19 DESAFIO 2 – FLEXBOX NO RODAPÉ 112
7 DESAFIO 1 – CONSTRUINDO LAYOUTS COM FLEXBOX 055 20 EXERCÍCIOS EXTRAS – FLEXBOX FROGGY 120
8 DESAFIO 1 - GABARITO 057
MÓDULO 2 COMPONENTES PERSONALIZADOS NO HTML
9 DESAFIO 2 – FLEXBOX NA HOME DA HASHTAG 068
1 APRESENTANDO O MÓDULO 122
10 DESAFIO 2 – FLEXBOX NO CABEÇALHO 069
2 PAGINAÇÃO - APRESENTANDO O DESAFIO 123
11 DESAFIO 2 – FLEXBOX NA SEÇÃO HERO 075
3 PAGINAÇÃO - RESOLUÇÃO 1/2 124
12 DESAFIO 2 – FLEXBOX NA SEÇÃO CONTEÚDOS GRATUITOS 078
4 PAGINAÇÃO - RESOLUÇÃO 2/2 + CSS NESTING 130
13 DESAFIO 2 – FLEXBOX NA SEÇÃO DIFERENCIAIS 085
5 ACORDEÃO - APRESENTANDO O DESAFIO 137
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
3
SUMÁRIO
NÍVEL TRILHA IMPRESSIONADORA - DO AVANÇADO AO IMPRESSIONADOR EM HTML/CSS
14 LAZY LOADING 501 27 DESAFIO 2 – ÚLTIMA MEDIA QUERY PARA AS SEÇÕES DIFERENCIAIS, O
547
15 CARREGAMENTO DO CSS E ARQUIVOS DE ESTILIZAÇÃO 503 QUE FALAM E NA MÍDIA
16 DESAFIO 2 – DEIXANDO A HOME DA HASHTAG RESPONSIVA 505 28 DESAFIO 2 – FINALIZANDO A ÚLTIMA MEDIA QUERY 551
17 DESAFIO 2 – CRIANDO A PRIMEIRA MEDIA QUERY 506 29 DESAFIO 2 – CRIANDO A NEVAGAÇÃO MOBILE 559
18 DESAFIO 2 – ALTERANDO A PÁGINA INTEIRA MUDANDO UMA ÚNICA 512 30 DESAFIO 2 – FINALIZANDO A NEVAGAÇÃO MOBILE 566
COISA 31 DESAFIO 2 – OTIMIZANDO A HOME DA HASHTAG 573
19 DESAFIO 2 – ALTERANDO O LAYOUT DA SEÇÃO HERO 519
32 DESAFIO 2 – DEPLOY – COLOCANDO A NOSSA PÁGINA NO AR 582
20 DESAFIO 2 – ALTERANDO O LAYOUT DA SEÇÃO CONTEÚDOS GRATUITOS 523
21 DESAFIO 2 – ALTERANDO O LAYOUT DA SEÇÃO DIFERENCIAIS 529 MÓDULO 6 FLOAT NO CSS
MÓDULO 9 PROJETO DE PÁGINA DE CAPTURA (SASS) MÓDULO 9 PROJETO DE PÁGINA DE CAPTURA (SASS)
FLEXBOX NO CSS
FLEXBOX NO CSS
FLEXBOX NO CSS
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Apresentação do Módulo (1/ 3) 9
Bem-vindo ao módulo de Flexbox no CSS, onde exploraremos técnicas essenciais para desenvolver interfaces web modernas e
responsivas. Neste módulo, abordaremos o uso de CSS Flexbox, uma poderosa ferramenta que permite criar layouts flexíveis e
eficientes com facilidade.
Layouts referem-se à organização e disposição dos elementos visuais em uma página, seja ela impressa ou digital. No contexto do
design web, o layout se refere à forma como os elementos como texto, imagens, vídeos, menus de navegação e outros componentes
são organizados e apresentados em uma página da web. A estrutura do layout determina como os usuários interagem com o conteúdo,
influencia a estética da página e afeta a usabilidade e a experiência do usuário.
Os layouts desempenham um papel crucial na criação de uma experiência de usuário eficaz e agradável. Eles ajudam a guiar a atenção
dos usuários, facilitam a navegação, e podem transmitir a identidade visual e a mensagem de uma marca ou organização. Existem
diversos tipos de layouts, e a escolha depende de fatores como o conteúdo a ser apresentado, o público-alvo, e os objetivos do site.
Alguns dos conceitos e técnicas mais comuns usados na criação de layouts para a web incluem:
• Grade (Grid): Uma estrutura de linhas horizontais e verticais que ajuda a alinhar e organizar os elementos de uma página. Um
sistema de grid pode ser fundamental para criar layouts consistentes e bem organizados.
• Responsividade: Refere-se à capacidade do layout de se ajustar a diferentes tamanhos de tela e dispositivos. Layouts responsivos
garantem que o conteúdo seja acessível e visualmente agradável em smartphones, tablets, laptops e desktops.
• Propriedades de CSS: Ferramentas como display: flex, display: grid, e outras propriedades de CSS ajudam a controlar a disposição
dos elementos. Por exemplo, o Flexbox e o Grid Layout são sistemas que permitem criar layouts complexos de maneira simplificada
• .
• Hierarquia Visual: A organização dos elementos de uma maneira que reflita sua importância, usando técnicas como tamanho, cor,
contraste e espaçamento. A hierarquia visual ajuda a guiar os olhos dos usuários através da página e destacar informações
importantes.
• Espaçamento e Margens: O uso de espaços vazios entre elementos para melhorar a legibilidade e a estética geral da página. O
espaçamento adequado pode fazer uma grande diferença na maneira como os usuários percebem e interagem com o conteúdo.
Durante este módulo, você aprenderá a utilizar as propriedades principais do Flexbox, como display: flex, justify-content, align-items,
flex-direction, entre outras. Também exploraremos como essas propriedades podem ser combinadas para criar layouts responsivos que
se adaptam a diferentes tamanhos de tela, garantindo uma experiência de usuário consistente e agradável.
Além disso, veremos exemplos práticos e desafios que ajudarão você a dominar o uso do Flexbox em projetos reais. Ao final do módulo,
você estará apto a criar layouts sofisticados e flexíveis, utilizando as melhores práticas do CSS para construir páginas web modernas e
funcionais.
O Flexbox, ou CSS Flexible Box Layout, é um layout modelo que facilita a distribuição de espaço e o alinhamento de itens em uma
interface de usuário. Ele é ideal para criar layouts responsivos e dinâmicos. O Flexbox é composto de dois principais elementos: o flex
contêiner e os flex items.
Flex contêiner
O flex contêiner é o elemento que define o contexto Flexbox. Para criar um flex contêiner, aplicamos a propriedade display: flex; a um
elemento. Este elemento, então, se torna um recipiente flexível para os itens que estão dentro dele, permitindo um controle avançado
sobre o alinhamento, direção, espaçamento e distribuição desses itens.
Neste exemplo, podemos transformar o <main> em um flex contêiner. Para isso, aplicaríamos a propriedade display: flex; ao <main>,
tornando seus filhos diretos (os <section>) em flex items.
O comportamento padrão do eixo principal é horizontal. Isso significa que, ao aplicar display: flex; ao contêiner, os elementos que
originalmente estavam dispostos em uma coluna (um em cima do outro) agora são organizados em uma linha (um ao lado do outro).
• Unidimensionalidade: Flexbox é ideal para layouts em uma única dimensão, seja horizontal (linha) ou vertical (coluna). Ele facilita a
organização de elementos em linha ou coluna, permitindo uma melhor gestão do espaço entre eles.
• Contêiner Flex: O elemento pai que contém os itens flex, definido com a propriedade display: flex.
• Itens Flex: Os elementos filhos dentro do contêiner flex, que são dispostos e alinhados de acordo com as propriedades definidas no
contêiner e nos próprios itens.
• Visão Geral dos Eixos: Alguns DevTools destacam o eixo principal e o eixo
transversal do flex contêiner. Isso ajuda a visualizar rapidamente em qual
direção os flex items estão sendo dispostos (horizontalmente ou
verticalmente) e como estão sendo alinhados.
Adicionaremos um background-color para cada uma das nossas seções, começando com a primeira section, e para as demais
vamos utilizar o seletor section:nth-child(2) é usado em CSS para estilizar o segundo elemento <section> que é um filho direto de
seu pai. Ele seleciona apenas o segundo <section> na ordem dos filhos, ignorando outros tipos de elementos que possam estar
entre eles. A contagem começa em 1, então nth-child(2) refere-se ao segundo filho na lista de filhos diretos.
Para estilizar outros filhos, você pode alterar o número dentro dos parênteses para corresponder à posição desejada. Por exemplo:
• section:nth-child(3) estiliza o terceiro <section>.
Propriedade gap:
A propriedade gap é utilizada no CSS Flexbox para definir o espaçamento entre os itens flexíveis dentro de um contêiner. Ela
facilita a criação de layouts com espaçamento consistente entre os itens, sem a necessidade de adicionar margens individuais aos
itens.
• Espaçamento Uniforme: O gap cria um espaçamento uniforme entre todos os itens flexíveis. Não afeta o espaço interno dos
itens, apenas o espaço entre eles.
• Distribuição de Espaço: O gap não afeta o tamanho dos itens, mas aumenta o espaço entre eles. Se você tiver um espaço
definido de 10 pixels, haverá uma área de 10 pixels
Usar gap é mais simples e limpo do que ajustar margens individuais para criar espaçamento entre itens, especialmente quando se
tem vários itens e um layout complexo.
Propriedade column-gap:
Uso com gap: As propriedades column-gap e row-gap são frequentemente usadas em conjunto com a propriedade gap. A
propriedade gap pode ser usada para definir ambos os espaçamentos ao mesmo tempo, mas se você quiser definir espaçamentos
diferentes para colunas e linhas, você pode usar column-gap e row-gap.
Resultado: Os itens são dispostos em uma linha horizontal. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Mudar a direção do Flexbox (2/5) 24
Propriedade flex-direction: column
• Descrição: Os itens flexíveis são mantidos em uma única linha ou coluna, e o contêiner flexível não permite quebra.
• Uso Comum: Ideal quando você deseja que todos os itens permaneçam em uma linha ou coluna, mesmo que isso signifique
que o contêiner precise de rolagem para acomodá-los.
Resultado: Os itens são dispostos horizontalmente e, quando não há mais espaço horizontal, eles quebram para a linha seguinte
horizontalmente. A disposição ainda é horizontal, mas os itens se movem para a linha seguinte quando o espaço é insuficiente.
A propriedade flex-basis é uma parte fundamental do Flexbox e define a base do tamanho dos itens flexíveis antes que o espaço
restante seja distribuído. Em outras palavras, ela especifica o tamanho inicial de um item flexível antes que a propriedade flex-
grow e flex-shrink entrem em ação.
A propriedade flex-grow é usada no Flexbox para controlar como um item flexível deve crescer em relação aos outros itens dentro do
mesmo contêiner flexível quando há espaço extra disponível. Ela define a proporção do espaço extra que um item flexível deve
ocupar em comparação com os outros itens flexíveis.
• Espaço Extra: Quando o espaço disponível dentro do contêiner flexível é maior do que a soma dos tamanhos iniciais dos itens
(definidos por flex-basis), o espaço extra é distribuído entre os itens flexíveis de acordo com os valores de flex-grow.
• Proporcionalidade: O valor de flex-grow é um número que representa a proporção de espaço extra que o item deve ocupar. Se
todos os itens tiverem o mesmo valor de flex-grow, eles crescerão igualmente. Se alguns itens tiverem valores maiores, eles
ocuparão mais espaço extra.
<número>: Um valor numérico que representa a proporção do espaço extra que o item deve ocupar. O valor padrão é 0, que significa
que o item não crescerá além do tamanho inicial definido por flex-basis.
Resultado: O item mantém seu tamanho inicial e não ocupará espaço extra no contêiner.
Resultado: O item crescerá para preencher o espaço extra, e a quantidade de crescimento será proporcional ao valor de flex-grow em
relação aos outros itens.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Tamanho dos elementos (4/11) 31
O que é flex-grow?
Imagine que você está organizando uma prateleira e tem três caixas. A prateleira é a largura do contêiner, e as caixas são os itens
flexíveis dentro desse contêiner. Agora, imagine que a prateleira é bem mais larga do que o total da largura das três caixas juntas. O
que você faz com o espaço extra? É aqui que entra o flex-grow.
O Problema
Quando você usa Flexbox para organizar itens em um contêiner, pode haver situações em que há espaço extra sobrando no
contêiner. Esse espaço extra precisa ser distribuído de alguma forma entre os itens dentro do contêiner.
• Valor de flex-grow: Esse valor é um número. O valor padrão é 0, o que significa que o item não vai crescer para ocupar o espaço
extra. Qualquer valor maior que 0 fará o item crescer para preencher o espaço disponível.
Situação Inicial:
Você tem um contêiner (prateleira) com 600 pixels de largura e três itens (caixas) dentro dele. Cada item tem 100 pixels de largura. No
total, os itens ocupam 300 pixels, então há 300 pixels de espaço extra.
• Resultado: Todos os itens vão crescer igualmente para ocupar o espaço extra. Cada item agora terá 200 pixels de largura, porque o
espaço extra de 300 pixels será dividido igualmente entre os três itens.
• Resultado: O espaço extra será dividido em 4 partes (1 + 2 + 1 = 4). O primeiro e o terceiro itens crescerão para ocupar 1/4 do espaço
extra cada um, e o segundo item crescerá para ocupar 2/4 (ou metade) do espaço extra.
• Inicialmente:
• contêiner: 600px
• Itens: 100px cada, totalizando 300px
• Espaço extra: 300px
• Com flex-grow: 1:
• contêiner: 600px
• Itens: 200px cada (100px base + 100px de crescimento)
• Espaço extra distribuído igualmente
Então, voltando ao cenário anterior, vamos usar a propriedade flex-basis em nossas seções para definir um tamanho fixo. Assim, será
possível utilizar a propriedade flex-grow de forma eficaz.
Conceito de flex-shrink
A propriedade flex-shrink especifica o fator de redução de um item flex
quando o contêiner flex tem menos espaço do que o necessário para todos
os itens. Em outras palavras, ela determina quanto o item deve encolher em
relação aos outros itens no contêiner quando há um overflow.
Como Funciona
• Fator de Encolhimento: O valor de flex-shrink é relativo. Se todos os itens
tiverem um valor de flex-shrink igual a 1, todos encolherão igualmente
quando o contêiner não tiver espaço suficiente. Se um item tiver um valor
de 2 e outro tiver um valor de 1, o item com flex-shrink: 2 encolherá duas
vezes mais do que o item com flex-shrink: 1.
• Comportamento Padrão: O valor padrão de flex-shrink é 1, o que significa
que os itens encolherão igualmente se o espaço no contêiner for
insuficiente.
• Zero e Valores Negativos: Um valor de flex-shrink de 0 impede que o
item encolha. Valores negativos não são válidos.
• Interação com Outras Propriedades Flex: A propriedade flex-shrink
funciona em conjunto com flex-grow e flex-basis para definir o
comportamento de dimensionamento dos itens flex. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Tamanho dos elementos (10/11) 37
A propriedade flex é uma propriedade abreviada no CSS que combina três propriedades flex individuais: flex-grow, flex-shrink, e flex-
basis. Esta propriedade é usada para definir como um item flexível (flex item) se comporta dentro de um contêiner flexível (flex
contêiner), permitindo ajustar o crescimento, encolhimento e tamanho base do item.
Sintaxe
A propriedade flex pode ser escrita de várias maneiras, dependendo das necessidades específicas do layout. Aqui está a sintaxe
básica:
• flex-grow: Um número que define a capacidade do item de crescer se houver espaço disponível. O valor padrão é 0.
• flex-shrink: Um número que define a capacidade do item de encolher se houver falta de espaço. O valor padrão é 1.
• flex-basis: O tamanho inicial do item antes de quaisquer ajustes de crescimento ou encolhimento. Pode ser um comprimento
específico (como px, em, etc.) ou auto. O valor padrão é auto.
• Sintaxe Mais Concisa: A propriedade flex permite definir três valores (crescimento,
encolhimento e base) em uma única linha, reduzindo a quantidade de código necessária.
• Configuração Rápida: Usar flex é mais rápido e intuitivo quando você quer configurar o
comportamento flexível de um item de forma consistente.
• Código Mais Limpo: Propriedades abreviadas podem tornar o código mais limpo e fácil de
ler, especialmente quando você tem muitos itens flexíveis no contêiner.
• Redução de Redundância: Simplifica a leitura e manutenção do CSS, evitando a
redundância de propriedades.
• Facilidade de Manutenção: Alterações futuras no comportamento flexível de um item são
mais fáceis de implementar e verificar quando se utiliza uma única propriedade abreviada.
• Consistência: Garante que todas as propriedades relacionadas ao comportamento flexível
sejam atualizadas de forma consistente, evitando inconsistências no layout.
• Convenção e Padronização: Usar propriedades abreviadas é uma prática comum e
recomendada na comunidade de desenvolvimento web, promovendo um estilo de código
mais padronizado.
• Boas Práticas: Facilita a adoção de boas práticas de CSS, onde a simplicidade e a clareza
são valorizadas.
No Flexbox, o alinhamento de elementos é um dos aspectos mais poderosos e flexíveis do modelo. Ele permite que você controle como
os itens dentro de um contêiner flexível são distribuídos e posicionados ao longo de dois eixos principais: o eixo principal (main axis) e o
eixo transversal (cross axis). O alinhamento no Flexbox abrange tanto a distribuição do espaço entre os itens quanto o posicionamento
dos itens em relação ao contêiner e uns aos outros.
Eixos do Flexbox
Alinhamento Individual: A propriedade align-self permite que você sobrescreva o alinhamento transversal de um único item
dentro do contêiner.
Conceito Geral
O alinhamento no Flexbox é altamente flexível, permitindo não apenas o posicionamento básico dos itens, mas também a criação
de layouts complexos e responsivos. Com as propriedades de alinhamento, você pode centralizar itens, espaçá-los
uniformemente, alinhá-los em grupos, ou ajustá-los dinamicamente com base no espaço disponível, tudo dentro de um único
contêiner flexível.
Essa capacidade de controlar o alinhamento de itens tanto ao longo do eixo principal quanto do eixo transversal é uma das razões
pelas quais o Flexbox é tão popular para criar layouts web modernos, oferecendo aos desenvolvedores uma maneira poderosa de
construir interfaces adaptáveis e bem organizadas. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Alinhamento e Posicionamento dos elementos (3/16) 41
A propriedade justify-content no Flexbox é usada para alinhar e distribuir os itens flexíveis ao longo do eixo principal do contêiner
flexível. O eixo principal pode ser horizontal ou vertical, dependendo da configuração da propriedade flex-direction. A função principal
de justify-content é controlar como o espaço disponível entre os itens flexíveis é distribuído, seja em uma única linha ou em múltiplas
linhas dentro do contêiner.
center:
• Centraliza os itens ao longo do eixo principal.
• O espaço extra é distribuído uniformemente em ambos os lados dos itens.
flex-end:
• Alinha os itens no final do eixo principal.
• No caso de um eixo horizontal, os itens serão alinhados à direita.
• Não há espaço extra distribuído entre os itens.
space-around:
• Distribui os itens com espaço igual ao redor de cada item.
• O espaço ao início e ao final do contêiner será metade do espaço entre os itens, pois o espaço é aplicado antes e depois de cada item.
• Centralizar Conteúdo: Use justify-content: center para centralizar itens ao longo do eixo principal.
• Distribuir Espaço: Use justify-content: space-between ou space-around quando precisar distribuir espaço de forma igualitária entre
os itens.
• Alinhar à Direita ou à Esquerda: Use justify-content: flex-start ou flex-end para alinhar os itens em uma extremidade específica do
contêiner.
Conceito de align-items
• Eixo Transversal: O alinhamento feito por align-items ocorre ao longo do eixo transversal. Por exemplo, se o eixo principal for
horizontal (flex-direction: row), o eixo transversal será vertical, e align-items controlará o alinhamento vertical dos itens.
• Impacto nos Itens: A propriedade afeta todos os itens dentro do contêiner flexível, determinando como eles são distribuídos em
relação ao eixo transversal.
Valores de align-items
center:
• Centraliza os itens ao longo do eixo transversal.
• Isso posiciona os itens no meio do contêiner, verticalmente se o eixo transversal for vertical.
flex-end:
• Alinha os itens ao final do eixo transversal.
• Se o eixo transversal for vertical, os itens serão alinhados à base do contêiner.
baseline:
• Alinha os itens ao longo de suas linhas de base de texto.
• Útil quando você deseja alinhar itens com diferentes alturas baseados na linha de base do texto dentro dos itens.
• Alinhar Verticalmente em um Contêiner Horizontal: Se você tiver um contêiner com itens dispostos em uma linha (flex-direction:
row), align-items ajuda a controlar o alinhamento vertical dos itens.
• Alinhar Horizontalmente em um Contêiner Vertical: Se o contêiner tiver itens dispostos em uma coluna (flex-direction: column),
align-items controlará o alinhamento horizontal.
• Uniformizar a Altura dos Itens: Usar align-items: stretch é útil quando você deseja que todos os itens preencham o contêiner
uniformemente.
Com o Flexbox, a ordem visual dos itens pode ser controlada diretamente através de CSS, sem necessidade de alterar o HTML.
Isso é especialmente útil em layouts responsivos, onde a ordem dos elementos pode precisar ser ajustada em diferentes
tamanhos de tela ou dispositivos.
Simplicidade no Código:
• Ao usar Flexbox para alterar a ordem dos itens, você evita a complexidade de soluções anteriores, tornando o código CSS mais
limpo e fácil de manter.
Como Funciona
A mudança na ordem dos elementos no Flexbox é feita utilizando a propriedade order, que permite especificar a posição de
um item em relação aos outros. Cada item em um contêiner flexível tem uma ordem padrão de 0, e você pode atribuir
valores positivos ou negativos para alterar a posição de um item específico.
Para aplicarmos a propriedade order, vamos fazer as seguintes alterações em nosso arquivo na estrutura de html e css:
Cada item em um contêiner flexível tem uma ordem padrão de 0. A propriedade order aceita valores inteiros, tanto positivos
quanto negativos, que determinam a posição do item em relação aos outros itens dentro do contêiner.
• Itens com valores menores de order aparecem antes. Se um item tiver um valor de order menor que os outros, ele será
exibido primeiro.
• Itens com valores maiores de order aparecem depois. Se um item tiver um valor de order maior que os outros, ele será
exibido por último.
• Itens com o mesmo valor de order mantêm a ordem original. Se vários itens têm o mesmo valor de order, eles aparecerão na
ordem em que estão no HTML.
• Valores Negativos: Colocam o item antes dos itens que têm valores order de 0 ou
superiores.
• Valor Zero (0): Este é o valor padrão, e os itens com order: 0 aparecem na ordem
em que estão no HTML.
• Valores Positivos: Colocam o item depois dos itens que têm valores order
menores.
• Destacar Elementos Específicos: Pode ser usada para mover itens importantes ou
destacados para a frente ou para a parte superior da interface, sem alterar a
estrutura subjacente.
A propriedade align-self permite que você sobrescreva o alinhamento definido por align-items para um item específico dentro
do contêiner. Isso significa que, enquanto align-items define um alinhamento padrão para todos os itens, align-self pode ser
usado em um item filho individual para ajustá-lo de forma diferente dos outros.
• Alinhamento Diferenciado: Quando um item específico precisa de um alinhamento diferente dos demais.
• Layout Personalizado: Em layouts complexos, onde certos itens precisam de posicionamento especial, align-self permite essa
personalização sem precisar criar regras CSS adicionais ou contêineres separados.
• Melhor Controle Visual: Dá ao desenvolvedor mais controle sobre o layout final, permitindo ajustes finos no posicionamento
de itens individuais.
• Estrutura de Layout: Usaremos o Flexbox para alinhar e distribuir os elementos dentro das seções de forma mais controlada.
Por exemplo, podemos alinhar o texto ao lado da imagem da Smart TV ou centralizar o conteúdo para que ele fique bem
posicionado independentemente do tamanho da tela.
• Alinhamento de Itens: Com o Flexbox, podemos garantir que os itens dentro de cada seção sejam alinhados de maneira
consistente. Isso inclui centralizar botões, ajustar listas, e organizar as seções de "Características" e "Condições" para que fiquem
mais uniformes.
• Responsividade: Flexbox facilita a criação de layouts que se adaptam dinamicamente ao tamanho da tela. Isso significa que
seu anúncio ficará visualmente atraente em dispositivos móveis, tablets e desktops, sem a necessidade de grandes ajustes.
• Melhorias Estéticas: Além da organização, o Flexbox também nos permitirá implementar pequenos ajustes estéticos, como
espaçamento entre elementos, que podem fazer uma grande diferença na aparência geral do site.
FLEXBOX
css
HTML css
• A <div class="contêiner-preco"> agrupa todos os • display: flex;Transforma o elemento com a classe .contêiner-preco
elementos relacionados ao preço, como o título "Preço" e em um contêiner flexível. Isso significa que os elementos filhos
as informações sobre o valor e o desconto. Isso torna o (nesse caso, o <h2> e a <div> que contém os parágrafos) serão
código mais legível e facilita a manutenção, pois os organizados de acordo com as regras do Flexbox.
elementos relacionados estão encapsulados em um
único contêiner. • flex-flow: column;Define a direção do layout dos itens dentro do
contêiner flexível como uma coluna.
• Ao envolver os parágrafos com uma <div>, você pode
aplicar estilos específicos a esse grupo de elementos. Por • gap: 2rem;Adiciona um espaçamento de 2 rem (que é uma unidade
exemplo, se quiser espaçar ou alinhar os dois parágrafos de medida relativa ao tamanho da fonte raiz) entre os elementos
de forma específica, pode fazê-lo aplicando estilos filhos dentro do contêiner flexível. Isso significa que haverá um
diretamente à <div> que os contém. espaço de 2 rem entre o <h2> e a <div> contendo as informações de
preço e desconto.
• O contêiner .contêiner-preco está organizando seus elementos filhos (o título "Preço" e a seção com os parágrafos) em uma coluna,
garantindo que eles fiquem dispostos um embaixo do outro.
• Um espaçamento de 2 rem é adicionado entre esses elementos, o que cria um layout mais arejado e visualmente equilibrado,
evitando que os elementos fiquem muito próximos uns dos outros.
Conseguimos criar a mesma estrutura para a div de condições e utilizar essa mesma estrutura de css para criar o layout:
Agora que criamos o layout das estruturas individualmente, vamos englobar as estruturas em um único contêiner, que será um
elemento div com classe contêiner-precocondicoes e também vamos adicionar as propriedades flexbox nessa estrutura:
• O contêiner .contêiner-precocondicoes organiza seus itens filhos (como seções ou elementos dentro desse contêiner) em uma
coluna, alinhando-os verticalmente um abaixo do outro.
• Os itens são centralizados horizontalmente dentro do contêiner, de forma que todos os elementos ficam alinhados ao centro do
contêiner, independentemente de seu tamanho.
• Um espaçamento de 3.12 rem é adicionado entre os itens, garantindo que haja uma separação consistente e esteticamente
agradável entre os elementos.
Vamos encapsular com um novo elemento div as estruturas de figure, nossas divs de preço e condição e nossa âncora, para criar o
layout que deixará os elementos dispostos horizontalmente.
Fechamento do contêiner-figure
O Desafio
Nosso próximo desafio será reestruturar a HOME, aplicando o Flexbox para otimizar a organização e responsividade dos elementos. A
transição para o Flexbox nos permitirá:
• Melhorar a Flexibilidade do Layout: O Flexbox oferece uma maneira mais intuitiva e poderosa de organizar e alinhar os elementos
na página, especialmente para criar layouts que se adaptam perfeitamente a diferentes tamanhos de tela.
• Aumentar a Responsividade: Com o Flexbox, podemos garantir que o conteúdo da HOME se adapte de forma dinâmica a
dispositivos móveis, tablets e desktops, sem comprometer a experiência do usuário.
• Simplificar o CSS: Flexbox nos permite reduzir a complexidade do código, eliminando a necessidade de técnicas antigas e
combinações complicadas de float, inline-block, e posicionamento absoluto.
• Centralizar e Alinhar Elementos Facilmente: Flexbox facilita o alinhamento e centralização dos elementos tanto no eixo principal
quanto no eixo transversal, proporcionando um controle refinado sobre o layout.
Objetivo
Nosso objetivo é revisar e atualizar a estrutura da HOME, aplicando Flexbox para melhorar a organização visual e funcionalidade do
site. Com essa mudança, queremos não apenas garantir que o layout seja mais moderno e eficiente, mas também que ele ofereça
uma melhor experiência ao usuário final.
Vamos iniciar com as alterações para flexbox com a O próximo passo é transformar o nosso header em um flex
nossa seção de cabeçalho. A primeira alteração que contêiner. E na nossa divisão ele terá um item do contêiner o nosso
precisamos fazer é retirar o estilo aplicado no elemento <img> e o segundo será o elemento nav.
elemento nav, para que nossa lista de itens aparece
em nosso header.
Vamos deixar agora os elementos alinhados ao centro, lembrando sempre de verificar em qual eixo vamos mexer para atingir o
layout desejado, nesse caso será o cross axis.
Agora vamos retornar na estrutura dos elementos que possue a classe .contem-filho e vamos utilizar o seguinte layout:
H
O
V
E
R
O próximo passo é organizarmos os logos dos cursos de treinamento e programação, para isso vamos adicionar uma classe
na div que está englobando essas estruturas.
Agora vamos transformar esses elementos div em um contêiner flex e adicionar um gap para separar os logos.
Vamos modificar os <li> que estão presentes dentro da div que possui a classe gratuito-link-lista, vamos transformá-los em
um display flex e adicionar algumas outras propriedades para alinhar os itens.
• position: relative; Define o posicionamento do elemento como relativo em relação à sua posição original. Isso significa
que ele pode ser movido a partir de onde normalmente estaria no fluxo do documento, sem alterar o layout dos outros
elementos ao redor.
• left: 2rem; Desloca o elemento 2 rem (uma unidade de medida relativa ao tamanho da fonte) para a direita a partir da sua
posição original. Como o elemento está com position: relative, ele permanece no fluxo do documento, mas se move 2 rem
para a direita.
• z-index: 1; Controla a sobreposição do elemento em relação a outros elementos na página. Um z-index maior faz com que
o elemento apareça na frente de elementos com um z-index menor. Como o valor é 1, este elemento estará na frente de
elementos com z-index: 0 ou sem z-index definido.
Essas propriedades juntas permitem mover o elemento ligeiramente para a direita, mantê-lo no fluxo de layout, e
garantir que ele se sobreponha a outros elementos se necessário. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Desafio 2 – Flexbox na Seção Diferencias (1/12) 85
Antes de começar o layout flexbox na seção Diferenciais, vamos realizar um pequeno ajuste na nossa seção Hero, e utilizar
uma propriedade letter-spacing.
A propriedade CSS letter-spacing controla o espaçamento entre as letras de um texto. Ela permite ajustar a distância entre
os caracteres em um elemento, proporcionando mais ou menos espaço entre cada letra.
Como Funciona:
• Valores Positivos: Um valor positivo de letter-spacing aumenta o espaço entre as letras, espalhando-as mais no texto.
• Valores Negativos: Um valor negativo reduz o espaço entre as letras, aproximando-as mais umas das outras.
• Unidades: Você pode especificar o valor em várias unidades CSS, como px (pixels), em (relativo ao tamanho da fonte), ou %
(porcentagem).
Usos Comuns:
• Melhoria da Legibilidade: Aumentar o letter-spacing pode tornar o texto mais legível, especialmente em títulos ou letras
maiúsculas.
• Estética: Ajustar o espaçamento entre letras pode ser usado para fins estéticos, criando um design mais refinado ou
distinto.
• Correção de Renderização: Às vezes, fontes personalizadas podem ter espaçamento inadequado entre caracteres, e
letter-spacing ajuda a corrigir isso.
Podemos utilizar também a propriedade text-align ao invés do letter-spacing, ou junto com essa propriedade.
Então primeiro vamos transformar a <div> que está encapsulando todos esses elementos em um flex contêiner e depois
utilizar algumas propriedades do flexbox para organizar o layout.
A próxima classe que vamos modificar é o elemento que está englobando a imagem, o título e o bloco de parágrafos que criamos
anteriormente.
Essa declaração de padding aplica espaçamento interno ao redor do conteúdo de um elemento em quatro direções: superior, direita,
inferior e esquerda.
Com esses ajustes, já podemos voltar para o nosso layout flexbox. Vamos atribuir mais algumas propriedades para os elementos
dessa seção:
Vamos aninhar todas as imagens de empresas dentro de uma única div e adicionar a classe bloco-imagens-diferenciais.
Agora vamos alterar a propriedade width que aplicamos com o valor de 33% para que as estruturas ficassem com o mesmo espaço
por uma do flexbox. Então vamos adicionar uma classe a div que engloba esses elementos.
Agora vamos precisar fazer alguns ajustes diferentes para criar o layout de linhas e colunas dos nossos cards, o ideal para essa parte
seria utilizarmos um conceito chamado grid, porém esse será uma assunto para outro módulo, e nesse vamos tentar aplicar as
propriedades do flexbox para conseguir o layout desejado.
A propriedade flex é uma abreviação que combina três propriedades do Flexbox: flex-grow, flex-shrink, e flex-basis. Quando você
escreve flex: 1 1 50%;, está definindo como um item flexível deve crescer, encolher e qual tamanho base ele deve ocupar dentro de um
contêiner flexível.
• flex-grow: 1; Indica que o item pode crescer para preencher o espaço disponível no contêiner. O valor 1 significa que o item vai
crescer de forma proporcional em relação aos outros itens que também tenham um valor de flex-grow definido. Se todos os itens
tiverem flex-grow: 1, eles dividirão igualmente o espaço extra.
• flex-shrink: 1; Indica que o item pode encolher se necessário, para se ajustar ao espaço disponível no contêiner. O valor 1 significa
que o item vai encolher proporcionalmente aos outros itens que também têm flex-shrink definido.
• flex-basis: 50%; Define o tamanho inicial ou base do item antes de ele ser ajustado pelo flex-grow ou flex-shrink. Aqui, o item é
definido para ocupar 50% do espaço disponível no contêiner, antes de aplicar o crescimento ou encolhimento.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 1 – Desafio 2 – Flexbox na Seção na Blog da Hashtag (4/5) 104
Ao adicionarmos um espaço entre os cards utilizando a propriedade gap, vamos verificar que ocorre um erro novamente de
layout, então vamos precisar ajustar a porcentagem da propriedade flex.
As últimas duas modificações que vamos realizar são no nosso título e no padding do nosso contêiner.
Agora repare que no segundo elemento li, temos vários elementos dentro dela, então quando adicionamos o gap ele afasta os
elementos, para corrigir vamos encapsular esses elementos dentro de um div.
Agora vamos adicionar uma nova classe ao elemento [Link]êiner, para distanciar a "caixa azul" título com da estrutura abaixo
dela.
Com a nova classe adicionada, podemos tirar um elemento div que está encapsulando toda essa seção, porque se torna
desnecessária. Vamos utilizar a contêiner-comoajudar-2 para alinhar o layout da "seção cinza". E como boas práticas, vamos deixar
as propriedades utilizadas em ambas as estruturas de contêiner e o que for diferente, vamos criar o estilo separado.
Agora vamos modificar os elementos div que possuem os inputs armazanados, mas para utilizarmos o estilo criado, vamos
adicionar mais uma classe ao nosso formulário chamada "form".
Para finalizar essa seção vamos adicionar uma nova classe ao contêiner global dela, para criarmos o espaçamento entre o título e
o formulário.
E vamos aproveitar para reutilizar algumas estruturas da classe form para a nossa seção de rodapé, especificamente no nosso
formulário news letter.
Agora precisamos adicionar mais um contêiner com o elemento div para unir os elementos do Cursos Online, vamos adicionar
uma classe chamada subsecao-cursosonline.
Agora só falta adicionarmos mais um encapsulamento com o elemento div nas estruturas de email e telefone.
Vamos utilizar a classe subsecao-rodape nas demais estruturas do nosso rodapé que são: Endereço, Redes sociais, Proteção de
Dados e Links Úteis.
Precisamos mexer na estrutura das Redes Sociais, e para isso vamos adicionar uma div que encapsule todas as redes e adicionar
uma classe chamada rodape-redessociais.
Aqui está uma explicação das propriedades fill, stroke, e currentColor, que são comumente usadas em SVGs (Scalable Vector
Graphics) e elementos gráficos em CSS:
• fill: Define a cor interna de um elemento gráfico, como a cor de preenchimento de uma forma (por exemplo, um círculo ou um
retângulo) em um SVG.
• stroke: Define a cor e a aparência da borda (contorno) de um elemento gráfico. Também pode ser usada em conjunto com
outras propriedades, como stroke-width para definir a largura do contorno.
• currentColor: É uma palavra-chave CSS que define a cor de um elemento baseado no valor da propriedade color do mesmo
elemento. Usar currentColor para fill ou stroke faz com que essas propriedades adotem a cor definida na propriedade color,
garantindo consistência visual.
Agora vamos o contêiner inteiro que engloba os elementos de classe subsecao-rodape, e adicionar dentro do elemento as classes
rodape-coluna e rodape-coluna-info.
Agora que criamos os layout individuais de cada estrutura da nossa seção, vamos estruturar o contêiner principal que engloba
todas as estruturas. É o elemento div que possui a classe container, porém vamos adicionar mais uma classe chamada container-
rodape e será nela que vamos aplicar as propriedades flexbox.
O último passo para nossa seção é atribuir um valor de largura maior para o nosso contêiner rodapé.
Módulo 2
• Paginação: Um componente essencial para dividir grandes quantidades de conteúdo em páginas menores, proporcionando
uma navegação mais fluida e organizada.
• Acordeão: Um elemento interativo que permite ocultar e revelar informações, ideal para FAQs e seções com conteúdo
extensivo.
• Popup: Uma janela sobreposta que aparece para destacar informações importantes, captar a atenção do usuário ou coletar
dados.
• Carrossel: Um componente visual dinâmico que exibe conteúdo de forma rotativa, perfeito para galerias de imagens ou
destaques.
Essas definições são apenas uma prévia do que você aprenderá. Em cada aula, vamos mergulhar mais fundo em cada um desses
componentes, explicando em detalhes como criá-los e aplicá-los de forma eficiente. Prepare-se para transformar seu HTML com
componentes que fazem a diferença!
Neste desafio, vamos criar uma paginação com dois botões principais, "Anterior" e "Próximo". Esses botões permitirão a
navegação entre as diferentes páginas. Ao passar o mouse sobre eles, você verá uma mudança no estilo, indicando que são
interativos.
Entre esses botões, teremos seis elementos numerados que representam as páginas. No entanto, para evitar uma lista muito
longa de números, utilizaremos uma representação visual comum: uma série de números iniciais, seguida por reticências (...), e,
por fim, o número da última página. Isso cria uma visualização simplificada, como 1 2 3 4 ... 25.
Além disso, toda vez que você passar o mouse sobre qualquer um desses números ou reticências, eles se transformarão em links
clicáveis, e seu estilo também mudará, mostrando que eles estão prontos para serem selecionados.
Prepare-se para criar uma experiência de navegação dinâmica e intuitiva, onde o usuário pode facilmente explorar o conteúdo de
maneira organizada e eficiente!
O recurso de CSS Nesting está sendo utilizado para aninhar a regra de estilo para os links (<a>) dentro de um contêiner com a classe
.paginacao. Esse recurso permite que você estilize os elementos filhos (a) diretamente dentro do contexto do seu elemento pai
(.paginacao), sem precisar repetir o seletor do pai para cada estilo específico.
• .paginacao { ... }: Este é o seletor principal, que se refere a um elemento com a classe .paginacao. Todo o conteúdo dentro dessas
chaves {} se aplica aos elementos que têm essa classe.
• & a { ... }: O & (ampersand) é um operador especial no CSS Nesting. Ele representa o seletor pai, que neste caso é .paginacao.
Quando você escreve & a, está dizendo "selecionar todos os elementos <a> que são filhos de um elemento com a classe .paginacao".
O & é substituído automaticamente pelo seletor do elemento pai durante o processamento, resultando em .paginacao a.
• color: red;: Esta regra de estilo aplica a cor vermelha ao texto de todos os links (<a>) que estão dentro do elemento com a classe
.paginacao.
O código criado anteriormente é equivalente ao seguinte código CSS, sem o uso de nesting:
• Clareza e Organização: O uso de nesting agrupa os estilos relacionados a um determinado elemento em um único bloco, tornando
o CSS mais organizado e mais fácil de manter.
• Menos Repetição: Você evita a repetição desnecessária do seletor .paginacao para cada estilo que deseja aplicar a elementos filhos,
simplificando o código.
Quando Usar:
Nesting é particularmente útil em projetos grandes, onde você tem múltiplos níveis de aninhamento de elementos, e quer manter o
CSS mais legível e estruturado de acordo com a hierarquia do HTML.
1. & a:
• Significado: Seleciona todos os <a> que são filhos diretos ou descendentes de um elemento com a classe do pai.
2. &a:
• Significado: Seleciona um elemento <a> que possui a classe exata correspondente ao seletor pai concatenado ao nome do
elemento.
• Explicação: Nesse caso, &a se torna .btna. Não é comum na prática, pois normalmente usamos o & seguido de um espaço para
designar um elemento filho ou descendente.
• Explicação: Aqui, a & se torna a .tooltip, significando que o estilo se aplica ao elemento .tooltip que é precedido por um <a>. Este é
um uso avançado para casos onde o seletor pai aparece depois do seletor filho na hierarquia CSS.
• Com &:
• Referencia diretamente o seletor pai dentro do bloco aninhado.
• Permite criar seletores mais específicos e combinados, como no caso de pseudo-classes ou quando se trabalha com elementos
descendentes específicos.
• Sem &:
• Não há referência ao seletor pai, então o seletor se aplica de forma independente.
• Usar o seletor diretamente fora do contexto de nesting.
O Que é um Acordeão?
Um acordeão é um componente de interface que permite esconder ou revelar conteúdo de forma interativa. Ele é especialmente útil
em páginas que precisam exibir grandes quantidades de informação de maneira organizada e acessível, sem sobrecarregar o usuário
com muitos dados de uma só vez.
Objetivos do Desafio:
• Criar um Acordeão Funcional: Utilizar HTML e CSS para construir um acordeão que permita ao usuário expandir e contrair seções de
conteúdo.
• Estética e Usabilidade: Garantir que o acordeão seja visualmente atraente e fácil de usar, com transições suaves e uma estrutura
intuitiva.
A estrutura do desafio possui o contêiner principal, que será nosso elemento com classe acordeao, também temos os itens de cada
acordeão que é composto por um cabeçalho e um conteúdo.
Neste desafio, vamos mergulhar no mundo dos popups, um recurso amplamente utilizado em websites para chamar a atenção dos
usuários, exibir mensagens importantes, ou oferecer funcionalidades adicionais sem redirecionar para outra página.
O Que é um Popup?
Um popup é uma pequena janela ou caixa que aparece sobre o conteúdo principal da página, geralmente em resposta a uma ação
do usuário, como clicar em um botão ou após um determinado tempo de navegação. Ele é ideal para destacar informações, solicitar
interações rápidas, ou fornecer notificações de forma não invasiva.
Objetivos do Desafio:
• Criar um Popup Funcional: Desenvolver um popup que possa ser facilmente ativado e fechado, usando apenas HTML e CSS.
• Design Atraente: Garantir que o popup seja visualmente atraente, com estilo que se integra perfeitamente ao layout da página.
Essa classe .popup estiliza um elemento que será exibido como um popup
centralizado na tela. Vamos entender cada propriedade brevemente:
• :link: Aplica estilos aos links que não foram visitados pelo
usuário. Isso é útil para garantir que todos os links tenham
uma aparência padrão ou específica antes de serem clicados
pela primeira vez.
O Que é um Carrossel?
Um carrossel é uma série de imagens ou conteúdos apresentados em sequência, normalmente dispostos horizontalmente, que
permite aos usuários navegar por eles de maneira intuitiva. Embora comumente associado a transições automáticas e controles
interativos, neste desafio, focaremos apenas na construção do layout do carrossel utilizando HTML e CSS.
Objetivos do Desafio:
• Criar a Estrutura do Carrossel: Desenvolver um layout de carrossel que organize os elementos de forma clara e visualmente
agradável.
• Estilização Eficiente: Aplicar CSS para estilizar o carrossel, criando um visual coeso e integrado ao design geral da página.
E vamos adicionar 3 das imagens dentro do nosso arquivo html, cada uma encapsulada por um elemento div de classe chamada
imagem.
4. Responsividade:
• Dimensionamento Dinâmico: Um container pode ser dimensionado dinamicamente com width, height, ou usando unidades
relativas como % ou vw/vh, o que facilita a criação de layouts responsivos. A imagem dentro pode se adaptar ao tamanho do
container usando max-width, height: auto, ou outras propriedades de CSS.
• overflow: hidden; Oculta o conteúdo: O conteúdo que ultrapassa os limites do contêiner é cortado, e a parte excedente não é
visível.
• Uso: Ideal quando você deseja garantir que o conteúdo não "vaze" do contêiner, mantendo o layout limpo e organizado. Também é
útil para criar efeitos visuais, como barras de rolagem personalizadas ou para esconder partes de uma imagem ou de um texto.
• overflow: scroll; Sempre adiciona barras de rolagem: Adiciona barras de rolagem ao contêiner, mesmo que todo o conteúdo
caiba dentro dele. Isso força a exibição das barras de rolagem.
• Uso: Pode ser útil em interfaces onde você deseja que o usuário saiba que pode rolar o conteúdo, independentemente de haver ou
não transbordo.
• overflow: auto; Adiciona barras de rolagem apenas quando necessário: Adiciona barras de rolagem apenas se o conteúdo
ultrapassar os limites do contêiner.
• Uso: É o valor mais comum para gerenciar conteúdo em caixas ou contêineres onde você só deseja que as barras de rolagem
apareçam quando realmente houver algo para rolar.
Melhoria da Acessibilidade
• Descrição: Pode ser usado para adicionar conteúdo
visualmente necessário sem interferir no HTML que pode ser
lido por leitores de tela.
Lembrando do Desafio do Popup desse módulo, sabemos que a estrutura dele não precisa estar dentro de nenhum elemento
semântico como header, main ou footer. Podemos adicionar um contêiner que será o elemento div no final de toda nossa
estrutura de HTML. Vamos reutilizar a estrutura do desafio popup, e modificar as estruturas e layout que for necessário.
Módulo 3
GRID NO CSS
GRID NO CSS
GRID NO CSS DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Apresentando o módulo (1/1) 183
Bem-vindo ao módulo “Grid no CSS”! Neste módulo, aprofundaremos o seu conhecimento sobre a ferramenta “Grid” do CSS, que é
uma das formas de construir layout em CSS.
Temas abordados:
• Como criar layout com Grid: Você aprenderá a como utilizar o Grid e as suas peculiaridades.
• Complementando o que aprendemos com Flexbox: Como vimos anteriormente, alguns elementos podem ser implementados
com Flexbox. Entretanto, outros ficam melhores com Grid. Por esse motivo, essa técnica pode ser muito útil.
• Grid: A propriedade Grid será explorada neste módulo.
• Display: grid: Assim como para a ferramenta Flex tínhamos display:flex, a lógica é similar para o caso do Grid. Sendo assim,
teremos display:grid quando utilizarmos essa técnica em CSS.
Este módulo é projetado para ampliarmos as suas ferramentas na realização de layouts com CSS. Nesse sentido, passaremos pelos
principais detalhes de como implementar o Grid.
Nesta seção, iremos iniciar o nosso aprendizado de como utilizar o Grid. Vamos nessa!
O primeiro passo consiste em criar o arquivo “[Link]”, que será manipulado durante este módulo:
Após essa etapa, lembre-se que, ao utilizar o Visual Studio Code, basta pressionar a tecla “!” e em seguida para gerar a estrutura
do código html automaticamente:
Vamos criar e editar alguns dos elementos existentes na página html a fim de que possamos manipulá-los e criar um layout de estilo
Grid.
Com essas etapas concluídas, inclua o elemento “class=grid” na <div> mais externa, uma vez que já sabemos que iremos utilizar o
comando display:grid futuramente.
A fim de facilitar, inclua nas divs internas as respectivas classes: class=“div1”, class=“div2”, class=“div3”, class=“div4” e class=“div5”.
Com essas etapas feitas, aperte “Go live” no canto inferior direito, a fim de rodar um servidor local no seu computador. Após
pressionado o botão, uma página html em branco será aberta:
Primeiramente, vamos incluir a tag <style> à página. Sendo assim, inclua, abaixo do body e acima da <div> mais externa, a tag <style>,
o estilo .grid e o comando display:grid.
Após esse processo, o <body> do seu html deve estar similar a seguinte estrutura:
Salve o seu código e atualize a página que está rodando no servidor local do seu computador.
Você irá notar que nada mudou! Isso aconteceu porque ainda não incluímos conteúdo nas divs internas, tal como, por exemplo, cor.
Vamos mexer nesses parâmetros agora! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Como usar o Grid (5/14) 188
Para adicionar alguns parâmetros e visualizarmos as divs, vamos adicionar a cor vermelha, o tamanho e a altura dos elementos.
Sendo assim, dentro do escopo “.grid”, adicione & div e determine os valores para os atributos mencionados anteriormente. Neste
exemplo, utilizaremos: background-color: red ; height: 5rem ; e width: rem.
Após a conclusão dessas etapas e atualização da página, o código do <style> e a página html serão, respectivamente, parecidas com
as figuras a seguir:
A fim de visualizar as divs individualmente, podemos, dentro do navegador, apertar F12 e selecionar a aba “Elements”.
O código html da página será exibido, e, à medida que passamos o mouse, o navegador irá destacar o elemento em questão.
Adicionalmente, note que, assim como aparecia no flex, a palavra grid aparece ao lado do elemento <div class=“grid”>.
Isso será muito útil para conseguirmos entender como serão as linhas, as colunas e outros elementos do layout em grade.
Outro detalhe a ser notado é que, do lado direito, o navegador exibe algumas das propriedades, tal como alinhamento e posicionamento.
A imagem da próxima página ilustra a interatividade ao passar o mouse em cima das divs, enquanto as setas destacam,
respectivamente, o local que a palavra grid aparece no código e a escolha de posicionamento e alinhamento:
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Como usar o Grid (7/14) 190
local que aparece a palavra grid no html
escolha de alinhamento e
posicionamento do grid
Note dois pontos essenciais: temos um layout em grade com 5 linhas e existem alguns delimitadores que dividem as linhas entre si
(as setas verdes da imagem a seguir apontam para as linhas).
Delimitadores
Vamos editar esse layout para ganharmos cada vez mais confiança ao mexer com o “grid”?
Primeiramente, mudaremos as cores! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Como usar o Grid (9/14) 192
Para mudarmos as cores, vamos atribuir a cada uma das classes que criamos (div1, div2, div3, div4 e div5) uma cor diferente.
Para cada uma das outras divs, vamos atribuir uma cor diferente a partir do acesso às diferentes classes.
Utilize o comando “& .divx” e mude x para o número da classe desejada (a figura ao fim da página ilustra as modificações para cada
uma das classes).
Atribua a cor azul para a div2, a verde para div3, amarelo para div4 e roxo para div5.
Após realizar essa etapa e atualizar a página, a tag <style> e a sua página estarão similares, respectivamente, as seguintes imagens:
Além disso, note que continuamos com o mesmo número de linhas (ou também chamada de tracks).
Repare que o layout grid, por padrão, organiza a página por linhas.
Caso queiramos colocá-la em colunas, podemos atribuir a propriedade grid-auto-flow para column (lembre-se que o
grid-auto-flow vai especificar como as linhas e colunas serão criadas automaticamente).
O grid vai de ponta a ponta da tela, mas essa propriedade distribui igualmente cada caixa.
Por outro lado, com o flex, as divs estariam uma do lado da outra, e teríamos que mexer em propriedades de alinhamento para
chegarmos ao resultado exibido na tela.
Vamos, agora, mexer no tamanho das caixas para vermos como a propriedade se comporta!
Para isso, coloque width:50rem e height:50rem na propriedade da div, e você verá que as caixas crescerão (muito!), fazendo a página
html e parte do código ficarem similares as seguintes imagens:
Vamos, primeiramente, fazer as definições padrões para que saibamos a equivalência entre 1rem e número de pixels (lembre
que isso já foi feito nas aulas anteriores!):
Vamos reduzir o tamanho de cada div interna a 30 rem (300 pixels) e estipular o tamanho máximo da div externa em 100rem
(100 pixels).
Após essas etapas, o código e a página html estarão similares às imagens da próxima página:
Ao explorar a página criada, você notará que o somatório de todas as divs é maior que o tamanho da div, que está delimitada
a 1000 pixels.
Adicionalmente, note no canto inferior direito que temos o tamanho dos elementos da página:
Sendo assim, podemos mexer nos tamanhos para adequar o layout ao que desejamos!
Com isso em mente, podemos encerrar o conteúdo planejado para esta seção.
Nas próximas seções, começaremos a mexer com essas propriedades, aprofundando, ainda mais, o seu conhecimento sobre
o grid! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Definindo as linhas da Grade (1/10) 198
Para esta nova seção, vamos começar a manipular as linhas do layout em grade!
Primeiramente, é importante entender que existem as formas automática e manual para definir a quantidade e o tamanho das linhas
desse tipo de layout.
Caso quiséssemos criar as linhas de forma automática, basta incluir a propriedade grid-auto-row no código e especificar o tamanho
das linhas (neste caso, utilizaremos 40 rem):
Note que enquanto a propriedade grid-auto-flow está relacionada a como os conteúdos serão organizadas na tela (neste caso, em
colunas), a propriedade grid-auto-rows refere-se as características das linhas CASO elas sejam criadas.
Entretanto, ao clicar no grid, será possível notar que o tamanho da grid cresceu de 300 pixels para 400 pixels, como mostrado a seguir:
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Definindo as linhas da Grade (2/10) 199
Lembre-se que se atualizarmos a página html, não haverá, visualmente, mudança, uma vez que só criamos uma linha e os tamanhos
são relativos às POSSÍVEIS linhas que são geradas automaticamente.
Para criarmos novas linhas, podemos mexer, a partir da propriedade grid-template-rows, no modelo (template) da página html que
estamos trabalhando.
Utilizando o arquivo [Link], podemos comentar a propriedade grid-auto-rows e adicionar tamanhos que desejamos para as linhas:
40rem (400
pixels)
50rem (500
pixels)
Definição dos
tamanhos
E caso queiramos colocar uma terceira linha de tamanho 30rem abaixo da linha de 50rem? Como fazemos?
40rem (400
pixels)
50rem (500
pixels)
30rem (300
pixels)
Podemos, também, especificar o número de colunas manualmente, ou determinar o número de colunas manualmente e deixar o
número de linhas ser decidido automaticamente. Esse último caso o que veremos na próxima seção!
Para entender ainda melhor como o layout em grid processa a informação, podemos testar diferentes número de elementos.
Por exemplo, caso adicionemos 1 elemento, teremos 6 elementos no total. Como estamos especificando que queremos três linhas,
teremos duas colunas (que serão geradas automaticamente!).
Analogamente, se tivermos 7 elementos, a parte automática fará o trabalho de alocar mais uma coluna para o layout da página!
Para fazer o teste com 6 e 7 elementos, podemos criar, respectivamente, mais uma ou duas divs no código que estamos utilizando
(basta copiar e colar uma das divs):
Neste momento, é importante entender a diferença entre os layouts flex (visto anteriormente) e grid.
Enquanto no flex temos apenas uma linha ou apenas uma coluna, no grid podemos ter diversas linhas e colunas. Isso pode facilitar o
design de algumas páginas! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Definindo as linhas da Grade (8/10) 205
Antes de encerrarmos essa seção, é importante mencionar que existem diferentes formas de definir o tamanho das linhas.
Além das unidades rem e px, podemos utilizar um percentual em relação à altura total do grid.
Para isso, temos que, primeiramente, definir a altura total que queremos do grid (por exemplo, height: 120rem).
Após essa etapa, basta definir no grid-template-rows as proporções que queremos para cada uma das linhas.
Neste exemplo, colocando a primeira linha tem 30% do tamanho, a segunda linha 35% e a terceira linha 35%, temos:
Basicamente, o html vai pegar a quantidade total, dividir pelo height, e atribuir os valores de acordo com as frações dadas.
Caso utilizássemos, por exemplo, “grid-template-rows: 1fr 2fr 1fr;”, a primeira linha e a terceira linha teriam o mesmo tamanho, e a
segunda linha teria o dobro do tamanho de cada uma das duas.
É importante notar que se eliminarmos o tamanho do height, o grid deixará somente o espaço para cumprir a definição que fizemos.
Por último, mas não menos importante, caso queiramos todas as linhas do mesmo tamanho, podemos utilizar o comando repeat(x, y),
em que x são o número de linhas que desejamos e y é o tamanho para cada linha.
Antes de prosseguirmos para a próxima seção, vamos editar um pouco a página para termos as divs 6 e 7, que foram criadas por último,
com classes e cores diferentes (brown e lime, respectivamente).
modificação
modificação das
das cores
classes
Com isso feito, vamos em frente! Rumo à fluência em html e CSS, caro impressionador!
Repare que, até o momento, não especificamos qual o tamanho de cada coluna. Como, então, o html está criando o tamanho de cada
uma das colunas?
Basicamente, pode-se perceber que a página está pegando o width disponível e atribuindo espaço igual para as três colunas existentes
(note que cada coluna possui o mesmo tamanho).
Por exemplo, caso queiramos todas as colunas do mesmo tamanho, podemos utilizar a propriedade 1fr:
Ao atualizarmos a página, notaremos que todas as colunas continuam com o mesmo tamanho.
Se quisermos tamanhos diferentes, podemos utilizar os métodos ensinados na seção anterior. Por exemplo, para fazermos a segunda
coluna o dobro do tamanho da primeira e da terceira, podemos utilizar a unidade fr, resultando no código e na tela a seguir:
Lembre-se que no código html utilizado nós definimos a largura máxima width: 100rem.
Sendo assim, o código html ficará restrito àquele espaço máximo, buscando alocar os tamanhos da melhor forma possível.
Caso seja retirado o limite máximo fixo, a página conseguirá utilizar todo espaço em tela, mantendo as proporções estipuladas pelo
programador.
Note a diferença entre as distribuições com o limite máximo width: 100rem (imagem à esquerda) e sem esse valor (imagem à direita):
Para isso, vamos comentar a linha da propriedade grid-auto-columns (lembre-se do atalho Ctrl+; no Visual Studio), uma vez que não haverá
criação automática de colunas:
Note que se comentarmos a linha grid-auto-flow, estaremos mudando a ordem de exibição das cores, uma vez que o padrão de organização
é por linha.
Em outras palavras, quando temos grid-auto-flow:column, preenchemos a coluna inteira antes de prosseguirmos para a próxima coluna.
Quando temos o padrão por linhas (ou grid-auto-flow:row), preenchemos a linha inteira antes de irmos para a próxima linha.
Perceberam a diferença e importância de entendermos como cada uma das propriedades funciona? Isso pode mudar totalmente o
layout de uma página. Vamos em frente!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Definindo as colunas da Grade (6/8) 213
Já aprendemos a manipular o número de linhas e de colunas, e também criarmos de forma automática e/ou manual essas
propriedades.
Note que podemos coordenar os tamanhos e espaçamentos de acordo com a nossa vontade!
Por exemplo, caso queiramos quatro colunas no total, com as duas primeiras de tamanho 1fr, a terceira com 2fr e a última com
tamanho 1fr, temos, sem limitarmos o width:
Por outro lado, caso a gente limite o width, o html buscará organizar da melhor forma possível:
Ao atualizarmos a página, notaremos que os números aparecerão no canto superior esquerdo da tela.
Vamos editar isso, centralizando e justificando os itens, mudando a cor e aumentando um pouco a letra:
Esta propriedade é diferente da display:grid, que especifica esse tipo de layout como um “contêiner” e possui, do inglês, os “grid
items” como elementos (a ideia é similar aos “flex items” que estudamos anteriormente).
No caso que estudaremos nesta seção, a propriedade grid é uma daquelas chamadas de shorthand property, que possuem sintaxes
específicas e permitem que o programador escolha os valores de múltiplos parâmetros simultaneamente.
Utilizando uma lógica similar a que as propriedades flex-grow, flex-shrink e flex-basis estão compreendidas dentro do flex, a
propriedade grid compreende todas as definições de layout vistas até agora (como, por exemplo, grid-auto-flow, grid-auto-rows, etc).
Caso queiramos visualizar no Visual Studio a descrição dessa propriedade, basta digitar grid, e a explicação, em inglês, aparecerá ao
lado:
Por exemplo, caso acessemos a documentação grid do CSS no Mozilla ([Link] veremos
que há diversas formas de definição do parâmetros, o que pode tornar a vida do programador um pouco mais complicada.
De qualquer forma, é importante passar essas informações para termos na nossa “caixa de ferramentas” e utilizarmos quando necessário!
Se nós escrevermos um ou dois valores ao lado do grid, estaremos tratando das propriedades “template” relacionadas às linhas e
colunas, respectivamente.
Por exemplo, repetindo os comandos que utilizamos nas seções anteriores, temos a seguinte equivalência:
Sendo assim, no código [Link], podemos utilizar a versão curta e notaremos que não houve nenhuma modificação do layout (lembre-
se de comentar a versão longa!):
Nesses novos casos, estaremos também abordando as outras propriedades, tais como grid-auto-flow, grid-auto-rows, grid-template-
rows e grid-template-columns.
No primeiro padrão, temos o caso que acontece quando queremos definir o número de linhas manualmente e deixar o número de
colunas automaticamente.
Neste caso, se comentarmos as outras definições e atualizarmos a página, teremos a tela e código similares a:
Da forma que escrevemos, a primeira coluna é preenchida inicialmente, depois a segunda, e assim sucessivamente.
Isso é fácil perceber pela numeração das divs (de 1 a 7) que implementamos anteriormente! As setas e os números a seguir mostram a
ordem de preenchimento dos elementos:
Note que, nesta imagem, o mouse foi colocado em cima da palavra grid para facilitar a visualização dos tamanhos relativos entre as divs.
Por exemplo, para um tamanho de 40rem (ou 400 pixels pelas nossas definições), temos:
Sendo assim, ao atualizar a página e colocar o mouse sobre a palavra grid, temos a seguinte imagem:
Caso a gente retire o limite width:100, será possível visualizar o layout da página ocupando o espaço todo:
Ao atualizar a página, notaremos que a ordem de preenchimento mudará. Em outras palavras, primeiro as colunas serão
preenchidas e depois as linhas, conforme mostra a tela:
Por exemplo, caso queiramos a primeira linha com um tamanho, a segunda linha com o dobro do tamanho e a terceira linha desse
mesmo tamanho, temos a seguinte implementação:
Com a explicação do método shorthand feita, podemos seguir para a próxima seção!
Vamos aprender a como mudar espaçamentos, tamanho dos elementos, posicionamento, e muito mais!
No Flex, que foi visto anteriormente e é menos flexível, nós mexíamos na propriedade order para posicionar os elementos.
Entretanto, lembre-se que tínhamos que definir a posição relativa dos elementos, dizendo que um elemento seria posicionado antes do
outro.
Por exemplo, poderíamos dizer que a div1 será posicionada antes da div2; a div2 antes da div3; e assim por diante.
No grid, por outro lado, conseguimos dizer exatamente em qual local o elemento será posicionado
Esse fato, apesar de simples, é muito importante, pois faz com que esse tipo de layout seja mais flexível!
Para entendermos como fazer esse posicionamento, vamos abrir as ferramentas do desenvolvedor (só apertar F12 com o navegador
aberto), selecionar a aba Elements e apertar a palavra grid para destacarmos a grade que temos.
Você notará que, após realizar esse processo, existirão números na parte superior e lateral que indicam, respectivamente, o número da
coluna e da linha em que a div é iniciada.
A imagem na próxima página detalha um pouco mais os elementos que aparecerão na tela: DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Posicionando os elementos (2/23) 228
Local em que se
aperta para exibir a
grade existente no
layout da página
html
Numeraçã
o das
linhas
Numeraçã
o das
colunas
Note que temos os números no início das linhas e/ou colunas, fazendo com que possamos indicar no código em que número o
elemento começa e termina.
Número da linha
que a div1 começa Número da linha
que a div1 termina
Número da coluna que a div3 começa Número da coluna que a div3 termina
Número da linha
que a div3 começa Número da linha
que a div3 termina
Caso queiramos migrar o elemento div3 para o espaço que fica abaixo do elemento div4 e ao lado da div7, podemos,
inicialmente, colocar o início da div3 para a coluna 4 e o fim para coluna 5.
Para fazer isso, vamos modificar as propriedades grid-column-start e grid-column-end para, respectivamente, o início e
término das colunas da div3.
Note que isso aconteceu porque, até agora, não especificamos a linha de início e final do elemento!
Após essa inclusão no código, teremos o resultado que desejamos (note que as outras divs irão mudar automaticamente para se
adaptar):
Caso queiramos aumentar o espaço que ela ocupa, basta incluir nas propriedades grid-column-start e grid-column-end números que
aumentem o tamanho:
Entretanto, ao observar a página, notaremos que ela continua ocupando o mesmo espaço porque a definição do width continua em 30rem:
Caso a gente especifique width da div3 e não especifique o width e height das divs, os tamanhos dos elementos serão da dimensão dos
números, conforme mostrados a seguir:
Dessa forma, podemos mexer nas propriedades que estávamos vendo anteriormente (grid-template-rows, grid-template-columns, etc).
Entretanto, como queremos que as linhas sejam geradas automaticamente, podemos utilizar a propriedade grid-auto-rows com o
tamanho de, por exemplo, 30rem:
Note que, de acordo com o código que temos, a penúltima coluna possui o dobro do tamanho da última, e é por isso que vemos a
largura da coluna das divs 3 e 4 estão maiores que as demais.
Por exemplo, podemos colocar a div1 na última coluna da primeira linha. Para isso, vamos criar uma classe para a div1 (note que não
havíamos criado uma classe específica para ele) e definir as propriedades grid-column-start e grid-column-end :
Por exemplo, se quisermos deslocarmos a div2 para a primeira posição, basta posicionar de acordo com o que desejamos:
Note que mesmo que possua elementos vazios, a grade continua existindo como se fosse um bloco!
Um ponto interessante é que o posicionamento dos elementos possui uma versão shorthand.
Para determinarmos a coluna inicial e/ou fim da linha, basta incluirmos o número da coluna inicial e número da coluna final com o
símbolo “/” entre os números.
Por exemplo, para fazer a div1 começar na coluna 4 e ir até 5 (ou seja, manter o layout do mesmo jeito), temos:
Para o caso da linha, temos a mesma lógica. Sendo assim, mantendo a div2 na mesma posição que está atualmente (fazer o elemento
começar nas linha e coluna 1 e terminar nas linha e coluna 2), tem-se:
Como exemplo desse fato, podemos alterar grid-row para termos os elementos na a primeira, segunda e terceira linha. As modificações
no código e as respectivas figuras são exibidas a seguir:
Caso queiramos que o elemento comece na div2 e possua tamanho 2, basta acrescentar ao lado do número de início o elemento “/”,
com a palavra span, e seguida da duração:
De forma alternativa, podemos também especificar em que coluna ou linha o elemento termina, e qual é o tamanho do elemento.
Por exemplo, utilizando um caso similar de tamanho 2 e fazendo com que a div2 termine na coluna 3, tem-se:
Quando as divs não possuem posição determinada, elas são deslocadas de acordo com a necessidade.
Caso os elementos sejam especificados manualmente, o html irá fixar o posicionamento deles, fazendo com que coincidam caso
estejam sobrepostos.
Vimos, nesta seção, que podemos posicionar as divs de acordo com o que desejamos!
Entretanto, antes de visualizarmos os efeitos de algumas propriedades do grid, vamos mexer no código para termos um layout apropriado.
Sendo assim, comente a especificações manuais de cada uma das divs existentes, fazendo com que o posicionamento seja automático:
Podemos fazer isso de diversas formas, tal como, por exemplo, limitar o layout a 4 colunas de mesmo tamanho:
Como já se deve imaginar, existem alguns tipos de espaçamento que podem ser utilizados.
Para isso, basta especificar o espaço desejado (por exemplo, 2rem) e o layout ficará similar ao seguinte:
Sendo assim, utilizando também o tamanho de 2rem, basta incluir essa definição no código:
Pela lógica, assim como no flex, podemos utilizar a propriedade gap: 2rem caso tenhamos a situação em que o espaçamento da
linha é igual ao da coluna (row-gap = column-gap):
Entretanto, essas propriedades estão obsoletas, como mostra o Visual Studio caso digitemos uma delas no código.
Portanto, note que o procedimento para definição de espaços é similar ao já visto na propriedade Flex!
Antes de seguirmos para a próxima seção, vamos colocar o espaçamento das linhas em 3rem e das colunas em 1rem para
fazermos mais um treino de modificação de gaps:
Com isso feito, podemos passar ao próximo conteúdo, com o intuito de aprimorar, ainda mais, o nosso conhecimento sobre o
Grid!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Áreas dentro da Grade (1/14) 255
Nesta seção, iremos aprofundar o entendimento de como posicionar os elementos na estrutura grid!
Até o momento, sabemos como determinar manualmente o posicionamento dos elementos dentro do layout!
Entretanto, com o conhecimento que vimos até agora, precisamos definir separadamente o início e o fim das linhas e colunas.
Nesse sentido, é importante mencionar que existe a propriedade shorthand grid-area, que está relacionada às propriedades grid-row-
start, grid-row-end, grid-column-start e grid-column-end.
Sendo assim, para determinar a div2 com início na linha 2, término na linha 3, começo na coluna 3, e uma largura de dois espaços,
pode-se utilizar o seguinte padrão:
Se omitirmos o último elemento, a div terá o tamanho padrão de uma divisão, conforme mostra o código e a imagem a seguir:
Por exemplo, caso façamos o teste de omitir os dois últimos elementos, teremos o seguinte código e tela:
Percebeu a importância do shorthand dessa propriedade? Essa característica pode facilitar e simplificar o código consideravelmente!
Sendo assim, caso utilizemos esse padrão, somente a linha de início será informada, conforme mostra o caso a seguir:
Para isso, vamos utilizar o grid-template-areas! Talvez, este momento, não esteja claro o que isso quer dizer, mas logo ficará!
Primeiramente, vamos, a fim de tornar o entendimento mais intuitivo, diminuir a quantidade de divs existentes na página, trocar o
conteúdo de cada uma das divs de números para letra, modificar o número de colunas e trocar a cor da div5 para “lime”.
Com isso feito, podemos desenhar manualmente o nosso layout com o grid-template-areas!
E como realizamos esse layout? DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Áreas dentro da Grade (8/14) 262
Para realizar esse layout, basta especificar como queremos o nosso layout.
Por exemplo, podemos, como primeiro passo, escrever um layout da seguinte maneira:
A imagem acima ilustra o posicionamento de cada elemento com o espaço relativo ao layout (na próxima página, isso ficará mais
claro!).
Após isso, devemos associar a string indicada na imagem acima à div existente.
Com isso, escrevemos em cada uma das divs sua respectiva associação:
Com essa etapa feita, teremos associado cada uma das divs às letras especificadas no layout.
Consegue perceber que o layout está exatamente como queríamos? Cada letra ocupa o espaço que determinamos no grid-template-
areas!
A título de exemplo, caso queiramos mudar o nome de “a” para “area” e retirarmos as letras “d” e “e” do layout, podemos modificar o
código da seguinte forma:
Para fazermos o layout do jeito que queremos, temos que, além disso, associar a definição acima ao nome area.
Note que como retiramos as letras “d” e “e” da grade, elas não serão contidas no grid! Sendo assim, elas existem na página html, mas
não estão definidas na grade!
Por exemplo, no blog da Hashtag ([Link] existe um layout clássico que poderíamos fazer! Entre
na página e note isso!
Antes de prosseguirmos, a fim de facilitar os próximos passos, vamos incluir todos os elementos de volta na grade, voltar ao nome antigo
de a para a div1 e atualizar a página:
Por exemplo, caso estejamos mexendo na propriedade grid-row-end, nós podemos não ter a certeza de quantas linhas temos.
Entretanto, caso queiramos um elemento na última linha, podemos especificar com o número negativo -1.
Como estaríamos contando de trás para frente nesse exemplo, os números negativos facilitariam as definições!
É essencial destacar que, quando tratamos de números, isso vale para as propriedades vistas até agora!
Com a página que temos atualmente, note que o grid está ocupando todo o espaço disponível do nosso grid:
Em outras palavras, se quiséssemos, por exemplo, colocar esse bloco de elementos para a direita ou para a esquerda. Qual seria o
procedimento?
Primeiramente, é interessante perceber que, de acordo com as definições feitas no código, colocamos que teremos três colunas e cada uma
delas ocupará 1fr.
Nesse sentido, a página divide o espaço total disponível em três, gerando o resultado que temos até o momento.
Sendo assim, realmente, não faz sentido pensar em alinhamento vertical e/ou horizontal, uma vez que não há espaço sobrando.
Entretanto, caso nós coloquemos espaços ao redor do nosso grid, poderemos pensar em alinhar verticalmente e/ou horizontalmente.
Por exemplo, vamos colocar que cada coluna terá o tamanho de 10rem (100 pixels):
Para fazer isso, vamos, primeiramente, reduzir o tamanho de cada linha para 10rem, a fim de melhorar nossa visualização:
Após isso, é possível reduzirmos a altura (height) do nossa grid para 60rem, gerando espaço livre vertical, como mostra a figura a seguir:
Por exemplo, caso queiramos colocar o bloco de linhas e colunas para baixo, podemos utilizar o align-content:end, como mostrado a seguir:
Outro exemplo, podemos colocar o bloco no meio (align-content:center), como mostra a imagem a seguir:
Por exemplo, podemos colocar o bloco para o canto direito a partir justify-content:end, como exibido a seguir:
Entretanto, como definimos tamanhos fixos para o nosso grid nas colunas ( grid-template-columns: repeat(3, 10rem) ), será possível notar
que não haverá, neste caso, modificação.
Um último exemplo interessante é se não fixarmos o width e centralizarmos o bloco, ficaremos como seguinte resultado:
Na ferramenta de desenvolvedor (aperte F12), podemos explorar os distintos comandos e veremos a página se alterar! Note
algumas opções possíveis na imagem a seguir:
Com essa última observação. encerramos, por esta seção, o conteúdo planejado!
Agora, meu caro impressionador, é hora de praticar , para fixar os conteúdos! E é isso que veremos nas próximas seções!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Propriedade place-items (1/4) 279
Para essa aula vamos criar um arquivo novo de HTML com a seguinte estrutura:
Se analisarmos nosso arquivo e quisermos aplicar um alinhamento central ao elemento <div>, a abordagem mais comum e intuitiva
seria utilizar o conceito de Flexbox em vez de Grid.
Para criar um alinhamento central utilizando o conceito de Flexbox, podemos usar as propriedades align-items e justify-content.
Essas propriedades nos permitem alinhar os itens no eixo vertical e horizontal, respectivamente. A estrutura básica ficaria assim:
Como Funciona:
• align-items: Alinha os itens verticalmente (no eixo do bloco) dentro de suas células de grid.
• justify-items: Alinha os itens horizontalmente (no eixo em linha) dentro de suas células de grid.
A propriedade place-items pode aceitar um ou dois valores:
• Um valor: Se você fornecer apenas um valor, ele será aplicado tanto a align-items quanto a justify-items. Por exemplo:
No entanto, podemos torná-lo ainda mais responsivo utilizando o Grid. Para isso, é importante identificar os breakpoints adequados,
permitindo ajustar essa propriedade conforme necessário e definir quantas colunas desejamos em diferentes tamanhos de tela. Isso
pode ser bastante trabalhoso, mas uma solução para simplificar esse processo é utilizar auto-fit e auto-fill, que permitem que o Grid
se ajuste automaticamente ao espaço disponível, facilitando a criação de layouts flexíveis.
A propriedade auto-fill no CSS Grid permite que as colunas do grid se expandam para preencher o espaço disponível, criando o
máximo possível de colunas com base em um tamanho de coluna definido. Se houver espaço extra na linha, ele simplesmente cria
novas colunas em vez de deixá-lo vazio. Isso é útil para layouts onde você deseja maximizar a utilização do espaço.
A propriedade auto-fit é semelhante ao auto-fill, mas com uma diferença sutil: quando o espaço disponível na linha é maior do que
o necessário, o auto-fit vai fazer com que as colunas ajustadas para preencher o espaço deixem as colunas vazias. Isso significa que,
se houver espaço extra, as colunas já existentes serão esticadas para ocupar o espaço, em vez de criar novas colunas.
Neste caso, o grid irá ajustar as colunas para preencher a linha, mas se houver espaço extra, as colunas existentes se expandirão para
ocupar esse espaço, e não haverá novas colunas criadas.
2. Visualização do Layout
• auto-fill: Se o espaço é maior do que o necessário para as colunas, ele ainda mostra o número máximo de colunas, resultando em
potencial espaço em branco (vazio) na grade.
• auto-fit: Se houver espaço extra, ele fará com que as colunas que já estão lá aumentem de tamanho para ocupar esse espaço,
eliminando colunas vazias na grade.
3. Uso Prático
• auto-fill é útil quando você deseja garantir que um certo número de colunas esteja sempre presente, mesmo que isso signifique
que algumas delas estejam vazias.
• auto-fit é preferido quando você quer um layout mais fluido, onde as colunas existentes se adaptam ao espaço disponível,
evitando áreas não utilizadas.
Uso do Flexbox
• Direção de Layout: O Grid organiza elementos em uma estrutura de linhas e colunas (bidimensional), enquanto o Flexbox
organiza elementos em uma única linha ou coluna (unidimensional).
• Referência de Alinhamento: No Grid, o layout é definido em relação ao contêiner pai e sua estrutura; já no Flexbox, a disposição
dos elementos é baseada em seus tamanhos intrínsecos e no espaço disponível.
• Complexidade: Para layouts mais complexos que envolvem tanto a vertical quanto a horizontal, o Grid é mais adequado. Para
alinhamentos e distribuições mais simples, o Flexbox é mais fácil e intuitivo.
Resumo
• CSS Grid: Use-o para layouts mais complexos que precisam de um controle preciso sobre o espaço em duas dimensões.
• Flexbox: Use-o para layouts mais simples e para alinhar itens em uma única linha ou coluna, com base em seus tamanhos
intrínsecos.
Entender quando usar cada um desses métodos de layout pode melhorar significativamente a estrutura e a responsividade do seu
design, proporcionando uma melhor experiência para os usuários.
A ideia é criar exatamente o mesmo layout da página já feita com Flexbox, mas, agora, utilizando a ferramenta Grid.
O arquivo [Link] está na seção Download. Baixe o arquivo, faça as modificações necessárias para gerar a página com Grid e busque
solucionar o desafio sozinho!
• Não trocaremos todos os flexs existentes, apenas alguns específicos para organizar os elementos no formato de grid;
• Duas grids externas foram utilizadas no novo layout (faz parte do desafio perceber se será necessário ou não trocar outros elementos
de flex para grid);
A imagem a seguir, ilustra as dicas para resolver esse desafio. Vamos com tudo, impressionador!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Desafio 1 - Construindo um layout com Grid (2/2) 290
Códig
o
antigo
Primeira grid
utilizada
Códig
o
Segunda grid novo
utilizada
Isso facilita para visualizarmos as diferenças entre os dois arquivos conforme mexemos no estrutura.
Para isso, faça os seguintes passos: pegue os arquivos que temos no arquivo “[Link]”; crie uma pasta (no caso, pode ser com o
nome de gabarito); copie e cole os arquivos “[Link]” e “[Link]” dentro da pasta e renomeie as cópias para “desafio-1-
[Link]” e “[Link]”.
Com isso, a lista de arquivos dentro da pasta ficará similar a seguinte imagem.
Após fazer esse procedimento, dependendo do nome dos arquivos existentes no seu computador, a página html perderá o formato.
Primeiramente, mude o caminho para o arquivo da figura nos arquivos “[Link]” e “[Link]”, uma vez que a
figura está na mesma pasta dos arquivos html e css (vejo o arquivo a seguir):
Além disso, como mexeremos no css para implementarmos a página com grid, mude a referência do arquivo “[Link]”
para “[Link]”:
A partir de agora, todas as modificações serão feitas nos arquivos “[Link]” e “[Link]”, que são os arquivos
que irão implementar o novo layout com grid.
Com isso feito, você notará que teremos quatro elementos alinhados para o espaço que queremos trabalhar com layout do tipo
grade:
Após fazer isso, notaremos que os elementos contidos nessa div estarão alinhados, como mostra a figura a seguir:
Tendo resolvido esses detalhes, vamos, primeiramente, mexer na <div class="container-figure">, que contém os elementos que precisam
ser mexidos. Sendo assim, no css, vamos trocar o tipo de display para grid e comentar a instrução relativa ao gap, gerando os seguintes
códigos e página:
Como explicamos anteriormente, esse é o padrão (apenas uma coluna e as linhas são criadas automaticamente)
Entretanto, no layout que temos, podemos ir por dois caminhos: a página cria as colunas automaticamente e nós fixamos uma linha
(veremos mais a frente que não é somente uma linha!); ou criamos duas colunas e as linhas são feitas de forma automática.
No gabarito que disponibilizamos na plataforma, fizemos o Desafio 1 com a fixação em duas colunas e as linhas sendo criadas
automaticamente.
Para mostrar que os dois caminhos são equivalentes, resolveremos fixando uma linha e fazendo as colunas automáticas.
Sendo assim, o próximo passo é mudar o padrão da criação automaticamente (grid-auto-flow: column) e para vermos como ficaria o
layout, podemos colocar grid-template-rows:1fr :
Neste caso, a imagem da televisão estaria ocupando as três linhas, e cada uma das linhas terá o tamanho individual de acordo com os
outros elementos contidos nela.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Desafio 1 – Gabarito (9/18) 299
Sendo assim, basta especificarmos o número de linhas e colocarmos o tamanho no automático, como mostrado a seguir:
Será possível notar que temos um layout um pouco mais similar ao que queremos chegar.
Agora, meu amigo, vem o “pulo do gato”. Ao observar a grid do jeito que está, veremos que, para termos o layout que queremos, a figura
precisa ocupar 3 espaços:
Isso pode ser feito de várias maneiras, tal como, por exemplo:
Com essa implementação feita, você notará que o layout da grade de cima já está mais do jeito que imaginávamos:
Como já sabemos o espaçamento pelo código feito com o flex, basta incluir essas especificações nas definições da área:
Usualmente, quando tratamos de centralização horizontal, estamos tratando do comando justify, que pode ser relacionado a “content" ou
“items”.
Esse fato vai fazer com que a nossa parte superior do layout fique exatamente igual a nossa página feita com flex, como mostra o código e a
tela a seguir:
A partir da estrutura do html, note que temos duas linhas e três colunas.
Novamente, temos duas formas de proceder: ou fazemos as linhas fixas e as colunas sendo geradas automaticamente; ou deixamos as
colunas fixas e fazemos com que as linhas sejam geradas automaticamente pela página.
Para fazermos diferente da parte de cima e explorarmos outras formas de resolver problemas, vamos fixar o número de colunas e deixar as
linhas serem geradas automaticamente.
Ao olhar o código, observamos que a parte section inferior não possui classe.
Podemos utilizar uma classe específica ou, como sabemos que existem duas seções e a inferior é a segunda, utilizamos nth-child.
Isso acontece porque a grid ocupará o espaço todo. Como queremos ocupar todo espaço necessário e ter três colunas, podemos escrever:
Note que conseguimos, então, implementar as três colunas. O que falta é mexer na palavra “Características”.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Desafio 1 – Gabarito (16/18) 306
Ao olhar o <h2>, podemos utilizar o nesting do css.
Escrevendo de forma diferente, podemos implementar isso no código, o que gerará o seguinte resultado:
Note que falta, ainda, fazer o espaçamento correto horizontal e vertical dos elementos e o alinhamento da palavra Características.
Para isso, vamos alterar o pedaço de código da div inferior, gerando os seguintes código e imagem:
Com isso feito, terminamos o Desafio 1! Vamos aprimorar ainda mais o seu conhecimento no Desafio 2!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 3 – Desafio 2 – Usando Grid na Seção Blog(1/1) 309
Pessoal, vamos treinar um pouco mais a utilização de grid!
De forma similar ao Desafio 1, vamos tomar como exemplo o Desafio 2 do módulo 7 e implementar a página com grid.
É recomendável tentar resolver sozinho a fim de praticar os conceitos e comandos aprendidos nesta aula!
Com esse exercício, aprofundaremos o entendimento de quando é recomendável fazer o layout com grid e quando devemos fazer com
flex.
Vamos, então, pegar a seção “Post no Blog” na página da Hashtag e implementar os elementos com grid!
Colocaremos os arquivos contidos em “[Link]” dentro da pasta Gabarito (pode ser outro nome), podendo mexer diretamente nesse
arquivo!
Uma pergunta que é normal ao lidar com grid é: como saber se é melhor determinar o número de colunas e linhas; deixar automático as
duas grandezas; ou fixar os dois valores?
Essa decisão depende muito da aplicação! Neste caso, como temos sempre o mesmo número de linhas e colunas, vamos fixar essas duas
grandezas.
Primeiramente, caso a versão do seu arquivo não tenha isso corrigido, vamos retirar um possível <body class=“popup-aberto”> que faz
com que um pop-up apareça toda vez que sua página é aberta:
Tendo feito isso, agora sim vamos alterar o layout para flex!
Ao explorar a página html, vemos que a seção do blog da Hashtag é implementado com flex:
Sabendo desse detalhe, vamos, então, alterar esse container para grid!
Como é possível observar, os elementos ficaram alinhados, uma vez que não especificamos o layout do nosso grid.
Por exemplo, a propriedade de tamanho que utilizamos no flex dentro de “caixa-postblog” não é mais relevante.
Esse fato acontece porque utilizamos o grid, e os tamanhos já são selecionados automaticamente.
Esse gap servirá tanto para linhas quanto para colunas, mantendo o layout uniforme:
Nos próximos módulos, vamos mexer com animações, responsividade de sites, e muito mais!
Avante, impressionador!
O Grid Garden é uma plataforma interativa projetada para ajudar você a praticar e dominar os conceitos de CSS Grid de maneira
divertida. Neste jogo, você terá a tarefa de posicionar elementos em um "jardim" virtual, usando propriedades do Grid como grid-
column, grid-row, e justify-items para regar cenouras e evitar ervas daninhas.
Cada nível do Grid Garden traz novos desafios, permitindo que você explore o poder do layout bidimensional do CSS Grid de
forma prática. Com ele, você aprende e aplica cada conceito de maneira gradual e envolvente, enquanto reforça o entendimento
do posicionamento e alinhamento de elementos.
Módulo 4
✔ Transições
✔ Efeitos 2D e 3D
✔ Animações e Keyframes
Vamos, então, em frente! Veremos bastante conteúdo, alguns exercícios e, ao final do módulo, temos dois Desafios para serem
resolvido!
Com esse conhecimento, seremos capaz de resolver algumas questões que foram apresentadas nas seções anteriores deste curso!
Por exemplo, quando vamos em [Link] e passamos o mouse em cima de um dos cursos, notamos que há
uma coloração gradual:
Esses efeitos são muito legais, não é mesmo? Vamos aprender a fazer isso na prática!
Vamos criar o arquivo transiçõ[Link] dentro do Visual Studio Code, apertar “!” + “tab” para completar o conteúdo e mudar o título
do html para “Transicoes”:
Tendo essa base inicial feita, precisamos, antes de criar transições, ter elementos na página para criarmos essas transições.
Como mexeremos bastante nos estilos dos elementos, vamos seguir a boa prática de programação e criar um arquivo chamado
[Link], linkando-o ao html:
Inicialmente, colocamos o padrão, o tamanho da fonte do html, os estilos para o body e o parágrafo <p>.
Para analisar qual cor está sendo usada no site da Hashtag, podemos forçar o estado de “:hover”, que é o estado quando passamos o
mouse em cima do elemento.
Para isso, após acessar a ferramenta de desenvolvedor (basta apertar F12), faça os seguintes passos:
1 – Aperte na seta que fica no canto superior esquerdo para ver o elemento dentro da estrutura do html;
Depois desses passos, você verá que o elemento da tela ficará em laranja.
Os números na página a seguir mostram os passos a serem seguidos, e a imagem mostra como fica a tela após esses passos:
Note que a maneira do lado esquerdo é mais elegante e deixa o código mais organizado, uma vez que as informações sobre o
parágrafo p estão contidas no mesmo elemento.
Entretanto, perceba, ao acessar o html, que a transição do elemento é mais brusca que a da Hashtag.
Sendo assim, vamos alterar um pouco mais o código para conseguirmos o mesmo efeito!
Primeiramente, perceba que, ao acessar o html, a transição do elemento é mais brusca que a da Hashtag.
Em seguida, vamos alterar um pouco mais o código para conseguirmos o mesmo efeito!
O segundo ponto é que a maneira do lado esquerdo é mais elegante, eficiente e deixa o código mais organizado.
Entretanto, note que não há espaçamento entre os elementos “&” e “:”. Caso houvesse, estaríamos adicionando um “hover” nos
elementos abaixo do parágrafo, e não no parágrafo em si!
A propriedade de transição muito utilizada é a transition, que é uma propriedade “short-hand” com quatro propriedades: transition-
property, transition-duration, transition-timing-function e transition-delay.
Inicialmente, vamos explorar cada uma das propriedades separadamente. Após o entendimento, utilizaremos a “transition” para unir
as quatro.
Na prática, geralmente definimos que transições podem ocorrendo para todas as propriedades, escrevendo transition-property:all.
Com isso definido, conseguimos, a partir das outras propriedades, ajustar melhor o que queremos fazer.
A próxima propriedade é a transition-duration, que basicamente é “duração da transição” desde o início até o seu fim.
É importante notar que como colocamos “transition-property: all”, todas as propriedades demorarão cinco segundo para chegarem
ao seu resultado final.
Por exemplo, se atualizarmos a página e não tivermos cache, o teste durará cinco horas para aparecer. Se quisermos algo mais
específico, podemos especificar somente a cor ou outra(s) propriedades.
Um valor que pode ser utilizado é 0.3 segundos, resultando no seguinte código:
Note que, até o momento, informamos a duração da transição, mas não informamos como seria feito essa transição.
Caso queiramos que o site ande mais rápido no início ou no final, podemos utilizar o transition-timing-function.
Para melhor entendimento, pode-se entrar na documentação do mozilla para entender melhor as diversas opções disponíveis.
Após isso, você será redirecionado para o site da documentação do parâmetro ([Link]
BR/docs/Web/CSS/transition-timing-function).
.
000
Módulo 4 – Transições 1-2 (15/18) 334
O site da documentação mostra as variações e como o valor final da propriedade é alterado:
Assim, existem diferentes formas de alterar, ou determinar exatamente a forma com a função Cubic-Bézier.
Lembre-se que o CSS é um mar de informação. É necessário entender o fundamento e, a partir desse ponto, modificamos de acordo.
Sendo assim, podemos colocar, por exemplo, transform:translateX(400px) e fazer o tempo de transição igual a 5 segundos,
resultando no movimento desejado:
Podemos alterar, então, para linear, ease, ease-in, ease-out, ease-in-out ou outro movimento desejado.
Isso nós veremos na segunda parte de Transições! Vamos em frente, caro impressionador!
Para funções, vamos começar com o mais simples, que é por “steps”.
A tradução para steps seria passos. Assim, podemos dividir as nossas transições em “passos”.
Por exemplo, se colocarmos steps(5), teremos cinco passos na página, e você verá a palavra andando a distância em cinco etapas ao
passar o mouse sobre o objeto.
Por exemplo, podemos definir que o movimentação de translação será iniciado com o pulo, que o pulo será feito no final do tempo;
que o movimento será inicializado e finalizado com um pulo; e que não há pulo no início e nem no final do intervalo.
No caso em que não colocamos o segundo parâmetro (steps (5, jump-end)), que é o caso padrão, é possível perceber que o
movimento de translação é finalizado com um pulo.
Se quisermos que a transição aja de forma diferente, existem outras três possibilidades:
• steps(5, jump-start)- o pulo para a próxima divisão é efeito imediatamente após o posicionamento do mouse. Em outras palavras,
há um pulo no início do movimento;
• steps(5, jump-both)- existe o pulo no início e no final do movimento. Note que, neste caso, acabamos “ganhando” um pulo
(existem 6 pulos no total);
Será possível notar que apenas um passo será dado, sendo no final do intervalo (step-end) ou no início (step-start).
Tendo visto essas funções, vamos aprender sobre a função cubic-bezier, que é mais genérica que os outros termos vistos.
De forma geral, são escolhidos dois pontos intermediários, que são incluídos na chamada da função, para fazer a interpolação de
movimento entre os pontos inicial e final.
Ao olhar o gráfico da documentação easing-function, essa explicação fica mais clara, sendo possível visualizá-la com as respectivas
explicações:
PONTO INTERMEDIÁRIO 2
PONTO INTERMEDIÁRIO 1
PONTO
INICIAL DO
ELEMENTO PONTO
FINAL DO
ELEMENTO
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Transições 2-2 (4/8) 341
É possível perceber que com essa função conseguimos criar uma forma mais personalizada de criar movimentações.
Um fato interessante é que podemos criar situações em que o elemento passa do ponto final que desejamos, e depois volta até o o
ponto que queremos.
Entretanto, note que não conseguimos fazer esse fato com todas as propriedades.
Vamos supor, por exemplo, que queremos clarear a cor laranja até chegar ao branco.
Como no caso das cores o branco é valor máximo para cada um dos valores rgb(255, 255, 255)), não é possível fazer essa
funcionalidade, gerando o comportamento exibido no gráfico da direita a seguir.
Para isso, podemos colocar a frase “CURSO DE EXCEL” em uma div a fim de visualizarmos isso.
Sendo assim, vamos colocar o parágrafo <p> dentro da div, alterar a background-color e o width da <div> para visualizarmos melhor:
Uma pergunta que pode ser feita é com relação às possíveis aplicações do que vimos. Existem inúmeras!
Existe a função linear que podemos utilizar mais de dois pontos, mas ela ainda está em fase de teste.
Sempre que uma função estiver em teste, é recomendável, a princípio, não utilizá-la, pois talvez ela só funcione em um dos
navegadores.
Por exemplo, colocar transition-delay:2s significa que a página vai esperar 2 segundos antes de iniciar a transição.
Por último, mas não menos importante, para juntar as quatro propriedades vistas em uma só, utilizamos a função short-hand
transition.
Para, então, fazer funcionalidade similar com o short-hand, podemos fazer o seguinte (à esquerda, a declaração normal; à direita, a
versão short-hand):
Agora, sim, conseguimos ver tudo de transição! Vamos em frente! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Efeitos 2D (1/29) 346
Fala, pessoal!
Agora que já vimos uma chuva de conteúdo relativo a transições (lembre-se que a função short-hand “transition” é utilizada para
quatro parâmetros), vamos ver efeitos 2D.
Veremos cinco propriedades para efeitos 2D, tal como, por exemplo, inclinar o elemento, aumentá-lo de tamanho, e muito mais!
Para facilitar, podemos colocar o que vimos na aula passada dentro de uma pasta, criando uma nova pasta onde colocaremos os
códigos que alteraremos ao longa da aula.
Utilizamos o padrão do texto html, mudando o título para “Efeitos 2D”, e o CSS padrão, lembrando de linkar o estilo com a referência
do arquivo.
Lembre-se que a pasta não precisa conter, exclusivamente, somente os arquivos do projeto. Caso haja outros arquivos armazenados
nessa pasta, a imagem anterior que está a esquerda será ligeiramente diferente.
Com o objetivo de ilustrar cada uma das propriedades 2D, vamos criar uma div para cada propriedade, atribuindo títulos e classes
diferentes para cada uma delas.
No CSS, vamos especificar alguns parâmetros para a div geral e especificar para cada uma das divs parâmetros específicos de forma a
identifica-las mais facilmente DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Efeitos 2D (3/29) 348
Para facilitar a visualização, vamos criar uma margem entre as divs de 1rem.
Além disso, vamos centralizar as palavras dentro do bloco e alterar as cores do texto dos blocos em azul, verde e roxo para branco a
fim de melhorar a visualização.
O Translate move o elemento para a esquerda, direita, cima ou para baixo. Mais especificamente, essa propriedade se desdobra em duas:
eixo X e eixo Y.
Sendo assim, podemos colocar o texto na página HTML, inserir uma margem e centralizar o texto, resultando nas seguintes imagens:
Sendo assim, podemos utilizar transform: translate (X, Y), em que X é o tamanho do deslocamento no eixo X (deslocamento positivo
para a direita e negativo para a esquerda) e eixo Y (deslocamento positivo para baixo e negativo para cima).
Por exemplo, caso coloquemos transform: translate (1rem, 1rem) na div1, será possível notar que o retângulo vermelho será
deslocado para a direita e para baixo:
Por exemplo, caso utilizemos translateX(10rem) e/ou translateY(10rem), teremos o deslocamento, respectivamente, horizontal e
vertical:
Antes de prosseguirmos, vamos deixar de forma a mostrar que o elemento está mexido para direita e para cima.
Basicamente, com essa propriedade,o elemento será rotacionado no sentido horário, caso o ângulo seja positivo, ou no anti-horário, se for
negativo.
Por exemplo, caso utilizemos transform:rotate(90deg), será possível notar que a div2 rotacionou para a direita:
Por exemplo, caso utilizemos transform:translate(-90deg), teremos efeito visual similar ao de 270 graus:
Por exemplo, podemos utilizar 45 graus ou, até mesmo, 10 graus. Antes de passarmos para a próxima propriedade, vamos deixar em 10
graus para visualizarmos o efeito.
Caso utilizemos o fator 1, será possível notar que não haverá alteração, uma vez que estamos multiplicando o tamanho do elemento por 1.
Entretanto, caso utilizemos o fator 0.5, o elemento será reduzido pela metade tanto na dimensão horizontal quanto na vertical, como
mostrado a seguir:
Por exemplo, caso coloquemos isso dentro do hover, determinemos o tempo de transição e como será feito essa mudança (ease-in, por
exemplo), teremos uma mudança ao passar o mouse sobre o elemento:
Se quisermos mudar os valores, podemos colocar, por exemplo, scale(0.5,1.5), fazendo com que escalemos pela metade do tamanho no eixo
X e que o tamanho aumente em 50% no eixo Y:
Sendo assim, vamos ajustar o padding para 2rem e ficaremos com o seguinte resultado:
Note que dependendo da sua página o valor do padding pode ser diferente!
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Efeitos 2D (18/29) 363
Adicionalmente, note que no Translate a omissão de um dos valores significa translação apenas no eixo X.
No caso do Scale, a inclusão de apenas um valor significa que o elemento será escalado nas duas dimensões.
O Skew é um pouco mais difícil para visualizar. Ao traduzir o termo do inglês para o português, será possível notar que a palavra significa
algo similar a inclinar.
Sendo assim, o Skew vai “deitar” o elemento com relação ao eixo que desejarmos.
Os eixos X e Y estão em um plano, enquanto o eixo Z está como se estivesse “saindo” da tela. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Efeitos 2D (19/29) 364
A imagem a seguir mostra os três eixos, em que os eixos X e Y estão em preto, e o eixo Z está destacado em vermelho:
Z X
Z X
Isso faz com que, uma vez que o elemento não tem espessura, não vejamos nada.
Adicionalmente, perceba que no caso de 180 graus teremos o caso similar ao de 0 graus.
Como falado no início desta seção, o Skew não é tão intuitivo quanto as outras propriedades.
Z X
Isso faz com que, uma vez que o elemento não tem espessura, não vejamos nada. É o caso análogo do skewX!
Adicionalmente, todas as propriedades, tais como ter o caso de 180 graus similar ao de 0 graus, a simetria de posicionamento com/para 90
graus e a não inversão do bloco entre 90 e 180 graus o bloco, acontecem.
Essa propriedade, apesar de ser um pouco mais complicada, possui diversas aplicações!
Outro ponto importante é que podemos deitar o bloco nos dois eixos simultaneamente!
Por exemplo, caso queiramos inclinar o bloco 30 graus no eixo X e 45 graus no eixo Y, basta utilizar skew(30deg, 45deg).
em que ScaleX, SkewY, SkewX, ScaleY, TranslateX e TranslateY são os respectivos valores desejados.
Além disso, enquanto no SkewY e SkewY “puros” a gente podia utilizar graus, nesse caso nós precisamos informar a tangente do ângulo.
Essa conta é um pouco desnecessária, que pode ser feita manualmente ou pelo CSS em si.
O CSS já fará a equivalência no transform, sendo o segundo e terceiro valor as tangentes dos ângulos.
Sendo assim, caso queiramos escalar no eixo X de 0.8 e 1.2 no eixo Y; transladar 100 pixels no eixo horizontal e 200 no vertical; e continuar
com os ângulos mostrados anteriormente, teremos os seguintes código e resultado:
Para o caso de 3D, algumas dessas características serão mantidas, outras serão alteradas e algumas não terão muita aplicação prática.
Vamos estudar isso em mais detalhes?
Quando falamos em visualização 3D, usualmente vem a imagem de um cubo na nossa cabeça.
É exatamente isso que vamos fazer! Iremos construir um cubo e explorar as suas três dimensões (comprimento, altura e profundidade):
altur
a
o
000
Módulo 4 – Efeitos 3D (2/20) 376
Para prepararmos o ambiente que vamos desenvolver o cubo, podemos fazer os seguintes passos:
Ao apertar “Go Live” no nosso Visual Studio Code, poderemos visualizar a seguinte página:
Assim, para começarmos o desenvolvimento do cubo, vamos editar um pouco o formato com que os elementos do HTML são exibidos.
Editaremos, então, a nossa classe “bloco” no nosso CSS, colocando as propriedades display: flex, align-items: center, justify-content:
center, width: 10rem e height: 10rem.
Adicionalmente, a partir da nossa classe “bloco”, acessaremos as nossas “divs filhas” utilizando a função nth-child, e colocaremos as
cores lightblue, lightgreen e lightcoral para, respectivamente, as divs 1, 2 e 3.
Entretanto, note que os três blocos estão empilhados, e não é isso que queremos para construir o nosso bloco!
Vamos, então, fazer algumas alterações para conseguirmos construir o nosso cubo.
Note que poderíamos juntas os dois elementos body sem problema algum. Deixamos dessa forma porque são características
particulares, e não gerais.
Isso acontece porque, na verdade, precisamos colocar os três quadrados na mesma posição específica, e, a partir disso, faremos
movimentos para termos o efeito de visualização 3D.
Sendo assim, um dos caminhos é atribuir um posicionamento absoluto para as nossas divs.
Com isso, precisamos fazer o posicionamento relativo dessas divs em relação a classe bloco e o absoluto dentro de cada div:
Vamos, então, retirar a margem, uma vez que já centralizamos o elemento pelo flex, e, para termos as divs centralizadas em relação ao
bloco, vamos atribuir valores às altura e largura de 10rem:
Sendo assim, vamos definir quais partes serão a da frente, da esquerda e do topo.
Para ser mais fácil, podemos criar uma classe para cada lado do quadrado e alterarmos no CSS, resultando nos seguintes códigos:
Note que teremos que rotacionar alguns dos elementos para termos essa ideia de profundidade.
A div “Frente” não precisará ser mexida significativamente, já que é a que tem inclinação nula.
Para visualizarmos melhor, vamos tirar a visualização das divs Frente e Topo:
Assim, podemos utilizar o rotatey, que faz com que o bloco faça o seguinte movimento:
Assim, como queremos que a letra “E” de “Esquerda” fique mais perto da tela, utilizamos um grau negativo (a angulação positiva faria o
elemento girar para o outro lado).
Assim, após implementar rotatey(-90), a div sumirá da tela, mas continuará existindo:
Com isso feito, depois que implementarmos as outras faces do cubo, poderemos inclinar um pouco e teremos o efeito desejado.
De forma similar ao procedimento anterior, vamos eliminar a exibição das outras duas divs para não confundir.
O raciocínio para a div “Topo” é similar à “Esqueda”, mas com rotação em relação ao eixo X.
Novamente, precisamos que a div fique perpendicular ao plano da página, conforme mostrado a seguir:
Agora, o que precisamos fazer é inclinar o nosso bloco como um todo, fazendo com que os planos que estão perpendiculares à página
fiquem visíveis na tela.
Entretanto, antes de iniciarmos, é necessário informar ao código html que queremos visualizar o efeito 3d.
Note que, para fins de testes, poderíamos fazer as alterações diretamente no Chrome, chegar em valores apropriados para melhor
visualização e, por fim, fazer a alteração no código principal.
Ao darmos um zoom somente no bloco, notamos que o que está faltando é fazer a translação nos eixos a fim de formarmos o cubo, como
pode ser visto na figura a seguir:
Sendo assim, utilizamos a função translatez para ajustar os planos de forma a serem um cubo.
Com isso, ajustaremos a translação em 5rem, resultando nas imagens e códigos finais a seguir:
Entretanto, uma nova propriedade que só faz sentido com o 3D é a perspective(), que pode diminuir a distância entre o usuário e o eixo Z.
Por exemplo, utilizando para testar diretamente na ferramenta do desenvolvedor, podemos usar com 21rem:
SEM COM
PERSPECTIVE PERSPECTIVE
Perceba que podemos utilizar essa e outras propriedade em conjunto com o hover, fazendo com que o objeto se mova ao passar o mouse
sobre o objeto!
• O rotate() utilizado na aula passado faz um movimento angular com o objeto (horário ou anti-horário), enquanto os rotateX, rotateY e
rotateZ fazem movimentos nos ângulos;
• O rotate3D() é um short-hand para rotateX, rotateY e rotateZ. Entretanto, assim como matrix3D(), as especificações são bem menos
intuitivas;
É relevante mencionar que com transições conseguimos fazer movimento entre um ponto inicial e um final de movimento!
Para começarmos, utilize os códigos html e css da aula passada, renomeando-os e ajustando referências:
Vamos fazer esse cubo se movimentar na página por, por exemplo, cinco pontos:
2 4
1 3 5
Entretanto, antes de configurarmos esses elementos, o primeiro passo é posicionar o cubo no ponto inicial que desejamos!
Para isso, vamos retirar do body o justify-content, tiramos qualquer transição e/ou hover que estava configurado, e colocamos um
pading para termos uma margem:
Após isso, vamos determinar o nome da animação, a porcentagem do tempo da animação e as localizações de cada um dos pontos 1 a 5.
Sendo assim, após testarmos esse posicionamento na ferramenta do desenvolvedor, podemos utilizar os keyframes da seguinte forma:
Nesse sentido, de acordo com cada percentual de animação determinada anteriormente, o bloco fará a transição definida.
Note que, então, o processo de animação em duas etapas: primeiramente, definimos os keyframes; após isso, implementamos, em si, a
animação!
Com isso, chamaremos o “keyframes animação-cubo” para especificarmos como será a movimentação da animação.
Nas aulas passadas, vimos que algumas animações podem ser feitas com a propriedade translate, mas não temos tanta “liberdade” em
termos visuais.
Nesta aula, veremos a animação em si! Notaremos que existem inúmeras possibilidades de animações que podem ser feitas!
Primeiramente, é importante mencionar que podemos utilizar a propriedade animation para criar a animação.
A Animation é um short-hand para 9 possíveis propriedades, sendo 8 funcionais e 1 em teste, que é chamada de animation-timeline.
Para propriedades que são grandes e possuem peculiariaddes, é recomendável ir na documentação do Mozilla referente à
documentação.
Para isso, basta digitar “animation:” e clicar em MDN Reference no Visual Studio.
Entretanto, uso das propriedades é intuitivo, então podemos concatenar todas elas e utilizar na propriedade short-hand animation.
Para iniciarmos a nossa explicação, vamos copiar e colar o exemplo disponibilizado na página para ilustrar o uso dessa propriedade
(lembre-se de comentar para não modificar o código neste momento):
Para o caso do duration e delay, é intuitivo e simples: basta informar o tempo em segundos ou, caso queiramos um tempo fracionário,
utilizamos a divisão por ponto.
A próxima propriedade intuitiva é o animation-interation-count, que indica quantas vezes animação a seguir.
Os exemplos a seguir ilustram os casos em que queremos a animação rodando 1 vez, 2 vezes ou infinitas vezes:
Outra propriedade é o animation-name, que indica o nome da animação (neste exemplo, seria “animação-cubo”)
No caso do play-state, teríamos as opções para rodar (running) ou pausar (paused), como ilustrado nas imagens a seguir:
Para o animation-direction, poderíamos ter a ordem normal, a ordem reversa, alternar entre a ordem direta e inversa começando pela
ordem direta, ou o alternar entre a ordem direta e inversa começando pela ordem reversa:
Inicialmente, não incluiremos nos nossos testes, mas depois a sua utilização será ilustrada.
E será possível que o cubo se moverá na tela entre os pontos especificados, conforme ilustra a figura seguir de um determinado instante
de tempo:
Sendo assim, basta incluirmos a rotação desejada que teremos o efeito que gostaríamos (isto é, fazer o cubo inclinado percorrer a tela):
Durante animação, será possível perceber que o cubo não está subindo e/ou descendo de forma igual.
Em alguns pontos, ele sobe muito na tela, enquanto em outros ele fica mais abaixo.
Perceba que isso depende muito da vontade do programador e do ajuste fino realizado durante a elaboração da página.
Fazendo os devidos ajustes, podemos perceber que o movimento fica mais “harmônico” com os seguintes valores:
Feito isso, podemos fazer algumas alterações para começarmos a sentir como as propriedades alteram o movimento.
Por exemplo, podemos mudar a “distribuição do movimento” para ease-in-out, retirar o delay e fazer a animação rodar em loop:
Um exemplo interessante é colocar duas iterações e fazer o cubo parar quando o mouse está em cima do cubo.
Para isso, temos que mudar a propriedade iteration-count e, dentro do hover, a play-state:
Outro caso é utilizarmos a função cubic-bezier, fazendo, por exemplo, com 20% da animação ter 80 % do resultado, e 60% do tempo ter
50% do resultado:
Sendo assim, note que podemos buscar esse movimento mudando os pontos do keyframes, como mostrado a seguir:
Para se familiarizar com as variações possíveis, mude os parâmetros e veja os efeitos visuais que as mudanças causam!
Por último, mas não menos importante, vamos explorar a propriedade fill-mode.
• Forwards – as características especificadas no último keyframe são mantidas após a animação já estar completa;
• Backwards – as características do primeiro keyframe são implementadas antes da animação começar a rodar
• None – não há mudança na propriedade entre o tempo em que a animação é aplicada e o tempo em que a animação começa a rodar
ou após ela estar completa
Como exemplo, é sugerido mudar a palavra “forwards” do comando abaixo para backwards, none e both para ver o efeito na tela:
Para fazer isso, basta colocar o font-weight maior, como mostrado a seguir:
Com isso, será possível perceber as sutilizas de cada uma das opções (backwards, both, forwards e none).
Em seguida, teremos mais uma aula, e, após isso, os Desafios 1 e 2 para praticarmos o que foi ensinado!
Apesar de termos visto como realizar animações, nós, como desenvolvedores, precisamos tratar os casos em que o usuário não deseja
que ocorra uma animação.
Por exemplo, existem pessoas que ficam enjoadas com o movimento ou simplesmente não gostam de animações, e, por esse motivo,
desabilitam o flag para animações.
Para simular o comportamento do navegador quando esse é o desejo do usuário, temos que ir na ferramenta do desenvolvedor (apertar
F12) e pressionar Ctrl + shift + P:
Para tratarmos o caso em que o usuário que essa opção, precisamos informar o CSS, colocando o código que queremos executar
quando não há preferênci:
Entretanto, caso retiremos a opção de movimento reduzido, a animação voltará a funcionar normalmente.
Com o objetivo de testar, basta seguir o mesmo procedimento anteriormente descrito e clicar na opção, como mostra a imagem a
seguir:
Assim, caso o usuário tenha preferência de menos mobilidade, isso será respeitado; caso não haja preferência, a página funcionará
normalmente.
Vamos em frente, pessoal! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Desafio 1 – Criando um Elemento Animado (1/2) 414
Fala, galera!
Basicamente, teremos que construir uma bola com efeito de sombra que se movimenta por cinco pontos da tela:
Seguem algumas dicas que podem ajudá-los durante a implementação deste desafio:
• Primeiramente, pense em como criar uma bola: lembre-se que a bola pode ser entendida como um quadrado com a
propriedade de border-radius (o raio da borda) alterado;
• Após criar a borda, lembre-se que necessitamos criar o efeito 3D nesta bola. Será que utilizaremos os efeitos 2D e/ou 3D que
aprendemos? Não sei, fica o questionamento e a reflexão para vocês! Pode ser que sim, pode ser que não. Implemente e teste para
buscar entender a melhor forma de implementação
• Outro ponto é que temos a sombra embaixo da bola, que é uma sombra que vai mudando, mas a animação será implementada
posteriormente;
• Repare que: temos 5 pontos na animação; a animação está em loop infinit; a bola possui a mesma velocidade durante todo o
tempo; e algumas outras coisas já devem começar a ser entendidas ao observar a animação.
Busquem implementar sozinhos e, na próxima aula, veremos como implementar esse desafio!
Dito isso, mãos à obra! DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 4 – Desafio 1 – Gabarito (1/7) 416
Pessoal, espero que tenham tentado resolver o Desafio 1!
Caso não tenham conseguido e/ou tentado resolver, não tem problema! Veremos uma das possíveis soluções (note que existem inúmeras
formas de resolver!)
Primeiramente, vamos copiar e colar os arquivos HTML e CSS “DoZero” na pasta Gabarito, renomeando os arquivos com o sufixo “-aula”.
Dessa forma, alteraremos os novos arquivos, mas tendo o gabarito na mesma página para possíveis comparações.]
Após esse procedimento, chegamos a seguinte organização da pasta e a códigos similares a (lembre-se de mudar a referência do CSS):
Repare que colocamos as novas características do CSS separadas do texto padrão para buscar maior organização do código.
Caso queiramos ainda mais clareza, podemos incluir o bloco “.bola” dentro do body, de forma a termos algo similar ao seguinte:
Como implementamos uma div com width e height do mesmo tamanho, basta colocarmos border-radius:50% para criarmos uma bola,
como mostrado a seguir:
Caso testemos algumas propriedades utilizadas anteriormente, tal como o rotatex e rotatey, notaremos que não
conseguiremos o efeito que queremos.
Isso só foi possível na aula passada porque utilizamos um cubo, que são feitos de várias faces. Sendo assim, foi possível
ajustar as rotações das faces individualmente e gerar o efeito visual desejado.
No caso da bola deste Desafio, caso quiséssemos fazer isso de forma análoga, teríamos que criar várias faces e fazer algumas
modificações manuais bem trabalhosas. Isso necessitaria do auxílio do Javascript para criarmos diversas faces, o que não é
preciso!
Sendo assim, é possível perceber que o efeito de ter uma bola 3D nada mais é que uma sombra interna com suas devidas
características.
Por isso, vamos incluir, mexendo na ferramenta do desenvolvedor para conseguirmos fazer um ajuste fino de valores, um
box-shadow na nossa bola com seu devido deslocamento, o desfoque (Blur) e especificação de rgba.
Entretanto, a sobra está bem para dentro. Seria interessante a deslocarmos ligeiramente a sombra para termos o efeito desejado.
Com isso implementado, vamos mexer na sombra que fica abaixo da bola!
Para colocarmos uma segunda sombra, basta adicionar “,” e as outras especificações ao lado da última informação sobre a primeira sombra.
Sendo assim, fazendo o ajuste fino dos parâmetros, chegamos na seguinte imagem e especificação:
Nesse sentido, quando fizermos a animação, mexeremos nessa propriedade para gerarmos esse efeito visualmente!
Entretanto, antes de qualquer coisa, é necessário definir os keyframes que fazem parte da animação.
Como o objetivo de ter mais espaço para implementarmos a bola subindo e descendo, vamos ajustar o padding do body para 15rem:
Além disso, note que o efeito que gostaríamos está relacionado a translações nos eixos x e y, fazendo a bolinha se deslocar em, por exemplo,
200 % do seu tamanho horizontalmente e 100% verticalmente.
Caso quiséssemos visualizar esse efeito, basta adicionar o comando translate da seguinte forma:
Os primeiros elementos que vamos aplicar o conceito de transições, será os elementos da navegação do cabeçalho da Home da
Hashtag, e além de adicionarmos a propriedade transition, também vamos aproveitar para utilizar o Nesting, aninhando os
elementos e classes para obter uma estrutura mais organizada e legível do nosso CSS.
O trecho transition: color ease-in 200ms; aplica uma transição suave à mudança de
cor dos links (a) no cabeçalho de uma lista.
Aqui está o que cada parte faz:
• color: Define que a transição será aplicada à propriedade color, ou seja, à cor do
. texto do link.
Assim, quando a cor do link mudar (por exemplo, ao passar o mouse sobre ele), a
transição será suave, em vez de instantânea, com uma aceleração inicial.
• transition-property: border;:
• Especifica que a transição será aplicada apenas às mudanças na
propriedade border do botão. Isso significa que, quando a borda do
botão for alterada (como em um hover, foco, ou outro estado), a
transição será animada de forma suave, ao longo de 100ms.
• transform: Significa que a transição será ativada sempre que houver uma
alteração na propriedade transform do elemento.
• ease-in: Define que a transição começará devagar e acelerará até o final, criando
um efeito de suavidade ao início da animação.
. • &:hover: Aplica o estilo quando o usuário passa o mouse sobre o elemento .caixa-
postblog.
Resumo do comportamento:
Quando a cor do link (elemento <a>) mudar, essa alteração não será
abrupta. Ao invés disso, haverá uma animação suave, em que a cor se
transforma gradualmente ao longo de 200 milissegundos. O efeito
começa devagar e depois acelera, proporcionando uma transição visual
mais agradável para o usuário.
Explicação da transição:
Módulo 5
RESPONSIVIDADE E OTIMIZAÇÕES
RESPONSIVIDADE E OTIMIZAÇÕES
RESPONSIVIDADE E OTIMIZAÇÕES
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Apresentação do Módulo (1/1) 435
Bem-vindos ao nosso próximo módulo do curso de HTML e CSS. Hoje, vamos mergulhar em um tema fundamental para qualquer
desenvolvedor web: Responsividade.
No mundo atual, onde os dispositivos vêm em diversas formas e tamanhos, é essencial que nossas páginas sejam flexíveis e se
adaptem a diferentes telas, sejam elas de desktop, tablet ou mobile. Ao longo deste módulo, vamos aprender sobre media queries,
uma poderosa ferramenta que nos permite aplicar estilos diferentes com base nas características do dispositivo, como largura da tela.
Falaremos também sobre como construir layouts eficazes que funcionem bem em qualquer formato. Vamos explorar como utilizar
imagens responsivas que se ajustam automaticamente ao tamanho da tela, garantindo uma apresentação visual consistente e
atraente.
Além disso, vamos introduzir o conceito de variáveis no CSS, que facilitam a manutenção e a organização do seu código, permitindo
que você altere rapidamente as cores, tamanhos e outros valores de estilo em um único lugar.
O carregamento de fontes também será um tópico importante, onde discutiremos como otimizar a inclusão de fontes
personalizadas para melhorar o desempenho da sua página. E, claro, não podemos esquecer das otimizações gerais que ajudam a
garantir que sua página carregue rapidamente, proporcionando uma melhor experiência ao usuário.
Por fim, abordaremos o processo de deploy, que é essencial para tornar seu site acessível ao público. Vamos ver como colocar sua
criação na web de forma eficiente e segura.
Prepare-se para uma jornada que vai aprimorar suas habilidades e prepará-lo para criar sites mais modernos, responsivos e prontos
para o futuro! Vamos começar!
Uma media query no CSS é uma técnica que permite aplicar estilos diferentes a um documento com base nas características do
dispositivo que está sendo utilizado para visualizá-lo, como a largura, altura, orientação e resolução da tela. Essa funcionalidade é
fundamental para o desenvolvimento de layouts responsivos, que se adaptam a diferentes tamanhos de tela, garantindo uma
experiência de usuário otimizada em dispositivos variados, como desktops, tablets e smartphones.
Quando aplicamos um estilo no arquivo [Link] sem o uso de media queries, esse estilo é considerado global e será aplicado a
todos os dispositivos, independentemente do tamanho da tela ou de outras características do dispositivo. Isso significa que, se você
definir um estilo para um elemento, ele se manterá ativo em qualquer dispositivo que carregar essa folha de estilo.
Vamos criar um arquivo [Link] adicionando um elemento de título com um texto : Testando, além disso, criaremos um arquivo
[Link] e adicionaremos um estilo para entendermos sobre os conceitos descritos acima:
A estrutura que acabamos de criar utiliza o estilo global, através do [Link] para o nosso elemento <h1>.
• Abrindo o DevTools:
• Pressione F12 ou clique com o botão direito do mouse em qualquer lugar da página e
selecione "Inspecionar". Isso abrirá o painel do DevTools, que geralmente aparece na parte
inferior ou lateral da tela.
• Acessando a Ferramenta de Dimensões Responsivas:
• No DevTools, você verá um ícone que se parece com um dispositivo (geralmente localizado na
parte superior esquerda do painel, com a descrição "Toggle device toolbar" ao passar o mouse
por cima). Clique nesse ícone ou pressione Ctrl + Shift + M (ou Cmd + Shift + M no Mac) para
ativar a visualização responsiva.
• Verificação Imediata: À medida que você altera a largura da tela, o DevTools aplica automaticamente suas media queries definidas
no CSS. Assim, você pode observar como os estilos mudam em tempo real, conforme as condições da media query são atendidas.
• Ajustes e Experimentos: Se você perceber que certos estilos não estão funcionando como desejado em uma tela menor, pode
ajustar diretamente o CSS no painel do DevTools. Clique no elemento desejado e faça alterações nos estilos, como mudar a cor, o
tamanho da fonte ou as margens, e veja imediatamente o resultado na tela.
• Depuração: Caso algo não esteja aparecendo corretamente, você pode inspecionar os elementos e verificar quais estilos estão
sendo aplicados, se estão sendo sobrescritos por outros estilos, e assim por diante.
Benefícios
Utilizar o DevTools e a ferramenta de dimensões responsivas permite que você:
• Teste rapidamente como seu design se adapta a diferentes tamanhos de tela.
• Faça ajustes instantâneos e visualize os efeitos sem precisar recarregar a página ou modificar diretamente o código fonte.
• Melhore a responsividade do seu layout, garantindo que ele funcione bem em qualquer dispositivo.
Essa prática é uma parte essencial do desenvolvimento web moderno, pois nos ajuda a criar sites que não apenas se adaptam, mas
também proporcionam uma ótima experiência para todos os usuários.
Considerações
Uma media query é escrita utilizando a regra @media, seguida de uma condição que define quais características do dispositivo serão
consideradas. Os estilos dentro da media query são aplicados apenas se as condições especificadas forem atendidas.
A sintaxe @media media-type and condition é uma parte fundamental do CSS para aplicar estilos de forma condicional, dependendo
das características do dispositivo ou da janela do navegador. Essa abordagem é essencial para a construção de layouts responsivos,
permitindo que você ajuste a aparência de sua página em diferentes tamanhos de tela e tipos de dispositivos.
Componentes da Sintaxe
• @media:
• É a regra que inicia a media query. Ela informa ao navegador que as regras CSS dentro de seu bloco só devem ser aplicadas se as
condições especificadas forem atendidas.
• media-type:
• Especifica o tipo de mídia ao qual a regra se aplica. Os tipos de mídia mais comuns são:
• all: Para todos os dispositivos (padrão).
• screen: Para dispositivos com tela, como monitores e smartphones.
• print: Para impressão.
• speech: Para dispositivos que utilizam síntese de voz.
Você pode também não especificar um media-type, caso a media query seja aplicável a todos os tipos.
• and:
• Este operador permite combinar múltiplas condições. Se você usar and, a media query será aplicada apenas se todas as condições
especificadas forem verdadeiras.
• condition:
• Refere-se às características específicas do dispositivo, como largura da tela, altura, orientação, resolução, entre outras. Aqui estão
alguns exemplos comuns:
landscape:
• Refere-se a uma tela que está na orientação horizontal. Isso significa que a largura da tela é maior que a altura.
• Normalmente, essa orientação é comum em dispositivos como laptops e desktops, além de quando os smartphones ou tablets
são girados de lado.
portrait:
• Refere-se a uma tela que está na orientação vertical. Isso significa que a altura da tela é maior que a largura.
• É a orientação padrão para a maioria dos smartphones e tablets quando mantidos na posição vertical.
Desktop First é uma abordagem em que você começa a desenvolver o design e o CSS para telas grandes (como desktops) e, em
seguida, aplica ajustes para telas menores (como tablets e smartphones). Aqui estão algumas características dessa abordagem:
Vantagens:
• Complexidade Inicial: Muitas vezes, os sites são projetados inicialmente para telas grandes, onde você pode incluir mais
elementos e complexidade visual.
• Recursos Visuais: Facilita o uso de gráficos e elementos que são mais adequados para telas grandes.
Desvantagens:
• Dificuldade em Simplificar: Às vezes, pode ser difícil simplificar o design à medida que você desce para tamanhos menores.
• Desperdício de Recursos: Pode resultar em uma carga maior de recursos em dispositivos móveis, que podem não ser tão
potentes quanto os desktops.
Mobile First é uma abordagem em que você começa a desenvolver o design e o CSS para telas pequenas (como smartphones) e,
em seguida, expande para telas maiores (como desktops). Essa abordagem é cada vez mais popular devido ao aumento do uso de
dispositivos móveis. Veja algumas características:
Vantagens:
• Foco na Usabilidade: Ao começar pelo mobile, você é forçado a priorizar a usabilidade e a simplicidade, criando uma experiência
mais fluida para usuários de dispositivos móveis.
• Carregamento Otimizado: Os sites geralmente carregam mais rápido em dispositivos móveis, pois você pode focar em recursos
mínimos.
• Melhor Performance: Reduz o risco de sobrecarregar a versão móvel com recursos desnecessários, levando a uma experiência
mais leve e responsiva.
Desvantagens:
• Limitações de Design Inicial: Você pode sentir que a criatividade é limitada no início, já que os elementos precisam ser mais
simples.
• Adição de Complexidade: À medida que você vai para telas maiores, pode ser um desafio adicionar elementos sem tornar o
design confuso.
Conclusão
A escolha entre desktop first e mobile first depende do seu público-alvo e das necessidades do projeto. Ambas as abordagens têm
seus prós e contras, e entender o contexto em que seu site será usado pode ajudar a tomar a melhor decisão. Se você prioriza a
experiência móvel e uma performance otimizada, mobile first pode ser a melhor escolha. Por outro lado, se o foco é em layouts
complexos e recursos visuais, desktop first pode ser mais adequado.
Independentemente da abordagem que você escolher, a chave para um design responsivo eficaz é testar continuamente em
diferentes dispositivos e tamanhos de tela!
Tradicionalmente, considerávamos apenas três tamanhos de tela principais: desktop, tablet e mobile. Essa abordagem se
concentrava em apenas duas pontos de quebra (breakpoints) que permitiam aos desenvolvedores ajustar o layout de um site. O
primeiro breakpoint geralmente era definido para telas de desktop, com uma largura mínima de cerca de 1024 pixels, enquanto o
segundo breakpoint era voltado para dispositivos móveis, tipicamente em torno de 768 pixels.
Limitantes e Oportunidades
Essa estrutura rígida trazia limitações consideráveis. Os desenvolvedores eram forçados a pensar em soluções que funcionassem
para apenas um número limitado de situações. As técnicas de design responsivo na época se baseavam em media queries simples
e no uso de floats para criar layouts. O CSS era utilizado principalmente para ajustar estilos, mas sem a flexibilidade que temos hoje.
Ainda assim, essa abordagem inicial foi crucial para o desenvolvimento da web, pois estabeleceu os fundamentos da responsividade.
Aprendemos a importância de criar experiências de usuário consistentes em diferentes dispositivos, mesmo que isso significasse
enfrentar desafios e limitações. Essa era uma época em que a criatividade e a adaptação eram essenciais para atender às
necessidades de uma audiência crescente e diversificada.
Com o avanço da tecnologia e o aumento da diversidade de dispositivos e tamanhos de tela, a responsividade evoluiu
significativamente. Hoje, não apenas temos uma variedade infinita de dispositivos, mas também ferramentas e técnicas sofisticadas
que nos permitem criar experiências web fluidas e adaptáveis para qualquer situação. Mas a jornada que começamos, com apenas
três telas e dois breakpoints, foi fundamental para moldar o que conhecemos como design responsivo moderno!
Hoje, a criação de sites responsivos é uma parte essencial do desenvolvimento web. Com uma vasta gama de dispositivos, cada um
com suas próprias dimensões e resoluções, os desenvolvedores precisam adotar abordagens mais dinâmicas e flexíveis do que
nunca. Uma das principais práticas atuais é o uso de media queries em conjunto com técnicas de design flexível, como flexbox e
grid.
Uma das etapas cruciais no processo de desenvolvimento responsivo é testar o layout do site em diversos dispositivos e tamanhos
de tela. Os desenvolvedores frequentemente utilizam as ferramentas de desenvolvedor dos navegadores, acessíveis através do
atalho F12, que oferecem uma funcionalidade chamada Responsive Design Mode. Essa ferramenta permite que você simule como
seu site se comporta em diferentes tamanhos de tela, desde dispositivos móveis a desktops.
Ao diminuir a largura da tela no modo responsivo, os desenvolvedores podem observar onde o layout começa a "quebrar". Esse
processo envolve:
• Monitoramento Atento: À medida que a largura da tela é reduzida, os desenvolvedores devem observar cuidadosamente a
aparência e a usabilidade do site. Eles prestam atenção a elementos que se sobrepõem, que ficam cortados ou que não se
alinham corretamente.
• Identificação de Problemas: Às vezes, à medida que a tela encolhe, alguns componentes do site, como imagens, textos ou
botões, podem não se comportar como esperado. É fundamental identificar esses pontos de quebra e resolvê-los.
• Ajuste com Media Queries: Uma vez identificadas as quebras, os desenvolvedores usam media queries para aplicar estilos
específicos a diferentes tamanhos de tela. Por exemplo, pode-se definir um estilo para telas de 768 pixels e outro para telas de 480
pixels.
• Meta Mínima de 320 Pixels: Para garantir que o site seja 100% responsivo, é importante projetá-lo para funcionar em telas de 320
pixels de largura, que é uma das dimensões mais comuns para smartphones. Isso garante que, mesmo em dispositivos menores,
a experiência do usuário permaneça suave e acessível.
A responsividade hoje não é apenas uma opção, mas uma necessidade no desenvolvimento web. O processo de ajustar layouts e
testar em diferentes tamanhos de tela, especialmente ao monitorar como os elementos se comportam ao reduzir a largura, é
fundamental para criar experiências de usuário consistentes e agradáveis. Com as ferramentas modernas e as práticas de design
responsivo, os desenvolvedores têm à disposição uma gama de recursos que lhes permite criar sites que não apenas funcionam
bem em qualquer dispositivo, mas também se destacam em uma variedade de contextos e configurações.
Além de ajustar o layout, otimizar o tamanho dos arquivos de imagem também é uma preocupação central. Cada imagem que
você carrega em sua página possui um tamanho em kilobytes (KB) ou megabytes (MB), o que afeta diretamente o tempo de
carregamento e a performance do site. Imagens grandes podem tornar o site mais lento, principalmente em conexões móveis, o
que impacta negativamente a experiência do usuário.
Nessa aula vamos utilizar a imagem de fundo da HOME da Hashtag. E podemos verificar as caracerísticas dela ao passar o
mouse por cima de sua url com o inspecionar.
• Uso de Várias Resoluções: Para garantir que suas imagens sejam adequadas a diferentes dispositivos, você pode usar a técnica
de fornecer diferentes versões da mesma imagem para diferentes breakpoints. Isso evita carregar uma imagem de alta
resolução em dispositivos com telas menores, economizando largura de banda e tempo de carregamento.
• Atributos HTML como srcset e sizes: Esses atributos na tag <img> ajudam a carregar automaticamente a melhor versão da
imagem, com base no tamanho da tela do usuário. Assim, você pode garantir que uma imagem menor seja carregada em um
celular, enquanto uma imagem de maior resolução é exibida em um desktop.
• Otimização de Arquivos: Use formatos de imagem mais leves e modernos, como WebP, ou ferramentas de compressão para
reduzir o tamanho dos arquivos sem sacrificar a qualidade visual.
• Considerar o Contexto: Em breakpoints menores, você pode exibir imagens com menos detalhes, ajustando a qualidade e o
tamanho conforme necessário. Isso evita desperdício de dados e melhora a navegação em dispositivos móveis.
O Device Pixel Ratio (DPR) é uma medida que expressa a relação entre os pixels físicos da tela de um dispositivo e os pixels lógicos
que você utiliza no desenvolvimento web (como os definidos em CSS). Em outras palavras, o DPR indica quantos pixels físicos
correspondem a um único pixel lógico na tela.
• Pixels Lógicos: São os pixels que você define em seu código, como as dimensões de um elemento em CSS. Por exemplo, se você
define a largura de um elemento como 100 pixels, isso se refere a 100 pixels lógicos.
• Pixels Físicos: São os pixels reais na tela do dispositivo. Por exemplo, um dispositivo com alta densidade de pixels terá mais pixels
físicos em um espaço menor.
Exemplo Prático
• DPR de 1: Um pixel lógico é igual a um pixel físico. Isso é comum em telas padrão, como a maioria dos monitores de desktop.
• Visualização: Se você define uma imagem de 100x100 pixels em CSS, ela ocupa 100x100 pixels físicos na tela.
• DPR de 2: Um pixel lógico é igual a 2 pixels físicos na largura e 2 pixels físicos na altura.
• Visualização: Em um dispositivo com DPR de 2, uma imagem definida como 100x100 pixels em CSS ocupará 200x200 pixels
físicos na tela, resultando em uma imagem mais nítida e detalhada.
• DPR de 3: Um pixel lógico é igual a 3 pixels físicos na largura e 3 pixels físicos na altura.
• Visualização: Uma imagem de 100x100 pixels em CSS será exibida como 300x300 pixels físicos.
• Qualidade da Imagem: Com o aumento do uso de dispositivos de alta resolução, como smartphones e tablets, o DPR se tornou
um aspecto crucial para garantir que as imagens e os elementos gráficos sejam exibidos de forma nítida e clara.
• Design Responsivo: Compreender o DPR ajuda os desenvolvedores a criar layouts responsivos que se adaptam a diferentes
dispositivos e resoluções, proporcionando uma experiência de usuário otimizada.
• Desenvolvimento de Aplicativos: Para desenvolvedores de aplicativos, o DPR é essencial para garantir que os elementos da
interface do usuário sejam dimensionados corretamente em diferentes dispositivos.
Ter três telas com o mesmo tamanho físico, mas com diferentes resoluções e valores de Device Pixel Ratio (DPR), é um conceito
importante para entender como a qualidade visual e a experiência do usuário podem variar em dispositivos que parecem idênticos à
primeira vista. Vamos explorar como isso funciona.
• Qualidade da Imagem:
• Uma tela com alta resolução e um DPR maior proporciona uma qualidade de imagem superior. Isso é especialmente importante
para aplicações gráficas, design de interface e visualização de imagens, onde os detalhes são cruciais.
• Experiência do Usuário:
• A experiência do usuário pode ser afetada por como o conteúdo é exibido. Em uma tela de baixa resolução, textos e imagens
podem parecer desfocados ou pixelizados, o que pode dificultar a leitura e a interação. Em contraste, telas de alta resolução
melhoram a clareza, tornando a navegação mais agradável.
• Desenvolvimento Responsivo:
• Para desenvolvedores, entender as diferenças de DPR é essencial para criar layouts responsivos que se adaptem a diferentes
dispositivos. É fundamental utilizar imagens de alta qualidade e considerar o DPR ao definir tamanhos em CSS, para garantir que
o conteúdo seja exibido corretamente em todas as telas.
Conclusão
Ter três telas com o mesmo tamanho físico, mas com diferentes resoluções e DPRs, ilustra como a qualidade visual pode variar
enormemente. Isso é relevante para designers, desenvolvedores e usuários, pois determina como o conteúdo é percebido e
como ele deve ser projetado para cada tipo de dispositivo. Com o crescente uso de dispositivos móveis e telas de alta resolução,
considerar o DPR é uma parte fundamental do desenvolvimento web moderno.
Quando você passa o mouse sobre o atributo src da tag <img>, o que está sendo destacado é o URL da imagem que será carregada.
Esse atributo é obrigatório no elemento <img>. Nos navegadores que suportam srcset, o src é tratado como uma imagem candidata
com uma densidade de pixels padrão de 1x (ou seja, a imagem será usada para dispositivos com densidade de pixels normal) a
menos que o srcset defina uma imagem específica com essa densidade ou contenha descritores de largura (w).
Em resumo:
• src é o fallback para a imagem se o srcset não for suportado.
• Nos navegadores que suportam srcset, o src será usado para dispositivos com densidade de 1x, a menos que uma opção mais
adequada seja definida no srcset.
• O atributo src define a imagem padrão que será carregada (neste caso, [Link]).
• O atributo srcset="Imagens/[Link] 2x" define uma versão de maior resolução (duas vezes a densidade de pixels). Se o
dispositivo tiver uma densidade de pixels 2x, o navegador irá carregar essa imagem ([Link]) para manter a qualidade
visual.
Isso é útil para garantir que imagens sejam exibidas com alta qualidade em dispositivos com telas de alta densidade, como
smartphones modernos.
As estruturas de tamanho de tela, como o srcset e sizes, devem ser definidas no HTML e não no CSS por várias razões:
• Carregamento Otimizado: O HTML permite que o navegador decida qual imagem carregar antes mesmo de renderizar a página.
Isso evita o download desnecessário de imagens grandes que podem não ser necessárias em telas menores.
• Peso Inicial da Imagem: Ao definir as imagens diretamente no HTML, você garante que apenas a imagem apropriada para a tela
do usuário seja baixada, reduzindo o peso da página e melhorando o tempo de carregamento.
• Acessibilidade: Imagens definidas no HTML permitem que o conteúdo seja mais acessível, especialmente em dispositivos móveis,
onde a largura da tela pode variar significativamente.
Portanto, usar o HTML para essas configurações é essencial para a eficiência e a performance da página.
• Flexibilidade: Com <picture>, é possível definir várias fontes de imagem, garantindo que a mais apropriada para cada situação
seja carregada. Isso não só melhora a performance, mas também a estética do design, pois permite a escolha de composições
visuais que se adaptam melhor a diferentes formatos de tela.
• Eficiência no Carregamento: Ao usar <img>, a mesma imagem pode ser carregada em diferentes tamanhos, o que pode levar ao
desperdício de largura de banda, especialmente em dispositivos menores. Já a tag <picture> permite que imagens totalmente
diferentes sejam utilizadas, evitando o download de arquivos pesados que não são necessários para determinadas resoluções.
Essas abordagens garantem uma experiência visual mais rica e eficiente para os usuários, otimizando tanto a estética quanto a
funcionalidade das páginas web.
Sintaxe e Funcionamento:
• Estrutura: A tag <picture> envolve uma ou mais tags <source> e, opcionalmente, uma tag <img>. Cada <source> pode ter
atributos como media (para condições de mídia) e srcset (para especificar diferentes arquivos de imagem).
• Processo: O navegador avalia as condições especificadas nas tags <source> e carrega a primeira imagem que atende aos critérios.
A tag <img> serve como um fallback, garantindo que uma imagem sempre seja exibida, mesmo que nenhuma condição seja
atendida.
• background-image:
• Define uma imagem de fundo para a div. Neste caso, a imagem banner-
[Link] é aplicada como fundo.
• Usamos essa abordagem quando a imagem faz parte do design de fundo
e não do conteúdo principal da página, diferente de quando inserimos
imagens diretamente no HTML com <img>.
• background-position: 50%:
• Define o posicionamento da imagem de fundo dentro da div.
• A 50% centraliza a imagem tanto horizontal quanto verticalmente.
• Isso é útil para garantir que a parte central da imagem seja visível,
especialmente se a imagem for cortada devido ao background-size
• .
• background-size: cover:
• Faz com que a imagem de fundo cubra toda a área da div, mantendo a
proporção da imagem.
• Ou seja, a imagem será ajustada para cobrir a área sem distorcer suas
dimensões, mas parte dela pode ser cortada (dependendo do tamanho da
div).
• Isso garante que, independentemente do tamanho da tela ou janela, a
imagem sempre preencha completamente o espaço, criando um design
responsivo.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Imagens responsivas – CSS (2/8) 469
• height: 471px:
• Define a altura da div. Sem essa propriedade, a div não teria altura, então a imagem de fundo não seria exibida.
• Diferente de uma imagem inserida com <img>, que tem suas próprias dimensões, uma div só ocupa espaço se você definir suas
dimensões ou se houver conteúdo dentro dela.
• Portanto, ao especificar a altura, você garante que a div terá uma área visível onde a imagem de fundo será aplicada.
• Uma div vazia (sem conteúdo dentro) não tem altura por padrão, ou seja, seu tamanho é 0px, então, mesmo que você aplique
uma imagem de fundo, ela não será visível, porque a div tecnicamente não tem espaço.
• Definir um height garante que a div tenha espaço onde a imagem de fundo possa ser exibida.
• No HTML, podemos usar <img> e controlar a responsividade com atributos como srcset e sizes para adaptar diferentes imagens a diferentes
resoluções.
• Quando usamos CSS para manipular uma imagem de fundo, temos controle total sobre o seu comportamento, estilo, e posicionamento, mas
não podemos modificar o tamanho da imagem conforme o dispositivo diretamente, como fazemos com srcset.
Se o objetivo for usar imagens como parte do layout visual (não conteúdo), essa abordagem com background-image e propriedades CSS é mais
apropriada.
A condição -webkit-min-device-pixel-ratio: 2 usada dentro de uma media query se refere à densidade de pixels de um dispositivo e
é especificamente voltada para dispositivos que utilizam o motor de renderização WebKit, que é o motor por trás de navegadores
como o Safari (em iPhones e iPads) e versões anteriores do Chrome e Opera.
Vamos entender cada parte: -webkit-min-device-pixel-ratio: 2:
• -webkit:
• Esse é um prefixo específico para navegadores que utilizam o motor WebKit (principalmente dispositivos da Apple e algumas
versões de navegadores antigos). Ele foi necessário em uma época em que certas funcionalidades CSS eram implementadas de
forma experimental ou específica em navegadores como Safari e Chrome. Hoje em dia, muitos navegadores já suportam essa
funcionalidade sem o prefixo.
• min-device-pixel-ratio:
• Refere-se à relação de pixels do dispositivo. Essa propriedade mede a quantidade de pixels físicos (no hardware) em relação aos
pixels lógicos (no CSS).
• Um valor de 2 significa que o dispositivo tem uma alta densidade de pixels, também conhecido como tela retina (ou seja, para
cada pixel que o CSS define, o dispositivo usa 2 pixels físicos).
• Em termos simples, dispositivos com min-device-pixel-ratio: 2 têm telas mais nítidas e com maior resolução, como muitos
smartphones modernos e monitores de alta definição.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Imagens responsivas – CSS (5/8) 472
2:
• O valor 2 indica que o dispositivo possui pelo menos o dobro de pixels físicos para cada pixel CSS. Isso é comum em
dispositivos com telas de alta resolução, como iPhones, iPads e outros dispositivos com telas retina.
Quando usar?
• A media query com -webkit-min-device-pixel-ratio: 2 é usada para aplicar estilos específicos em dispositivos com telas de
alta densidade, como substituir imagens por versões de maior resolução. Isso garante que as imagens e gráficos fiquem nítidos
em dispositivos modernos com telas de alta qualidade.
Por exemplo, no código fornecido, carrega uma versão de alta resolução da imagem ([Link]) quando o dispositivo tem uma
densidade de pixels de 2 ou mais, garantindo que a imagem pareça nítida em telas de alta definição.
Uma outra forma que podemos criar responsidade da nossa imagem dentro do nosso CSS é a seguinte estrutura:
1. background-image: -webkit-image-set(...):
• -webkit-image-set é uma propriedade específica para navegadores que utilizam o motor WebKit (como o Safari e algumas
versões anteriores do Chrome e Opera).
• A função image-set() permite definir várias resoluções da mesma imagem para diferentes densidades de pixel. Isso é útil para
garantir que dispositivos com telas de alta densidade (como telas retina) carreguem uma imagem de maior qualidade,
enquanto dispositivos com resoluções mais baixas carreguem uma versão menor e mais leve.
• "Imagens/[Link]" 1x define a imagem a ser usada em dispositivos com uma densidade de 1x, ou seja, uma
densidade de pixel padrão (dispositivos com tela comum).
• "Imagens/[Link]" 2x define a imagem a ser usada em dispositivos com densidade de 2x ou maior, como telas retina,
que possuem uma maior densidade de pixels por polegada (ppp).
Isso permite carregar a versão adequada da imagem para cada tipo de dispositivo, otimizando o tempo de carregamento e
garantindo uma boa qualidade visual.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Imagens responsivas – CSS (7/8) 474
2. background-image: image-set(...):
• image-set() é a versão padrão (sem o prefixo -webkit) e funciona em navegadores modernos que suportam essa funcionalidade
sem a necessidade de um prefixo específico.
• A lógica é a mesma do -webkit-image-set, mas é uma implementação mais amplamente suportada. Com essa propriedade,
navegadores modernos poderão entender e aplicar a seleção de imagens correta conforme a densidade de pixels do dispositivo.
O comportamento é idêntico ao de -webkit-image-set(), mas é aplicável a navegadores modernos como o Chrome, Firefox, Edge e
outros que suportam a funcionalidade padrão de image-set(). Ele carrega a versão 1x (baixa densidade) ou 2x (alta densidade) da
imagem dependendo do dispositivo.
• Ambas as funções (-webkit-image-set e image-set) permitem que você defina múltiplas versões da imagem e o navegador
escolhe qual versão carregar com base na densidade de pixels da tela do dispositivo.
• Isso é importante para otimização de performance e qualidade visual:
• Dispositivos com telas normais (1x): Carregam a versão padrão da imagem, que é mais leve e consome menos recursos.
• Dispositivos com telas de alta densidade (2x): Carregam a versão de alta resolução da imagem, garantindo que ela seja
exibida com nitidez.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Imagens responsivas – CSS (8/8) 475
• Performance: Em dispositivos com telas de menor resolução, carregar uma imagem menor (como a versão 1x) reduz o uso de
banda e acelera o carregamento da página.
• Qualidade visual: Em dispositivos de alta resolução (como smartphones modernos), carregar uma imagem maior (como a
versão 2x) garante que ela seja exibida com alta nitidez, sem ficar pixelada ou desfocada.
Aplicação prática:
Se você deseja que seu site funcione bem tanto em telas de alta densidade (como as telas retina da Apple) quanto em telas
normais, usar image-set() permite ajustar automaticamente a qualidade da imagem de acordo com o dispositivo, sem a
necessidade de criar media queries complexas.
Variáveis em CSS são uma forma de armazenar valores reutilizáveis, como cores, tamanhos, espaçamentos, etc., que podem ser
usados várias vezes no código. Elas permitem manter o estilo do site mais organizado, fácil de manter e modificar, principalmente
quando há a necessidade de aplicar as mesmas propriedades em vários lugares. No CSS, as variáveis são chamadas de Custom
Properties.
A utilidade das variáveis em CSS está diretamente ligada a facilitar a manutenção, a organização, a consistência e a flexibilidade do
código. Vou listar as principais utilidades com mais detalhes:
1. Facilidade na Manutenção
• Alteração rápida: Se você definir uma cor, um tamanho ou um espaçamento como uma variável, poderá alterar o valor em um
único lugar e ele será refletido em todas as partes do site onde a variável foi usada. Isso economiza tempo, especialmente em
projetos grandes, pois não é necessário alterar cada instância manualmente.
2. Coerência no Design
• Uniformidade: Variáveis garantem que o mesmo valor seja usado consistentemente em várias partes do código. Isso evita que
diferentes valores semelhantes (como tons de cor ligeiramente diferentes) sejam acidentalmente aplicados em diferentes
elementos, mantendo um design coerente.
3. Reutilização de Código
• Evita repetição: Variáveis ajudam a evitar a repetição de valores no CSS, tornando o código mais limpo e legível. Ao reutilizar
variáveis, você centraliza valores comuns, o que facilita a manutenção.
7. Flexibilidade e Escalabilidade
• Adaptabilidade: À medida que seu projeto cresce, o uso de variáveis torna o código mais escalável, permitindo que você
adicione novos valores ou altere os existentes sem se preocupar em quebrar o layout geral do site.
1. :root
• O que é?: :root é um seletor CSS que se refere ao elemento raiz do documento, ou seja, o elemento <html>. Qualquer variável
definida dentro do :root estará disponível globalmente, em qualquer parte do CSS.
• Por que usar?: Isso é útil para garantir que as variáveis possam ser acessadas e reutilizadas em todo o arquivo CSS, o que
facilita a manutenção e a coerência do design.
--azul: #0588c4;
• Esta variável representa uma cor azul. O valor hexadecimal #0588c4 é um tom específico de azul.
• Pode ser usada para definir a cor de fundo, bordas, textos ou qualquer outra propriedade que aceite cores.
--azul-claro: #78d4ff;
• Esta variável armazena uma cor azul mais clara, que pode ser usada em contraste com o azul mais escuro para destacar
elementos ou criar hierarquia visual.
--azul-escuro: #035276;
• Esta variável contém uma cor azul mais escura. Normalmente, tons escuros são usados para enfatizar ou dar contraste em
relação a outros elementos de cores mais claras.
--laranja-avermelhado: #c44105;
• Esta variável define uma cor laranja avermelhada. Pode ser usada para chamar a atenção, como em botões ou alertas, já que
tons de vermelho ou laranja costumam destacar mais elementos.
--propriedade-box: border-box;
• Aqui, você está armazenando a propriedade border-box, que é um valor comum da propriedade box-sizing. Isso pode ser útil
se você deseja reutilizar essa propriedade em diferentes elementos de forma consistente.
• O valor border-box define que a largura e a altura de um elemento incluem o padding e a borda, facilitando o controle do
tamanho dos elementos no layout.
Sintaxe básica:
Fontes seguras para a web, (ou web-safe fonts), são aquelas que, historicamente, são amplamente suportadas pela maioria dos
sistemas operacionais e navegadores. Essas fontes, como Arial, Times New Roman e Verdana, estão pré-instaladas na maioria dos
dispositivos, o que permite seu uso sem precisar importá-las ou fornecê-las via link no HTML ou CSS.
No desenvolvimento de sites, você pode perceber que nem todas as fontes precisam ser importadas no CSS, como é o caso de
fontes como Arial, Verdana e Montserrat. Isso acontece por dois motivos principais: fontes "sistema" e fontes "web".
1. Fontes do Sistema
Fontes como Arial, Verdana e Times New Roman são chamadas de fontes do sistema. Elas vêm pré-instaladas na maioria dos
sistemas operacionais (Windows, macOS, Linux) e, por isso, não precisam ser baixadas ou carregadas da internet. Quando você
usa uma dessas fontes no CSS, como font-family: Arial;, o navegador verifica se essa fonte já está instalada no sistema do usuário.
Se estiver, ela é aplicada imediatamente.
Essa abordagem é muito eficiente, pois não há necessidade de solicitar recursos adicionais (como arquivos de fonte) do servidor,
tornando o carregamento do site mais rápido.
2. Fontes Web
Por outro lado, fontes como Montserrat ou Roboto são chamadas de fontes web. Elas não vêm instaladas no sistema da maioria
dos usuários. Por isso, para usar essas fontes, é necessário "importá-las" de um serviço de hospedagem de fontes (como o Google
Fonts), ou incluir os arquivos de fonte no próprio projeto. A importação é feita no CSS com a regra @import ou a inclusão direta
em HTML via <link>.
Assim como com imagens, você pode baixar a fonte Roboto em arquivos de formato específico (como .ttf ou .woff) e armazená-la
na pasta do seu projeto. Em seguida, você pode referenciar esses arquivos no seu CSS usando a regra @font-face. Isso permite
que a fonte seja carregada diretamente do seu servidor, sem depender de links externos.
Depois de selecionar, você irá clicar no ícone de "sacola", para conseguir verificar os
tipos de importação e como você importa a fonte selecionado para dentro do seu
projeto.
Quando você importa uma fonte usando um link no HTML, seu navegador está basicamente fazendo uma solicitação para pegar
o arquivo de fonte hospedado em um servidor externo (como o Google Fonts). Vamos entender como esse processo acontece e
como o navegador consegue “buscar” a fonte na API do Google Fonts.
O uso de preconnect com servidores de fontes (como [Link] e [Link]) é uma estratégia para melhorar
a velocidade do carregamento de páginas. Ele ajuda a reduzir o tempo que o navegador gasta esperando para estabelecer
conexões e buscar recursos, resultando em uma melhor experiência de usuário, especialmente quando se trata de fontes
externas.
2. href="[Link]
A propriedade href contém o URL onde a folha de estilo com a definição da fonte Roboto pode ser encontrada. O Google Fonts
gera esse link automaticamente quando você seleciona uma fonte e suas variantes no site. Vamos entender o que cada parte
dessa URL representa:
• [Link] Este é o domínio que hospeda a API do Google Fonts. É o serviço onde as fontes são
armazenadas e distribuídas para a web.
• /css2?family=Roboto: Isso especifica que você está solicitando a fonte da família "Roboto".
• ital,wght@0,400;0,700;1,400: Esta parte é um pouco mais detalhada e define as variantes da fonte que você deseja carregar:
No exemplo:
• 0,400: Refere-se ao estilo não-itálico (0 significa normal) com peso 400 (que é o peso normal).
• 0,700: Refere-se ao estilo não-itálico (0 significa normal) com peso 700 (que é negrito).
• 1,400: Refere-se ao estilo itálico (1 significa itálico) com peso 400.
Essas combinações permitem que você defina quais variações da fonte Roboto você quer carregar no seu projeto.
4. &display=swap
O parâmetro display=swap faz parte da estratégia de renderização de fontes e define como a fonte será exibida no seu site
enquanto ela está sendo carregada. Isso afeta o comportamento do texto durante o carregamento da fonte.
• swap: Com essa opção, o navegador usará uma fonte de fallback (uma fonte padrão do sistema) enquanto a fonte Roboto está
sendo baixada. Assim que a fonte Roboto estiver disponível, o navegador substitui a fonte de fallback pela Roboto. Isso evita que o
texto fique invisível enquanto a fonte está sendo carregada, o que é chamado de "flash of invisible text" (FOIT).
Quando estamos lidando com fontes personalizadas em um site, existem duas formas principais de incluí-las: usando o <link> no
HTML ou usando a regra @font-face no CSS. Ambas são eficientes, mas funcionam de maneiras diferentes e têm vantagens em
contextos específicos.
Como funciona:
• @font-face: Esta regra permite que você defina fontes personalizadas diretamente no seu arquivo CSS.
• font-family: "MinhaRoboto": Você está criando um nome personalizado para a fonte que será usada no CSS. Nesse caso, o nome da
sua fonte será "MinhaRoboto".
• font-weight: 400: Define o peso (espessura) da fonte. O peso 400 é o padrão (normal).
• font-display: swap: Assim como no método do Google Fonts, essa propriedade define que uma fonte de fallback será usada até que
a fonte personalizada seja carregada.
• src: Define a origem da fonte. Existem algumas opções aqui:
• local("Roboto"): Tenta carregar a fonte localmente do sistema do usuário (se ele já tiver a fonte Roboto instalada no computador).
• url([Link] Caso a fonte não esteja disponível localmente, ela será carregada de um
servidor externo, a partir de um arquivo .ttf (TrueType Font).
Vantagens:
• Controle total: Você tem mais flexibilidade, pois pode escolher onde os arquivos da fonte estão hospedados, como os arquivos serão
carregados, e até definir formatos diferentes para diferentes navegadores.
• Personalização: Ideal quando você precisa usar fontes personalizadas ou exclusivas que não estão disponíveis em bibliotecas como
o Google Fonts.
• Fallback local: A estrutura local() permite que o navegador utilize uma fonte já instalada no dispositivo do usuário, o que pode
melhorar o desempenho.
Quando usar:
• Quando a fonte não está em um serviço online: Se você tiver uma fonte personalizada ou quiser usar uma fonte não disponível no
Google Fonts, a regra @font-face permite adicionar a fonte diretamente.
• Quando você quer hospedar as fontes: Se você deseja controlar onde a fonte é hospedada (em seu próprio servidor, por exemplo),
essa é a melhor abordagem.
As fontes variáveis do Google Fonts são uma tecnologia avançada de fontes que permite que uma única fonte contenha múltiplas
variações de estilo e peso, em vez de ter que carregar várias fontes diferentes para cada variação que você deseja usar. Isso é feito
através da utilização de um formato de fonte OpenType chamado OpenType Font Variations.
• Interpolação:
• As fontes variáveis permitem a interpolação entre estilos. Por exemplo, você pode usar valores que vão de um peso 100 (muito leve)
até um peso 900 (muito grosso) simplesmente ajustando uma propriedade no CSS, como font-weight. Isso significa que, em vez de
precisar de um arquivo separado para cada peso, você pode gerar pesos intermediários.
• Flexibilidade:
• As fontes variáveis oferecem uma flexibilidade incrível em design, permitindo que os desenvolvedores e designers ajustem a
espessura, largura e outros atributos da fonte com precisão. Isso é especialmente útil em layouts responsivos, onde o estilo da fonte
pode ser ajustado de acordo com o tamanho da tela.
• Eficiência de carregamento: Carregamento mais rápido devido à redução do número de arquivos de fonte.
• Aprimoramento do design: Os designers têm mais liberdade para experimentar com diferentes estilos e pesos sem a necessidade
de múltiplas fontes.
• Suporte para personalização: Proporciona uma experiência mais rica para os usuários, permitindo que a tipografia se adapte ao
contexto e ao design do site.
Na tipografia web, o uso de classes CSS para definir estilos de fontes é uma prática comum. Vamos entender como criar uma classe
CSS para a fonte Montserrat, que é uma fonte variável, permitindo a personalização do seu estilo e peso.
Estrutura da Classe CSS
Aqui está a estrutura da classe CSS que vamos analisar:
Componentes da Classe
• font-optical-sizing: auto;:
• Essa propriedade é usada para controlar como a fonte é renderizada em diferentes tamanhos. O valor auto permite que o
navegador ajuste automaticamente o estilo da fonte para otimizar a legibilidade com base no tamanho do texto. É uma
funcionalidade útil para garantir que o texto fique bonito e fácil de ler, independentemente de onde for exibido.
• font-weight: <weight>;:
• Aqui, <weight> é um valor que varia de 100 a 900, representando a espessura da fonte. Por exemplo:
• font-weight: 400; representa um peso normal.
• font-weight: 700; representa um peso negrito.
• Isso permite que você tenha diferentes espessuras da mesma fonte Montserrat, aumentando a flexibilidade do design.
• font-style: normal;:
• Esta propriedade define o estilo da fonte. O valor normal indica que o texto deve ser renderizado em estilo normal, sem itálico ou
outros efeitos. Se você quisesse usar itálico, poderia definir como font-style: italic;.
O Que É Font-Stacking?
Font-stacking refere-se à prática de especificar uma série de fontes em uma declaração CSS, em uma ordem de preferência. Quando
um navegador renderiza uma página, ele tenta carregar a primeira fonte da lista. Se essa fonte não estiver disponível, o navegador
passa para a próxima fonte e assim por diante, até encontrar uma fonte que possa ser utilizada.
Neste exemplo, o navegador tentará primeiro usar Roboto. Se Roboto não estiver disponível, ele tentará Helvetica Neue. Se essa
também não estiver disponível, passará para Arial e, finalmente, para qualquer fonte sans-serif disponível no sistema.
Análise da Declaração
-apple-system:
• Essa é uma fonte específica para sistemas da Apple (macOS e iOS). Ela é utilizada para renderizar texto em dispositivos Apple de
maneira que se integre ao estilo do sistema operacional. Ao usar essa fonte, você garante que o texto tenha um visual nativo em
dispositivos Apple.
BlinkMacSystemFont:
• Esta fonte é usada principalmente em sistemas macOS executando o navegador Google Chrome. É uma forma de garantir que o
texto seja renderizado usando a fonte do sistema macOS no Chrome.
"Segoe UI":
• Esta é a fonte padrão usada no sistema operacional Windows. É uma fonte sans-serif bem legível e comumente utilizada em
interfaces de usuário. Incluí-la na pilha de fontes assegura que o texto será exibido com uma fonte familiar para usuários de
Windows.
Roboto:
• Roboto é uma fonte popular desenvolvida pelo Google, muito utilizada em aplicativos e na web. É uma fonte sans-serif que oferece
um design moderno e é facilmente legível. Sua inclusão na lista garante que, se nenhuma das fontes anteriores estiver disponível,
Roboto será utilizada. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Font-stacking para otimização de fontes (3/4) 499
Oxygen-Sans:
• Oxygen é uma fonte sans-serif projetada para ser utilizada em interfaces de usuário. Ela é uma boa opção para usuários de sistemas
Linux, pois é comumente disponível em distribuições que utilizam o ambiente gráfico KDE.
Ubuntu:
• Esta é a fonte padrão utilizada pelo sistema operacional Ubuntu. É uma fonte sans-serif projetada para ser legível em telas e
utilizada em interfaces. Incluir essa fonte assegura que usuários do Ubuntu tenham uma experiência visual consistente.
Cantarell:
• Cantarell é uma fonte sans-serif desenvolvida para a interface do usuário do sistema operacional GNOME. Ela é legível e elegante,
proporcionando uma boa alternativa para usuários de sistemas Linux que usam GNOME.
"Helvetica Neue":
• Esta é uma versão modernizada da clássica fonte Helvetica, conhecida por sua clareza e elegância. É amplamente utilizada em
design gráfico e interfaces. É uma boa opção para quando as fontes anteriores não estão disponíveis.
sans-serif:
• Finalmente, a declaração termina com sans-serif, que é uma família genérica de fontes. Isso garante que, se nenhuma das fontes
especificadas estiver disponível, o navegador usará qualquer fonte sans-serif instalada no sistema do usuário. Isso proporciona uma
fallback segura, garantindo que o texto ainda será legível.
• Compatibilidade: Ao incluir fontes específicas para diferentes sistemas operacionais e navegadores, você melhora a
compatibilidade e a experiência do usuário.
• Consistência Visual: A ordem de preferências garante que o texto tenha uma aparência consistente em diferentes plataformas,
adaptando-se ao estilo do sistema operacional.
• Fallback Seguro: Com a inclusão da família genérica sans-serif, você garante que haverá sempre uma fonte disponível, mesmo que
nenhuma das fontes personalizadas esteja instalada.
Lazy loading (carregamento preguiçoso) é uma técnica usada para melhorar o desempenho de sites e aplicativos web,
permitindo que elementos como imagens, vídeos e outros recursos sejam carregados apenas quando são necessários. Isso
significa que, em vez de carregar todos os elementos de uma vez, o navegador carrega os elementos à medida que o usuário os
vê na tela, economizando largura de banda e acelerando o tempo de carregamento da página.
Quando uma página é carregada, os navegadores normalmente buscam todos os elementos, como imagens e vídeos, de uma só
vez. Isso pode tornar a página lenta e aumentar o tempo de carregamento, especialmente se houver muitos elementos pesados.
O lazy loading modifica esse comportamento:
• Carregamento Inicial: Quando a página é acessada, apenas os elementos visíveis na área de visualização (viewport) são
carregados. Os elementos que estão fora da tela não são carregados imediatamente.
• Detecção de Visibilidade: À medida que o usuário rola a página para baixo, o navegador detecta quando os elementos estão
prestes a entrar na área de visualização. Assim que um elemento fica visível, ele é carregado.
• Carregamento sob Demanda: Essa abordagem garante que o usuário só baixe os recursos que realmente está prestes a ver,
melhorando a eficiência do carregamento da página.
• Melhoria na Performance: Como apenas os elementos necessários são carregados, a página carrega mais rapidamente,
melhorando a experiência do usuário.
• Economia de Largura de Banda: O lazy loading reduz a quantidade de dados transferidos, especialmente útil em dispositivos
móveis com planos de dados limitados.
• Experiência do Usuário Aprimorada: Os usuários podem começar a interagir com o conteúdo mais rapidamente, sem esperar que
todos os elementos sejam carregados.
O atributo loading="lazy" informa ao navegador que essa imagem deve ser carregada somente quando estiver prestes a entrar na
área de visualização.
Algumas práticas e atributos podem ser utilizados para otimizar o carregamento do CSS:
Preconnect:
• O atributo <link rel="preconnect" href="[Link] é usado para estabelecer uma conexão antecipada com o
servidor onde os recursos (como fontes) estão hospedados. Isso reduz o tempo de espera, já que o navegador começa a estabelecer
a conexão antes mesmo de precisar do recurso. Essa técnica é especialmente útil para fontes externas, como as do Google Fonts.
Lazy Loading:
• Outra prática importante é o lazy loading de elementos como imagens e iframes. Ao usar o atributo loading="lazy" em tags <img> e
<iframe>, você instrui o navegador a carregar esses elementos apenas quando eles estiverem prestes a entrar na área de
visualização do usuário. Isso reduz o número de recursos que precisam ser carregados inicialmente, melhorando o desempenho da
página. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Carregamento do CSS e Arquivos de Estilização (2/2) 504
Preload:
• A estrutura <link rel="preload" href="[Link]" as="style"> é utilizada para carregar um recurso específico, como uma folha de
estilo, com antecedência. O atributo rel indica ao navegador que o recurso é importante e deve ser carregado o mais rápido
possível, enquanto o atributo as especifica o tipo de recurso que está sendo carregado (neste caso, um estilo). Isso é especialmente
útil para folhas de estilo críticas que são necessárias para o layout inicial da página, pois assegura que o CSS seja carregado antes de
outros recursos menos prioritários.
Uso de Media Queries: Você pode incluir media queries no seu CSS para garantir que a aparência da sua página se ajuste a diferentes
tamanhos de tela. Isso é essencial para o design responsivo. Adicionar as media queries em diferentes arquivos favorece o
carregamento apenas quando necessário dessa folha estilo:
Este desafio, vocês terão a oportunidade de aplicar os conhecimentos adquiridos sobre CSS e responsividade na criação da Home
da Hashtag. A responsividade é um aspecto essencial do desenvolvimento web moderno, permitindo que nossos sites se
adaptem a diferentes tamanhos de tela e dispositivos, proporcionando uma experiência de usuário consistente e agradável.
Para alcançar uma boa responsividade, vocês explorarão o uso de media queries, que são regras CSS que aplicam estilos
diferentes com base nas características da tela, como largura e altura. Vocês podem consultar as media queries do site oficial
como referência, mas também encorajamos que pratiquem uma abordagem mais intuitiva: diminuam a tela do navegador e
observem como o layout atual da Home da Hashtag se comporta. Identifiquem pontos em que o design começa a "quebrar" ou
não se adapta corretamente e desenvolvam suas próprias media queries para resolver esses problemas.
Lembre-se de que a responsividade não se trata apenas de ajustar tamanhos de fontes e imagens, mas também de reorganizar
elementos e garantir que a navegação seja fácil e acessível em qualquer dispositivo. Ao final deste desafio, vocês terão uma
Home da Hashtag que não só será visualmente atraente, mas também funcionará perfeitamente em telas de diferentes
tamanhos, desde desktops até smartphones.
Preparem-se para aplicar a criatividade e a lógica que aprenderam até agora, enquanto trabalham para criar uma experiência de
usuário excepcional! Vamos lá!
Vamos criar um arquivo CSS dedicado para armazenar as media queries que serão aplicadas em telas com dimensões de até
1160px. Além disso, vamos garantir que esse arquivo só seja carregado quando o site estiver sendo visualizado em telas menores
ou iguais a essa largura, utilizando o atributo media na tag <link> no HTML.
Passos:
1. Crie o Arquivo CSS para a Media Query
Primeiro, crie um arquivo CSS chamado "[Link]".
• em: Relativo ao tamanho da fonte do elemento pai. Ele escala com base no contexto em que é usado.
• rem: Relativo ao tamanho da fonte da raiz do documento (html). Ele é mais previsível, pois sempre considera o tamanho da
fonte base, geralmente 16px, a menos que você altere isso no html.
• Adaptabilidade e escalabilidade:
• O uso de em torna o design mais escalável, pois ele é relativo ao tamanho da fonte do elemento pai (ou da raiz, no caso de
"rem"). Isso significa que o layout pode se ajustar melhor em diferentes dispositivos e resoluções, já que se adapta ao
tamanho do texto e outros elementos da página.
• Quando você usa pixels, os valores são fixos. Isso significa que o layout pode não se ajustar bem em telas maiores ou
menores, ou ao mudar as configurações de zoom ou acessibilidade do navegador.
• Usar em em uma media query torna o layout mais relacionado ao tamanho de texto, ajudando na acessibilidade e
experiência de usuário. Se o usuário aumentar o tamanho do texto no navegador, a página vai se adaptar proporcionalmente.
Para converter pixels para em, precisamos saber o tamanho base da fonte. Normalmente, o tamanho padrão da fonte em
navegadores é 16px, então usaremos isso como referência (mas o valor pode variar se você definir um tamanho de fonte
diferente para a página).
• .container-oquefalam: Refere-se a um elemento HTML com a classe container-oquefalam. As regras CSS dentro dessa media
query vão afetar apenas esse elemento quando a largura da tela for menor que 1160px.
• margin: 0 8.6rem: Define as margens superior e inferior como 0 e as margens laterais (esquerda e direita) como 8.6rem.
Significado da regra: Quando a tela tiver 1160px ou menos, o elemento com a classe .container-oquefalam terá uma margem
lateral de 137.6px de cada lado, enquanto a margem superior e inferior será 0.
Quando utilizamos unidades relativas como rem no CSS, estamos definindo as propriedades (largura, altura, margens, etc.) em
relação ao tamanho base da fonte do documento. Isso torna o layout mais flexível e escalável. A técnica de definir o tamanho da
fonte do elemento html com um valor percentual, como 62.5% ou 56.25%, ajuda a simplificar a maneira como calculamos e
aplicamos o design responsivo.
• Escalabilidade global:
• Ao definir um tamanho base para o html, você pode facilmente escalar o layout com base no tamanho da tela ou no tipo de
dispositivo. Isso pode ser feito ajustando apenas o font-size do html em diferentes media queries, sem ter que tocar em
outras partes do CSS.
• Facilidade de cálculo:
• Definindo a base como 10px (com 62.5%), torna os cálculos no CSS mais
intuitivos. Um valor como 1.6rem é 16px, 2rem é 20px, e assim por
diante, facilitando o desenvolvimento sem precisar de muitas
conversões mentais ou manuais.
Conclusão:
A definição do tamanho de fonte no html com percentuais como 62.5% ou 56.25% permite que você trabalhe com unidades relativas
como rem de forma mais simples e consistente em toda a página. Isso facilita a criação de layouts responsivos, pois ao mudar apenas o
valor do font-size no html, você consegue ajustar o layout globalmente, enquanto elementos específicos, como .img-conteudos ou
.container-oquefalam, herdam essas mudanças automaticamente, simplificando o processo de design responsivo.
A classe .container-rodape é a base da estrutura, e as regras aplicadas a ela afetam os elementos dentro deste contêiner. Vamos
entender cada propriedade aplicada aqui:
gap: 3.77vw;
• O gap define o espaçamento entre os elementos internos do contêiner. No caso, o valor 3.77vw está utilizando a unidade vw
(viewport width).
• vw: É uma unidade relativa ao tamanho da largura da janela de visualização (viewport). 1vw é igual a 1% da largura total da janela.
Então, 3.77vw equivale a 3.77% da largura da tela.
justify-content: space-between;
• Essa propriedade é utilizada para alinhamento horizontal de itens em um contêiner flexível (quando o contêiner tem display: flex).
• space-between distribui os itens dentro do contêiner de forma que o primeiro e o último item fiquem nas extremidades, e os
itens restantes sejam distribuídos uniformemente entre eles.
• Isso é útil para garantir que os itens ocupem todo o espaço horizontal disponível no contêiner.
Vamos verificar mais 2 pontos de break do nosso site e será as estruturas de 830 e 767. Então já vamos adicionar os novos
arquivos de css, respectivos a cada dimensão e linkar os arquivos no arquivo html. E vamos já adicionar uma alteração no arquivo
de 830.
Vamos deixar criado o arquivo para o próximo breakpoint no valor de 480px, que é a dimensão de Mobile. E já linkar esse
arquivo ao arquivo html.
background-image:
• Essa propriedade define uma imagem de fundo para a seção.
• No caso, a imagem está sendo carregada a partir de um link externo, essa URL é o caminho da imagem que será exibida
como o fundo da .secao-conteudos.
background-position-y: bottom;:
• Essa propriedade controla onde a imagem de fundo será posicionada verticalmente.
• O valor bottom indica que a imagem será alinhada na parte inferior da seção. Ou seja, a parte de baixo da imagem ficará
encostada na parte de baixo da seção.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Alterando o Layout da Seção Conteúdos Gratuitos (2/6) 524
background-size: auto;:
• Essa propriedade define como a imagem de fundo será redimensionada.
• O valor auto significa que a imagem não será redimensionada manualmente. Ela manterá o seu tamanho original e o
navegador decidirá o melhor ajuste com base no espaço disponível.
background-color: white;:
• Esta propriedade define a cor de fundo da seção.
• O valor white indica que, além da imagem, a seção terá um fundo branco. Isso é útil para quando a imagem não cobre toda
a área da seção, ou se a imagem tiver partes transparentes.
padding-bottom: 1rem;:
• O padding é o espaçamento interno da seção.
• padding-bottom: 1rem adiciona um espaço de 1rem (1 vez o tamanho da fonte base) na parte de baixo da seção, criando um
"respiro" entre o conteúdo da seção e o seu limite inferior.
Agora, dentro da classe .secao-conteudos, temos uma regra aninhada para .container-conteudos. Isso indica que o estilo vai
aplicar as propriedades a um elemento com a classe .container-conteudos que está dentro da .secao-conteudos. Essa é uma
funcionalidade comum em pré-processadores como SASS.
flex-flow: column;:
• Esta propriedade faz parte do sistema Flexbox, que é uma maneira moderna de organizar e alinhar elementos em uma
página.
flex-flow: column; indica que os itens dentro do contêiner .container-conteudos serão organizados em uma coluna
vertical. Ou seja, cada item aparecerá um embaixo do outro, ao invés de lado a lado.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Alterando o Layout da Seção Conteúdos Gratuitos (3/6) 525
Para posicionarmos corretamente as estruturas de "caixas" dos elementos Treinamentos e Programação, vamos alinha-los ao
centro.
Para finalizar a nossa seção Conteúdos Gratuitos, vamos alterar o posicionamento da nossa imagem, para que ela fique na
posição correta referente a nossa imagem de fundo e também vamos adicionar um layout novo ao título dessa seção.
Essa linha de CSS está utilizando a propriedade min-width para definir a largura
mínima de um elemento com a classe .oquefalam-carrossel-img. A largura mínima
é calculada com a função calc() duas vezes de maneira aninhada, o que pode
parecer um pouco confuso. Vamos decompô-la:
100% - 1.82vw:
• 100% se refere à largura total do contêiner pai do elemento. É uma maneira de
dizer que o valor base para o cálculo é a largura total do elemento pai.
• 1.82vw: A unidade vw significa "view width" e corresponde a 1% da largura da
viewport (tela visível). Portanto, 1.82vw é 1.82% da largura da tela.
• O cálculo 100% - 1.82vw está subtraindo 1.82% da largura da tela a partir da largura
total do contêiner pai, provavelmente para criar algum tipo de espaçamento ou
ajustar a largura em relação à tela.
Feito essas alterações, podemos perceber que nossos elementos de seta, desalinharam. Então vamos precisar nesse momento
adicionar um elemento div para encapsular todos os elementos de imagens dessa seção. E atribuir novas propriedades para
corrigir o layout:
Para finalizar a nossa seção O que falam, vamos alinhas nossas setas com as seguintes propriedades:
Explicação Detalhada
1. & .container-namidia
• O & refere-se ao elemento pai, que é a classe .container-namidia. Isso significa que
todos os estilos definidos dentro dessa estrutura se aplicam a elementos que
estão dentro de um container com essa classe.
2. & .namidia-titulo
• Aqui estamos selecionando um elemento filho chamado .namidia-titulo dentro de
.container-namidia.
• min-width: 35.71rem;: Define a largura mínima do título para 35.71 rem,
garantindo que ele não fique menor que esse valor. O uso de rem é uma unidade
relativa que ajuda a manter a responsividade em diferentes tamanhos de tela.
3. & .namidia-links
• Seleciona um elemento filho chamado .namidia-links dentro de .container-
namidia.
• flex-flow: row wrap;: Define que os itens dentro desse container vão ser dispostos
em uma linha e, se não couberem, vão "quebrar" para a linha seguinte. Essa é uma
maneira de usar o Flexbox para controlar o layout.
• justify-content: end;: Alinha os itens dentro de .namidia-links para o final do eixo
principal (ou seja, à direita, se a direção for horizontal).
• gap: 1rem;: Adiciona um espaço de 1 rem entre os itens, ajudando a evitar que eles
fiquem muito próximos uns dos outros. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Alterando o Layout da Seção Na mídia (2/2) 537
4. & a
• Aqui estamos definindo estilos para os links (<a>) que estão dentro de .namidia-links.
• height: 2.86rem;: Define a altura dos links para 2.86 rem, garantindo que todos os links tenham a mesma altura.
5. & img
• Seleciona as imagens (<img>) que estão dentro dos links (<a>).
• height: 100%;: Faz com que a altura das imagens ocupe 100% da altura do link pai. Isso significa que as imagens vão se ajustar
automaticamente à altura definida para os links, mantendo a proporção.
grid-template-columns: 1fr;
• Aqui, estamos definindo o número de colunas e o tamanho de cada uma.
• 1fr significa que o grid terá uma coluna que ocupará 1 fração do espaço disponível. Como só há
uma coluna, ela ocupará todo o espaço horizontal do container.
padding: 3.12rem;
• O padding é o espaço interno do container, ou seja, a distância entre o conteúdo interno e as
bordas do container.
• Nesse caso, o valor de 3.12rem aplica essa distância em todos os lados do container (superior,
inferior, esquerdo e direito). A unidade rem é relativa ao tamanho da fonte raiz (normalmente
16px), o que ajuda a manter a responsividade.
padding-top: 6.1rem;
• Este sobrescreve o valor de padding-top (espaçamento superior), que foi inicialmente definido
como 3.12rem na linha anterior. Agora, o espaçamento superior do container é 6.1rem,
enquanto os outros lados ainda mantêm o 3.12rem. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Alterando o Layout da Seção Blog (2/2) 539
max-width: 78.57rem;
• Define a largura máxima do container .container-blog. Isso significa que, mesmo que o
espaço da tela seja muito grande, o container não vai ultrapassar 78.57rem de largura.
• O uso de uma largura máxima é comum para evitar que o conteúdo se espalhe demais em
telas grandes, mantendo a legibilidade e o design compacto.
Explicação Geral
Esse código define um layout de blog usando CSS Grid para organizar o conteúdo em uma
única coluna e permitir que as linhas se ajustem ao conteúdo. Ele também garante um
espaçamento interno confortável ao redor do conteúdo (com mais espaço no topo), e limita
a largura máxima do container para garantir que o design permaneça legível e organizado
em telas maiores.
Na seção Minicurso não vamos precisar modificar nada do nosso layout ela já está responsiva tanto para dimensão de 767 quanto
480px.
A última seção que vamos alterar para responsividade da dimensão de 767 será a seção Rodapé, e para iniciar vamos ter que
alterar o arquivo [Link], pois vamos ter que utilizar um layout de grid ao invés de flex.
• CSS Grid: Foi projetado para trabalhar com layouts bidimensionais. Ou seja, ele permite organizar os elementos tanto em
linhas quanto em colunas ao mesmo tempo. Isso dá ao Grid um controle muito preciso sobre a distribuição dos elementos em
todo o espaço disponível, permitindo facilmente criar uma estrutura de várias colunas e linhas.
• Flexbox: Foi projetado para layouts unidimensionais, o que significa que ele se concentra em organizar elementos em uma
única linha ou uma única coluna de cada vez. Embora o Flexbox seja flexível, ele não tem a capacidade intrínseca de
manipular ambos os eixos (linhas e colunas) simultaneamente da mesma forma que o Grid.
Se tentarmos fazer o mesmo layout com Flexbox, o comportamento seria diferente. Flexbox vai organizar os elementos em uma
única linha (ou coluna), dependendo do fluxo definido, mas não tem a capacidade de organizar o layout em linhas e colunas ao
mesmo tempo.
Com o Flexbox:
• Os itens serão dispostos em uma linha horizontal até preencherem o espaço
disponível.
• Se não houver mais espaço, eles irão "quebrar" para a linha seguinte, mas você
não terá controle total sobre a quantidade de itens por linha, pois o Flexbox se
ajusta automaticamente ao conteúdo.
Então dentro do arquivo [Link] vamos alterar o layout que utilizamos dentro
desse container:
.container-rodape
Essa classe define o container do rodapé usando CSS Grid para organizar o
conteúdo. Vamos quebrar suas propriedades:
• repeat(2, auto) significa que o grid terá duas colunas, e o tamanho delas será
ajustado de acordo com o conteúdo de cada uma.
• justify-items: center;
• Alinha os itens dentro de cada célula do grid horizontalmente ao centro. Isso
significa que todos os elementos dentro do grid serão centralizados em suas
respectivas colunas.
• grid-column: 1;
• Coloca o elemento na primeira coluna do grid.
• grid-row: 1 / span 3;
• Define que o elemento começa na linha 1 e se estende por 3 linhas. Ou seja,
ele ocupará o espaço de 3 linhas no grid, sendo ideal para um conteúdo que
precisa se estender verticalmente, como um menu ou informações
detalhadas.
• width: auto;
• A largura é ajustada automaticamente com base no conteúdo da coluna.
Não há um valor fixo aqui, permitindo que o layout se ajuste
dinamicamente.
.rodape-container-copyright
Essa classe se refere à seção do rodapé que contém as informações de
copyright, geralmente posicionada na parte inferior do rodapé.
• grid-row: 3;
• Coloca este elemento na terceira linha do grid. Isso significa que o conteúdo
de copyright será alinhado na parte inferior do rodapé, independentemente
de quantas colunas estejam definidas. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Última Media Query para Seção Hero e Conteúdos (1/2) 545
Finalizado a responsividade da dimensão 767, vamos A seção Hero já está com o layout pronto, devido as
começar a estilização da última media query do nosso site alterações que fizemos anteriormente em outras queries.
que será no arquivo de 480px. Nesse momento vamos Então vamos pular para seção conteúdo que analisando a
começar com os layout das seções Hero e Conteúdos dimensão de 480 reparamos que algumas estruturas não
Gratuitos. estão com o layout interessante para o ususário.
• .caixas-cursos-hashtag:
• O Flexbox é utilizado para organizar os itens de forma vertical,
ou seja, os elementos são dispostos em uma coluna, um
abaixo do outro.
• O align-self: center; alinha esse container no centro do eixo
vertical do Flexbox pai, centralizando os itens.
Já na seção Diferenciais, existem alguns elementos precisamos mexer para que sua estrutura fique mais organizada e agradável.
.oquefalam-titulo
• Dentro do container principal, essa classe provavelmente estiliza o título da seção "O que falam".
• O uso de flex-flow: column; organiza o conteúdo dessa área em uma coluna, ou seja, os elementos serão empilhados verticalmente.
• O max-width: none; remove qualquer limitação na largura máxima, permitindo que o título possa se expandir conforme necessário.
.oquefalam-carrossel-imagens
• Essa classe agrupa as imagens que fazem parte de um carrossel de depoimentos ou feedback. Provavelmente exibe várias imagens
em um formato de slider ou carrossel.
.oquefalam-seta
• Essa classe é utilizada para definir o tamanho das setas de navegação do carrossel.
• O width: 5rem; ajusta a largura da seta para 5rem, garantindo que as setas sejam suficientemente grandes para serem vistas e
clicadas, facilitando a navegação no carrossel.
.oquefalam-container-imgs
• Esse container envolve as imagens dentro do carrossel. Ele provavelmente serve como um agrupador para controlar a disposição das
imagens.
.oquefalam-carrossel-img
• Dentro do container de imagens, essa classe controla o tamanho de cada imagem individual no carrossel.
• O min-width: 100%; garante que cada imagem ocupe 100% da largura do container, ou seja, apenas uma imagem é exibida por vez
no carrossel, ocupando todo o espaço disponível. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
Módulo 5 – Desafio 2 – Última Media Query para Seções Diferenciais, O que falam e
000
Na mídia (3/4)
549
Atualmente, você está usando max-width em suas folhas de estilo, o que significa que o CSS correspondente será aplicado quando a
largura da tela for menor ou igual a esses valores. Isso é útil para criar layouts responsivos para dispositivos menores, como tablets e
smartphones.
Se você quiser usar min-width em vez de max-width, o comportamento será o inverso: o CSS será aplicado quando a largura da tela
for maior ou igual ao valor especificado. Isso é útil para definir estilos que se aplicam a telas maiores, como desktops ou monitores
widescreen.
Diferença e Funcionamento
• Com max-width: O estilo é aplicado até que a tela atinja aquele tamanho máximo. Por exemplo, se você usa (max-width: 767px), o
estilo se aplicará a dispositivos com largura até 767px, ou seja, telas menores, como smartphones.
• Com min-width: O estilo é aplicado a partir de um certo tamanho de tela. Usando (min-width: 767px), o estilo se aplica somente em
telas maiores que 767px, ou seja, tablets e computadores. Telas menores que isso não aplicariam esse estilo.
Quando usar min-width
• Abordagem desktop-first: Se você está focando em criar um layout para telas maiores e quer garantir que ele funcione bem em
dispositivos desktop antes de se preocupar com versões menores (como tablets e smartphones), então você começa definindo estilos
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
para telas maiores e usa min-width para ajustar os estilos conforme o dispositivo fica menor.
Módulo 5 – Desafio 2 – Última Media Query para Seções Diferenciais, O que falam e
000
Na mídia (4/4)
550
Agora para a seção Na mídia vamos utilizar as seguintes propriedades para criar o layout responsivo do 480px.
.container-namidia
Este é o container principal da seção "Na mídia". Dentro dele, são aplicadas as seguintes regras:
• flex-flow: row wrap;: Define que os itens dentro do container serão dispostos em uma linha
horizontal (row) e, se o espaço não for suficiente, eles vão automaticamente para a linha
seguinte (wrap). Isso garante que o conteúdo seja responsivo, se ajustando ao espaço
disponível.
• justify-content: center;: Centraliza os itens ao longo do eixo horizontal, colocando-os no meio
da área disponível.
.namidia-titulo
Essa classe estiliza o título da seção "Na mídia". Aqui, o Flexbox é novamente utilizado:
• flex-flow: row wrap;: Similar ao container principal, os elementos dentro do título serão
dispostos horizontalmente e poderão quebrar em múltiplas linhas, se necessário.
• justify-content: center;: Centraliza o título no centro da tela ou do container em que ele está
inserido.
.namidia-links
Este container agrupa os links de mídia ou redes sociais.
Links (& a)
• height: 3.86rem;: Define uma altura fixa para os links, padronizando o tamanho dos elementos
de link para torná-los visualmente uniformes.
.secao-blog
Este é o container principal da seção "blog". Dentro dela, aplicam-se as seguintes regras:
Dentro dela, aplicam-se as seguintes regras:
.container-blog
Dentro da seção "blog", existe um outro container que agrupa o conteúdo principal do blog.
.caixa-blog-h2
Dentro do container do blog, há um elemento estilizado que provavelmente contém o título
ou subtítulo do blog. As regras aplicadas são:
Resumo
Esse CSS organiza a seção "blog" com bastante espaçamento na parte superior, tanto na
seção geral quanto dentro do container do blog, proporcionando uma separação clara entre
o conteúdo. O uso de padding garante que o conteúdo tenha espaço e não fique apertado
nas bordas. Além disso, o título do blog dentro de .caixa-blog-h2 é configurado para ter uma
largura adaptável à tela (utilizando porcentagem da viewport) e é centralizado
horizontalmente para dar uma aparência limpa e alinhada ao centro.
Esse código CSS estiliza uma seção chamada "Minicurso" e seus elementos internos. Vamos analisar cada parte em detalhes.
.container-minicurso
Esse é o container principal para a seção "Minicurso", que agrupa todos os elementos relacionados a essa parte da página.
& h2
Dentro desse container, a regra é aplicada especificamente aos elementos de cabeçalho de nível 2 (h2):
• text-align: center;: Centraliza o texto do cabeçalho no meio do container. Isso proporciona uma apresentação visual
equilibrada, tornando o título mais destacado e fácil de ler.
.form-minicurso
Esse elemento representa o formulário do minicurso, onde os usuários provavelmente se inscrevem ou interagem de alguma
forma. As regras aplicadas a ele são:
• grid-template-columns: 1fr;: Define que o formulário terá uma única coluna, ocupando a largura total do container. A
unidade fr (fraction) significa que a coluna ocupará uma fração do espaço disponível. Neste caso, como há apenas uma
coluna, ela usará toda a largura disponível.
• gap: 2.5rem;: Define um espaço de 2.5rem entre os elementos filhos dentro do grid. Isso cria um afastamento entre os
campos do formulário, evitando que eles fiquem colados uns nos outros e proporcionando uma aparência mais organizada.
• max-width: 350px;: Limita a largura máxima do formulário a 350 pixels. Isso impede que o formulário fique excessivamente
largo em telas grandes, garantindo que ele permaneça em um tamanho que seja fácil de usar e ler, especialmente em
dispositivos móveis.
• align-self: center;: Centraliza o formulário verticalmente dentro do container pai. Isso é útil quando o container pai tem um
espaço maior do que o necessário para o formulário, garantindo que ele fique alinhado ao centro em relação ao espaço
disponível.
• width: 100%;: Define a largura do formulário para ocupar 100% do espaço disponível dentro do seu container pai, dentro do
limite de max-width. Isso permite que o formulário se expanda em telas menores, garantindo que não haja espaços
desnecessários nas laterais.
.container-rodape
Esse é o container principal do rodapé, que organiza todos os elementos que fazem parte dele.
• grid-template-columns: 1fr;: Define a estrutura do grid, estabelecendo uma única coluna que ocupará toda a largura
disponível do container. A unidade fr (fraction) indica que a coluna deve ocupar uma fração do espaço disponível,
permitindo que o conteúdo se ajuste conforme necessário.
• max-width: 40rem;: Limita a largura máxima do container do rodapé a 40rem. Isso é útil para evitar que o rodapé fique
excessivamente largo em telas grandes, ajudando a manter uma apresentação visual equilibrada.
• gap: 4rem;: Define um espaço de 4rem entre os elementos filhos dentro do grid. Esse espaçamento garante que os
componentes do rodapé não fiquem colados uns aos outros, proporcionando uma aparência mais organizada e arejada.
.logo-footer
Esse elemento representa o logotipo que provavelmente está localizado na parte superior do rodapé.
• grid-row: 1;: Especifica que o logotipo deve ocupar a primeira linha do grid. Isso posiciona o logotipo no topo da estrutura do
rodapé.
• width: 14rem;: Define a largura do logotipo como 14rem, garantindo que ele tenha um tamanho específico e não se expanda
além desse limite.
• grid-row: 2;: Define que essa coluna ocupa a segunda linha do grid, posicionando-a logo abaixo do logotipo.
• align-items: center;: Alinha verticalmente os itens dentro dessa coluna ao centro, melhorando a apresentação visual.
• align-items: center;: Esta regra garante que os elementos filhos dentro dessas sub-seções sejam alinhados verticalmente ao
centro.
• text-align: center;: Centraliza o texto horizontalmente dentro dessas seções, garantindo que o conteúdo textual seja
visualmente equilibrado e acessível.
.rodape-container-copyright
Esse elemento é geralmente onde as informações de direitos autorais são exibidas.
• grid-column: auto;: Permite que o container ocupe a coluna automaticamente conforme definido na estrutura do grid.
Neste caso, como o grid possui apenas uma coluna, essa propriedade pode ser redundante.
• grid-row: 4;: Especifica que o container de direitos autorais ocupa a quarta linha do grid. Isso significa que ele será
posicionado na parte inferior do rodapé.
Cotinuando os ajustes da imagem de logo, vamos adicionar também uma estrutura no arquivo de dimensão 1035px, alterando
o tamanho do padding e tamanho da imagem. E também vamos adicionar a propriedade width na tela 767px.
& img
Esta regra aplica-se a qualquer imagem dentro do container .cabecalho.
• width: 10rem;: Define que todas as imagens no cabeçalho terão uma largura
de 10rem. Isso garante que as imagens sejam exibidas com um tamanho
consistente, o que pode ser útil para logos ou outros elementos visuais
importantes.
& nav
Essa regra se aplica à navegação (menu) dentro do cabeçalho.
• display: none;: Oculta o menu de navegação. Isso pode indicar que a
navegação será escondida por padrão, provavelmente para ser exibida
apenas em certas situações (como quando o menu for acionado em
dispositivos móveis).
& .nav-icones
Esta classe é aplicada a um container que contém os ícones de navegação,
como um ícone de menu ou outros ícones relacionados à navegação.
• display: block;: Faz com que o container de ícones de navegação seja exibido
como um bloco visível. Isso pode ser para dispositivos móveis, onde a
navegação tradicional está oculta, mas os ícones (como um ícone de menu
"hamburger") são exibidos.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 5 – Desafio 2 – Criando a Navegação Mobile (4/7) 562
& .nav-icone
Esta regra estiliza cada ícone individual dentro do container .nav-icones.
• width: 4rem;: Define que cada ícone terá uma largura de 4rem, proporcionando uma dimensão padronizada para os ícones,
tornando-os grandes o suficiente para interação fácil, especialmente em dispositivos móveis.
• color: #112e61;: Define a cor do ícone como #112e61, um tom de azul escuro. Isso ajuda a manter a consistência visual com a
paleta de cores do site.
&.nav-icone--fechar
Esta classe aplica-se a um ícone específico de fechamento, que pode ser usado para fechar o menu de navegação.
• display: none;: Oculta o ícone de fechamento por padrão. Ele pode ser exibido apenas quando o menu estiver aberto,
oferecendo uma maneira de o usuário fechar o menu. Isso sugere que a navegação pode ter um comportamento dinâmico,
como a exibição de um ícone de para abrir o menu e um ícone de "fechar" que aparece quando o menu está ativo.
E dentro do arquivo [Link] vamos adicionar a propriedade display:none, pois os ícones apenas vão aparecer a partir da
dimensão de 767px.
& nav
Dentro de .aberto, o elemento nav (que representa a barra de navegação) é estilizado de forma específica para esse estado.
• position: fixed;: O menu de navegação é posicionado de forma fixa na tela. Isso significa que ele fica "preso" à janela de
visualização do navegador e não se desloca com o conteúdo da página ao rolar.
• top: 0; bottom: 0; left: 0; right: 0;: Essas propriedades definem que o menu ocupa toda a altura e largura da tela, estendendo-
se de cima a baixo e de esquerda a direita, cobrindo completamente a área visível. Isso cria um menu em tela cheia.
• display: block;: Garante que o elemento nav seja exibido em bloco, o que o torna visível no estado aberto.
• background-color: white;: Define o fundo do menu como branco, proporcionando um contraste claro com o restante da
página, tornando o menu o foco principal.
& ul
Dentro do nav, a lista desordenada (ul) também recebe estilos específicos.
• flex-flow: column;: Isso organiza os itens da lista (li) em uma coluna, empilhando-os verticalmente. A propriedade flex-flow é
usada para definir a direção do fluxo dos elementos filhos. Aqui, ao usar "column", o menu assume um layout vertical, típico de
menus de navegação de tela cheia.
& .nav-icone
Este seletor estiliza os ícones de navegação individuais dentro do container .nav-icones.
&.nav-icone--fechar
Este seletor aplica estilos ao ícone de fechamento do menu, "x" que aparece quando o menu
está aberto.
• display: block;: Garante que o ícone de fechar esteja visível, sendo exibido como um bloco no
layout. Esse comportamento indica que, quando o menu está aberto, o ícone de fechar é
mostrado.
&.nav-icone--menu
Este seletor aplica estilos ao ícone do menu, normalmente representado por três linhas
horizontais (conhecido como "hamburger menu") que aparece quando o menu está fechado.
• display: none;: Faz com que o ícone do menu seja oculto. Isso sugere que quando o menu
está aberto, o ícone de menu é escondido e substituído pelo ícone de fechar.
& .item-lista-cabecalho
Aplica estilos ao item de lista no cabeçalho.
&.contem-filhos
Esse seletor refere-se a um item de lista que contém sub-itens (filhos). Ele estiliza itens de menu que possuem uma lista
aninhada (como um submenu).
&.aberto
Aplica estilos quando o item que contém sub-itens está no estado aberto (geralmente ativado por algum tipo de interação,
como um clique). Aqui estão os conceitos das propriedades aplicadas:
• display: flex;: O item de lista é transformado em um contêiner flexível, permitindo o controle do alinhamento e
distribuição dos sub-itens.
• flex-flow: column;: Define a direção dos itens flexíveis em uma coluna, empilhando os sub-itens verticalmente.
• gap: 2.5rem;: Define o espaçamento entre os sub-itens. Isso adiciona uma distância de 2.5rem entre os elementos filhos.
• display: flex;: A lista é tratada como um contêiner flexível, permitindo o alinhamento dos itens filhos (li).
• position: static;: Define que o posicionamento da lista não terá nenhuma alteração especial (ela segue o fluxo normal da
página).
• gap: 1.02rem;: Define o espaçamento entre os itens da lista dentro do contêiner flexível.
• align-items: start;: Alinha os itens filhos (li) ao início do eixo transversal (alinhamento vertical neste caso).
• list-style: disc;: Define o estilo da lista como um ponto (disc) ao lado dos sub-itens.
• background-color: transparent;: Define o fundo da lista como transparente, removendo qualquer cor de fundo.
& li
Aplica estilos aos itens individuais da lista dentro da ul.
• border-bottom: none;: Remove a borda inferior que poderia estar aplicada aos itens da lista.
• padding: 0;: Remove qualquer preenchimento (espaço interno) dos itens da lista.
• content: none;: Remove qualquer conteúdo adicional que possa ter sido adicionado por meio do pseudo-elemento
::after.
Essa estrutura controla o estilo de um item de lista que contém sub-itens, aplicando um layout flexível, alinhando e
espaçando adequadamente os sub-itens, e removendo efeitos visuais como sombras e bordas. Quando o item está no
estado aberto, os sub-itens são exibidos verticalmente, com espaçamento entre eles e sem bordas ou sombra.
• rgba(255, 255, 255, 0.95) representa a cor branca com uma leve transparência, onde
0.95 é o valor da opacidade (próximo de totalmente opaco).
padding: 5rem;
Define o espaçamento interno do elemento (o espaço entre o conteúdo do elemento e
suas bordas). Neste caso, está sendo aplicado um padding de 5rem em todas as direções
(superior, inferior, direita e esquerda).
backdrop-filter: blur(1.5rem);
Aplica um efeito visual ao fundo do elemento, neste caso, um desfoque de 1.5rem. Esse
valor faz com que qualquer conteúdo por trás do elemento pareça borrado, criando um
efeito de desfoque no plano de fundo do nav.
max-height: 100%;
No contexto da ul (lista não ordenada), define que a altura máxima da lista
será de 100% da altura do contêiner pai. Isso limita a altura da lista ao espaço
disponível no contêiner.
overflow: auto;
Controla o comportamento do conteúdo que ultrapassa o tamanho do
contêiner. Com o valor auto, as barras de rolagem (scroll) são adicionadas
automaticamente se o conteúdo exceder o limite do contêiner. Aqui é usado
na ul para permitir rolagem se necessário.
padding: 0 5rem;
Aplica um preenchimento lateral (padding horizontal) de 5rem à lista ul,
enquanto o preenchimento vertical (topo e base) é 0. Isso adiciona espaço
nas laterais do conteúdo da lista.
Responsividade no Lighthouse
A responsividade é essencial para garantir que seu site seja exibido corretamente em dispositivos de diferentes tamanhos,
como desktops, tablets e smartphones. O Lighthouse verifica se o site está adaptado para diferentes resoluções de tela e gera
insights sobre os seguintes pontos:
• Viewport configurado: Verifica se o site tem a tag <meta name="viewport">, que define como o conteúdo deve ser ajustado
em telas menores.
• Elementos ajustados ao viewport: Avalia se todos os elementos da página (imagens, vídeos, textos, botões, etc.) são
dimensionados de acordo com a largura da tela, garantindo que o usuário não precise usar o zoom ou rolar horizontalmente
para visualizar o conteúdo.
• Tamanhos de texto legíveis: Avalia se o tamanho das fontes é adequado para dispositivos móveis, permitindo leitura
confortável sem a necessidade de zoom.
• Botões e links acessíveis: Verifica se os elementos clicáveis são suficientemente grandes e têm espaço adequado ao redor
para facilitar a interação em telas de toque.
Tempo de interação:
• Avalia quanto tempo o site leva para ficar interativo após ser carregado. Isso é importante para garantir que os usuários possam
navegar rapidamente sem esperar pelo carregamento de todos os recursos.
SEO:
• Estrutura do HTML: O Lighthouse avalia se o HTML está bem estruturado com tags corretas, como títulos (<h1>, <h2>, etc.), links, meta
tags e atributos alt em imagens, facilitando o rastreamento pelos motores de busca.
• Boas práticas:
• Segurança: Avalia a implementação de protocolos seguros como HTTPS, garantindo que o site seja seguro para os usuários.
• Uso eficiente de APIs modernas: Verifica se o site utiliza APIs e padrões modernos que garantem a compatibilidade e a longevidade
do projeto.
• Consistência global: Centralizar valores como cores, tamanhos e fontes no :root garante uniformidade em todo o site, reduzindo
inconsistências visuais e erros causados por variações manuais.
• Facilidade de manutenção: Ao definir variáveis globais no :root, qualquer mudança de design ou atualização de estilo pode ser feita
rapidamente, diminuindo o tempo de retrabalho e aumentando a eficiência de desenvolvedores.
• Redução de redundância: O uso de variáveis no :root evita a repetição de valores estáticos (como cores ou espaçamentos) em várias
partes do código, reduzindo a quantidade de CSS processado pelo navegador, o que melhora o tempo de carregamento.
• Melhora na responsividade: Usar variáveis no :root permite adaptar facilmente elementos como tamanhos e espaçamentos em
diferentes breakpoints, promovendo uma experiência de usuário mais fluida em dispositivos variados.
• Futuras expansões e personalizações: Definir variáveis globais no :root facilita a implementação de temas, pois as mudanças podem
ser feitas de forma simples e rápida, otimizando o tempo e os recursos ao desenvolver novas funcionalidades ou estilos.
Essa abordagem ajuda a criar um código CSS mais leve, modular e escalável, melhorando a experiência tanto do desenvolvedor quanto
do usuário final.
• Carregamento antecipado: O uso do preload instrui o navegador a buscar os recursos (como arquivos CSS) o mais cedo possível,
mesmo antes de eles serem necessários para a renderização. Isso diminui o tempo de espera do usuário, acelerando o tempo de
carregamento da página.
• Prioridade no processamento: O atributo as="style" define o tipo de recurso a ser carregado (neste caso, estilos CSS). O navegador
consegue priorizar corretamente o arquivo com base em sua importância para a renderização da página. Isso evita que recursos
menos críticos sejam carregados antes de elementos essenciais, como o CSS.
• Redução do tempo de renderização: Como os estilos são fundamentais para a renderização correta do layout, o carregamento
antecipado garante que a página seja exibida mais rapidamente, evitando o "flash" de conteúdo não estilizado (FOUC). Isso melhora a
percepção de desempenho pelos usuários.
• Evita bloqueios de renderização: Sem o preload, o navegador pode adiar o carregamento de arquivos CSS até que ele alcance a
referência no documento HTML. Isso pode bloquear a renderização da página. Com o preload, o navegador já terá esses arquivos
prontos quando forem necessários.
• Uso eficiente de recursos: O carregamento antecipado otimiza a alocação de largura de banda, garantindo que arquivos essenciais
sejam baixados enquanto outros recursos menos prioritários são carregados posteriormente.
• Redução da Latência: A pré-conexão (preconnect) estabelece conexões antecipadas com servidores externos, como o Google Fonts,
reduzindo o tempo de espera para a resolução de DNS, a configuração de TCP e o handshake SSL. Isso é crucial para garantir que as
fontes sejam carregadas rapidamente, especialmente em sites que dependem fortemente de fontes externas.
• Carregamento Eficiente de Estilos: O uso de preload para a folha de estilos das fontes garante que as regras de fonte sejam aplicadas
assim que o navegador as baixa, evitando o atraso na aplicação de estilos relacionados à tipografia.
• Melhoria na Experiência do Usuário: Ao garantir que as fontes sejam carregadas rapidamente, reduz-se o risco de FOUT (Flash of
Unstyled Text) e FOUT (Flash of Unstyled Text), resultando em uma apresentação mais suave e profissional do conteúdo textual.
• Otimização de Performance: Com as fontes sendo carregadas mais rapidamente, o tempo de carregamento percebido da página
diminui, melhorando a pontuação de desempenho em ferramentas de avaliação e a experiência geral do usuário.
• Carregamento Sob Demanda: O atributo loading="lazy" permite que as imagens sejam carregadas apenas quando estão prestes a
entrar na área visível do viewport do usuário. Isso significa que as imagens que não estão imediatamente visíveis não consomem
largura de banda ou recursos do navegador até que sejam realmente necessárias.
• Redução do Tempo de Carregamento Inicial: Ao não carregar todas as imagens de uma vez, a carga inicial da página é reduzida, o
que pode resultar em tempos de carregamento mais rápidos. Isso é particularmente importante em páginas com muitas imagens ou
em dispositivos móveis, onde a largura de banda pode ser limitada.
• Melhor Experiência do Usuário: O uso de carregamento preguiçoso ajuda a evitar que a página fique lenta ou "congele" enquanto as
imagens são carregadas. Isso proporciona uma experiência de navegação mais fluida, pois os usuários podem começar a interagir
com o conteúdo da página sem esperar que todas as imagens sejam carregadas.
• Otimização de Recursos: Em conexões lentas ou limitadas, o loading="lazy" ajuda a economizar dados, pois apenas as imagens
necessárias para o que o usuário está visualizando são carregadas. Isso pode ser benéfico para usuários em dispositivos móveis ou em
áreas com conectividade limitada.
• SEO e Desempenho: Melhorar o desempenho do carregamento da página pode impactar positivamente a pontuação de SEO, uma
vez que os mecanismos de busca tendem a favorecer sites que oferecem uma boa experiência ao usuário.
Visto o carregamento da imagem podemos adicionar a seguinte estrutura para otimizarmos mais ainda a nossa página:
O Que é Deploy?
Deploy é o termo utilizado para descrever o processo de publicar um site ou aplicação em um servidor. Basicamente, você envia
seus arquivos do projeto (HTML, CSS, imagens, etc.) para a internet, permitindo que outros usuários acessem seu site através de
um domínio (um endereço como [Link]).
No caso de projetos simples que usam apenas HTML e CSS, o deploy é um processo direto, pois não envolve servidores
complexos ou bancos de dados. Existem várias plataformas que podem hospedar seu site de forma gratuita. Hoje, vamos nos
concentrar no Netlify, que é uma ferramenta que facilita o deploy de sites estáticos, como os criados com HTML e CSS.
1. Preparando o Projeto
Antes de tudo, verifique se seu projeto está completo e organizado. Isso significa que você deve ter todos os arquivos necessários
prontos, como:
• O arquivo [Link] (geralmente, o arquivo principal da sua página).
• Arquivos CSS (separados em uma pasta chamada css ou algo semelhante).
• Outras pastas com imagens, scripts, etc.
Crie uma pasta única para todo o projeto para facilitar o processo de deploy.
4. Publicando o Site
Assim que o upload for concluído, o Netlify processará o deploy e seu site estará online em poucos segundos! O Netlify vai
automaticamente atribuir um domínio temporário ao seu site, algo como [Link].
Você pode testar o site clicando nesse link fornecido e ver como ele está funcionando. Além disso, o Netlify permite que você
personalize esse domínio, se desejar.
• Gratuito: O Netlify oferece um plano gratuito, ideal para pequenos projetos ou portfólios.
• Fácil de Usar: Com a função de arrastar e soltar, fazer o deploy de projetos HTML e CSS é simples e rápido.
• Deploy Automático: Se você integrar seu projeto com repositórios como GitHub, pode configurar o Netlify para fazer deploy
automaticamente sempre que houver uma mudança no código.
• Certificado SSL Gratuito: O Netlify oferece certificados SSL automaticamente, o que significa que seu site será carregado com
segurança usando o protocolo HTTPS.
• Rapidez: O Netlify usa uma infraestrutura global que garante que seu site carregue rapidamente, independentemente da
localização dos visitantes.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
585
TRILHA FRONTEND MODERNA - HTML/CSS & JAVASCRIPT
Módulo 6
FLOAT NO CSS
FLOAT NO CSS
FLOAT NO CSS DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 6 – Apresentação do módulo (1/1) 586
Bem-vindo ao módulo onde exploraremos uma técnica de layout que, embora seja considerada "antiga", ainda é importante
conhecer: o Float.
Você já está familiarizado com métodos modernos como Flexbox e Grid, que oferecem soluções mais intuitivas e poderosas para
criar layouts. No entanto, antes da popularização desses métodos, o float era uma das principais ferramentas para posicionar
elementos em uma página web.
Conhecer o float pode ajudar a entender o legado do CSS e a lidar com projetos que ainda utilizam essa técnica. Vamos mergulhar no
mundo do float e descobrir como ele era utilizado para controlar o fluxo dos elementos na página!
Nessa aula vamos abordar a propriedade float e como que criavamos layouts utilizando ela. Para isso vamos criar um arquivo html,
dentro do <body> vamos adicionar 3 elementos (h1, img e p). A imagem vamos utilizar o logo da hashtag do site hashtagtreinamentos
e o parágrafo vamos gerar no site do Lorem ipsum.
Título e Parágrafo
Os elementos como títulos (<h1>, <h2>, etc.) e parágrafos (<p>) são exibidos no fluxo normal do documento com um display padrão
de block. Isso significa que cada um deles ocupa toda a largura disponível e empurra os elementos subsequentes para a linha
seguinte. Em outras palavras, esses elementos são exibidos um abaixo do outro, respeitando a hierarquia e a estrutura do conteúdo.
Imagem
Agora, considere uma imagem adicionada ao documento com a tag <img>. Por padrão, a imagem tem um display de inline-block, o
que significa que ela se comporta de forma similar a um texto em linha, ocupando apenas o espaço necessário para sua largura e
altura. No entanto, ao contrário dos elementos de texto, uma imagem pode coexistir na mesma linha que outros elementos inline, a
menos que seu contêiner ou a própria imagem seja definida como um bloco.
position: absolute
Na estrutura apresentada, a propriedade float: left; aplicada ao h1 faz com que o título seja posicionado à esquerda, permitindo que o
conteúdo subsequente, como a imagem e o parágrafo, flua ao seu redor. Isso significa que a imagem e o parágrafo serão exibidos ao
lado do h1, ocupando o espaço disponível à direita do título.
• float: left;: O h1 flutuará à esquerda dentro do fluxo do documento, e os elementos seguintes tentarão ocupar o espaço ao seu lado,
respeitando o fluxo natural da página.
• position: absolute;: O h1 seria removido do fluxo normal do documento e posicionado em relação ao seu contêiner posicionado
mais próximo (ou ao <body>, se nenhum outro contêiner estiver posicionado). Isso significa que os elementos subsequentes não
"veriam" o h1 e se posicionariam como se ele não existisse, potencialmente sobrepondo-se a ele.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 6 – Como usar as propriedades de float e clear (4/10) 590
Interação com Outros Elementos:
• float: left;: O conteúdo ao lado do h1 (como a imagem e o texto) se ajustará ao espaço que o h1 ocupa.
• position: absolute;: Os elementos ao redor não considerariam a posição do h1, o que poderia resultar em sobreposições.
Fluxo do Documento:
• float: left;: O h1 ainda faz parte do fluxo normal da página, e outros elementos fluirão em torno dele.
• position: absolute;: O h1 é removido do fluxo do documento, e outros elementos não levarão sua posição em consideração.
Continuando com o nosso fluxo float, vamos posicionar a imagem do logo para o canto direito.
Quando múltiplos elementos em uma página possuem a propriedade float, o comportamento de posicionamento deles é
determinado pela ordem em que aparecem no código HTML, além de suas respectivas direções de flutuação (esquerda ou direita).
Vamos analisar o que acontece com os elementos h1, img, e p em relação ao fluxo do float nas seguintes condições:
1. Configuração de Flutuação:
• h1 { float: left; }: O h1 será flutuado à esquerda, ocupando o espaço mais à esquerda disponível no contêiner pai (neste caso, o
<body>).
• img { float: right; }: A imagem (img) será flutuada à direita, ocupando o espaço mais à direita disponível no contêiner.
• p { float: left; }: O parágrafo (p) será flutuado à esquerda, e tentará se posicionar ao lado do h1, dependendo do espaço disponível.
• Quando você utiliza float em elementos, eles são removidos parcialmente do fluxo normal do documento, e elementos
subsequentes tentarão flutuar ao lado deles, se houver espaço.
• Às vezes, isso não é desejado — por exemplo, você pode querer que um elemento comece abaixo de um conjunto de elementos
flutuados, sem tentar ocupar o espaço ao lado deles.
• É aí que entra a propriedade clear.
• none: (valor padrão) Sem nenhum efeito de limpeza. O elemento será posicionado normalmente, tentando ocupar espaço ao lado
de elementos flutuados, se possível.
• left: O elemento não permitirá flutuações à esquerda. Ele será posicionado abaixo de todos os elementos flutuados à esquerda.
• right: O elemento não permitirá flutuações à direita. Ele será posicionado abaixo de todos os elementos flutuados à direita.
• both: O elemento não permitirá flutuações nem à esquerda nem à direita. Ele será posicionado abaixo de todos os elementos
flutuados, independentemente da direção do flutuante.
• inherit: O elemento herda o valor da propriedade clear de seu elemento pai.
Se aplicarmos em todos os elementos a propriedade float, repare que a cor de fundo do elemento div que acabamos de adicionar,
desaparece:
Como os elementos flutuantes são removidos do fluxo normal do documento, a <div> não os considera ao calcular sua altura. Ao
adicionar o pseudo-elemento ::after com clear: both;, você está dizendo ao navegador que ele deve encerrar o comportamento de
flutuação e garantir que a altura da <div> seja recalculada de forma a incluir os elementos flutuantes. Esse bloco invisível adicionado
pelo ::after força a <div> a se ajustar para envolver todo o conteúdo, resultando em uma altura correta.
Resultado final:
A <div> agora reconhecerá corretamente os elementos flutuantes dentro dela e ajustará sua altura para acomodar esses elementos,
solucionando o problema da altura zero.
Essa técnica é amplamente utilizada e é uma forma eficiente de lidar com o problema sem precisar modificar o HTML diretamente ou
adicionar um elemento extra visível para limpar os flutuantes.
FLOAT
Este desafio vai te ajudar a entender como layouts eram construídos antes de técnicas modernas como o Flexbox e o CSS Grid, além
de aprimorar suas habilidades em CSS, organização de layout e boas práticas para compatibilidade em diferentes navegadores.
As propriedades que utilizamos nas aulas passadas do conceito flexbox estão comentados, para orientar a criação do layout, então
vamos aplicar as mudanças nos primeiros elementos:
Essas propriedades juntas garantem que o elemento seja exibido como um bloco, centralizado na página, com uma largura que se
ajusta ao conteúdo e um espaçamento inferior de 1.6 rem.
Explicação do aninhamento:
• & a { ... }: O & representa o seletor pai, que no caso é .conteudos-caixa-logos. Então, &
a é equivalente a .conteudos-caixa-logos a. Esse bloco define estilos específicos para
os links (<a>) que estão dentro de .conteudos-caixa-logos. Nesse caso, aplica uma
margem à direita nos links.
• &:last-child { ... }: Novamente, o & refere-se ao seletor pai, que aqui é a. Então, &:last-
child é equivalente a .conteudos-caixa-logos a:last-child. Esse bloco remove a
margem à direita do último link dentro do contêiner, garantindo que o último item
não tenha um espaçamento extra.
Neste código, o aninhamento (nesting) está sendo usado para estruturar os estilos dentro do seletor
principal .conteudos-lista-redessociais. Vamos explicar cada parte:
• .conteudos-lista-redessociais { ... }:
• Esse é o seletor principal, e todo o código dentro deste bloco refere-se ao elemento com a classe
.conteudos-lista-redessociais.
• &::after { ... }:
• content: "";: Cria um pseudo-elemento vazio após o conteúdo do contêiner.
• display: block;: Faz o pseudo-elemento se comportar como um bloco, ocupando espaço no layout.
• clear: both;: O objetivo aqui é limpar os elementos flutuantes dentro do contêiner .conteudos-lista-
redessociais. Isso resolve o problema da altura zero do contêiner (pois os elementos flutuantes não
afetam a altura dele), forçando-o a envolver corretamente os links flutuantes.
Explicação detalhada:
1. & li { ... }:
• position: relative;: Define que o item da lista (<li>) será posicionado de forma relativa. Isso permite que seus filhos, como a
imagem, possam ser posicionados de forma absoluta em relação a ele.
• padding-left: 2.45rem;: Adiciona um preenchimento à esquerda de 2.45rem. Isso cria um espaço dentro de cada item da lista,
provavelmente para acomodar ícones ou imagens.
• width: 1.8rem;: Define a largura das imagens como 1.8rem, garantindo que todas as imagens tenham o mesmo tamanho.
• position: absolute;: Posiciona a imagem de forma absoluta em relação ao item da lista (li), que está posicionado de forma relativa.
Isso significa que a imagem será removida do fluxo normal do documento e posicionada de acordo com as coordenadas
fornecidas.
• top: 50%;: Move a imagem para 50% da altura do item da lista, o que significa que a imagem ficará no meio verticalmente.
• calc(-100% - 0.65rem): Move a imagem 100% para a esquerda (fora do contêiner) e adiciona um espaço extra de 0.65rem. Isso
posiciona a imagem antes do conteúdo do item da lista.
• -50%: Ajusta a imagem para centralizá-la verticalmente no meio do item da lista.
Resumo:
A lista (li) está sendo preparada para acomodar imagens à sua esquerda, com um espaço criado via padding-left.
As imagens (img) são posicionadas fora do fluxo normal do texto, flutuando à esquerda do conteúdo do item da lista, com
alinhamento vertical centralizado em relação ao item.
O resultado é uma lista com ícones ou imagens à esquerda, alinhados corretamente ao lado de cada item, sem quebrar o fluxo do
layout.
Módulo 7
METODOLOGIA BEM
METODOLOGIA BEM
METODOLOGIA BEM DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 7 – Introdução ao Módulo (1/1) 606
• Blocks (Blocos): Representam as partes independentes e reutilizáveis de uma interface. Aprenderemos como identificar e
nomear blocos de maneira clara e intuitiva.
• Elements (Elementos): São as partes internas de um bloco que, embora tenham funções específicas, não podem existir de
maneira independente. Abordaremos como criar e organizar elementos para estruturar melhor o código.
• Modifiers (Modificadores): Permitem variar a aparência ou o comportamento de blocos e elementos, adicionando flexibilidade ao
design sem comprometer a organização.
Ao final deste módulo, você será capaz de aplicar a metodologia BEM em seus projetos, garantindo um código mais limpo,
consistente e colaborativo. Vamos começar!
A metodologia BEM (Block, Element, Modifier) foi criada pela equipe de desenvolvedores do Yandex com o objetivo de estruturar o
código de maneira mais clara, especialmente em projetos com interfaces complexas. Ela ajuda a manter uma organização
consistente entre HTML e CSS, tornando mais fácil a manutenção e o trabalho em equipe. Vamos entender cada parte da
metodologia:
1. Block (Bloco)
Um Bloco é uma unidade independente que pode ser reutilizada em diferentes partes da aplicação. Ele representa um componente
de interface completo, como um formulário, menu, botão, ou qualquer outra seção que tenha um propósito próprio.
Exemplo:
• Um bloco chamado button seria representado no HTML com uma classe .button.
• Esse bloco representa a base para o estilo e funcionalidade do componente "botão".
No CSS, você define as propriedades do bloco para estilizar o componente:
Exemplo:
• Para um botão que inclui um ícone, o elemento do ícone seria representado como
button__icon.
• A nomenclatura é formada pela junção do nome do bloco (button) com dois underscores (__) e
o nome do elemento (icon), indicando que ele faz parte do bloco "button".
3. Modifier (Modificador)
Um Modificador é uma variação de um bloco ou elemento. Ele permite ajustar a aparência, o
comportamento ou o estado de um bloco ou elemento sem criar uma estrutura completamente
nova. Modificadores são úteis para aplicar estilos diferentes a um mesmo bloco, como alterar a
cor de um botão ou adicionar um estado ativo.
Exemplo:
• Um botão que possui uma cor diferente pode ter o modificador button--primary, onde -- é
utilizado para indicar o modificador (primary).
• O modificador pode ser aplicado ao bloco como um todo ou a elementos específicos dentro
dele.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 7 – Como funciona a Metodologia BEM (3/3) 609
Resumindo
• Bloco: .nome-do-bloco
• Elemento: .nome-do-bloco__nome-do-elemento
• Modificador: .nome-do-bloco--modificador ou .nome-do-bloco__nome-do-elemento--modificador
Exemplo Completo
Imagine um botão com um ícone que possui uma variação de cor:
A metodologia BEM, quando aplicada corretamente, facilita a criação de componentes reutilizáveis e escaláveis, mantendo a
organização e a clareza do código.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 7 – Exemplos da Metodologia (1/5) 610
Exemplo 1:
No BEM, o Bloco é um componente independente, ou seja, uma unidade que possui significado próprio e é reutilizável. Aqui temos dois
blocos principais:
• casa: Representa um bloco completo que pode ser considerado como um componente principal ou uma seção da interface.
• quarto: É outro bloco dentro da estrutura, com propósito próprio e pode conter seus próprios elementos e modificadores.
Os Elementos são partes internas de um bloco, ou seja, componentes subordinados ao bloco ao qual pertencem e que não têm sentido
isolados. Eles são identificados pela estrutura nome-do-bloco__nome-do-elemento, mostrando que fazem parte do bloco específico.
Os Modificadores são usados para criar variações de um bloco ou elemento, indicando mudanças de aparência, comportamento, ou
estado. Eles são definidos com --modificador e ajudam a identificar facilmente as diferentes variações de um bloco ou elemento.
Na estrutura, temos dois modificadores:
• casa--azul: É um modificador do bloco casa, indicando que este bloco possui uma variação, neste caso, possivelmente de cor (azul).
Essa modificação pode alterar a aparência do bloco sem alterar sua estrutura.
• quarto__impressora--ligada: É um modificador do elemento quarto__impressora, sinalizando um estado específico da impressora
(ligada). Esse modificador permite alterar o estado do elemento quarto__impressora sem criar uma estrutura nova.
A estrutura ao lado permite que definamos um bloco principal (casa), seus elementos
internos (casa__jardim) e suas variações (casa--azul). Da mesma forma, temos um
bloco quarto, que inclui seus elementos específicos e até um modificador para o
elemento quarto__impressora.
Pergunta para refletir: Dado que a metodologia BEM nos ajuda a organizar o CSS,
você acha que a estrutura criada aqui permite uma especificidade suficiente para
atender a todos os estilos e comportamentos necessários? Ou será que ainda
precisaríamos de outras formas de organização para alcançar um maior controle e
clareza?
Pense sobre como essa organização pode influenciar a maneira como você estiliza
componentes complexos e até que ponto a estrutura BEM ajuda ou limita a
especificidade que precisamos em um projeto.
Exemplo 2:
No BEM, o Bloco representa uma entidade independente, que possui um propósito próprio e pode ser reutilizada em diferentes partes
do projeto. Aqui, o bloco principal é:
• pessoa: Este é o componente principal da estrutura, representando uma entidade chamada "pessoa". Esse bloco é o núcleo da
estrutura e contém as classes de estilos básicos para esse componente.
Os Elementos são partes internas de um bloco. Eles dependem do bloco para fazer sentido e não possuem identidade fora dele. São
indicados com __ após o nome do bloco, demonstrando que pertencem a ele. Nesta estrutura, temos dois elementos:
• pessoa__mao: Este é um elemento do bloco pessoa que representa a "mão" da pessoa. Ele está associado diretamente ao bloco
pessoa e só faz sentido no contexto de "pessoa".
• pessoa__rosto: Outro elemento do bloco pessoa, representando o "rosto" da pessoa. Assim como a mão, o rosto faz sentido apenas
quando associado ao bloco pessoa.
Exemplo 2:
Consideração Final
A aplicação do BEM nessa estrutura permite organizar o código de forma clara, facilitando a compreensão e o estilo modular do
componente "pessoa". Esse tipo de estrutura torna o CSS mais escalável e fácil de manter, especialmente em projetos grandes, onde a
clareza e consistência das classes são essenciais.
• Organização e Clareza: Com BEM, o código CSS é mais estruturado, pois segue um padrão rigoroso de nomenclatura. Isso facilita a
leitura e o entendimento, principalmente em projetos grandes.
• Reutilização de Componentes: BEM incentiva o uso de blocos e elementos que são independentes e reutilizáveis. Isso permite que
desenvolvedores criem componentes que podem ser usados em diferentes partes do projeto sem duplicar estilos.
• Facilidade de Manutenção e Escalabilidade: Graças à nomenclatura padronizada, a manutenção do código torna-se mais simples.
Quando precisamos alterar um bloco ou elemento, é fácil identificar a classe no CSS e garantir que o código fique consistente ao
longo do tempo.
• Evita Conflitos de Estilo: BEM ajuda a minimizar problemas de conflito de CSS, como especificidade excessiva, já que cada bloco e
elemento possui uma estrutura de classe única.
• Trabalho em Equipe: Por ser uma convenção bem definida, BEM facilita a colaboração entre desenvolvedores, pois todos seguem o
mesmo padrão e compreendem rapidamente a função de cada classe.
• Nomes de Classes Longos: A nomenclatura detalhada da BEM pode resultar em nomes de classes longos e complexos. Em projetos
grandes, isso pode fazer o CSS parecer “poluído” e aumentar o tamanho do código.
• Curva de Aprendizado: Para iniciantes, a metodologia BEM pode ser confusa ou difícil de adotar, pois exige a compreensão dos
conceitos de bloco, elemento e modificador, e a criação de nomes coerentes.
• Excesso de Classes no HTML: Aplicar BEM rigorosamente pode resultar em HTML com muitas classes. Para desenvolvedores que
preferem uma estrutura mais enxuta, isso pode parecer sobrecarregado.
• Limitação de Especificidade: Embora a padronização da BEM ajude a manter um código organizado, ela também pode limitar a
especificidade. Para casos onde a personalização é necessária para um elemento específico, pode ser necessário criar modificadores
adicionais, o que pode complicar a estrutura.
• Não Ideal para Pequenos Projetos: Em projetos menores ou menos complexos, BEM pode parecer excessivo e aumentar
desnecessariamente a quantidade de código, sem trazer benefícios significativos.
Conclusão
A metodologia BEM é muito útil em projetos grandes e colaborativos, mas é importante considerar a complexidade do projeto antes de
adotá-la integralmente. Avaliar as necessidades de organização e escalabilidade é fundamental para decidir se BEM é a abordagem
mais eficiente para o contexto.
Agora, vamos aplicar a estrutura do BEM. Para que fique claro como essas três
abordagens funcionam na prática, começaremos criando estilos com base no
estilo básico que já temos, utilizando o Nesting. Em seguida, transformaremos
essa estrutura para aplicar a metodologia BEM, destacando as diferenças e os
benefícios que cada abordagem traz para a organização do CSS. Essa
comparação nos permitirá entender melhor como cada método pode ser
utilizado de maneira eficaz em nossos projetos.
No próximo arquivo, iremos reestruturar nosso código para incorporar os princípios da metodologia BEM, garantindo que cada
componente, elemento e variação esteja claramente definido e facilmente identificável. Essa transição nos ajudará a criar um código
mais coeso e intuitivo, que pode ser facilmente compreendido e atualizado por toda a equipe.
A metodologia BEM (Block, Element, Modifier) é uma abordagem que facilita a criação de um CSS bem estruturado, permitindo uma
organização clara e intuitiva. Cada parte do código é nomeada de maneira que sua relação e função sejam facilmente compreendidas.
Então vamos refatorar nosso arquivo html com a classes de acordo com essa estrutura, identificando as partes se será bloco, elemento
ou modificador.
Bloco: .caixa
• O bloco principal é identificado pela classe .caixa. Essa classe representa um componente independente que pode ser reutilizado
em diferentes partes do projeto.
Exemplos:
• .caixa__container-h3: Um contêiner que abriga um cabeçalho (h3), mostrando que é um elemento específico dentro do bloco caixa.
• .caixa__logos: Uma área que contém os logos dos cursos oferecidos.
• .caixa__link: Um link que pertence à seção de redes sociais.
Elementos de Lista:
• As classes como .caixa__item-lista indicam que cada item dentro da lista é um elemento do bloco caixa. Essa nomenclatura ajuda a
manter a hierarquia e a funcionalidade clara.
Vamos adicionar uma classe chamada caixa__img-curso em todos os elementos de imagem dentro dos elementos âncoras
caixa__círculo.
E para todos os elementos da nossa ul, vamos adicionar uma classe específica e alterar o
arquivo CSS para obtermos uma estrutura separadas pelas classe implementadas.
Hora de Praticar!
Agora é a sua vez!
• Modifique a estrutura HTML e CSS da sua página de anúncio da Smart TV utilizando a metodologia BEM.
• Sinta-se à vontade para ajustar a organização e adicionar novos elementos se necessário.
Primeiro vamos adicionar uma classe no elemento main, que vamos considerar um bloco e transformar seu seletor de tag por classe
no CSS, além de aplicar a estrutura que vimos aula passada no arquivo CSS.
Agora o elemento h1 dentro da seção de classe principal, irá possuir uma classe que identifique-o como elemento e vamos alterar a
forma que identificamos esse elemento no arquivo CSS.
Podemos entender que o [Link]-h1 não é um elemento e sim apenas uma modificação que precisar fazer de forma específica, e é
preciso analisar se vale a pena utilizar a metodologia do BEM ou não, no nosso caso como o Desafio é praticarmos esse conceito,
vamos deixar tudo alinhado com essa metodologia.
Dentro desse elemento, vamos criar as classes para cada um respectivamente e alterar o CSS.
Feito isso podemos substituir todos os elementos h2,para a nova classe h2. Continuando nessa lógica vamos implementar também
nos elementos elementos da próxima div que será renomeada a classe para principal_container-condicoes:
Feito isso encerramos a modularização e metodologia do BEM, da estrutura seção principal. E agora vamos para a próxima seção que
será a Características.
Para finalizar o nosso desafio, vamos aplicar o BEM na última estrutura que é link do whatsapp:
Módulo 8
EXTENSÃO - SASS
EXTENSÃO - SASS
EXTENSÃO - SASS DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Apresentação do Módulo (1/1) 637
Neste módulo, vamos expandir nossas habilidades em front-end com o uso do SASS (Syntactically Awesome Style Sheets), uma
extensão avançada do CSS que permite escrever código mais organizado, reutilizável e poderoso. Ao longo das próximas aulas,
abordaremos conceitos como:
• Nesting: Aprenderemos como estruturar nosso CSS de maneira hierárquica, tornando o código mais legível e refletindo melhor a
estrutura HTML.
• Variáveis: Vamos explorar como criar e usar variáveis para facilitar a manutenção de estilos, permitindo mudar cores, tamanhos e
fontes de forma rápida e centralizada.
• Mixins e Functions: Conheceremos formas de criar blocos de estilos reutilizáveis e funções para automatizar padrões, ganhando
eficiência no desenvolvimento.
• Partials e Modularização: Descobriremos como dividir o código SASS em múltiplos arquivos e organizá-los de forma mais limpa e
lógica.
Além disso, exploraremos o uso do [Link] e do NPM para automatizar processos, gerenciar dependências e configurar um ambiente
de desenvolvimento prático e escalável. Prepare-se para concluir o módulo com um desafio prático que consolidará todos esses
conhecimentos e levará seu trabalho a um novo nível!
SASS, ou Syntactically Awesome Style Sheets, é um pré-processador de CSS que amplia as funcionalidades do CSS tradicional,
permitindo escrever estilos de forma mais poderosa e organizada. Ele nos oferece recursos como variáveis, nesting
(aninhamento de regras), mixins e funções, tornando o desenvolvimento de estilos mais eficiente e o código mais fácil de
manter.
Ao escrevermos em SASS, criamos nossos estilos em arquivos com a extensão .scss ou .sass. Esses arquivos, porém, não podem
ser lidos diretamente pelos navegadores. Em vez disso, o SASS compila esses arquivos em CSS padrão, transformando o código
escrito em SASS/SCSS para um formato que o navegador consegue interpretar.
Para saber mais e acessar a documentação completa, você pode visitar o site oficial do SASS.
Para que o navegador possa aplicar esses estilos, precisamos de um compilador SASS, que converte (ou "compila") o código
SASS para um arquivo CSS padrão. Esse processo de compilação traduz todos os recursos avançados do SASS, como variáveis e
mixins, em código CSS, permitindo que o navegador carregue e aplique esses estilos na página.
• O compilador converte para CSS – O compilador SASS transforma nosso código em um arquivo .css.
• O navegador aplica o CSS – O arquivo CSS final é lido pelo navegador e aplicado à página.
Esse processo é feito automaticamente com o uso de ferramentas que rodam o compilador sempre que o código SASS é
alterado, facilitando o desenvolvimento.
• Compilar pré-processadores: Ferramentas como o SASS, que precisam compilar código em CSS, utilizam o [Link] para
automatizar esse processo. Cada vez que salvamos um arquivo SASS, o [Link] compila automaticamente o arquivo em CSS,
aplicando as mudanças instantaneamente no projeto.
• Automatizar tarefas repetitivas: Usando [Link] junto com bibliotecas e ferramentas (como Gulp ou Webpack), você pode
automatizar diversas tarefas, como minificar CSS, otimizar imagens e recarregar automaticamente a página no navegador.
• Instalar e gerenciar pacotes via NPM: [Link] traz o NPM (Node Package Manager), que permite baixar e gerenciar pacotes
e bibliotecas específicas para o front-end, como o SASS, e muitas outras que ajudam a agilizar o desenvolvimento e
padronizar o fluxo de trabalho.
Dessa forma, mesmo para desenvolvedores focados no front-end, o [Link] é uma ferramenta essencial para utilizar SASS de
maneira mais eficiente e automatizada, além de melhorar a produtividade no dia a dia.
• Instalar o SASS e outras ferramentas automaticamente: Com um simples comando npm install sass, o NPM baixa e instala
o compilador SASS, junto com suas dependências.
• Automatizar a compilação do SASS para CSS: Com o NPM, você pode configurar scripts no projeto (em [Link]) para
que o SASS seja automaticamente compilado. Por exemplo, o comando npm run sass pode ser configurado para rodar
sempre que você quiser compilar o código SASS para CSS.
• Gerenciar dependências do projeto: O NPM registra todas as bibliotecas e ferramentas usadas no projeto (como o SASS) em
um arquivo [Link], permitindo que qualquer desenvolvedor possa instalar as mesmas dependências no projeto com o
comando npm install.
Com o NPM, todo o processo de instalação, atualização e execução do SASS fica mais simples e organizado, permitindo que
você automatize e padronize o desenvolvimento.
• Acesse o site oficial do [Link]: Visite [Link] onde você encontrará as opções de download para diferentes
sistemas operacionais (Windows, macOS e Linux).
• Baixe o instalador: Clique na versão desejada para baixar o instalador adequado ao seu sistema operacional.
• Instale o [Link]:
• Windows e macOS: Abra o arquivo de instalação e siga as instruções do assistente de instalação. Durante a instalação,
certifique-se de selecionar a opção "Add to PATH" para que você possa acessar o [Link] e o NPM pelo terminal.
• Linux: Siga as instruções específicas do site para instalar via gerenciador de pacotes (como apt para distribuições baseadas
em Debian).
• Verifique a instalação:
• Após instalar, abra o terminal (ou prompt de comando) e digite node -v para verificar a versão do [Link] e npm -v para
verificar a versão do NPM.
• Se ambos retornarem uma versão, a instalação foi concluída com sucesso.
Agora, o [Link] e o NPM estão prontos para uso, permitindo que você instale pacotes, como o SASS, e utilize outras
ferramentas de desenvolvimento.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Instalando o NODEJS, NPM e SASS (2/6) 643
Navegando entre Pastas com o Comando cd
O comando cd significa "change directory" (mudar diretório) e é usado no terminal para navegar entre as pastas do seu
computador. Vamos entender como usá-lo de forma simples!
Exemplo Prático
Você está atualmente na pasta chamada Extensao SASS. Dentro dessa pasta, existe outra pasta chamada SASS, e você quer
entrar nela. Para fazer isso, siga estas etapas:
• Abra o terminal: Você pode abrir o terminal ou prompt de comando no seu computador.
• Digite o comando: Para entrar na pasta SASS, você vai usar o seguinte comando:
• O que isso faz? Esse comando diz ao seu computador para "mudar para" a pasta SASS. Agora você está dentro da pasta
SASS, e todos os comandos que você digitar a partir daqui se aplicarão a essa pasta.
• Confirmando a Navegação: Para ter certeza de que você está na pasta correta, você pode usar o comando pwd (print
working directory), que mostrará o caminho da pasta atual.
Inicializar o NPM:
• Com o terminal aberto e na pasta do seu projeto, digite o seguinte comando e pressione Enter:
O que acontece? O NPM iniciará um assistente que fará perguntas sobre o seu projeto.
Arquivo [Link]:
• Após responder todas as perguntas, o NPM criará um arquivo chamado [Link] na pasta do seu projeto. Você pode ver
esse arquivo na aba "Explorer" do VS Code, à esquerda.
O que é o [Link]?
• O [Link] contém todas as informações que você forneceu e outras que o NPM adicionou, como as dependências do
seu projeto (caso você adicione pacotes futuramente).
Importância do [Link]
• Organização: Mantém as informações do seu projeto em um só lugar.
• Gestão de Dependências: Facilita a instalação e o gerenciamento de pacotes com o NPM.
• Colaboração: Outros desenvolvedores podem facilmente instalar as dependências do seuDESENVOLVIMENTO
projeto WEB com umIMPRESSIONADOR
– FULL STACK único comando,
I HASHTAG PROGRAMAÇÃO
npm install.
000
Módulo 8 – Instalando o NODEJS, NPM e SASS (5/6) 646
Instalando o SASS com NPM
Depois de inicializar o NPM e criar o arquivo [Link], você está pronto para instalar o SASS no seu projeto. O SASS é um
pré-processador CSS que permite escrever estilos de forma mais eficiente. Aqui está como instalá-lo:
Para instalar o SASS como uma dependência do seu projeto, você pode usar o seguinte comando:
O que acontece?
• O comando npm install sass irá baixar e instalar o SASS na sua pasta de projeto.
• A opção --save-dev adiciona o SASS como uma dependência de desenvolvimento no seu arquivo [Link], o que significa
que ele será usado apenas durante o desenvolvimento e não será incluído na versão final do seu projeto.
Verificar a Instalação:
• Após a instalação, você pode verificar se o SASS foi adicionado com sucesso ao seu projeto. Abra o arquivo [Link] e
procure por uma seção chamada "devDependencies". Você deverá ver algo parecido com isso:
O que acontece?
• O comando npm install verifica o arquivo [Link] e instala todas as dependências listadas nele na pasta node_modules.
• Isso cria uma nova pasta node_modules contendo todos os pacotes necessários para o seu projeto funcionar corretamente.
Dentro do seu arquivo [Link], você pode definir scripts que facilitam tarefas comuns no seu projeto. O script que você
mencionou é usado para compilar arquivos SASS em CSS. Vamos analisar cada parte do script:
O que é "scripts"?
• A seção "scripts" no [Link] permite que você defina comandos que podem ser executados com o NPM (Node Package
Manager). Isso é útil para automatizar tarefas repetitivas, como a compilação de arquivos SASS.
O que acontece?
• Ao rodar esse comando, o NPM irá procurar o script "compile:sass" que você definiu no [Link] e executará o comando
associado a ele. Isso irá compilar o arquivo [Link] em [Link].
Esse script é uma adição importante ao seu fluxo de trabalho, pois permite que você acompanhe automaticamente as
alterações feitas nos arquivos SASS e as compile em CSS sempre que uma mudança ocorrer.
• -w (ou --watch): este argumento é a parte mais importante do comando. Ele instrui o compilador SASS a "observar" (ou
"monitorar") o arquivo [Link]. Isso significa que o SASS ficará atento a qualquer alteração nesse arquivo (ou em qualquer
arquivo SASS que ele importar).
• Automatização da Compilação:
• Ao usar o script watch, você não precisa compilar manualmente seus arquivos SASS toda vez que fizer uma alteração. O SASS
irá automaticamente recompilar o CSS sempre que detectar uma mudança no arquivo [Link].
• Aumento da Produtividade:
• Isso permite que você se concentre no desenvolvimento, pois não precisa interromper seu fluxo de trabalho para executar o
comando de compilação repetidamente. Você pode escrever seu código SASS e ver as alterações refletidas instantaneamente
no CSS.
• Ideal para Desenvolvimento:
• O monitoramento contínuo é especialmente útil durante a fase de desenvolvimento, quando você está frequentemente
fazendo alterações no estilo e precisa ver resultados imediatos. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Variáveis (1/8) 652
Vamos entender a diferença entre variáveis em CSS e SASS, pois essa é uma das características que tornam o SASS um
poderoso pré-processador CSS.
Variáveis em CSS
Como Funciona:
• Declaração: Em CSS, as variáveis são declaradas usando a sintaxe --nome-da-variavel: valor; dentro de um seletor.
• Escopo: As variáveis CSS têm escopo limitado ao seletor onde são definidas, mas podem ser acessadas em qualquer lugar
dentro desse seletor ou em seus filhos.
• Uso: Para usar uma variável, você precisa chamá-la com a função var(), assim: background-color: var(--nome-da-variavel);.
Variáveis em SASS
Como Funciona:
• Declaração: As variáveis em SASS são declaradas simplesmente com um $ seguido do nome da variável: $nome-da-variavel:
valor;.
• Escopo: As variáveis SASS podem ser acessadas em qualquer lugar dentro do arquivo, desde que sejam declaradas antes de
seu uso, e têm escopo global por padrão, a menos que definidas dentro de um bloco específico.
• Uso: Você usa a variável diretamente pelo nome, sem precisar de uma função para acessá-la, assim: background-color:
$nome-da-variavel;.
Sintaxe:
• CSS: Usa -- para declarar e var() para usar.
• SASS: Usa $ para declarar e o nome diretamente para usar.
Escopo:
• CSS: O escopo é limitado ao seletor onde a variável é declarada.
• SASS: O escopo é global por padrão, a menos que esteja dentro de um bloco.
Compatibilidade:
• CSS: As variáveis CSS são uma funcionalidade padrão do CSS e podem ser usadas em qualquer navegador moderno.
• SASS: As variáveis SASS são uma funcionalidade do pré-processador e precisam ser compiladas para CSS antes de serem
utilizadas no navegador.
Uso em Cálculos:
• CSS: As variáveis CSS podem ser usadas em cálculos, mas com algumas limitações.
• SASS: O SASS permite operações matemáticas diretas com variáveis, facilitando a manipulação de valores.
Compilação: Quando você compila seu arquivo SASS, a linha box-shadow: 0 0 1rem rgba($cinza, 0.15); será convertida para CSS
normal. O resultado final será algo como:
• Uso da Função darken(): Ao usar a função darken(), você especifica a cor a ser escurecida e a porcentagem que deseja
escurecer.
• Resultado da Compilação: Quando você compila esse código SASS, a função darken() calcula a nova cor escurecida e
substitui a linha no CSS resultante. A cor resultante será uma versão mais escura de #303030.
As variáveis no SASS oferecem uma série de benefícios que tornam o desenvolvimento de estilos CSS mais eficiente e
organizado. Aqui estão os principais benefícios de usar variáveis no SASS:
• Facilidade de Atualização: Se você precisar mudar uma cor ou valor, basta atualizar a variável em um único lugar, e todas as
instâncias que usam essa variável serão automaticamente atualizadas.
• Simplificação de Alterações: Quando é necessário fazer ajustes de design, como mudar uma paleta de cores ou valores de
espaçamento, você pode simplesmente alterar as variáveis em vez de procurar manualmente por cada instância no código.
• Variações em Temas: Isso facilita a criação de diferentes temas, já que você pode alterar as variáveis em vez de reescrever todo o CSS.
• Facilidade de Criação de Funções: Com variáveis, você pode criar funções personalizadas que dependem de valores dinâmicos,
aumentando ainda mais a flexibilidade do seu código.
• Configurações e Temas: Você pode facilmente definir variáveis para configurações de tema e usá-las em mixins para criar estilos
responsivos e adaptáveis.
Primeiro vamos alterar as classes do arquivo HTML, para utilizar a metodologia do BEM e utilizar
o Nesting para aninhar os estilos já criado no [Link].
O que aplicamos aqui é chamado de Native Nesting, uma das funcionalidades do SASS que permite que você escreva estilos de
forma aninhada, seguindo a estrutura hierárquica do HTML. O Native Nesting proporciona uma maneira intuitiva de organizar seu
código CSS, agrupando estilos relacionados dentro de seus blocos principais, o que facilita a leitura e manutenção.
No código anterior, temos um bloco principal chamado .caixa, que contém várias regras de estilo para o seu layout, como display,
padding e box-shadow. Dentro desse bloco, usamos o Native Nesting para definir os estilos de elementos específicos, como
.caixa__h1, .caixa__h2, e .caixa__texto, utilizando o símbolo & para referenciar o seletor pai. Isso significa que, por exemplo, .caixa__h1
será interpretado como .caixa .caixa__h1, permitindo uma estrutura clara e lógica.
Esse tipo de organização não só torna o código mais legível, mas também ajuda a manter a consistência nas regras de estilo, já que
as propriedades relacionadas ficam agrupadas. Além disso, o uso de variáveis, como $cinza e $azul-escuro, para definir cores e
outros valores, proporciona uma flexibilidade adicional, permitindo alterações rápidas em todo o projeto. Assim, o Native Nesting se
torna uma ferramenta poderosa para otimizar o desenvolvimento de CSS com SASS, promovendo uma abordagem mais organizada
e eficiente.
Por exemplo, ao definir estilos para elementos dentro de uma .caixa, você pode aninhá-los diretamente, assim:
• &
: Já &:hover aplica um efeito de hover sobre o elemento
.caixa. Quando o usuário passar o mouse sobre .caixa, o
Sass irá interpretar &:hover como .caixa:hover, o que
mudará a cor do texto para $azul-escuro. Esse uso do &
simplifica o código ao permitir que efeitos ou
pseudoclasses sejam adicionados diretamente dentro
do bloco pai.
No Sass, as functions são blocos de código reutilizáveis que permitem realizar cálculos e operações complexas, retornando valores
que podem ser usados em outras partes do estilo. Functions ajudam a tornar o CSS mais dinâmico, permitindo a criação de estilos
que se adaptam a diferentes variáveis, simplificando o desenvolvimento.
Functions permitem criar pequenas fórmulas reutilizáveis que tornam o código mais flexível. Vamos analisar o exemplo da function
multiplicar, que cria uma operação de multiplicação. Aqui está um exemplo básico de como criar e usar essa função no Sass.
• Definição da Function: Aqui, a function multiplicar é definida para receber dois parâmetros, $a e $b.
• Retorno: Dentro da function, o @return multiplica os dois valores recebidos, retornando o resultado. Esse valor pode ser aplicado
diretamente nas propriedades CSS.
Usando uma function em Sass como multiplicar, podemos fazer cálculos dinâmicos diretamente nas propriedades CSS. No
exemplo abaixo, usamos a function multiplicar para definir o padding:
• Function multiplicar: Essa function recebe dois parâmetros, $a e $b, e retorna o resultado da multiplicação entre eles.
• Chamada da Function: No estilo do .elemento, chamamos multiplicar(2, 1), o que retorna 2, pois estamos multiplicando 2 por 1.
• Cálculo Final: Após a chamada da function, o valor retornado (2) é multiplicado por 1rem, resultando em 2rem. Esse valor final é
aplicado como padding para o .elemento.
• Flexibilidade: Permite usar cálculos diretamente no código CSS, tornando o design responsivo e ajustável.
• Facilidade de Atualização: Alterações na function refletem em todos os lugares onde ela é usada, simplificando a manutenção.
• Redução de Código Repetitivo: Evita ter que reescrever o mesmo cálculo em diferentes partes do CSS, o que mantém o código
mais limpo e organizado.
Esse uso de functions em Sass facilita a criação de estilos dinâmicos e torna o CSS mais escalável e eficiente para o projeto.
A function dividir em Sass é outra maneira de realizar cálculos dinâmicos diretamente no código CSS. Assim como a function
multiplicar, dividir permite operações matemáticas, mas aqui o objetivo é dividir dois valores. Vamos entender como ela funciona
com um exemplo:
Explicação do Exemplo
• Definição da Function dividir: A function dividir recebe dois parâmetros, $a e $b, e retorna o valor da divisão entre eles ($a / $b).
• Chamada da Function no CSS: No estilo do .elemento, chamamos dividir(10, 2). Isso retorna o valor 5, já que 10 dividido por 2 é
igual a 5.
• Aplicação do Resultado: O valor resultante da divisão, 5, é multiplicado por 1rem, resultando em 5rem. Esse valor é então
aplicado como o margin para o .elemento.
Aqui, a multiplicação direta 2 * 1 * 1rem resulta em 2rem. O Sass processa essa expressão antes de compilar para CSS final, o que
significa que o navegador verá apenas padding: 2rem; no arquivo CSS gerado.
• Cálculos Diretos e Simples: Para operações básicas, como multiplicar ou dividir valores fixos, você não precisa criar uma function.
Basta realizar a operação no próprio valor da propriedade.
• Rapidez e Eficiência: Economiza tempo quando o cálculo é simples e repetitivo, pois reduz o código necessário e torna o CSS
mais direto.
• Controle Visual no Código: Esse método permite que você ajuste medidas diretamente na linha da propriedade, facilitando o
entendimento do cálculo sem precisar rastrear uma function separada.
Quando Usar
Esses cálculos diretos são úteis para definir tamanhos proporcionais ou espaçamentos em seu código, especialmente quando
deseja ajustar rapidamente os valores sem criar e configurar functions adicionais no Sass.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Mixins e Includes (1/5) 668
No Sass, mixins são blocos de código reutilizáveis que permitem agrupar e aplicar conjuntos de estilos CSS de forma eficiente e
flexível. Imagine que você tem um estilo específico que precisa ser repetido em várias partes do seu CSS. Com um mixin, é possível
definir esses estilos uma vez e aplicá-los em diversos lugares, evitando duplicação de código e facilitando manutenção.
• Facilita a Manutenção: Caso precise ajustar um estilo que está presente em várias partes, basta alterar o mixin, e todas as
ocorrências serão atualizadas automaticamente.
• Permite Flexibilidade com Parâmetros: Mixins aceitam parâmetros, o que permite ajustar estilos específicos, como tamanhos e
cores, sempre que necessário. Com isso, você pode criar um mixin para um botão que aceita diferentes cores e tamanhos.
Com Sass, você pode utilizar mixins para centralizar estilos recorrentes de maneira prática. Vamos ver um exemplo com o mixin
flex-j--center, que ajuda a centralizar elementos usando Flexbox:
Aqui, o mixin flex-j--center define display: flex e justify-content: center. Com ele, você
pode centralizar o conteúdo horizontalmente em qualquer elemento de forma
simples e sem repetir esse código em várias partes do CSS.
• Defina o mixin: Primeiro, você cria o mixin com a palavra @mixin, seguida pelo nome e pelos estilos que deseja reutilizar.
• Inclua o mixin no seletor desejado: Para aplicar esses estilos em um elemento específico, você usa @include seguido pelo nome
do mixin.
Conceito do @include
A palavra @include é como uma "chamada" ao mixin. Quando o Sass encontra @include flex-j--center;, ele substitui essa linha pelo
código dentro do mixin flex-j--center, que contém display: flex; justify-content: center;. Assim, o elemento .container recebe esses
estilos sem que você precise reescrevê-los diretamente.
Essa abordagem torna o código mais organizado e facilita a manutenção. Por exemplo, se precisar ajustar o alinhamento, basta
atualizar o mixin, e todos os elementos que o utilizam automaticamente refletem as mudanças, sem que você precise ir em cada
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
um para alterá-los.
000
Módulo 8 – Mixins e Includes (3/5) 670
Os mixins com parâmetros no Sass permitem criar estilos altamente flexíveis e reutilizáveis. Utilizando parâmetros, você pode
passar valores específicos ao incluir um mixin, ajustando seus estilos conforme necessário, sem precisar reescrever o código para
cada caso.
• .titulo: o mixin é chamado com 2rem para o tamanho da fonte, 700 para o peso e 1.5 para a altura da linha.
• .subtitulo: o mixin é reutilizado com diferentes valores de tamanho, peso e altura da linha.
• Reutilização Flexível: Com parâmetros, um mixin pode ser aplicado a vários elementos com configurações diferentes, mas com o
mesmo código-base.
• Manutenção Simplificada: Alterar o estilo em um único lugar afeta todos os elementos que o utilizam. Por exemplo, ao ajustar o
mixin textos, todos os elementos que o incluírem serão atualizados.
• Consistência Visual: Os mixins com parâmetros mantêm o design consistente e evitam a duplicação, pois você só precisa incluir
o mixin e passar os valores desejados.
Parâmetros do Mixin
• $flow: Define a direção e o comportamento do Flexbox (exemplo: row wrap, column nowrap).
• $align: Controla o alinhamento dos itens ao longo do eixo transversal, usando align-items.
• $justify: Define a distribuição dos itens no eixo principal com justify-content.
• $gap: Define o espaçamento entre os elementos flexíveis.
Vamos incluir no HTML um link com a classe caixa__link, que será estilizado como um botão usando o @extend.
Usamos o @extend para que caixa__link herde os estilos de %botao e %botao--hover, placeholders que definem estilos de botão
básico e de hover. Veja como funciona:
• Código Mais Limpo: Estilos reutilizáveis podem ser definidos uma vez e aplicados em vários lugares.
• Facilidade de Manutenção: Alterações no design do botão podem ser feitas no placeholder, e todos os elementos que o
estendem serão atualizados automaticamente.
• Consistência Visual: Todos os links que imitam botões terão o mesmo estilo, garantindo um visual uniforme.
Definição do Placeholder:
• O placeholder %botao define estilos comuns que você deseja aplicar a
vários elementos que devem ter uma aparência de botão.
• Este placeholder inclui propriedades como align-self, color, font-weight,
background-color, border-radius, padding, text-decoration, e transition.
Hover State:
• O placeholder %botao--hover define os estilos que devem ser aplicados
quando o botão está em estado de hover. Aqui, mudamos a cor e a cor de
fundo para indicar visualmente que o botão está interativo.
Na metodologia BEM, o uso de media queries dentro de blocos segue o princípio de organização, mantendo cada parte do
estilo do componente isolada e de fácil manutenção. Ao invés de aplicar as media queries fora do bloco ou da estrutura
específica, elas são incorporadas diretamente nos seletores do próprio componente.
Para utilizarmos uma ferramenta poderosa para aplicar media queries de maneira mais eficiente no SASS, começamos
criando um mixin. Mixins são blocos de código reutilizáveis que facilitam a organização de estilos, e, nesse caso, vamos
utilizá-los para gerenciar estilos responsivos de forma prática.
Dentro do nosso mixin, usamos a palavra-chave @content. Pense no @content como uma “área” reservada para o
conteúdo que será adicionado posteriormente. É como um espaço vazio que será preenchido conforme necessário. Assim,
quando chamarmos o mixin query-pequena, todo o estilo que colocarmos dentro do @include será automaticamente
inserido no local onde está o @content dentro do mixin.
Vantagens
Assim, esse método torna o uso de media queries mais limpo e eficiente, principalmente em projetos responsivos que exigem ajustes
para diferentes tamanhos de tela. DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Content e If(4/7) 679
A padronização do nome dos mixins no SASS usando o formato respond-tamanho (por
exemplo, respond-small, respond-medium, respond-big) é uma prática que facilita a
organização e a leitura do código ao definir media queries para diferentes tamanhos de tela.
Esse padrão torna o código mais intuitivo e eficiente, pois, ao ver respond-small, fica
imediatamente claro que se trata de uma media query para uma tela pequena.
Como Funciona
No exemplo ao lado, cada mixin representa uma media query para um tamanho específico de
tela, com nomes que ajudam a identificar o contexto de uso:
Benefícios da Padronização
• Clareza: Com o nome respond seguido de um tamanho (small, medium, big), fica claro que
o mixin é voltado para media queries e que tipo de tela ele atende.
• Escalabilidade: Com uma estrutura de nomes como essa, fica mais fácil adicionar novas
media queries se necessário, mantendo a consistência (por exemplo, respond-large).
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Content e If(5/7) 680
Para tornar nossas media queries mais dinâmicas e flexíveis, podemos
aprimorar a criação dos nossos mixins utilizando condicionais @if e @else if no
SASS. Essa abordagem permite que um único mixin (respond) possa responder
a diferentes tamanhos de tela, dependendo de um parâmetro específico. Isso
reduz a necessidade de criar um mixin separado para cada tamanho de tela e
facilita a manutenção do código.
• Condicional @if e @else if: Usamos o @if para checar o valor do parâmetro
$tamanho e definir a media query correta. A cada condição, o mixin verifica o
valor e aplica a media query correspondente.
No exemplo ao lado, cada condição (small, medium, big) aplica uma media
query com um limite de largura diferente.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Content e If(6/7) 681
No SASS, podemos definir valores padrão para os parâmetros em um mixin, o que facilita o uso e permite maior flexibilidade.
Quando um valor padrão é atribuído a um parâmetro, ele será aplicado automaticamente se o mixin for chamado sem especificar
um valor para esse parâmetro. Isso reduz a quantidade de código que precisamos escrever, pois não precisamos sempre passar
todos os valores ao chamar o mixin, apenas os que realmente desejamos personalizar.
• $flow: row: Se não especificarmos nada, o flex-flow será row, ou seja, os itens serão alinhados na horizontal.
• $align: stretch: O align-items será stretch por padrão, fazendo com que os itens ocupem toda a altura do contêiner.
• $justify: start: O justify-content será start, alinhando os itens no início do contêiner.
• $gap: 0: O espaçamento (gap) entre os itens será 0 caso não alteremos esse valor.
Também podemos passar apenas os valores que queremos modificar. Por exemplo, se quisermos definir um gap de 1rem e o justify-
content como center:
O que é?
Compilação é o processo de transformar seu código SASS (ou SCSS) em CSS puro. O navegador só entende CSS, então precisamos
fazer essa conversão.
Como funciona?
Aqui está o comando que usamos para compilar:
• sass/[Link]: Este é o seu arquivo SASS original onde você escreveu seus estilos.
• css/[Link]: Este será o arquivo CSS gerado após a compilação.
O que é?
Prefixos são instruções que ajudam o navegador a entender certas propriedades CSS que podem não ser suportadas da mesma
forma em todos os navegadores.
Como funciona?
Utilizamos o Autoprefixer para adicionar esses prefixos automaticamente. Veja como é feito:
Esse comando de prefixação tem o objetivo de adicionar prefixos de compatibilidade ao CSS, para que ele funcione corretamente
em diferentes navegadores. Vamos entender cada parte do comando:
postcss:
• O que é: PostCSS é uma ferramenta que permite processar o CSS com vários plugins. Neste caso, usamos o postcss com um
plugin específico, o autoprefixer.
• Por que usamos: Com ele, podemos aplicar automaticamente prefixos a certas propriedades CSS, garantindo compatibilidade
com navegadores antigos ou que não suportam as últimas versões de CSS da mesma forma.
-b 'last 10 versions':
• O que é: Este argumento define quais versões de navegadores devem ser suportadas.
• Como funciona: -b é a abreviação de browsers, e 'last 10 versions' indica que queremos suportar as últimas 10 versões de cada
navegador importante. Isso ajuda a cobrir uma grande parte dos usuários sem aumentar demais o tamanho do CSS com prefixos
para versões muito antigas e raramente usadas.
css/[Link]:
• O que é: Este é o arquivo de entrada, ou seja, o CSS compilado pelo SASS na etapa anterior.
• Por que usamos: O [Link] é o ponto de partida para a aplicação dos prefixos. Esse arquivo ainda não possui os prefixos
adicionados.
-o css/[Link]:
• O que é: -o significa output (saída).
• Como funciona: Esse argumento define o nome do arquivo final após a adição dos prefixos. No caso, [Link] será o CSS
final, contendo os prefixos para garantir compatibilidade com navegadores antigos.
O que é?
A compactação é o processo de remover espaços em branco, quebras de linha e outros caracteres desnecessários do CSS,
resultando em um arquivo menor.
Como funciona?
Aqui está o comando que usamos para compactar o CSS:
O que é?
A etapa de Build combina todas as etapas anteriores em um único comando, facilitando o processo.
Como funciona?
Aqui está o comando de Build:
• Este comando usa uma ferramenta chamada npm-run-all para executar as etapas de compilação, prefixação e compactação em
sequência, de forma organizada.
autoprefixer:
• O que é: O autoprefixer é um plugin que adiciona automaticamente prefixos para garantir que o CSS funcione em diferentes
navegadores.
• Por que usamos: Como alguns navegadores exigem prefixos especiais para interpretar certas propriedades CSS, o autoprefixer
automatiza esse processo, aplicando os prefixos necessários de forma inteligente.
npm-run-all:
• O que é: npm-run-all é uma ferramenta que permite executar vários scripts do npm em sequência ou paralelamente.
• Por que usamos: Com ela, conseguimos simplificar a execução de várias etapas no processamento do CSS em um único
comando. Por exemplo, podemos compilar o SASS, aplicar os prefixos e comprimir o CSS final em uma sequência de comandos.
postcss:
• O que é: PostCSS é uma ferramenta para transformar CSS com o uso de plugins, como o autoprefixer.
• Por que usamos: No nosso caso, ele serve como uma plataforma que executa o autoprefixer e permite que outros plugins sejam
adicionados ao processo, tornando o CSS mais compatível e customizável.
postcss-cli:
• O que é: PostCSS CLI é uma interface de linha de comando para o PostCSS.
• Por que usamos: Ela permite que executemos o PostCSS através do terminal usando comandos npm, o que facilita o uso do
autoprefixer em nosso processo de build.
DESENVOLVIMENTO WEB – FULL STACK IMPRESSIONADOR I HASHTAG PROGRAMAÇÃO
000
Módulo 8 – Build: Compile, Prefix and Compress(7/7) 689
Como Instalar as Dependências
Para instalar todas essas dependências, usamos o comando:
• --save-dev: Esse argumento indica que estamos instalando essas dependências como "dependências de desenvolvimento". Elas
são necessárias apenas durante o desenvolvimento e não serão incluídas no projeto final que vai para produção.
Resumo
Essas dependências são essenciais para que o [Link] possa executar o processo completo de transformar o SASS em CSS
compatível com diferentes navegadores. Elas automatizam tarefas como adicionar prefixos, executar vários comandos em
sequência e permitir o uso de plugins no processamento do CSS.
O Sass oferece o @for, uma regra de loop que funciona de maneira parecida com outras linguagens de programação. Ele permite
que você repita um bloco de código um número específico de vezes. A sintaxe básica do @for no Sass é a seguinte:
No loop @for, definimos uma variável, geralmente $i, que começará com o valor de <início> e incrementará até o valor de <fim>,
executando o código dentro do loop para cada número. Isso possibilita criar uma série de estilos sequenciais de forma prática.
Automatização do processo:
• Em vez de escrever manualmente um nth-child para cada item da lista e aplicar um escurecimento específico, o loop @for permite
que a aplicação de estilos seja automatizada para qualquer quantidade de elementos. Aqui, definimos 15 itens, mas essa estrutura
funciona para quantidades maiores com uma simples alteração no número final do loop.
Resultado:
Esse código aplica uma série de estilos progressivos com eficiência e flexibilidade, criando uma escala de cores em tons de azul que vai
escurecendo conforme cada item da lista, sem precisar escrever nth-child separadamente para cada um.
O padrão 7-1 é uma forma de organizar projetos SASS, dividindo os arquivos de estilo em diferentes pastas e arquivos, conforme a sua
função no projeto. Esse padrão ajuda a manter o código mais organizado, facilitando a manutenção, escalabilidade e compreensão
dos estilos, principalmente em projetos maiores.
A ideia é dividir os estilos em 7 pastas principais e usar 1 arquivo SASS principal para importar todos eles.
E, no arquivo principal [Link], que fica na raiz do projeto, fazemos os imports de cada uma dessas pastas.
O que é um Boilerplate?
Um boilerplate é uma estrutura básica ou "esqueleto" que serve como ponto de partida para projetos. É um conjunto de arquivos e
diretórios pré-configurados que ajudam a iniciar o desenvolvimento rapidamente, pois já incluem a organização básica do código e
algumas configurações padrão. No contexto do padrão 7-1 no SASS, o boilerplate da documentação do GitHub já traz a estrutura de
pastas e arquivos organizada conforme o padrão, incluindo arquivos vazios (ou quase vazios) para os principais componentes e estilos,
o que facilita e acelera o início do projeto.
Se quiser explorar um boilerplate para entender melhor, você pode conferir o repositório do padrão 7-1 no GitHub: 7-1 Boilerplate no
GitHub.
Outros:
[Link]
[Link]
Módulo 9
Essa página serve como um excelente exemplo para aplicar todos os conceitos que exploramos ao longo do curso. Através dela, você
poderá praticar habilidades de estruturação e estilização com SASS, criando desde layouts atraentes até elementos dinâmicos como
pop-ups.
Esse projeto foi pensado para você aplicar de forma prática o que aprendeu, oferecendo um ponto de partida claro e inspirador para
futuras criações.
Esse comando irá ler as configurações no arquivo JSON e baixar automaticamente todas as bibliotecas e ferramentas que nosso
projeto precisa para funcionar.
Observando nosso scripts para que ele sejam executados corretamente vamos criar na raiz do projeto duas pastas: css e sass.
O próximo passo é renomear essa nossa pasta para sass e a que criamos anteriormente pode ser deletada:
Agora, sempre que fizer uma alteração no seu arquivo SASS, o SASS detectará automaticamente e recompilará o CSS, mantendo seu
arquivo atualizado sem precisar rodar o comando manualmente a cada mudança. Isso é ideal para agilizar o processo de
desenvolvimento.
Para organizarmos melhor a estrutura do nosso projeto vamos deletar todos os arquivos ReadMe e também os arquivos das estruturas
que não vamos utilizar como as pastas de Vendors, Themes, arquivo [Link] e vamos deletar o conteúdo do arquivo [Link].
Podemos deletar o conteúdo dos arquivos para criarmos o próprio padrão do projeto, assim teremos 10 arquivos scss para
implementar os estilos da página.
NOTA:
E adicionaremos a estruturas:
Adicionar a seção uma cor de fundo e alguns estilos: E para finalizar o disclaimer vamos adicionar uma
sombra:
No componente caixa:
Agora vamos adicionar cada bloco de passos da nossa seção e para começar esses blocos, vamos buscar os ícones através do site
SVG Repo. O SVG Repo é um site que oferece uma ampla coleção de ícones e ilustrações no formato SVG, prontos para uso em projetos de design e desenvolvimento. Ele permite buscar, baixar e personalizar gráficos vetoriais gratuitamente, facilitando a criação de
interfaces visuais modernas e responsivas.
Agora vamos copiar a estrutura do passo criado mais 3 vezes e adicionar as informações de acordo com os passos:
No arquivo inscricao:
Também vamos deletar todos elementos de passo e imagem, e adicionar um elemento de botão, dessa forma teremos uma
estrutura da seguinte forma:
Para a nossa seção vamos aplicar a propriedade align:start e ao botão vamos adicionar uma nova classe para centralizar.
Agora vamos adicionar as informações de texto da nossa seção que seguirá a seguinte estrutura:
No arquivo popup:
O JavaScript é uma linguagem de programação usada para adicionar interatividade e dinamismo às páginas da web. No caso de
um popup, o JavaScript pode ser utilizado para "ouvir" eventos, como cliques em botões, e executar ações, como abrir ou fechar o
popup, manipulando diretamente o DOM (Document Object Model).
Crie uma pasta chamada js e dentro dela irá criar um arquivo chamado [Link] e adiconar ao final do arquivo HTML da seguinte
estrutura:
• [Link](".js-botao"):
Seleciona todos os elementos do DOM que possuem a classe js-botao.
Retorna uma NodeList, que é uma lista de elementos similar a um array.
• var botoes:
Declara a variável botoes para armazenar essa lista de elementos.
• botoes[0]:
Seleciona o primeiro botão da NodeList botoes (índice 0).
• .addEventListener("click", function () { ... }):
Escuta o evento de clique no botão e executa a função passada como argumento quando o evento ocorre.
• [Link]("popup--aberto"):
Adiciona ou remove a classe popup--aberto no elemento <body>:
• Se a classe não existe, ela é adicionada.
Para todas as imagens nós vamos adicionar a propriedade loading com valor lazy (exemplos abaixo):
Por fim vamos buildar nosso projeto, para que ele comprima e melhore a performance do nosso site com o comando npm run
build:css:
• Faça o Upload
• Arraste e solte a pasta do projeto (ou os arquivos) diretamente na área designada no site do Netlify Drop.
• Aguarde o Deploy
• O Netlify processará os arquivos e publicará o site. Ao final, você receberá um link único (geralmente algo como [Link]
[Link]).
• Teste o Site
• Acesse o link fornecido para garantir que o site está funcionando corretamente.
• Alteração do Nome do Link: Você pode personalizar o nome do domínio gerado (por exemplo, de meu-site-
[Link] para [Link]) acessando as configurações do site no painel do Netlify.
• Atualização do Deploy: Sempre que precisar atualizar o site, basta repetir o processo de upload com os arquivos atualizados.
• Usar GitHub (Opcional): Se quiser um fluxo contínuo de deploys, conecte seu repositório GitHub ao Netlify para deploys
automáticos ao fazer push de novas alterações.