Fundamentos da Web com HTML e CSS
Unidades de Medida e Introdução a Media Queries
Aprenda sobre unidades de medida e introdução a media queries
Unidades de Medida e Introdução a Media Queries 📏📱
🚀 Introdução
Olá, futuros desenvolvedores web! 👋 Nesta aula prática, vamos mergulhar em dois conceitos fundamentais para criar layouts web modernos e, acima de tudo, responsivos: as Unidades de Medida em CSS e as Media Queries.
Em um mundo com uma infinidade de dispositivos (smartphones, tablets, laptops, TVs), é essencial que nossos sites se adaptem e ofereçam uma ótima experiência de usuário, independentemente do tamanho da tela. É aqui que as unidades de medida flexíveis e as media queries entram em jogo, permitindo que nossos designs "conversem" com o ambiente em que são exibidos.
Prepare-se para colocar a mão na massa e transformar seus layouts estáticos em interfaces dinâmicas e adaptáveis!
📐 Unidades de Medida em CSS
As unidades de medida definem o tamanho de elementos, textos, espaçamentos e outras propriedades em CSS. A escolha da unidade correta é crucial para a responsividade.
Por que a escolha da unidade importa? 🤔
Usar unidades fixas pode quebrar seu layout em telas menores ou maiores. Unidades relativas, por outro lado, permitem que seus elementos escalem de forma proporcional, garantindo que o design se mantenha coeso em diferentes contextos.
Tipos de Unidades ↔️📏
Podemos classificar as unidades em dois grandes grupos: Absolutas (fixas) e Relativas (flexíveis).
1. Unidades Absolutas (Fixed) 📏
Estas unidades têm um tamanho fixo e não mudam em relação a outros elementos ou ao tamanho da viewport.
px(pixels): A unidade mais comum. Representa um pixel na tela. É útil para elementos que precisam ter um tamanho exato e não devem escalar, mas deve ser usada com cautela para garantir a responsividade geral.- Exemplo:
.box { width: 150px; /* Largura fixa de 150 pixels */ height: 100px; border: 1px solid black; } p { font-size: 16px; /* Tamanho de fonte fixo */ }
- Exemplo:
pt(points): Usado principalmente em mídias impressas. 1pt é igual a 1/72 de uma polegada. Raramente usado para web.
2. Unidades Relativas (Flexible) ↔️
Estas unidades são dinâmicas e escalam em relação a outro valor (como o tamanho da fonte do elemento pai, o tamanho da viewport, etc.). São a chave para o design responsivo!
-
em: Relativo aofont-sizedo elemento pai. Se o elemento pai não tiver umfont-sizedefinido, ele herda do seu próprio pai, e assim por diante, até o elemento raiz (<html>).- Exemplo:
<div style="font-size: 20px;"> <!-- Pai com font-size de 20px --> <p style="font-size: 1em;">Este parágrafo terá 20px.</p> <span style="padding: 0.5em;">Este span terá 10px de padding.</span> </div> - Vantagem: Ótimo para componentes onde o espaçamento e o texto devem escalar juntos.
- Desvantagem: Pode ser difícil de gerenciar, pois o valor final de
emdepende de múltiplosfont-sizes na cadeia de herança.
- Exemplo:
-
rem(root em): Relativo aofont-sizedo elemento raiz (<html>). Esta é uma das unidades mais recomendadas para tipografia e espaçamento geral, pois oferece controle centralizado sobre a escala de todo o documento.- Exemplo:
<!DOCTYPE html> <html lang="pt-BR" style="font-size: 16px;"> <!-- Root com font-size de 16px --> <head> <style> h1 { font-size: 2rem; /* 2 * 16px = 32px */ } p { font-size: 1rem; /* 1 * 16px = 16px */ } .container { padding: 1.5rem; /* 1.5 * 16px = 24px */ } </style> </head> <body> <h1>Título</h1> <p>Conteúdo do parágrafo.</p> <div class="container">Um container com padding.</div> </body> </html> - Vantagem: Previsível e fácil de gerenciar, pois todos os
rems se baseiam em um único valor.
- Exemplo:
-
%(Porcentagem): Relativo ao valor da propriedade correspondente do elemento pai. Se você definewidth: 50%, significa 50% da largura do pai. Se definefont-size: 120%, significa 120% dofont-sizedo pai.- Exemplo:
<div style="width: 400px; height: 200px; background-color: lightgray;"> <div style="width: 50%; height: 50%; background-color: lightblue;"> <!-- Este div terá 200px de largura e 100px de altura --> </div> </div>
- Exemplo:
-
vw(Viewport Width): Relativo a 1% da largura da viewport (a janela do navegador). Se a viewport tem 1000px de largura,1vwé igual a 10px.- Exemplo:
h1 { font-size: 5vw; /* O tamanho do título será 5% da largura da viewport */ } .banner { width: 100vw; /* O banner ocupará a largura total da viewport */ } - Vantagem: Excelente para elementos que precisam escalar perfeitamente com a largura da tela, como títulos grandes ou imagens de fundo.
- Exemplo:
-
vh(Viewport Height): Relativo a 1% da altura da viewport. Se a viewport tem 800px de altura,1vhé igual a 8px.- Exemplo:
.full-screen-section { height: 100vh; /* Ocupa a altura total da viewport */ } - Vantagem: Útil para seções que devem preencher a tela verticalmente.
- Exemplo:
-
fr(Fractional Unit): Usado exclusivamente em CSS Grid Layout. Representa uma fração do espaço disponível no grid container.- Exemplo (CSS Grid):
.grid-container { display: grid; grid-template-columns: 1fr 2fr 1fr; /* Três colunas: a do meio é o dobro das laterais */ gap: 10px; } - Vantagem: Permite criar layouts de grid fluidos e flexíveis, onde as colunas/linhas se ajustam automaticamente.
- Exemplo (CSS Grid):
📱 Introdução a Media Queries
As Media Queries são uma funcionalidade do CSS3 que permite aplicar estilos diferentes a um documento com base nas características do dispositivo que está sendo usado para visualizá-lo. Elas são a espinha dorsal do design responsivo.
O que são e para que servem? 🎯
Imagine que você quer que seu site tenha um layout de três colunas em desktops, mas em smartphones, você quer que essas colunas se empilhem verticalmente. As Media Queries permitem que você diga ao navegador: "Se a largura da tela for maior que X pixels, aplique este estilo; caso contrário, aplique aquele outro."
Sintaxe Básica 📝
A sintaxe de uma Media Query começa com @media, seguido pelo tipo de mídia e uma ou mais "features" (características) entre parênteses.
/* Exemplo de Media Query */
@media screen and (min-width: 768px) {
/* Estilos CSS aplicados SOMENTE quando a tela é "screen"
E a largura MÍNIMA da viewport é de 768 pixels ou mais. */
body {
background-color: lightblue;
}
.container {
max-width: 960px;
}
}@media: Palavra-chave que inicia a Media Query.screen: Tipo de mídia. Indica que os estilos são para telas de computador, tablets, smartphones, etc. Outros tipos incluemprint(para impressão) eall(para todos os tipos de mídia).and: Operador lógico para combinar múltiplas condições.(min-width: 768px): Uma media feature. Significa "quando a largura mínima da viewport for 768 pixels".
Media Features Comuns 🌟
width/height: Largura/altura exata da viewport.min-width: Largura mínima da viewport. Estilos aplicados quando a viewport é igual ou maior que o valor especificado.max-width: Largura máxima da viewport. Estilos aplicados quando a viewport é igual ou menor que o valor especificado.orientation: Orientação da viewport (portraitoulandscape).resolution: Resolução da tela (e.g.,min-resolution: 300dpi).
Breakpoints 🚦
Breakpoints são os pontos de interrupção onde seu layout muda para se adaptar a diferentes tamanhos de tela. Não há um conjunto universal de breakpoints "correto", mas alguns são comumente usados:
- Pequenos dispositivos (smartphones): até
576pxou600px - Dispositivos médios (tablets):
577pxa768pxou601pxa992px - Dispositivos grandes (desktops):
769pxou993pxem diante
É uma boa prática começar com um design para dispositivos móveis (max-width) e depois adicionar Media Queries para telas maiores (min-width). Isso é conhecido como Mobile First.
Combinando Media Queries 🤝
Você pode combinar múltiplas condições usando operadores lógicos:
and: Todas as condições devem ser verdadeiras.@media screen and (min-width: 600px) and (max-width: 900px) { /* Estilos para telas entre 600px e 900px */ .sidebar { display: none; } },(vírgula - operadoror): Se qualquer uma das condições for verdadeira.@media screen and (min-width: 1200px), screen and (orientation: landscape) { /* Estilos aplicados se a tela for muito larga OU se estiver em modo paisagem */ .header { font-size: 2.5rem; } }not: Nega uma condição (raramente usado).
Exemplo Oficial (MDN Web Docs) 📚
Este exemplo mostra como a cor de fundo e o tamanho da fonte podem mudar com base na largura da viewport:
/* Estilos padrão para telas pequenas (Mobile First) */
body {
background-color: lightcoral;
font-size: 16px;
}
/* Estilos para telas médias (a partir de 600px) */
@media screen and (min-width: 600px) {
body {
background-color: lightgreen;
font-size: 18px;
}
}
/* Estilos para telas grandes (a partir de 900px) */
@media screen and (min-width: 900px) {
body {
background-color: lightblue;
font-size: 20px;
}
}(Fonte adaptada: MDN Web Docs - Using Media Queries)
🧑💻 Exercícios Práticos: Construindo um Layout Responsivo
Agora é a sua vez de aplicar o que aprendemos! Vamos criar um layout simples e torná-lo responsivo usando unidades de medida relativas e Media Queries.
🛠️ Setup Inicial
Crie dois arquivos: index.html e style.css na mesma pasta.
index.html:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Layout Responsivo - Prática</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>Meu Site Responsivo</h1>
<nav>
<ul>
<li><a href="#">Início</a></li>
<li><a href="#">Sobre</a></li>
<li><a href="#">Contato</a></li>
</ul>
</nav>
</header>
<main class="container">
<section class="hero">
<h2>Bem-vindo à Era Responsiva!</h2>
<p>Este é um parágrafo de exemplo para demonstrar unidades de medida e media queries.</p>
<button>Saiba Mais</button>
</section>
<section class="cards-section">
<div class="card">
<h3>Card 1</h3>
<p>Conteúdo do card um.</p>
</div>
<div class="card">
<h3>Card 2</h3>
<p>Conteúdo do card dois.</p>
</div>
<div class="card">
<h3>Card 3</h3>
<p>Conteúdo do card três.</p>
</div>
</section>
</main>
<footer>
<p>© 2023 Fundamentos da Web</p>
</footer>
</body>
</html>style.css (Código Base):
/* style.css */
/* Estilos globais básicos */
body {
font-family: Arial, sans-serif;
margin: 0;
line-height: 1.6;
background-color: #f4f4f4;
color: #333;
}
header {
background-color: #333;
color: #fff;
padding: 1rem 0;
text-align: center;
}
header h1 {
margin: 0;
}
nav ul {
list-style: none;
padding: 0;
display: flex;
justify-content: center;
gap: 20px;
}
nav a {
color: #fff;
text-decoration: none;
}
.container {
max-width: 1200px;
margin: 20px auto;
padding: 0 20px;
}
.hero {
background-color: #007bff;
color: #fff;
padding: 40px;
text-align: center;
margin-bottom: 20px;
}
.hero h2 {
font-size: 2.5em; /* Será alterado para rem/vw */
margin-bottom: 15px;
}
.hero p {
font-size: 1.1em; /* Será alterado para rem */
margin-bottom: 25px;
}
button {
background-color: #28a745;
color: #fff;
border: none;
padding: 10px 20px;
cursor: pointer;
font-size: 1em; /* Será alterado para rem */
border-radius: 5px;
}
.cards-section {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
}
.card {
background-color: #fff;
border: 1px solid #ddd;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
flex: 1; /* Para que os cards se distribuam */
min-width: 280px; /* Será alterado para % ou vw */
text-align: center;
}
footer {
background-color: #333;
color: #fff;
text-align: center;
padding: 20px 0;
margin-top: 40px;
}🎯 Tarefas
Siga os passos abaixo, alterando o arquivo style.css.
1. Configurar rem para o font-size base 📝
[ ]No elemento<html>, defina umfont-sizede16px. Isso será a base para todos os seusrems.[ ]Altere ofont-sizedeheader h1para2.5rem.[ ]Altere ofont-sizede.hero h2para2.5rem(ou3rempara um impacto maior).[ ]Altere ofont-sizede.hero ppara1.1rem.[ ]Altere ofont-sizedobuttonpara1rem.[ ]Altere opaddingdoheaderpara1rem 0.[ ]Altere omargindo.containerpara2rem auto.[ ]Altere opaddingdo.containerpara0 1.25rem.[ ]Altere opaddingdofooterpara1.25rem 0.
Dica: Ao definir font-size: 16px; no html, 1rem será igual a 16px. Se você mudar o font-size do html para 10px (uma técnica comum para facilitar cálculos, já que 1rem = 10px), todos os seus rems escalarão proporcionalmente.
2. Layout Fluido com % e vw 🌊
[ ]Altere a largura do.containerpara90%, mantendo omax-width: 1200px. Isso fará com que ele ocupe 90% da largura da tela, mas não mais que 1200px.[ ]Altere ofont-sizede.hero h2para5vw(além doremjá definido). Isso fará com que o título principal escale com a largura da viewport. Usemin()oumax()para limitar o tamanho se desejar (ex:font-size: min(5vw, 3rem);).
3. Componente Flexível com em 📦
[ ]No.card, defina umfont-sizede1.1em. Isso fará com que o texto dentro do card seja 10% maior que ofont-sizepadrão do card (que por sua vez herdará dobodyouhtml).[ ]No.card, defina opaddingpara1.5em. Observe como o padding se ajusta ao tamanho da fonte do próprio card.[ ]Altere omin-widthdo.cardpara45%para que ele ocupe quase metade da tela em dispositivos maiores.
4. Introdução a Media Queries 📱
Vamos usar Media Queries para adaptar o layout em diferentes tamanhos de tela.
[ ]Crie uma Media Query para telas commin-widthde768px. Dentro dela:- Altere o
background-colordobodypara#e0ffe0(um verde claro). - Altere o
font-sizedohtmlpara18px. - Altere o
paddingdonav ulpara0 20px.
- Altere o
[ ]Crie uma Media Query para telas commin-widthde1024px. Dentro dela:- Altere o
background-colordobodypara#e0f0ff(um azul claro). - Altere o
font-sizedohtmlpara20px. - Altere o
flex-directiondanav ulpararow(certifique-se que já estárowoucolumnpor padrão para telas menores).
- Altere o
[ ]Crie uma Media Query para telas commax-widthde600px(para smartphones). Dentro dela:- Altere o
flex-directiondenav ulparacolumnealign-items: center;. - Altere o
paddingdo.heropara20px. - Altere o
flex-directionda.cards-sectionparacolumnealign-items: center;. - Altere a largura do
.cardpara90%para que eles ocupem a maior parte da largura da tela.
- Altere o
🧪 Testando seu Layout
Abra o arquivo index.html no seu navegador. Redimensione a janela do navegador lentamente e observe como:
- A cor de fundo do
bodymuda. - Os tamanhos de fonte escalam.
- O layout dos cards e da navegação se adapta.
Parabéns! Você está no caminho certo para criar sites verdadeiramente responsivos. 🎉
✅ Resumo e Próximos Passos
Nesta aula, exploramos as Unidades de Medida em CSS, distinguindo entre as unidades absolutas (como px) e as unidades relativas (como em, rem, %, vw, vh, fr). Entendemos a importância das unidades relativas para criar layouts flexíveis e adaptáveis.
Em seguida, mergulhamos nas Media Queries, a ferramenta essencial para aplicar estilos CSS condicionalmente, com base nas características do dispositivo. Aprendemos a sintaxe básica, os diferentes tipos de media features e como usar breakpoints para adaptar nossos designs.
Com os exercícios práticos, você teve a oportunidade de aplicar esses conceitos, transformando um layout estático em uma experiência responsiva.
O que vem a seguir? 🚀
- Pratique mais! Experimente diferentes breakpoints e combine unidades de medida.
- Aprofunde-se em Flexbox e Grid: Essas são as ferramentas de layout mais poderosas do CSS e se combinam perfeitamente com unidades relativas e Media Queries.
- Considere
min(),max(),clamp(): Funções CSS modernas que permitem definir tamanhos com limites, oferecendo ainda mais controle sobre a responsividade. - Explore mais Media Features: Descubra outras características como
prefers-color-scheme(para modo escuro),prefers-reduced-motione muito mais!
Continuem codificando e experimentando! A prática leva à perfeição no desenvolvimento web. 💪