Leia em uma página separada se achar melhor em https://estevanmaito.github.io/aprenda-html-css
Os exercícios ainda estão sendo recriados. Para receber atualizações desse repo, clique em Watch ao lado do Star (pode clicar nesse tb 😏).
-
Parte 1: HTML
- 1 - Escrevendo HTML
- 2 - Apresentando HTML
- 3 - Olá mundo!
- 4 - Estrutura básica
- 5 - Parágrafos
- 6 - Cabeçalhos
- 7 - Imagens
- 8 - Tamanho e acessibilidade em imagens
- 9 - Listas
- 10 - Links
- 11 - Tabelas
- 12 - Tabelas avançadas
- 13 - Formulários
- 14 - Formulários: entrada de texto curta
- 15 - Formulários: entrada de texto longa
- 16 - Formulários: radio buttons
- 17 - Formulários: checkboxes
- 18 - Formulários: select
- 19 - Formulários: envio
- 20 - Formulários: grupos
- 21 - Indentação
- 22 - Comentários
- 23 - Seções
- 24 - Seções: cabeçalho e navegação
- 25 - Seções: principal e secundária
- 26 - Seções: artigos e seções genéricas
- 27 - Seções: rodapé e divs
- 28 - ID
- 29 - Links internos
- 30 - Áudio e vídeo
- 31 - Iframes
- 32 - Blocos e linhas
- 33 - Mais texto
- 34 - Meta tags
- 35 - Validando HTML
-
Parte 2: CSS
- 36 - Escrevendo CSS
- 37 - Escrevendo CSS: no HTML com style
- 38 - Escrevendo CSS: no HTML em linha
- 39 - Escrevendo CSS: em arquivo externo
- 40 - Estrutura das regras
- 41 - Classes
- 42 - Seletores de tipo
- 43 - Seletores de classe
- 44 - Seletores de id
- 45 - Cascata
- 46 - Cores
- 47 - Herança
- 48 - Medidas
- 49 - Caixas (box-model)
- 50 - Padding
- 51 - Bordas
- 52 - Margem
- 53 - Texto
- 54 - Fontes
- 55 - Listas
- 56 - Tabelas
- 57 - Imagens de fundo
- 58 - Posicionamento
- 59 - Ordem (z-index)
- 60 - Seletores de atributos
- 61 - Combinando seletores
- 62 - Especificidade
- 63 - Pseudo classes
- 64 - Acessibilidade
- 65 - Media queries
- 66 - Breakpoints
- 67 - Viewport
- 68 - Validando CSS
- 69 - Flexbox
- 70 - Flexbox: linhas e colunas
- 71 - Flexbox: quebras
- 72 - Flexbox: justificar conteúdo
- 73 - Flexbox: alinhar itens
- 74 - Flexbox: alinhar conteúdo
- 75 - Flexbox: tamanho dos itens
-
Parte 3: BÔNUS
- 76 - Ferramentas
- 77 - Planejamento do projeto
- 78 - Estrutura dos arquivos
- 79 - HTML padrão
- 80 - Desenvolvimento HTML
- 81 - Desenvolvimento CSS
- 82 - Fim
Este livro é para você se:
-
O único contato que você teve com um site até hoje foi navegando nele pela internet. Você não faz ideia de como funciona um site. Ou
-
você já teve contato com HTML e CSS, talvez já tenha escrito códigos através de outros livros ou aulas, mas não se acostumou às particularidades de cada linguagem ou não entendeu direito como HTML e CSS estão ligados. Ou
-
você tem experiência com HTML e CSS mas gostaria de atualizar seus conceitos nas linguagens ou procura apenas uma referência rápida para sair colocando em prática. As chances são grandes de que você ache o que procura para sair usando em um dos mais de 70 capítulos que vão direto ao ponto. Ou
-
você só quer testar seus conhecimentos e fazer alguns exercícios.
Este livro não é para você se:
-
Você não sabe ler. Ou
-
está procurando um livro técnico com a especificação de cada linguagem. Ou
-
está buscando pelas novas APIs do HTML5, animações e efeitos complexos com CSS.
Este livro se baseia na premissa de que uma das melhores formas de aprender é fazendo.
As pessoas retém, em média:
- 5% escutando (aulas)
- 10% lendo
- 20% audiovisual
- 30% demonstrando
- 50% discutindo
- 75% praticando
- 90% ensinando
Fonte: Learning pyramid
A cada capítulo vou te levar de 10% a 75%.
Isso será alcançado através de capítulos curtos, direto ao ponto, seguidos de exemplos que você mesmo deve executar e exercícios baseados no que foi lido há pouco.
Li ótimos livros quando comecei a estudar estas tecnologias há alguns anos, mas nenhum foi além da leitura. Você termina de ler e não sabe como aplicar o conteúdo ou como estruturar uma página.
O melhor conceito que vi foi o aplicado por Mark Myers, autor americano, num livro de introdução ao Javascript. Capítulos curtos e muitos exercícios para praticar ao final de cada leitura. Ainda assim, ao final do livro eu não sabia onde usar ou o que construir com o que recém tinha acabado de aprender.
Decidi, portanto, criar o material de estudo que eu gostaria de ter lido e praticado em 2013. HTML e CSS não são a mesma coisa e não devem ser ensinados ao mesmo tempo. Imagine só, você querendo aprender a criar um parágrafo e eu te ensino a criar um parágrafo, alterar a cor e tamanho das fontes além de aumentar as margens.
Tenho certeza de que, ao final desta leitura, você será capaz de criar produtos incríveis além de estar direcionado para onde continuar a partir daqui.
Cada capítulo acompanha alguns exercícios para afixar o conteúdo recém lido. Sugiro fortemente que você realize todos. Do contrário, estará desperdiçando tempo e não reterá a maioria das informações.
Os desafios, em alguns momentos, podem parecer simples demais, e a minha intenção é que você sinta exatamente isso. O objetivo aqui é construir cada capítulo e seus exercícios sobre o que foi visto anteriormente, de modo que tudo se encaixe e pareça trivial.
Você também pode, a qualquer momento, voltar e refazer os exercícios para algum capítulo específico, caso queira relembrar os conceitos.
Não esqueça, a prática leva à perfeição.
BOA LEITURA!
HTML (Hypertext Markup Language) é uma linguagem que instrui o navegador (Firefox, Chrome, Edge, Safari, Opera, etc.) como montar uma página. Essas instruções basicamente dizem ao navegador onde cada parte da página deve ficar, seja um parágrafo, uma imagem ou um cabeçalho.
Apesar de as páginas que costumamos ver pela internet geralmente serem compostas por várias cores, fontes e formatos, o HTML em si é responsável apenas pela estrutura e conteúdo delas (textos, imagens, vídeo, links), enquanto que o CSS (mais detalhes na parte 2) é o responsável pela apresentação (instruções sobre como apresentar cada conteúdo, como cores, tamanhos e disposição).
Para que o navegador possa interpretar corretamente o que queremos que seja apresentado para quem for visualizar nossas páginas, precisamos escrever instruções específicas em HTML. Essas instruções são textos e podem ser escritas em qualquer editor de texto como o Notepad (bloco de notas) disponível no Windows ou TextEdit no Mac, que já vêm instalados com o sistema operacional ou um editor próprio para código, como Brackets, Sublime, Atom, Dreamweaver e mais uma infinidade que você pode conferir fazendo uma busca no Google por "editores de código".
Cada documento HTML cria uma página para o navegador. Ou seja, se tivermos vinte documentos, teremos vinte páginas no site.
Documentos HTML são identificados através de uma extensão própria. O nome do arquivo termina com .html
, como em sobre.html
ou contato.html
.
Durante o curso deste livro, nos restringiremos aos seguintes caracteres quando nomearmos um documento HTML (porém, saiba que existem mais possibilidades):
- apenas caracteres minúsculos;
- sem espaços;
- caracteres de 0-9, de a-z e - (hífen).
Faça os exercícios propostos para este capítulo em:
Geralmente, quando olhamos para a barra de endereços do navegador podemos ver o nome do arquivo HTML ao qual aquela página se refere:
Ou seja, quando este endereço é solicitado ao navegador, o arquivo index.html
é carregado e apresentado na tela do usuário.
Para que um arquivo HTML seja apresentado ao usuário, ele deve estar presente no servidor onde o site está hospedado. Assim, por exemplo, o navegador solicita o arquivo x.html
ao servidor que fará uma busca por este nome. Existindo um documento HTML que tenha o nome de x
, o servidor envia ao navegador o documento correspondente, caso contrário, uma mensagem de erro será apresentada ao usuário dizendo que o arquivo solicitado não foi encontrado.
Faça os exercícios propostos para este capítulo em:
A partir deste capítulo você já poderá se considerar um desenvolvedor web! É o que diz a Wikipedia:
Desenvolvimento web é o termo utilizado para descrever o desenvolvimento de sites
Vamos criar nosso primeiro site:
-
Na área de trabalho do seu computador, crie uma pasta chamada "meu-site" (note que estamos utilizando as mesmas regras de nomes para arquivos HTML aqui);
-
Abra seu editor de texto e crie um novo arquivo;
-
Copie o seguinte código dentro deste arquivo:
<!DOCTYPE html>
<html>
<head>
<title>Site do Estevan Maito</title>
</head>
<body>
Eu sou um desenvolvedor web!
</body>
</html>
-
Altere o título para o seu nome;
-
Salve o arquivo como
index.html
; -
Abra a pasta "meu-site" se já não estiver aberta e abra o arquivo
index.html
(com dois cliques ou selecione um navegador para abrir com).
Aí está! Sua primeira página para o mundo!
Mas o que está acontecendo aqui? Por que preciso escrever tantos "<", "/" e ">"?
Tags, leitor. Leitor, tags.
Tags são usadas em HTML para criar elementos e, assim, estruturar uma página. Geralmente, as tags aparecem em pares, uma tag de abertura e outra de fechamento. A tag de abertura consiste no nome do elemento (title
, por exemplo) cercado por <
e >
, resultando em <title>
, enquanto que a tag de fechamento é praticamente igual, com a exceção de que o nome do elemento (no nosso caso ainda é o title
) é precedido por /
, resultando em </title>
.
Tudo o que estiver entre o <
da tag de abertura e o >
da tag de fechamento é considerado um elemento. No exemplo acima, <title>Site do Estevan Maito</title>
é o nosso elemento title
.
Faça os exercícios propostos para este capítulo em:
No capítulo anterior vimos a seguinte estrutura, que é o mínimo para termos um documento HTML:
<!DOCTYPE html>
<html>
<head>
<title>Site do Estevan Maito</title>
</head>
<body>
Eu sou um desenvolvedor web!
</body>
</html>
Você já conhece as tags e sabe que uma de suas funções é prover estrutura para a página web, então vamos analisar linha a linha qual o papel de cada tag no documento HTML.
-
<!DOCTYPE html>
: é sempre a primeira linha e diz ao navegador qual o tipo de documento que ele deve apresentar na tela para o usuário. Nesse caso, nossa tag significa que este é um documento HTML5, a versão mais recente e compatível com todos navegadores modernos; -
<html>
e</html>
: todo o conteúdo de uma página deve ficar entre a tag de abertura e fechamentohtml
; -
<head>
e</head>
: o conteúdo desse elemento, com exceção do elementotitle
(que fica visível na janela do navegador, como na imagem do capítulo 2), não aparece para o usuário e geralmente é usado para inserir estilo e códigos relativos ao funcionamento do site, que se comunicam diretamente com o navegador; -
<title>
e</title>
: título da página, visível no nome da aba/janela do navegador; -
<body>
e</body>
: habitat de todos os elementos que são visíveis na tela do usuário. Menus, imagens, links, enfim, tudo que você vê na tela fica aqui dentro.
Nenhum desses elementos pode ser repetido.
Faça os exercícios propostos para este capítulo em:
Abra o arquivo index.html
que você criou no capítulo anterior e adicione uma linha abaixo de "Eu sou um desenvolvedor web!" dizendo "E eu sou incrível!". Você deverá ter isso dentro do elemento body
:
Eu sou um desenvolvedor web!
E eu sou incrível!
Agora execute novamente o arquivo index.html
, da mesma forma que foi realizado no passo 6 do capítulo anterior.
Você escreveu exatamente como eu mostrei, não foi? E por que o navegador está mostrando:
Eu sou um desenvolvedor web!E eu sou incrível!
O problema é que o navegador não reconhece uma nova linha da mesma forma com a qual estamos acostumados em editores de texto (como o Word, por exemplo). Ele simplesmente elimina todos os espaços entre os elementos e apresenta o resultado na tela.
Se você quiser mostrar dois parágrafos, terá que criar dois elementos que digam isso ao navegador. Faremos isso colocando nossas frases dentro das tags <p>
e </p>
, que compõem o elemento parágrafo.
Altere as duas frases dentro do elemento body
, no arquivo index.html
, para que se pareçam com isso:
<p>Eu sou um desenvolvedor web!</p>
<p>E eu sou incrível!</p>
Execute o arquivo index.html
para ver o resultado.
Talvez você já tenha percebido:
- Escrevemos as tags sempre em letras minúsculas;
- Não há espaços entre as tags e o conteúdo delas;
- A menos que o elemento utilizado tenha apenas umas tag, sempre adicione a tag de fechamento.
Faça os exercícios propostos para este capítulo em:
Já sabemos escrever parágrafos, mas imagine se um jornal, um trabalho escolar ou um site tivessem todo o seu conteúdo escrito em um mesmo tamanho de fonte. Seria praticamente impossível de localizar diferentes seções no texto. É por isso que utilizamos cabeçalhos.
Cabeçalhos estão disponíveis em HTML em seis níveis, sendo h1
o mais importante (e maior) e h6
o menos (e menor).
É aconselhável ter um h1
por página. Nenhum ou mais que um poderia deixar confuso um visitante sobre qual o tema ou título principal da página. Além disso, buscadores como Google e Bing utilizam os cabeçalhos para criar uma estrutura da página e isso é importante no ranking dos resultados. Com exceção dessa regra, você pode ter quantos cabeçalhos de outros níveis precisar.
Vamos alterar o código do nosso site, no arquivo index.html
, para mostrar alguns cabeçalhos. Antes da primeira frase, insira um elemento h1
e, antes da segunda frase, insira um elemento h2
com o conteúdo que você quiser. O resultado dever ser parecido com isso:
<h1>Seja bem-vindo ao meu site!</h1>
<p>Eu sou um desenvolvedor web!</p>
<h2>Sobre mim</h2>
<p>E eu sou incrível!</p>
Veja o resultado no navegador.
Faça os exercícios propostos para este capítulo em:
Ao inserir um elemento de imagem no documento HTML, não estamos adicionando a imagem em si, e sim um caminho para ela. É como se disséssemos ao navegador: "por favor, coloque neste espaço a seguinte imagem que está disponível neste caminho".
O caminho pode ser a URL para uma imagem em outro site ou a localização dela dentro do nosso servidor. Nesse último caso, digamos que dentro da pasta "meu-site" haja outra pasta chamada "imagens", e dentro dela tenhamos todas as imagens de nosso site. Poderíamos adicionar uma dessas fotos ao documento HTML da seguinte forma:
<img src="imagens/minha-foto.jpg">
Onde quer que adicionemos esta imagem, é lá que ela irá aparecer quando apresentada ao usuário, ou seja, será respeitada a ordem em que ela se encontra dentro do documento.
Note que o elemento img
não possui tag de fechamento! Além disso, este elemento possui um componente que não havia aparecido até agora, o atributo src
. Veremos muitos outros atributos ao longo deste livro, mas saiba por ora que atributos estendem a funcionalidade de um elemento. Nesse caso, além de indicarmos que queremos uma imagem naquele local, estamos dizendo que "queremos esta imagem especificamente".
Crie uma pasta chamada "imagens" dentro da pasta "meu-site", salve a seguinte imagem nela e insira-a no documento HTML com um elemento img
. Depois, veja o resultado no navegador.
http://i.imgur.com/ixsAXVk.jpg
Também é possível adicionar a imagem inserindo a URL acima diretamente no atributo src
.
Faça os exercícios propostos para este capítulo em:
Agora que temos uma imagem em nosso site, vamos acrescentar alguns detalhes. Começaremos pelo indispensável atributo alt
. Este atributo é responsável por fornecer ao navegador um texto alternativo à imagem, dessa forma, caso o navegador falhe em apresentar a imagem ou alguém visite seu site através de um leitor de tela (muito comum entre portadores de deficiências visuais), este texto será apresentado no lugar da imagem. Forneça sempre uma breve descrição da imagem, o suficiente para saber do que se trata sem vê-la.
A imagem anterior ficará assim em nosso site:
<img src="imagens/minha-foto.jpg" alt="Foto do autor do site">
Os dois atributos que compõem nossa imagem atualmente (src
e alt
) estarão presentes sempre em nossas imagens, mas além deles, podemos ter outros atributos opcionais, como altura (height
) e largura (width
), que dizem ao navegador qual o tamanho adequado para mostrar a imagem (implicitamente a medida utilizada é o pixel).
Não é aconselhável redimensionar imagens no navegador pois isso afeta a performance do carregamento do site como um todo. Por exemplo, se o arquivo "minha-foto.jpg" tem 100 pixels de altura e 50 pixels de largura e eu gostaria de apresentá-lo com a metade do tamanho, poderia inserí-la no documento HTML da seguinte forma:
<img src="imagens/minha-foto.jpg" alt="Foto do autor do site" width="50" height="25">
Note alguns detalhes nesse exemplo:
- O tamanho foi reduzido proporcionalmente;
- Tome cuidado ao trabalhar com alturas e larguras para que a imagem não fique distorcida;
- Fornecendo uma largura e uma altura às imagens, o navegador "reservará" um espaço exatamente daquele tamanho para a imagem enquanto ela não carrega, o que melhora a performance no carregamento do site.
Faça os exercícios propostos para este capítulo em:
Em HTML há duas opções de listas:
- ordenadas (ordered lists): listas numeradas automaticamente e identificadas pela tag
<ol>
; e - desordenadas (unordered lists): listas com marcadores e identificadas pela tag
<ul>
.
Cada item da lista (list item), tanto para listas ordenadas quanto desordenadas, é identificado pela tag <li>
.
Sendo assim, adicionaremos uma receita ao nosso site! Listaremos os ingredientes, que não precisam de ordem e os passos que devem ser seguidos em uma ordem específica (não levaremos o bolo ao forno antes de misturar os ingredientes, eu acho).
Adicione este trecho de código depois da imagem, no arquivo index.html
:
<h2>Bolo Delícia</h2>
<h3>Ingredientes</h3>
<ul>
<li>2 xícaras de farinha de trigo</li>
<li>2 ovos</li>
<li>1/2 xícara de leite</li>
</ul>
<h3>Modo de preparo</h3>
<ol>
<li>Misture os ingredientes</li>
<li>Despeje no lixo</li>
<li>Não repita isso em casa</li>
</ol>
O exemplo completo (com o código desde o início) está aqui.
Execute o arquivo index.html
e veja o resultado no navegador.
Faça os exercícios propostos para este capítulo em:
A primeira linha, do primeiro capítulo deste livro, diz que HTML significa Hypertext Markup Language. Hypertext é o nome complicado para Hyperlink, que é o nome complicado para link! Os links são parte fundamental da internet. Através deles podemos ir de um site para outro em apenas um clique ou executar alguma outra funcionalidade dentro do próprio site.
Por padrão, links têm um estilo diferente do texto comum. Eles são azuis e sublinhados.
O elemento a seguir cria um link para o site da Mozilla:
<a href="https://www.mozilla.org">Conheça a Mozilla!</a>
Que resultará no seguinte elemento em nossa página:
Vamos analisar o que compõe um link, em partes:
-
O elemento
<a>
</a>
representa uma âncora, que será o texto que estiver entre as tags (não dentro da tag de abertura). Ele é responsável por transformar um mero texto ("Conheça a Mozilla!") em um caminho para onde você definir no... -
atributo
href
, que representa uma referência a um hypertexto (hypertext reference), ou simplesmente diz ao navegador: "me leve para:". -
O conteúdo do atributo
href
pode ser um outro site ou uma página em nosso próprio site (também pode nos conduzir a outro ponto dentro da mesma página, como ainda veremos).
Para criar um link para uma outra página dentro de nosso site, basta indicar o nome do arquivo .html
que desejamos visitar (similar ao estudado no elemento img
). Se a página de nosso site encontra-se na mesma pasta do arquivo que está solicitando (digamos que o arquivo contato.html
esteja junto com o arquivo index.html
), criamos um link da seguinte forma:
<a href="contato.html">Fale conosco!</a>
Caso o arquivo esteja em outro diretório, simplesmente adicionamos o caminho para o arquivo no destino:
<a href="produtos/smartphone.html">Smartphones</a>
Aqui vimos apenas texto como conteúdo do link (a âncora), porém, saiba que é possível inserir praticamente qualquer elemento dentro de um link, inclusive imagens, e tornar este elemento interativo. Um breve exemplo que nos levaria à página do Google ao clicar sobre seu logo:
<a href="https://www.google.com">
<img src="logo-google.png" alt="Logotipo Google">
</a>
Faça os exercícios propostos para este capítulo em:
Até a criação do CSS (lá por 1996), usava-se tabelas para criar layouts (rodapés, cabeçalhos, etc.). Se você não está em 1995, sugiro que nunca use tabelas para organizar conteúdo em uma página.
Tabelas são criadas com o elemento table
e precisamos definir a estrutura das tabelas célula a célula, linha a linha.
Cada linha é criada utilizando o elemento tr
(table row) e cada coluna é criada a partir de células contidas na linha, representadas pelo elemento td
(table cell/data).
Uma tabela com duas linhas e duas colunas é criada da seguinte forma:
<table>
<tr>
<td>Linha 1, azul</td>
<td>Linha 1, vermelho</td>
</tr>
<tr>
<td>Linha 2, azul</td>
<td>Linha 2, vermelho</td>
</tr>
</table>
Insira esta tabela após o link criado no capítulo anterior, no arquivo index.html
e abra-o no navegador.
O resultado pode parecer um pouco confuso. Apesar de nossas células conterem cores, elas não estão pintadas. Isso só será possível com CSS, na segunda parte do livro. É possível ver também que as células "azuis" formaram a primeira coluna, enquanto que as "vermelhas" a segunda.
Faça os exercícios propostos para este capítulo em:
Por padrão, o texto dos elementos td
têm o mesmo estilo de parágrafos, ou seja, em fonte e tamanhos normais. Porém, assim como textos, tabelas também têm cabeçalhos, que neste contexto será o elemento th
(table header).
Um cabeçalho é criado simplesmente substituindo um elemento td
por um th
:
<table>
<tr>
<th>Cabeçalho coluna 1</th>
<th>Cabeçalho coluna 2</th>
</tr>
<tr>
<td>Linha 2, azul</td>
<td>Linha 2, vermelho</td>
</tr>
</table>
Um tabela pode ter uma célula que se estende por mais de uma linha. Isso é alcançado com o atributo rowspan
e a quantidade de células a ocupar. No exemplo abaixo, "Química" ocupará toda a coluna "Segunda-feira".
<table>
<tr>
<th>Segunda-feira</th>
<th>Terça-feira</th>
</tr>
<tr>
<td rowspan="2">Química</td>
<td>Matemática</td>
</tr>
<tr>
<td>Matemática</td>
</tr>
</table>
Pode-se expandir uma célula por mais de uma coluna também, através do atributo colspan
e a quantidade de células a ocupar. No exemplo abaixo, "Química" ocupará a primeira linha tanto de "Segunda-feira" quanto de "Terça-feira".
<table>
<tr>
<th>Segunda-feira</th>
<th>Terça-feira</th>
</tr>
<tr>
<td colspan="2">Química</td>
</tr>
<tr>
<td>Matemática</td>
<td>Matemática</td>
</tr>
</table>
Temos este código até aqui.
Faça os exercícios propostos para este capítulo em:
Uma das principais formas de interação entre um site e seus usuários, é através de formulários. Eles permitem que o usuário faça contato com o site, forneça dados de cartão de crédito para uma compra, cadastre-se em um rede social, entre diversas outras opções.
O elemento essencial para criar um formulário é o form
. Grande parte dos formulários começa da seguinte forma:
<form action="/obrigado-contato" method="post">
</form>
Aqui temos dois atributos analisados em detalhes:
-
action
: define a localização para onde os dados do formulário serão enviados, geralmente algum lugar especificado no servidor onde o site está hospedado. Ao chegar no destino, os dados são tratados e o usuário recebe uma resposta de sucesso ou erro. No lado do servidor, existem várias linguagens de programação que podem ser utilizadas para analisar e processar os dados enviados pelo formulário, entre diversas outras temos: Javascript, PHP, Ruby, C#, Java, Python, etc. -
method
: define qual o método de envio dos dados do formulário. Pode serget
oupost
.
Ainda sobre o atributo method
e os valores que ele aceita, usamos post
quando queremos enviar mais que algumas palavras e de forma mais privada (a solicitação para o servidor é enviada longe dos olhos do usuário comum), enquanto que o método get
é usado para envio de pequenos formulários, como campos de busca e cadastro de e-mails, quando a solicitação para o servidor é enviada na URL do navegador, como no exemplo abaixo de uma busca no Google sobre "métodos http":
https://www.google.com.br/search?q=métodos+http
Faça os exercícios propostos para este capítulo em:
Criaremos um formulário simples de contato e, para isso, o usuário precisa de um local para inserir seu nome. Esse local é o elemento input
.
<form action="/obrigado-contato" method="post">
<label>
Nome:
<input type="text" name="nome">
</label>
</form>
Insira este trecho de código no arquivo index.html
e veja o resultado no navegador. Experimente clicar sobre o título do campo "Nome". Observe como ao clicar sobre o título, o cursor vai automaticamente para dentro da caixa de texto.
Temos dois elementos novos aqui: input
e label
.
Label significa rótulo e é exatamente para isso que este elemento serve. Ele rotula outros elementos e é usado principalmente em formulários para facilitar a usabilidade dos usuários e auxiliar quem depende da acessibilidade de seu site. O texto dentro dele é o texto que antecederá a caixa de texto.
O elemento input
define uma caixa de texto simples, de apenas uma linha e é ideal para dados curtos como nome, e-mail, telefones, etc. Nosso elemento possui dois atributos:
type="text"
: significa que nossa caixa receberá texto do usuário.type
também pode ter outros valores, entre eles:number
,email
,tel
,password
(esconde os caracteres) e etc.name="nome"
: o nome do campo que será enviado junto com os dados do formulário. Pode ser qualquer valor, desde que não tenha espaços.
Uma forma alternativa de escrever o código anterior e que tem o mesmo resultado é atribuindo um identificador (id
) ao input
e conectando este identificador ao atributo for
, do label
.
<form action="/obrigado-contato" method="post">
<label for="campoNome">Nome:</label>
<input type="text" name="nome" id="campoNome">
</form>
O id
pode ter qualquer valor, desde que não contenha espaços, seja único no documento inteiro e seja o único ID do elemento em questão. Portanto, no exemplo anterior onde utilizamos "campoNome", poderíamos, para simplificar, utilizar apenas "nome".
Você escolhe qual dos dois modos utilizar.
Faça os exercícios propostos para este capítulo em:
Para campos de texto com mais de uma linha (onde um input
seria insuficiente), usamos o elemento textarea
.
<form action="/obrigado-contato" method="post">
<label>
Nome:
<input type="text" name="nome">
</label>
<br>
<label>
Mensagem:
<textarea name="mensagem" rows="4" cols="20"></textarea>
</label>
</form>
Primeiro, adicionamos um rótulo (label
) que está conectado ao textarea
através do atributo for
. Em seguida, adicionamos o elemento textarea
. Vamos aos detalhes:
- Não temos um atributo
type
, já que está explícito no nome do elemento que teremos apenas texto (textarea); - O atributo
name
tem a mesma função já vista; rows
ecols
definem quantas linhas e colunas o campo terá. Se omitidos, o elemento assume um tamanho padrão de acordo com cada navegador;- Por fim, mas não menos importante, temos uma tag de fechamento
</textarea>
, coisa que não temos no elementoinput
. Isso porque podemos inserir texto que será carregado por padrão no campo, entre as tags de abertura e fechamento.
A bruxaria aqui fica por conta do elemento br
, que cria uma quebra de linha (line break) e deixa nosso formulário mais legível (eu disse legível, não bonito). Apesar de apresentá-lo este elemento somente agora, ele pode ser usado em qualquer lugar, desde dentro de um parágrafo ou cabeçalho até entre elementos, como no exemplo acima.
Faça os exercícios propostos para este capítulo em:
Radio buttons permitem que o usuário selecione apenas uma opção entre várias. Abaixo do label
do nosso textarea
, insira o seguinte trecho de código e veja o resultado no navegador.
<br><br>
O que você está achando deste livro até agora?
<br>
<label>
<input type="radio" name="qualidade" value="otimo" checked>
Ótimo
</label>
<label>
<input type="radio" name="qualidade" value="bom">
Bom
</label>
<label>
<input type="radio" name="qualidade" value="razoável">
Razoável
</label>
Poucas novidades por aqui.
-
type
, que eratext
, passou a serradio
; -
O que dá a funcionalidade que queremos de selecionar apenas uma opção entre várias é que todos
radio
s compartilham do mesmoname
; -
O atributo
value
é o valor que será enviado ao servidor no momento da submissão do formulário, de acordo com a opção selecionada; -
O atributo
checked
, no caso de botões radio, só pode ser usado em um elemento e selecionará por padrão este elemento, podendo ser alterado pelo usuário.
Faça os exercícios propostos para este capítulo em:
Enquanto que os radio
buttons permitem a seleção de apenas uma opção, as checkbox
es (caixas de seleção) não têm limites.
Abaixo do nosso último exemplo, insira o seguinte código e visualize o resultado no navegador:
<br><br>
Quem além de você poderia aprender HTML e CSS?
<br>
<label>
<input type="checkbox" name="indicado" value="mãe" checked>
Mãe
</label>
<label>
<input type="checkbox" name="indicado" value="pai">
Pai
</label>
<label>
<input type="checkbox" name="indicado" value="amigos">
Amigos
</label>
Esta frase está ficando frequente. Isso significa que você já tem um conhecimento significativo.
Sem novidades por aqui.
Faça os exercícios propostos para este capítulo em:
O elemento de seleção, ou select
é o elemento ideal para quando o usuário precisa selecionar apenas uma opção entre várias, similar ao radio
button, mas existem muitas opções ou você quer deixar as opções mais organizadas.
Insira o seguinte trecho de código após as checkboxes do exemplo anterior e execute o arquivo:
<br><br>
Como você prefere ser chamado(a)?
<br>
<select name="tratamento">
<option value="senhor">Senhor</option>
<option value="mestre">Mestre</option>
<option value="senhora">Senhora</option>
<option value="deusa" selected>Deusa</option>
</select>
Aqui temos algumas diferenças em relação aos últimos elementos do formulário:
-
O elemento
select
é o único que contém o atributoname
e contém todas as opções dentro dele; -
Cada opção (
option
) tem um valor (value
) que corresponde ao apresentado ao usuário entre as tags<option></option>
; -
Assim como em outros tipos de
input
, podemos apresentar ao usuário uma resposta pré-selecionada, neste caso, usando o atributoselected
(não confunda comchecked
docheckbox
eradio
).
Faça os exercícios propostos para este capítulo em:
O envio do formulário é feito através do botão de submissão, ou submit
. Através dele, quando o usuário envia o formulário, os dados deste são enviados ao servidor (geralmente) para que sejam processados.
Antes da tag </form>
, adicione um botão para enviar o formulário, execute o arquivo index.html
no navegador e veja o resultado.
<br>
<input type="submit" value="Enviar formulário sem noção">
Talvez este seja o elemento mais simples do formulário. O atributo type="submit"
indica que este elemento submeterá os dados para o valor que estiver no atributo action
da tag <form>
, enquanto que o atributo value
representa o texto que será visível no botão, ao usuário.
Faça os exercícios propostos para este capítulo em:
Apesar de nosso formulário atual ser bem pequeno, os olhos de alguns usuários podem sangrar com tanta desorganização e falta de estrutura. Sem alterar o estilo dele ainda (veremos em breve como melhorar isso com CSS), usaremos dois elementos muito simples para melhorar a usabilidade deste formulário: fieldset
e legend
. Nosso formulário completo, com a adição destes dois elementos ficará da seguinte forma. Faça as alterações necessárias em seu documento HTML e execute-o para visualizar os resultados.
<form action="/obrigado-contato" method="post">
<fieldset>
<legend>Contato</legend>
<label>
Nome:
<input type="text" name="nome">
</label>
<br>
<label>
Mensagem:
<textarea name="mensagem" rows="4" cols="20"></textarea>
</label>
</fieldset>
<fieldset>
<legend>Perguntas</legend>
O que você está achando deste livro até agora?
<br>
<label>
<input type="radio" name="qualidade" value="Ótimo" checked>
Ótimo
</label>
<label>
<input type="radio" name="qualidade" value="Bom">
Bom
</label>
<label>
<input type="radio" name="qualidade" value="Razoável">
Razoável
</label>
<br><br>
Quem além de você poderia aprender HTML e CSS?
<br>
<label>
<input type="checkbox" name="indicado" value="Mãe" checked>
Mãe
</label>
<label>
<input type="checkbox" name="indicado" value="Pai">
Pai
</label>
<label>
<input type="checkbox" name="indicado" value="Amigos">
Amigos
</label>
<br><br>
Como você prefere ser chamado(a)?
<br>
<select name="tratamento">
<option value="senhor">Senhor</option>
<option value="mestre">Mestre</option>
<option value="senhora">Senhora</option>
<option value="deusa" selected>Deusa</option>
</select>
</fieldset>
<br>
<input type="submit" value="Enviar formulário sem noção">
</form>
O que foi feito aqui:
-
Separamos o formulário em duas seções: "contato" e "perguntas";
-
Cada seção é criada a partir de um
fieldset
que circunda os elementos daquele grupo; -
O nome de cada grupo é atribuído através do elemento
legend
, que está posicionado imediatamente após a tag de abertura dofieldset
; -
Com inclusão da "moldura" proporcionada pelo
fieldset
, pudemos eliminar algumas quebras de linha (br
).
Faça os exercícios propostos para este capítulo em:
Ou "da arte de tornar o código legível". Uma das principais virtudes de um bom código não está no que você escreveu e sim no espaço em branco. Note que até aqui, todo nosso código foi inserido com um padrão de espaço em branco entre os elementos. O navegador não se importa com este espaço deixado fora dos elementos. Portanto, podemos abusar dessa virtude para deixar nosso código melhor organizado.
Veja dois exemplos de organização:
<!DOCTYPE html>
<html>
<head>
<title>Meu documento desorganizado</title>
</head>
<body>
<h1>Seja bem-vindo</h1>
<p>Este é o pior site do mundo</p>
<form action="/ilegível" method="post">
<label>
Mensagem
<textarea name="mensagem" rows="3" cols="30"></textarea>
</label>
<input type="submit" value="Enviar">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Meu documento organizado</title>
</head>
<body>
<h1>Seja bem-vindo</h1>
<p>Este é o melhor site do mundo (ou pelo menos o mais organizado)</p>
<form action="/sucesso-garantido" method="post">
<label>
Mensagem
<textarea name="mensagem" rows="3" cols="30"></textarea>
</label>
<input type="submit" value="Enviar">
</form>
</body>
</html>
Os dois códigos apresentarão o mesmo resultado ao navegador. Em qual dos dois padrões você acredita que será mais fácil fazer alterações, encontrar determinado elemento e encontrar uma tag que você esqueceu de fechar?
A esta organização chamamos de indentação, que nada mais é que organizar de forma hierárquica os elementos. Se um elemento (que chamaremos de pai) tem outro elemento (filho) contido nele, o filho deverá estar localizado alguns espaços à frente. Quantos? Você define o que é melhor. Os espaçamentos mais utilizados variam de dois a quatro espaços ou um "tab". Neste livro, estou utilizando quatro espaços a cada "tab".
Faça os exercícios propostos para este capítulo em:
Nem sempre apenas o espaçamento tornará o código mais compreensível. Às vezes você precisa deixar mensagens no código para um colega ou para você mesmo no futuro, sobre o porque de um determinado elemento estar naquela posição ou para descrever melhor para qual seção do código está olhando ou até mesmo para excluir da visualização do navegador um trecho de código sem removê-lo definitivamente do documento HTML.
<!DOCTYPE html>
<html>
<head>
<title>Site do Estevan Maito</title>
</head>
<body>
<!-- Um comentário de uma linha pode ser escrito assim -->
<!--
Um comentário
com mais de uma
linha pode ser
escrito assim.
-->
<h1>Seja bem-vindo ao meu site!</h1>
<p>Eu sou um desenvolvedor web!</p>
<h2>Sobre mim</h2>
<!-- O trecho de código abaixo foi substituído até você ser incrível -->
<!-- O código abaixo não aparecerá no navegador -->
<!-- <p>E eu sou incrível!</p> -->
<!-- Mas este irá! -->
<p>E eu sou legal!</p>
</body>
</html>
De agora em diante, deixaremos comentários em nosso código, iniciando com <!--
e terminando com -->
.
Faça os exercícios propostos para este capítulo em:
A partir deste capítulo veremos como estruturar nossas páginas de forma semântica e organizada, ou seja, cada elemento é tão descritivo por si só que não há necessidade de apelar para comentários, classes e ids (veremos estes dois em breve) para entender o que ele significa. Estes elementos têm função apenas de identificar uma determinanda seção com base em sua funcionalidade.
Uma página muito simples se parece com essa imagem:
Além das facilidades que estas estruturas proporcionam a nós desenvolvedores, elas também auxiliam na acessibilidade, identificando cada seção para programas leitores de tela, por exemplo.
Faça os exercícios propostos para este capítulo em:
O elemento header
define um cabeçalho. Não confunda este cabeçalho com aqueles que identificam textos, como h1
e h2
. O header
tem o papel de agrupar elementos introdutórios, como logos, alguns menus e títulos, mas sem limitar-se ao topo da página, já que também podemos ter cabeçalhos em artigos e diversos outros lugares da página.
Já o elemento nav
é responsável por identificar uma seção de navegação. Aqui podem ser agrupados links que levam a outras páginas do site, pequenos formulários de busca, menus e etc.
<!DOCTYPE html>
<html>
<head>
<title>Exemplo de seções</title>
</head>
<body>
<header>
<img src="imagens/logo.jpg" alt="Logo da empresa">
<p>Site oficial da Estevan Corp.</p>
</header>
<nav>
<p>
<a href="/contato.html">Contato</a>
</p>
<p>
<a href="/sobre-nos.html">Sobre nós</a>
</p>
</nav>
</body>
</html>
Faça os exercícios propostos para este capítulo em:
O elemento main
corresponde ao principal conteúdo da página e deve ser usado apenas uma vez, dentro do body
. Dentro dele teremos formulários, artigos e tudo mais que considerarmos como conteúdo principal da página.
Conteúdo à parte do principal, que não tem relação direta com este, como glossário, biografia do autor, links relacionados, etc., serão englobados pelo elemento aside
.
<!-- O código anterior ao body, inclusive, foi omitido para simplificar o exemplo -->
<!-- cabeçalho principal -->
<header>
<img src="imagens/logo.jpg" alt="Logo da empresa">
<p>Site oficial da Estevan Corp.</p>
</header>
<!-- navegação do site -->
<nav>
<p>
<a href="/contato.html">Contato</a>
</p>
<p>
<a href="/sobre-nos.html">Sobre nós</a>
</p>
</nav>
<!-- conteúdo principal, formulários de contato, imagens, vídeos -->
<main>
<h1>Seja bem-vindo</h1>
<p>Somos uma empresa com mais de 150 anos no mercado [...]</p>
</main>
<!-- conteúdo que faz parte do site mas que não é necessariamente principal -->
<aside>
<a href="estevan.html">Saiba mais sobre o autor</a>
<a href="faq.html">Perguntas frequentes</a>
</aside>
<!-- o restante do código também foi omitido -->
Faça os exercícios propostos para este capítulo em:
O conteúdo de uma página é geralmente dividido em diversos blocos de conteúdo relacionado, mas que não tem um nome específico como navegação, cabeçalho e rodapé por exemplo. Estes blocos podem ser agrupados em seções chamadas de section
. Uma section
pode agrupar outros elementos como também pode estar agrupada dentro de outros elementos, como um article
, que define um artigo.
<!-- seção de artigos -->
<section>
<h2>Artigos</h2>
<article>
<h3>HTML é incrível</h3>
<section>
<p>Postado em: 20/06/2017</p>
</section>
<p>Desenvolva sites e mostre seu poder!</p>
</article>
<article>
<h3>Aprenda a criar sites</h3>
<p>Criar um site é mais simples do que parece.</p>
</article>
</section>
Faça os exercícios propostos para este capítulo em:
Direitos autorais, informações de contato e links úteis também têm um elemento específico para repousar no HTML, é o footer
(rodapé). Assim como o header
, a utlização do rodapé não se limita ao final da página, já que podemos ter notas ao final de um artigo, um botão de curtir depois de uma foto, etc.
<!-- Exemplo de utilização de um footer -->
<footer>
Todos os direitos reservados a Estevan Maito.
</footer>
Por fim, temos o controverso elemento div
(de divisão). É muito comum encontrar sites em que nenhum dos elementos vistos anteriormente são usados e temos apenas divs
para separar o conteúdo. Até a introdução da última especificação do HTML, a 5 (o famoso HTML5), não havia outro meio de dividir e organizar o conteúdo senão com div
. Hoje, já podemos escrever código muito mais claro com o auxílio das seções vistas anteriormente, mas podem existir momentos em que nenhum daqueles elementos se encaixa, como um bloco de botões para redes sociais ou um bloco de elementos que deve ser agrupado unicamente para alterar seu estilo, por exemplo. Nestes casos, pode-se usar div
.
<div>
<p>Um parágrafo que precisa de um estilo único. O diferentão.</p>
</div>
Faça os exercícios propostos para este capítulo em:
Vimos brevemente o uso de id
no capítulo 14, para conectar um label
a inputs
. O id
define um identificador único no elemento que deve ser único também no documento HTML inteiro. Os valores válidos para um id
são: letras, números, "_", "-" e ".".
Os principais usos do id
são para identificação de estilos (usando CSS), em algum script e links internos (visto no próximo capítulo).
<!-- Um bom exemplo de uso de id -->
<p id="erro">Tente novamente mais tarde</p>
<!-- Péssimo uso do id -->
<p id="meu paragrafo">Não espere que funcione como deveria...</p>
Faça os exercícios propostos para este capítulo em:
Já vimos como criar links para outras páginas, tanto dentro de nosso site quanto para outros sites, mas existe mais uma possibilidade que o link nos dá, que é a de criar links dentro da própria página.
Esse tipo de link é muito comum e auxilia os usuários da nossa página a se localizar e navegar mais rápido por ela.
Adicione o seguinte código ao arquivo index.html
. A primeira linha deve ser inserida imediatamente abaixo da tag <body>
enquanto que a última, imediatamente antes da tag </body>
. Feito isso, visualize o resultado no navegador e experimente clicar no link criado no começo da página.
<!-- linha a ser inserida após a tag <body> -->
<a href="#fim">Ir para o fim da página</a>
<!-- linha a ser inserida antes da tag </body> -->
<p id="fim">Você chegou ao fim!</p>
O valor do atributo href
do link acima é igual ao valor do id
que queremos como destino (nesse caso o destino será o elemento <p>
com id="fim"
), acrescido de #
no começo.
Faça os exercícios propostos para este capítulo em:
Adicionar áudio e vídeo a uma página vem junto com alguns problemas de compatibilidade entre os navegadores. Isso quer dizer que se o seu objetivo for atingir o máximo de pessoas possíveis para um vídeo ou áudio, talvez você acabe com diversos arquivos apenas para tocar um "bip". Neste livro, manteremos nosso foco em atingir o melhor resultado usando o mínimo de código possível e isso implica em usar apenas um formato para cada mídia: .mp3
para áudio e .mp4
para vídeo.
Como criar estes arquivos foge do escopo do livro.
<audio src="exemplo.mp3" controls></audio>
<video src="exemplo.mp4" width="360" height="240" controls></video>
Com exceção das próprias tags, quase tudo aqui é conhecido, com exceção do atributo controls
que, quando presente, adiciona controles (play, pause, barra de tempo, etc.) ao áudio ou vídeo em que for adicionado.
A forma mais segura (e menos custosa) de inserir mídia a uma página é utilizar serviços específicos que disponibilizam seu conteúdo de forma muito fácil, como a opção de incorporar vídeos do YouTube, por exemplo.
Faça os exercícios propostos para este capítulo em:
Iframes são responsáveis por carregar páginas web dentro de outras páginas web. Tome cuidado com as páginas que são carregadas dentro de sua página, ou melhor, evite ao máximo fazer isso. Iframes trazem consequências sérias em performance, acessibilidade e segurança. Dados sensíveis podem ser capturados por hackers através de um iframe. Um exemplo muito comum para o uso de iframe é incorporar vídeos do YouTube à página.
<!-- o próprio YouTube fornece o código pronto -->
<iframe src="https://www.youtube.com/embed/boanuwUMNNQ" width="420" height="315" allowfullscreen></iframe>
Aqui temos atributos praticamente iguais aos de uma imagem, com exceção do allowfullscreen
, que dá permissão para a execução do vídeo em tela cheia.
Caso seja imprescindível utilizar um iframe
que insira uma página de outro site ao seu, use o atributo sandbox
. Este atributo bloqueia a execução de scripts, formulários, popups, etc., a partir do iframe
. Não torna o elemento 100% seguro, mas dificulta o caminho do atacante.
<iframe src="https://developer.mozilla.org" width="100%" height="400" sandbox></iframe>
Faça os exercícios propostos para este capítulo em:
Cada elemento, por padrão, pode ser apresentado em uma de duas formas ao usuário: em bloco (block
) ou em linha (inline
).
Elementos de bloco criam uma nova linha e lá se estabelecem. Sem alterar suas propriedades com CSS, eles não terão nada ao seu lado. Exemplos desses elementos são: div
, p
, h1
e todos os demais cabeçalhos, footer
e todos os outros elementos dos capítulos de seções, form
, ul
, entre outros.
Elementos em linha não criam uma nova linha. Por padrão, mesmo que coloquemos seus códigos um abaixo do outro, eles serão apresentados lado a lado. Exemplos são: input
, img
, a
, span
, entre outros.
<h1>Cabeçalhos são blocos</h1>
<p>Parágrafos também</p>
<!-- inputs são elementos em linha -->
<input type="text">
<img src="bem-como-imagens.jpg" alt="Imagem em linha">
<a href="#">Link são elementos em linha e podem aparecer dentro de parágrafos!</a>
<!-- porém, um elemento só é em linha em relação ao contexto em que está inserido -->
<div>
<a href="#">Sou em linha, mas estou dentro de um bloco!</a>
</div>
<div>
<input type="text">
<a href="#">Estou na mesma linha do input, mas separado do link acima.</a>
</div>
Aprenderemos formas de mudar esse comportante em seguida com CSS!
Faça os exercícios propostos para este capítulo em:
Os seguintes elementos alteram o estilo do texto:
em
: torna o trecho itálico, sinalizando ênfase;strong
: torna o texto negrito;mark
: marca o texto em amarelo;u
: sublinha o texto.
Adicione o seguinte trecho de código ao arquivo index.html
e visualize os resultados no navegador.
<p>Este texto é <em>itálico</em>.</p>
<p>Este texto é <strong>negrito</strong>.</p>
<p>Este texto está <mark>marcado</mark>.</p>
<p>Este texto está <u>sublinhado</u>.</p>
Faça os exercícios propostos para este capítulo em:
Meta tags são elementos invisíveis ao usuário, que se comunicam diretamente com o navegador, e que não podem ser representadas por outro elemento HTML.
Saiba que existem diversos formatos e utilidades para as meta tags. Exploraremos aqui seu uso mais básico.
Insira o seguinte código dentro do elemento head
; É lá que ele ficará em todos os casos.
<meta charset="utf-8">
<meta name="description" content="A melhor página do mundo, para os melhores usuários do universo. Aqui você encontra tudo sobre ABC.">
A primeira tag informa ao navegador qual conjunto de caracteres estamos utilizando (charset
). As chances são grandes de que você sempre utilizará o valor utf-8
.
A última, dá uma breve introdução ao conteúdo que será encontrado na página e é utilizada principalmente pelos mecanismos de busca para complementar o resultado para seu site.
Ao final do livro criaremos uma página de exemplo com outras meta
. Por enquanto, estas serão o suficiente.
Faça os exercícios propostos para este capítulo em:
É fundamental testar seu código HTML contra os padrões da linguagem. Este passo pode te mostrar problemas que você não tinha percebido enquanto escrevia seu código e ainda garante que este está em conformidade com o que os navegadores esperam receber, ou seja, seu código será apresentado ao usuário da forma que você espera.
A principal ferramenta para realizar esta validação é desenvolvida pelo próprio comitê responsável pelo desenvolvimento dos padrões da Web (World Wide Web Consortium, ou W3C), e está disponível gratuitamente no endereço abaixo:
Chegamos ao fim da Parte 1. Seu código até o momento deve estar parecido com este.
Este capítulo não tem exercícios.
CSS (Cascading Style Sheets), ou Folhas de Estilo em Cascata, é uma linguagem que instrui o navegador como apresentar uma página. Essas instruções basicamente dizem ao navegador como (lembra que o HTML dizia "onde"?) cada parte da página deve aparecer, seja um parágrafo azul, uma seção de dimensões específicas posicionanda lateralmente, imagens e etc.
Você pode escrever CSS no mesmo programa em que escreveu HTML até agora. Não é necessária nenhuma modificação, com exceção do nome do arquivo que será salvo. Documentos CSS são identificados através de uma extensão própria. O nome do arquivo termina com .css
, como em estilos.css
.
As regras para escrita dos nomes dos arquivos css
são as mesmas do html
.
Faça os exercícios propostos para este capítulo em:
Existem duas formas de escrever CSS dentro do HTML, a primeira delas é utilizando o elemento style
.
Para não deixar nosso exemplo construído no arquivo index.html
feio (está lindo até agora), vamos criar um arquivo HTML novo que servirá de laboratório para nossas experiências com CSS.
Crie na pasta "meu-site" um arquivo chamado laboratorio.html
, com o seguinte conteúdo e execute no navegador.
<!DOCTYPE html>
<html>
<head>
<title>Laboratório de CSS</title>
<style>
p {
color: red;
}
</style>
</head>
<body>
<h1>Meu primeiro teste com CSS</h1>
<p>Primeiro parágrafo</p>
<p>Segundo parágrafo</p>
<p>Terceiro parágrafo</p>
</body>
</html>
Entraremos em detalhes sobre a forma de escrever CSS no capítulo 40. Por enquanto, nos ateremos à localização desse código.
Você deve ter visto que os três parágrafos agora estão em vermelho. Isso porque o elemento style
cria um espaço para inserir as regras CSS dentro dele. Os prós e contras deste método são:
Prós
- Os estilos inseridos no elemento
style
serão aplicados apenas aos elementos da página em questão; - Não há necessidade de carregar um arquivo externo (capítulo 39), o que diminui a quantidade de arquivos solicitados ao servidor e consequentemente o tempo de carregamento da página.
Contras
- Se tivermos mais de uma página e quisermos manter o mesmo estilo para o site inteiro, para fazer uma alteração, será necessário abrir cada arquivo HTML, encontrar as regras específicas e alterar uma a uma. Imagine isso em um site com 10, 50, 100, 1000 páginas! A manutenção é inviável;
- O estilo está misturado com a estrutura da página, o que é uma má prática.
Utilize esta técnica apenas se os estilos para a página em questão forem poucos e exclusivos dela.
Faça os exercícios propostos para este capítulo em:
A segunda forma de escrever CSS dentro do HTML é em linha, utilizando o atributo style
(não o elemento) no elemento específico.
Apague o elemento style
do exemplo anterior, altere o código para o seguinte e execute no navegador.
<!DOCTYPE html>
<html>
<head>
<title>Laboratório de CSS</title>
</head>
<body>
<h1>Meu primeiro teste com CSS</h1>
<p style="color: red;">Primeiro parágrafo</p>
<p style="color: red;">Segundo parágrafo</p>
<p style="color: red;">Terceiro parágrafo</p>
</body>
</html>
Visualmente, não há diferença no resultado deste para o exemplo do capítulo anterior. A diferença está nos prós e contras:
Prós
- O estilo é aplicado a um único elemento (o que também pode ser alcançando utilizando um
id
, como veremos no futuro); - Não há necessidade de carregar um arquivo externo (capítulo 39), o que diminui a quantidade de arquivos solicitados ao servidor e consequentemente o tempo de carregamento da página.
Contras
- Os mesmos de se usar o elemento
style
, mais... - Imagine alterar 10 páginas para que todos os parágrafos sejam de outra cor. Se cada página dessas tiver pelo menos 20 parágrafos, serão no mínimo 200 alterações!
Evite utilizar este método.
Faça os exercícios propostos para este capítulo em:
Será a forma de escrever CSS adotada daqui em diante e aconselho que você utilize em seus projetos também (a menos que seus estilos tenham menos de 100 linhas, então pode-se cogitar o uso de estilos dentro do elemento style
, direto no HTML).
Na pasta "meu-site", crie um arquivo chamado estilos.css
com o seguinte conteúdo:
p {
color: red;
}
E altere o arquivo laboratorio.html
:
<!DOCTYPE html>
<html>
<head>
<title>Laboratório de CSS</title>
<!-- Esta linha é responsável por carregar o arquivo externo de CSS -->
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<h1>Meu primeiro teste com CSS</h1>
<p>Primeiro parágrafo</p>
<p>Segundo parágrafo</p>
<p>Terceiro parágrafo</p>
</body>
</html>
Execute o arquivo laboratorio.html
no navegador e veja os resultados.
Visualmente, mais uma vez, não há diferença no conteúdo apresentado, porém, temos algumas novidades no código.
Primeiro, temos um arquivo novo, estilos.css
. Nele vamos escrever todo nosso CSS de agora em diante. Note que o conteúdo deste arquivo é o mesmo que preenchia o elemento style
.
Segundo, para que o estilo escrito em estilos.css
seja aplicado ao conteúdo de laboratorio.html
, precisamos conectar os dois arquivos. Isso é alcançado através do elemento link
.
O elemento link
é composto por dois atributos:
-
rel
: define o relacionamento do arquivo linkado (nesse casoestilos.css
) com o documento HTML.stylesheet
siginifica, surpreendentemente, que estamos conectando um documento de stylesheet, ou folhas de estilos (CSS); -
href
: define o caminho para o arquivo.
Prós
- Estilo separado da estrutura. Esta separação permite além da separação de conceitos, uma manutenção mais fácil;
- Um único arquivo pode ser vinculado a diversas páginas. Isso significa que alterações em um único local serão refletidas a todas as páginas que tiverem esta folha de estilos.
Contras
- É necessário o carregamento de um arquivo externo, o que afeta a performance e, dependendo do tamanho da página, quantidade de estilos a ser carregada e velocidade da conexão do usuário, pode fazer a tela "piscar" (primeiro a tela carrega sem nenhum estilo e, em poucos instantes, quando o arquivo externo é finalmente baixado e os estilos aplicados, a tela é colorida e reorganizada instantaneamente);
- Quanto mais arquivos de CSS forem necessários para um página, maior será o problema anterior.
Os prós superam os contras se o uso desta técnica for consciente. Evite criar muitos arquivos. Um documento bem comentado e organizado pode conter todas as regras de um site.
Faça os exercícios propostos para este capítulo em:
Analisaremos o CSS abaixo...
p {
color: red;
}
...a partir da seguinte matriz:
seletor {
propriedade: valor;
}
-
seletor: seleciona o(s) elemento(s) a serem estilizados. Pode ser o nome de um elemento (exatamente como aparece no HTML, sem os sinais
<>
), uma classe ou um id (veremos em breve estes dois últimos). No exemplo acima, aplicamos a cor vermelha a todos osp
(parágrafos); -
propriedade: identifica qual característica será alterada (ex: fonte, cor de fundo, largura). No exemplo, é a propriedade
color
(cor). É seguida imediatamente por:
(dois pontos) e um espaço; -
valor: especifica qual valor será aplicado à propriedade em questão (ex: que fonte será aplicada, qual a cor do fundo, qual a largura). No exemplo, alteramos a cor (
color
) para vermelho (red
); -
pares de propriedade e valor são chamados de declarações. Cada declaração é finalizada com
;
(ponto e vírgula); -
as declarações são colocadas dentro de um bloco de declarações, identificado por chaves (
{}
); -
o conjunto (do seletor à chave final
}
) corresponde a uma regra.
Faça os exercícios propostos para este capítulo em:
No capítulo 28, vimos como o atributo id
cria um identificador único. Neste capítulo, as classes (que não têm nada a ver com classes da programação orientada a objetos) nos possibilitarão identificar mais de um elemento com um mesmo identificador. Este comportamento será essencial para estilizarmos diferentes elementos com uma mesma regra (ex: um cabeçalho e um parágrafo, entre centenas de outros, devem ser azuis).
No documento laboratorio.html
, abaixo do último parágrafo, insira os seguintes elementos:
<p class="primeiro feito">Comprar pão</p>
<p class="segundo feito">Tirar o lixo</p>
<p class="terceiro">Consertar janela</p>
Adicionamos classes a um elemento através do atributo class
, de forma que cada classe esteja separada das demais por um espaço (isso nos impede de criar classes com espaços no nome, o que criaria outra classe).
Faça os exercícios propostos para este capítulo em:
O capítulo 40 nos introduziu ao conceito de seletores. Eles são usados para selecionar os elementos do documento HTML que queremos estilizar.
Existe uma grande variedade de seletores disponível, que nos permite selecionar elementos com grande precisão. Neste e nos seguintes capítulos nos dedicaremos aos seletores simples, representados por tipos (ou elementos), classes e ids.
O seletor de tipo é a forma mais simples de atingir todos os elementos de um determinado tipo. Atualmente, já temos um exemplo em funcionamento em nosso arquivo estilos.css
, em que selecionamos todos os parágrafos do documento HTML. Edite este documento para que o cabeçalho fique azul (insira abaixo da regra do elemento p
):
h1 {
color: blue;
}
Execute o arquivo laboratorio.html
e veja o resultado no navegador.
Faça os exercícios propostos para este capítulo em:
No capítulo 41 adicionamos três parágrafos com classes ao arquivo laboratorio.html
. Neste exemplo selecionaremos elementos específicos através destas classes.
Ao final de estilos.css
adicione o seguinte código e visualize o resultado no navegador:
.primeiro {
color: green;
}
.feito {
font-weight: bold;
}
O seletor de classe consiste em um ponto (.
), seguido pelo nome da classe. No exemplo acima, dois parágrafos com a classe feito
terão o peso da fonte (font-weight
) alterado para negrito (bold
), enquanto que o parágrafo com a classe primeiro
ficará verde.
Faça os exercícios propostos para este capítulo em:
Na sequência dos últimos três parágrafos com classes no arquivo laboratorio.html
, adicione o seguinte código:
<h2 id="erro">Ooops!</h2>
Adicione ao arquivo estilos.css
o seguinte trecho também e visualize o resultado no navegador (executando o arquivo laboratorio.html
):
#erro {
background-color: red;
}
O seletor de id é a forma mais fácil de selecionar apenas um elemento e consiste em um sustenido (#
), seguido pelo nome do id. Lembre-se que um elemento pode ter apenas um id
e este id
deve ser único no documento inteiro.
No exemplo acima, alteramos a cor de fundo (background-color
) para vermelho.
Evite usar ids para alterar o estilo de um elemento. Ainda que no momento haja a necessidade de estilizar apenas um elemento, estilos aplicados a um id
ficam restritos àquele elemento, enquanto que uma classe torna aquele mesmo estilo aplicável a quaisquer outros elementos.
Faça os exercícios propostos para este capítulo em:
Na introdução ao CSS vimos que a letra C, de CSS, significa cascata. No nível mais básico, isso significa que a ordem das regras importa. Ou seja, uma regra especificada posteriormente tem maior importância que uma regra no começo do documento. Se isso pareceu complicado, saiba que você já tem um exemplo pronto, desde o capítulo 43.
Ao executar o exemplo daquele capítulo você deve ter percebido que um dos parágrafos, entre tantos vermelhos, ficou verde. Isso porque a regra que atinge todos os parágrafos e os pinta de vermelho aparece antes da regra .primeiro
, que está vinculada a um parágrafo e o pinta de verde.
A ordem em que os estilos são aplicados é:
-
Importância
-
Especificidade
-
Ordem no código
Acabamos de aprender como a ordem das regras no código afeta o resultado exibido no navegador. As demais regras serão vistas ao longo do livro e têm algumas peculiaridades. Talvez este seja o conceito mais complexo e poderoso do CSS. Por sua compreensão ser fundamental, introduzirei os demais conceitos (mais complexos) futuramente para não confundir você.
Faça os exercícios propostos para este capítulo em:
Até agora, usamos cores indicando seu nome em inglês. A lista de cores possíveis utilizando seu nome é limitada a aproximadamente 150 nomes. Porém, existem outras formas de indicar cores, como RGB, RGBa (usada para transparências), hexadecimal, entre outras.
Neste capítulo, detalharei o funcionamento de cores em RGB e em hexadecimal e passaremos a utilizar o hexadecimal para o restante do livro. Os demais padrões, apesar de simples, tomariam um espaço considerável da nossa capacidade de memorizar neste momento. Você pode pesquisá-los na internet a qualquer momento.
A notação de uma cor em hexadecimal respeita o padrão RGB (red green blue): #RRGGBB
ou #RGB
(#
seguido por caracteres hexadecimais). Assim, a cor blue
(experimente alterar a cor de todos os parágrafos para ela) pode ser reescrita da seguinte forma, nos formatos RGB e hexadecimal, com o mesmo resultado:
/* 00 - Red, 00 - Green, FF - Blue */
/* maiúsculas e minúsculas são aceitas */
#0000ff
#0000FF
/* caso um par seja composto por números iguais, pode-se escrever apenas um deles */
#00f
#00F
/* 0 - Red, 0 - Green, 255 - Blue */
/* as notações com e sem espaços têm o mesmo efeito */
rgb(0, 0, 255)
rgb(0,0,255)
/* também é possível indicar a porcentagem de cada cor */
/* 0% - Red, 0% - Green, 100% - Blue */
rgb(0%,0%,100%)
Veja alguns exemplos de cores comuns, escritas em hexadecimal:
- Vermelho: #FF0000;
- Verde: #00FF00;
- Azul: #0000FF;
- Preto: #000000;
- Amarelo: #FFFF00;
- Branco: #FFFFFF.
Faça os exercícios propostos para este capítulo em:
Em CSS, herança se comporta como na vida real, passando propriedades de (elemento) pai para (elemento) filho.
Por exemplo, um um pai tem quatro itens:
- mil reais;
- uma casa;
- dois metros de altura;
- cem quilos.
Algumas propriedades suas serão passadas ao seus filhos (mil reais e uma casa), enquanto que outras são únicas do pai (peso e altura). Em CSS não existe uma regra fixa que diga qual propriedade passará de pai para filho, mas o bom senso impera. Se eu aplicar uma propriedade de cor de fonte (color
) a um bloco (um header
, por exemplo), os parágrafos, cabeçalhos e todo o texto que estiver lá dentro receberá as mesmas propriedades de cor (a menos que eu altere cada um individualmente), enquanto que as imagens não, afinal, não é possível alterar o texto de um imagem a não ser em um editor de imagens.
Margens, bordas, altura, largura, imagem de fundo, entre outros, NÃO são herdados. Seria bizarro se eu aplicasse uma margem ao elemento pai mais externo (html
) e TODOS os demais elementos internos herdassem este espaçamento. Em uma reação em cadeia, logo eu teria conteúdos com vinte vezes mais margem que o elemento alvo inicialmente. A regra aqui é usar o bom senso e testar. Não tenha medo de aplicar estilos a um determinado elemento e executar dezenas de vezes o documento no navegador para visualizar os resultados.
Ao arquivo estilos.css
, adicione o seguinte código ao final das demais regras (queremos que esta sobreponha as demais, no efeito cascata):
body {
color: orange;
text-decoration: underline;
}
Execute no navegador e visualize o resultado. Apenas o último cabeçalho (h2
) foi pintado, mas todos os demais elementos receberam o sublinhado (text-decoration: underline
). Mesmo nossa regra estando posicionada por último, os demais elementos continuam com as mesmas cores de antes. Isso se deve à especificidade (vista no decorrer do livro).
Herança é muito importante, pois evita que tenhamos que repetir o mesmo código para diversos elementos. Dessa forma, um estilo aplicado ao elemento pai pode ser herdado pelos filhos.
Faça os exercícios propostos para este capítulo em:
Em CSS existem diversas formas de declarar medidas de comprimento, separadas em dois grandes grupos:
- Absolutas ou de comprimento fixo (o pixel - px - é a principal delas), em que os elementos são apresentados exatamente no tamanho em que foram declarados;
- Relativas (em, rem, e % são as mais utilizadas), em que o comprimento é relativo ao especificado em outro elemento e pode variar.
Crie duas div
em laboratorio.html
, uma com a classe absoluto
e outra com a classe relativo
:
<div class="absoluto"></div>
<div class="relativo"></div>
O CSS destas duas classes será o seguinte (no arquivo estilos.css
). Além disso, adicione ao body
a altura de 800px
:
/* ao body acrescente a altura */
body {
/* demais propriedades acima */
height: 800px;
}
.absoluto {
width: 100px;
height: 100px;
background-color: red;
}
.relativo {
width: 30%;
height: 30%;
background-color: blue;
}
Execute o exemplo no navegador e experimente alterar a largura do navegador arrastando as bordas da janela. Observe como o exemplo com medidas absolutas não é afetado por nada, enquanto que a caixa com medidas relativas varia a largura (mudando a altura do body
, a caixa se adaptará ao novo valor).
Usaremos a medida que melhor couber em cada momento daqui em diante.
Faça os exercícios propostos para este capítulo em:
Tudo em CSS é uma caixa. Experimente adicionar ao seletor universal (*
; atinge todos os elementos) uma borda:
* {
/* veremos bordas em detalhes em um capítulo a parte, a seguir */
border: 1px solid black;
}
Veja o resultado no navegador e exclua esta regra.
Este conceito é a base de qualquer layout na web. Cada elemento é representado como uma caixa retangular composta pelo conteúdo, padding (espaço interno ao redor do conteúdo), border (borda; delimita interno e externo) e margin (margem; camada mais externa, ao redor da borda).
A imagem abaixo ilustra isso:
-
A área do conteúdo (content) é a área que contém o conteúdo do elemento, incluindo outros elementos que forem filhos deste elemento;
-
A área do
padding
representa a margem interna, localizada entre a borda e o conteúdo; -
A área da borda (
border
) fica entre opadding
e a margem; -
A área da margem (
margin
) representa a margem externa da caixa.
Cada um destes elementos será detalhado nos próximos capítulos, antes, vejamos um exemplo. Adicione o CSS e HTML abaixo aos seus respectivos documentos:
<div class="caixa">Eu sou uma caixa!</div>
A cada linha adicionada à classe .caixa
, execute o arquivo laboratorio.html
e veja o resultado.
.caixa {
background-color: red;
padding: 10px;
border: 5px solid black;
margin: 10px;
}
Por padrão, o padding
é contabilizado no tamanho do elemento, ou seja, o seguinte exemplo não resulta em uma largura de 100px
e sim 140px
(20px
de cada lado):
width: 100px;
padding: 20px;
A solução para isso é adicionar uma declaração que diz ao navegador para contabilizar a largura como tudo até a borda do elemento, assim, o resultado anterior teria 100px
de largura total, 20px
de padding
em cada lado e 60px
de espaço para o conteúdo (100 de largura - 20 de padding em cada lado = 60). Adicione esta linha à regra do elemento:
box-sizing: border-box;
Faça os exercícios propostos para este capítulo em:
Já vimos que o padding
é responsável pelo espaço interno da caixa, entre o conteúdo e a borda. Quando o conteúdo tem uma cor ou imagem de fundo, este irá se estender ao padding
, como no exemplo do capítulo anterior.
Existem duas formas de aplicar valores ao padding
:
- Indicando o valor de cada lado:
/* cima */
padding-top: 10px;
/* direita */
padding-right: 10px;
/* baixo */
padding-bottom: 10px;
/* esquerda */
padding-left: 10px;
- Abreviando em uma única expressão:
padding: 10px;
O valor acima aplica o mesmo valor de 10px
para todos os lados.
Podemos ainda usar a forma abreviada para indicar valores diferentes para cada lado, da seguinte forma:
padding: 10px 15px 10px 15px;
No exemplo anterior, os valores são declarados no sentido horário, começando pelo topo (top
), ou seja, top
, right
, bottom
, left
.
No último caso, poderíamos abreviar ainda mais, já que temos os mesmos valores para top
e bottom
, right
e left
. O resultado seria:
padding: 10px 15px;
O primeiro valor representa top
e bottom
, enquanto que o segundo right
e left
.
Por fim, estas formas têm o mesmo resultado:
/* cima */
padding-top: 10px;
padding-right: 10px;
padding-bottom: 10px;
padding-left: 10px;
padding: 10px 10px;
padding: 10px;
Faça os exercícios propostos para este capítulo em:
Ao final do padding
começa a borda do elemento, ou border
, que se estende até o início da margem.
Usaremos apenas o formato abreviado da declaração de borda, que determina a espessura, estilo e cor da borda.
O elemento caixa tem, até o momento a seguinte declaração de borda:
border: 5px solid black;
Onde 5px
define a espessura, solid
o estilo (experimente alterar para dotted
(pontilhado) ou dashed
(tracejado)) e black
a cor, que pode ter qualquer nome válido de cor ou valor em RGB, hexadecimal, etc.
Também é possível arredondar os cantos da borda usando a propriedade border-radius
com o valor de alguma medida de comprimento. Experimente adicionar à .caixa
:
border-radius: 3px;
Faça os exercícios propostos para este capítulo em:
A margem (margin
) representa a área ao redor do elemento (caixa) e afasta este de outros elementos. As formas de aplicar valor às margens seguem as mesmas regras que se aplicam ao padding
.
Estas formas têm o mesmo resultado:
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
margin: 10px 10px;
margin: 10px;
Apesar disso, as margens se comportam de forma particular, principalmente quando a margem de um elemento toca a de outro. Esse comportamento é chamado de margin collapsing ou "colapso de margem". Quando dois elementos se tocam, a distância entre eles é o valor da maior margem entre os dois, e não sua soma.
Este comportamento pode ser visto adicionando-se outra caixa
abaixo da que já temos em laboratorio.html
.
<div class="caixa">Eu sou uma caixa 2!</div>
Alterando-se o valor de margin
na classe .caixa
é possível ver que a distância entre as duas é a mesma que a aplicada ao topo ou laterais, e não a soma das duas.
Faça os exercícios propostos para este capítulo em:
Texto é o coração da web. Conteúdo atualmente é um dos maiores indicadores de sucesso de uma página. De que adianta o melhor layout, ser a melhor empresa em determinado ramo, ter os melhores produtos se não formos capazes de capturar a atenção do usuário através de conteúdo que importe para ele? Pelo menos é o que eu e a Google (mais especificamento o Google Search) achamos. Há algum tempo o mecanismo de ranking de páginas do Google já não utiliza palavras-chave com tanto peso como há algum tempo. Hoje seus algorítmos já são capazes de determinar do que uma página se trata através de seu conteúdo.
Mas só bom conteúdo não adianta. É preciso apresentar o conteúdo de forma que encante o usuário. E é isso o que faremos em breve (antes vamos continuar o esforço de deixar a página mais feia).
Adicione os seguintes trechos de código aos arquivos laboratorio.html
e estilos.css
, respectivamente:
<p class="texto-padrao">
Texto é o coração da web. Conteúdo atualmente é um dos maiores
indicadores de sucesso de uma página.
</p>
.texto-padrao {
color: #333;
letter-spacing: 2px;
line-height: 2;
text-decoration: underline;
text-align: center;
}
Visualize os resultados no navegador.
O papel de cada regra:
-
color
: define a cor do texto; -
letter-spacing
: altera o espaçamento entre cada letra; -
line-height
: altera a altura de cada linha. 1 é o padrão; -
text-decoration
: responsável pela decoração do texto. Adiciona uma linha sob (underline
), sobre (overline
) ou através (line-through
) do texto; -
text-align
: altera o alinhamento do texto. Os valores mais comuns são:left
,right
ecenter
.
Faça os exercícios propostos para este capítulo em:
Aos estilos atuais de body
e h1
, faça as modificações necessárias para que as regras fiquem iguais às seguintes e visualize os resultados no navegador:
h1 {
color: blue;
font-family: Georgia, "Times New Roman", serif;
font-size: 30px;
font-style: italic;
font-weight: bold;
}
body {
height: 500px;
font-family: sans-serif;
}
No cabeçalho h1
, alteramos as seguintes propriedades:
-
font-family
: especifica uma lista de fontes em que o texto deve ser exibido. Cada valor é separado por vírgula e diz ao navegador: "Carregue esta fonte, mas se não tiver, carregue esta outra" e assim por diante, até chegar à última opção que geralmente é um padrão em que o navegador carregará uma determinada fonte padrão naquela categoria (serif
para fontes com serifa,sans-serif
para fontes sem serifa emonospace
para fontes monoespaçadas). O conceito de serifa foge ao escopo deste livro; -
font-size
: determina o tamanho da fonte; -
font-style
: altera o estilo da fonte e pode sernormal
,italic
eoblique
; -
font-weight
: corresponde à espessura dos caracteres, pode serbold
(negrito),normal
ou um valor numérico especificado pela própria fonte.
No body
apenas dissemos ao navegador para aplicar qualquer fonte que não tenha serifa (sans-serif
).
Faça os exercícios propostos para este capítulo em:
A propriedade mais importante para um lista é list-style
, que especifica o estilo da lista (o tipo do marcador, a posição e até uma imagem para ele, se for o caso).
Crie uma lista em laboratorio.html
e visualize o resultado no navegador. Em seguida, mude o estilo da lista e veja o que mudou.
<ul class="menu">
<li>Início</li>
<li>Sobre</li>
<li>Produtos</li>
<li>Contato</li>
</ul>
li {
list-style: square;
}
No exemplo anterior a propriedade list-style
foi alterada para square
(quadrado). Outros valores possíveis são: disc
, decimal
, none
(nenhum), entre outros.
Podemos criar um menu a partir do exemplo anterior alterando o comportamento de cada li
, de bloco para em linha (se precisar, volte ao capítulo 32 para rever o conceito de blocos e linhas).
Altere a regra que atinge os li
para o seguinte:
li {
list-style: none;
display: inline-block;
padding: 5px;
}
Neste exemplo, removemos o estilo da lista (list-style: none
) e alteramos o comportamento de cada li
para que ficassem como blocos, porém em linha! Fique à vontade para adicionar links (a
) ao redor do texto de cada li
para transformar o exemplo em um menu real.
Faça os exercícios propostos para este capítulo em:
Vamos trazer para o laboratorio.html
um exemplo do arquivo index.html
.
<table>
<tr>
<th>Segunda-feira</th>
<th>Terça-feira</th>
</tr>
<tr>
<td rowspan="2">Química</td>
<td>Matemática</td>
</tr>
<tr>
<td>Matemática</td>
</tr>
</table>
A ele adicionaremos o seguinte estilo:
table {
border-collapse: collapse;
}
td, th {
border: 1px solid white;
padding: 5px;
background-color: tomato;
}
Primeiro, no elemento table
, alteramos a propriedade border-collapse
para que as bordas colapsem (se unam, através do valor collapse
. O padrão é separate
). Em seguida, para não repetir a mesma regra para dois elementos diferentes, listamos os elementos que devem receber determinado estilo, separados por vírgula, e damos uma borda às células e cabeçalhos da tabela. As demais regras já são conhecidas.
Faça os exercícios propostos para este capítulo em:
Usaremos a seguinte imagem para simular o cabeçalho de uma página com uma imagem de fundo:
http://i.imgur.com/UIp1qfs.jpg
Adicione ao laboratorio.html
o seguinte código:
<header class="imagem-fundo">
<h1>Bovinos</h1>
<p>Essa carne, é Bovinos</p>
</header>
E ao estilos.css
o seguinte código. Visualize o resultado no navegador.
.imagem-fundo {
background-image: url("http://i.imgur.com/UIp1qfs.jpg");
background-repeat: no-repeat;
background-size: cover;
background-position: center;
height: 400px;
width: 100%;
padding-top: 200px;
text-align: center;
}
As quatro primeiras declarações são nosso foco aqui.
-
background-image
: especifica a localização de uma imagem, que pode estar em nosso servidor (na pasta "imagens") ou em algum outro lugar na internet, como no exemplo. O caminho para a imagem é precedido pela palavraurl
e fica entre parênteses e aspas("")
; -
background-repeat
: determina se a imagem deve ser repetida caso haja espaço para tal. Os valores aceitáveis sãorepeat
,no-repeat
,repeat-x
(repete no eixo x),repeat-y
(repete no eixo y), entre outros; -
background-size
: altera o tamanho da imagem ao fundo. Pode receber um valor numérico em alguma medida do CSS (px, em, %, etc.) ou uma palavra chave comocover
(que cobre automaticamente o espaço do elemento, podendo esticar a imagem proporcionalmente para que isso ocorra) econtain
(a imagem será apresentada inteiramente no elemento, mesmo que sobre espaço ao redor dela); -
background-position
: especifica a posição da imagem ao fundo. Os valores possíveis são medidas numéricas e valores comotop
,left
,center
,bottom
eright
.
Os demais valores já são familiares.
Faça os exercícios propostos para este capítulo em:
Até agora, todos nossos elementos estão posicionados em suas posições padrão. Podemos alterar este comportamento utilizando a propriedade position
.
Insira o seguinte código em seus respectivos arquivos e visualize o resultado no navegador:
<div class="posicao absoluta">Absoluta</div>
<div class="posicao fixa">Fixa</div>
<div class="posicao relativa">Relativa</div>
<div class="posicao estatica">Estática</div>
.posicao {
height: 100px;
width: 100px;
}
.absoluta {
background-color: red;
position: absolute;
top: 20px;
right: 40px;
}
.fixa {
background-color: green;
position: fixed;
top: 0;
left: 40px;
}
.relativa {
background-color: blue;
position: relative;
top: 40px;
left: 120px;
}
.estatica {
background-color: black;
position: static;
}
O código com apenas este exemplo pode ser visualizado aqui.
Cada posição acima comporta-se de maneira diferente, posicionada através das propriedades top
, right
, bottom
e left
, que indicam a distância do elemento a partir de cada lado da página. vamos analisar cada uma:
-
absoluta:
position: absolute;
remove o elemento do fluxo normal (os elementos ao redor, se existirem, ocuparão seu espaço) e posiciona-o relativamente ao elemento ancestral mais próximo; -
fixa:
position: fixed;
remove o elemento do fluxo normal (os elementos ao redor, se existirem, ocuparão seu espaço) e posiciona-o fixado relativamente à tela do navegador, não permitindo que o elemento se mova com o rolar da página; -
relativa:
position: relative;
apresenta o elemento como se ele não tivesse sido posicionado e, então, ajusta a posição do elemento, sem alterar o layout. Dessa forma, o elemento não é removido do fluxo, mesmo que esteja distante de sua posição inicial. Pense nesta posição como uma posição absoluta, porém, mantida no fluxo; -
estática:
position: static;
mantém o elemento na posição normal, seguindo o fluxo do documento. Propriedades de posição não se aplicam.
Faça os exercícios propostos para este capítulo em:
Aproveitando o exemplo do capítulo anterior, podemos ver que alguns elementos se sobrepoem. Talvez a ordem em que em eles foram empilhados pelo navegador não seja a melhor para nosso layout, então alteraremos a ordem em que os elementos são apresentados com a propriedade z-index
. Note que o navegador ordena os elementos de acordo com a ordem em que foram escritos no HTML.
Adicione a linha abaixo a sua respectiva classe:
.fixa {
/* o código acima permance inalterado */
z-index: 1;
}
Veja aqui um exemplo "limpo".
Veja que a caixa "fixa" agora sobrepõe a caixa "relativa", isso porque, por padrão, todos os elementos herdam a propriedade z-index
do elemento pai, que inicialmente é igual a auto
.
Com exceção dos elementos estáticos (position: static
), os demais podem ter a ordem de apresentação alterada.
Faça os exercícios propostos para este capítulo em:
Outra forma de selecionar elementos (mais avançada), é com base em seus elementos.
Adicione o código HTML e CSS aos seus resectivos documentos e visualize o resultado no navegador:
Nome: <input type="text" name="nome">
Email: <input type="email" name="email">
[type="email"] {
border: 1px solid red;
}
[name="nome"] {
border: 2px solid magenta;
}
[type] {
background-color: yellow;
}
Aqui selecionamos dois elementos distintos com base em seus atributos. Qualquer elemento que tenha um atributo pode ser atingido por este formato de seletor, contato que respeite o seguinte formato:
-
O conteúdo do seletor deve estar entre colchetes
[]
; -
Caso seja necessário atingir um elemento com atributo de valor específico, o restante do atributo é escrito da mesma forma em que está inserido no HTML, respeitando sinais e aspas.
Faça os exercícios propostos para este capítulo em:
Usar um seletor por vez pode ser útil em alguns casos (selecionar todos elementos de um determinado tipo ou classe), mas pode ser ineficiente em algumas situações. Podemos selecionar elementos com precisão muito maior se combinarmos seletores. Existem cinco formas de combinações:
-
AB: seleciona qualquer elemento que se enquadre em A e B ao mesmo tempo;
-
A B: seleciona todos B dentro de A;
-
A > B: seleciona todos B que sejam filhos diretos de A;
-
A + B: seleciona todos B que tenham A como irmão imediato;
-
A ~ B: seleciona todos B que tenham A como irmão (em qualquer posição).
Abaixo temos um exemplo de cada seletor, comentado individualmente. Caso queira executar este exemplo localmente, sugiro que você crie um arquivo .html
e .css
separados para evitar conflitos com as regras já existentes. Um exemplo pronto pode ser encontrado aqui:
<main>
<h1 class="titulo">Minha página</h1>
<h1 class="cumprimento">Seja bem-vindo(a)</h1>
<p class="titulo">Não será selecionado por h1.titulo, que atinge apenas capeçalhos com estas classes.</p>
<p>Não será selecionado por h1 + p, pois não tem como irmão imediato um h1</p>
<section>
<h1>main é meu avô e eu herdo a regra main h1</h1>
<h2>Section é meu pai, não meu irmão.</h2>
<p>Não será selecionado pelo seletor main > p, pois não é filho direto do main</p>
</section>
<h2>Quem somos</h2>
</main>
/* AB */
/* todos h1 com a classe título */
h1.titulo {
font-family: sans-serif;
color: blue;
}
/* A B */
/* todos h1 que estejam em qualquer nível dentro de main */
main h1 {
text-decoration: underline;
}
/* A > B */
/* todos p que sejam filhos diretos de main */
main > p {
color: red;
}
/* A + B */
/* todos p que tenham como irmão imediato um h1 */
h1 + p {
font-size: 22px;
}
/* A ~ B */
/* todos h2 que tenham section como irmão */
section ~ h2 {
color: green;
}
Faça alterações no código acima, experimente selecionar elementos diferentes e em seguida faça os exercícios propostos para este capítulo em:
Especificidade é uma forma de os navegadores decidirem qual propriedade CSS é mais relevante para determinado elemento. Quando mais de uma propriedade tiver a mesma especificidade, a que aparecer por último será aplicada.
Por ordem de importância (quanto mais próxima ao fim, mais específica é):
-
Seletores de tipo (ex:
h1
,p
); -
Seletores de classe (ex:
.caixa
) e seletores de atributo (ex:[type="text"]
); -
Seletores de id (ex:
#erro
); -
Estilos em linha (ex:
<p style="color: red;">Olá</p>
); -
Valor
!important
.
Adicione o seguinte HTML ao final do arquivo laboratorio.html
e visualize o resultado:
<h3>Seletor de tipo, peso 1</h3>
<h3 class="peso-2">Seletor de classe, peso 2</h3>
<h3 id="peso-3">Seletor de id, peso 3</h3>
<h3 style="color: red;">Estilo em linha. Péssima prática. Peso 4</h3>
<h3>Valor !important aplicado à regra. Maior peso.</h3>
Agora adicione uma regra do CSS abaixo por vez ao arquivo estilos.css
e visualize o resultado de cada uma no navegador:
h3 {
color: green;
}
.peso-2 {
color: blue;
}
#peso-3 {
color: magenta;
}
h3 {
color: black !important;
}
Perceba que na última regra utilizamos o seletor mais fraco (de tipo), porém, com o valor de !important
ao final da declaração, o que sobrepõe qualquer outro estilo. Você pode, inclusive, tentar diminuir a importância dele mudando sua posição de último na ordem para primeiro. Nada será alterado.
Apesar disso, não é considerado uma boa prática utilizar o valor !important
. Prefira ser mais específico nas regras, utilizando os seletores que vimos anteriormente e talvez você nunca precise utilizar este valor.
Faça os exercícios propostos para este capítulo em:
Uma pseudo classe é uma palavra chave, precedida por dois pontos (:
), que é adicionada ao final de um seletor para especificar um estilo apenas quando o elemento estiver em um determinado estado.
Existem aproximadamente quarenta pseudo classes, das quais cinco muito utilizadas estão abaixo. Adicione os códigos abaixo aos seus respectivos arquivos e veja o resultado no navegador (passe o mouse sobre a lista):
<ul>
<li>Lista número 1</li>
<li>Lista número 2</li>
<li>Lista número 3</li>
<li>Lista número 4</li>
</ul>
Os detalhes de cada seletor estão abaixo.
li:first-child {
color: blue;
}
li:last-child {
color: red;
}
li:nth-child(2) {
color: green;
}
li:hover {
font-weight: bold;
background-color: #aaa;
}
-
:first-child
: seleciona o primeiro elemento; -
:last-child
: seleciona o último elemento; -
:nth-child(n)
: seleciona o enésimo elemento; -
:hover
: seleciona o estado dehover
do elemento (quando o mouse está sobre ele).
Faça os exercícios propostos para este capítulo em:
Tão importante quanto prover a sintaxe mais semântica possível e adicionar o atributo alt
às imagens, por exemplo, é tornar o conteúdo visível acessível ao usuário.
Nem todas as pessoas com alguma deficiência visual, por exemplo, que visitarem nossas páginas, são completamente cegas. Você deve conhecer alguém que precise de lentes corretoras (ex: óculos). Talvez um amigo, um familiar ou você mesmo está lendo este livro graças a algum artifício para corrigir a visão.
Deixo alguns conselhos (não são de forma alguma regras) para que suas páginas sejam mais acessíveis:
-
Contraste: evite o uso de cores muito semelhantes no fundo e na fonte do texto. Ex: ruim - fundo preto e fonte cinza, ruim - fundo branco e fonte amarela, bom - fundo branco e fonte preta. O ideal aqui é que uma das opções seja mais clara e a outra mais escura.
-
Tamanho da fonte: o padrão do tamanho de fonte dos navegadores é 16px. Em alguns casos pode parecer muito grande e talvez você decida diminuir, talvez para encaixar em algum layout, mas cuidado. Texto abaixo de 12px pode dificultar a leitura. O ideal é ter de 54 a 72 caracteres por linha nos parágrafos.
-
Pontos de clique/toque: considere que seu site será acessado por aparelhos móveis. Mesmo que isso não ocorra (eu acho improvável) evite que seus pontos clicáveis (menus, botões, links, etc.) sejam pequenos demais ou estejam muito próximos um do outro. Isso evita que o dedo (no caso de toque em uma tela) toque, sem intenção, em algum outro elemento ao redor e tenha um efeito indesejado.
Acessibilidade é um termo capaz de preencher um livro exclusivo. A intenção deste capítulo não é de esgotar as possibilidades de tornar suas páginas acessíveis, e sim mostrar a importância do tema e despertar o interesse.
Media queries permitem, através de uma expressão, definir estilos baseados no tamanho da tela do dispositivo. Isso é fundamental para que possamos adaptar nosso site a dispositivos móveis (celulares, tablets) e até TVs!
A sintaxe é muito simples e tem uma linha. Adicione cada código ao seu respectivo arquivo:
<div class="caixa-responsiva"></div>
.caixa-responsiva {
width: 600px;
height: 300px;
border: 1px solid black;
}
@media screen and (max-width: 700px) {
.caixa-responsiva {
width: 90%;
margin: 0 auto;
background-color: goldenrod;
}
}
Salve os arquivos, execute no navegador e experimente diminuir e aumentar a largura do navegador.
-
@media
: cria uma media query; -
screen
: atinge monitores e dispositivos com telas coloridas. Diversos outros valores são aceitos, comoprint
, para impressão,tv
, etc.; -
and (max-width: 700px)
: e que tenha largura máxima (max-width
) de700px
(para resoluções maiores que 700px usaríamosmin-width
); -
as regras que estiverem entre
{}
serão alteradas dentro da resolução determinada. No exemplo anterior,.caixa-responsiva
mantém a propriedadeheight
eborder
e ganhamargin
ebackground-color
.
Dizemos que cada media query com tamanho diferente representa um breakpoint (veja o capítulo a seguir).
Observação: margin: 0 auto
é o mesmo que dizer que a margem do topo e de baixo será 0 enquanto que as laterais serão caluladas automaticamente para terem o mesmo valor.
Faça os exercícios propostos para este capítulo em:
Breakpoints, traduzindo literalmente, são pontos de quebra, que ocorrem quando a largura ou altura da página atingem determinado tamanho. Algumas ferramentas de layout (ex: Bootstrap e Foundation) utilizam breakpoints pré-definidos, enquanto que algumas pessoas preferem definir um breakpoint de acordo com o tamanho da tela de terminados dispositivos, como tablets e smartphones.
Exemplo de dois breakpoints, sem conteúdo:
/* dispositivos com tela menor que 700px */
@media screen and (max-width: 700px) {}
/* dispositivos com tela menor que 1200px */
@media screen and (max-width: 1200px) {}
Os problemas dessas abordagens são:
-
Os dispositivos de hoje não serão os dispositivos de amanhã e a chance de seu layout ficar estranho em menos de um ano é grande;
-
O conteúdo fica limitado ao espaço disponível em tela;
-
As chances são de que nem todos os usuários do seu site usarão o mesmo aparelho.
Uma alternativa que eu uso e recomendo, é criar pontos de quebra de acordo com o layout. Você aumenta e diminui a janela do navegador, por exemplo, e quando algo sai do lugar, fica ilegível ou feio, é nesse ponto que você vai criar uma quebra e alterar o estilo daqueles elementos.
Faça os exercícios propostos para este capítulo em:
Podemos criar o site mais adaptável do mundo para dispositivos móveis, porém, quando este site for acessado de um dispositivo móvel real, ele terá a aparência de um site visto na tela de um computador, mesmo que em nosso navegador com a tela reduzida tudo apareça do jeito mais lindo do mundo. Isso acontecerá realmente caso não adicionemos ao head
a meta
responsável por dizer ao navegador as seguinte informações:
<meta name="viewport" content="width=device-width, initial-scale=1">
O valor de content
significa:
-
width=device-width
: a largura (width
) da página deve ser a largura do dispositivo (device-width
). Pode ter outros valores, como unidades em pixel; -
initial-scale=1
: a escala inicial (initial-scale
) deve ser igual a 1. O valor de 2 corresponderia a uma visão com zoom maior e menor que 1 a um zoom menor;
Não se esqueça de adicionar esta tag ao head
do documento em todos os sites que você planejar para dispositivos móveis (tenho esperança que todos).
Faça os exercícios propostos para este capítulo em:
Assim como HTML, é fundamental testar seu código CSS com os padrões da linguagem. Problemas que não haviam sido detectados no desenvolvimento podem aparecer neste passo. Ainda assim, em se tratando de CSS e a implementação variada entre os navegadores, não deixe de testar seu site no máximo de navegadores possível, e em diferentes versões destes. Existem plataformas que cobram para realizar automaticamente este serviço ou você pode fazer o download de diversas versões e testar por conta.
A principal ferramenta para realizar esta validação é desenvolvida pelo próprio comitê responsável pelo desenvolvimento dos padrões da Web (World Wide Web Consortium, ou W3C), e está disponível gratuitamente no endereço abaixo:
https://jigsaw.w3.org/css-validator/
Desenvolvimento Web é feito de escolhas. Escolher entre usar Bootstrap e Foundation, entre o estilo de design Material ou Flat, ou nenhum. Cada decisão terá um impacto. Neste livro, a maior decisão foi ensinar o uso de Flexbox para o layout.
De acordo com o site Can I Use, que mede a adoção das especificações de CSS e HTML pelos navegadores, no Brasil, aproximadamente 97% dos usuários de internet estão utilizando navegadores compatíveis com Flexbox. É quase 100%, mas os quase 3% que faltam correspondem a 3.000.000 de pessoas (levando em conta estatísticas recentes que apontam que mais de 50% dos brasileiros acessa a internet e arredondando o número de habitantes para baixo). É um número alto, mas que tende a cair logo.
Com o anúncio por parte da Microsoft de terminar o suporte para versões anteriores ao Internet Explorer 11 em 16 de janeiro de 2016, em breve teremos uma internet mais alinhada com as novas tecnologias.
Flexbox é uma especificação CSS que permite que os elementos alterem sua altura, largura e ordem para melhor preencher o espaço disponível. Isso tudo com muito pouco esforço de quem cria o código.
Por ser uma especificação recente, a implementação de alguns navegadores antigos (um ou dois anos atrás) contém alguns termos obsoletos, isso significa que para criarmos um container flex (visto no próximo capítulo) que funcione em todos os navegadores possíveis, precisamos marcar as propriedades com uma palavra chave que fará com que a propriedade seja interpretada somente por determinado navegador, por exemplo:
.container-flex {
/* atinge implementações antigas do Safari e Chrome */
display: -webkit-box;
display: -webkit-flex;
/* atinge implementações antigas do Firefox */
display: -moz-flex;
/* atinge implementações antigas do Internet Explorer */
display: -ms-flexbox;
/* atinge todas as implementações que utilizem a especifação atual */
display: flex;
}
Não é fácil memorizar o termo implementado por cada navegador para cada propriedade (para todas as outras propriedades do flexbox a briga é a mesma), portanto, escreveremos a forma mais simples e ao final do livro apresentarei uma ferramenta chamada Autoprefixer que automatiza este trabalho.
Veremos as nove propriedades principais de flexbox a seguir.
Saiba, porém, que estas inconcistências não se limitam ao flexbox. Muitas outras propriedades incorrem neste problema e você precisa ficar atento ao comportamento do seu layout em diversos navegadores.
Faça os exercícios propostos para este capítulo em:
O layout com flexbox é baseado na direção em que o elemento pai (que chamaremos a partir de agora de container flex ou simplesmente container) definiu.
O container flex mais básico é criado da seguinte forma e tem como padrão a direção em linha (row
):
<div class="container-flex"></div>
.container-flex {
display: flex;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
Para melhor visualizar a direção que o conteúdo adota, vamos adicionar alguns filhos (que chamaremos daqui em diante de itens flex ou itens):
<!--
não seria necessário o uso de nenhuma classe,
mas como a intenção do livro é clareza ao leitor
decidi tornar o exemplo o mais verboso possível
-->
<div class="container-flex">
<div class="item box-1">1</div>
<div class="item box-2">2</div>
<div class="item box-3">3</div>
<div class="item box-4">4</div>
<div class="item box-5">5</div>
</div>
.container-flex {
display: flex;
flex-direction: row;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
.item {
/* espaçamento e cor adicionados para visualização apenas */
padding: 10px;
background-color: #999;
}
O fato de os itens estarem ocupando todo o espaço vertical do container será abordado em seguida. Nos ateremos à direção por ora.
flex-direction: row
significa que nossos itens serão dispostos em linha, como num caderno. Da mesma forma que num caderno, numa página web temos um eixo vertical e um eixo horizontal:
Podemos alterar a direção de linha para coluna com flex-direction: column
. O efeito é o mesmo que virar nosso caderno. Os eixos vão junto:
Faça os exercícios propostos para este capítulo em:
Além da direção, que é determinada por padrão (row
) ao definir um container como flex
, a quebra padrão (neste caso, de linha) é configurada para ser contínua, ou seja, sem quebra.
.container-flex {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
Para alterar o comportamento padrão, utilizamos a propriedade flex-wrap
e os valores wrap
(quebrar/multi linha) e nowrap
(sem quebra).
É possível, e aconselhável, utilizar uma única declaração para definir o sentido e a quebra de linhas com a propriedade flex-flow
. O primeiro valor é equivalente a flex-direction
enquanto que o segundo equivale a flex-wrap
.
.container-flex {
display: flex;
flex-flow: row nowrap;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
Faça os exercícios propostos para este capítulo em:
A propriedade justify-content
define o alinhamento dos itens no eixo principal (horizontalmente se o itens estiverem em linha e verticalmente se estiverem em colunas) e só tem efeito se houver espaço livre entre os itens.
Pode ter os seguintes valores:
-
flex-start
: alinha todos os itens no começo do container; -
flex-end
: alinha todos os itens no final do container; -
center
: centraliza todos os itens no container; -
space-between
: alinha os itens no container de modo que o espaço livre fique entre eles; -
space-around
: alinha os itens no container de modo que todos tenham a mesma quantidade de espaço ao redor de si.
.container-flex {
display: flex;
flex-flow: row nowrap;
justify-content: space-around;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
Experimente alterar os valores de justify-content
e visualize os resultados no navegador.
Faça os exercícios propostos para este capítulo em:
A propriedade align-items
é reponsável pelo alinhamento dos itens de um container flex no eixo cruzado (verticalmente, se os itens estiverem em linha).
Os seguintes valores são aceitos:
-
flex-start
: alinha todos os itens no começo do container; -
flex-end
: alinha todos os itens no final do container; -
center
: centraliza todos os itens no container; -
baseline
: alinha todos os itens de acordo com a linha base do texto em seu conteúdo. Exemplo abaixo; -
stretch
: estica todos os elementos para que preencham o espaço do container. É o valor padrão.
.container-flex {
display: flex;
flex-flow: row nowrap;
justify-content: space-around;
align-items: baseline;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
.box-4 {
font-size: 40px;
}
As regras acima alinharão todos os itens do container pela linha base do texto. Veja como todos os elementos acompanham a linha do .box-4
.
É possível alterar itens individuais (ao invés de o container inteiro), usando a propriedade align-self
(auto alinhar) no elemento desejado, usando os mesmos valores de align-items
.
Faça os exercícios propostos para este capítulo em:
align-content
é responsável por alinhar as linhas (não os itens, como align-itens
; precisa ter mais de uma linha) quando há espaço entre elas no eixo cruzado, similar ao que o justify-content
faz em itens individuais.
Seus valores podem ser:
-
flex-start
: alinha todos as linhas no começo do container; -
flex-end
: alinha todos as linhas no final do container; -
center
: centraliza todos as linhas no container; -
space-between
: alinha as linhas no container de modo que o espaço livre fique entre elas; -
space-around
: alinha as linhas no container de modo que todas tenham a mesma quantidade de espaço ao redor de si; -
stretch
: estica todas as linhas para que preencham o espaço do container. É o valor padrão.
.container-flex {
display: flex;
flex-flow: row wrap;
justify-content: space-around;
align-content: space-between;
/* adicionadas medidas e cor para visualização apenas */
background-color: #ddd;
width: 300px;
height: 100px;
}
.item {
/* adicione uma largura para todos os itens */
/* as demais declarações permancem intactas */
width: 70px;
}
.box-4 {
/* apague o conteúdo desta regra */
}
Visualize o resultado no navegador.
Faça os exercícios propostos para este capítulo em:
Está até no nome: flexível. Este comportamento se reflete nas medidas de tamanho. Não é aconselhável utilizar as mesmas medidas que usamos para os demais elementos, como campos de texto e imagens, por exemplo. Para itens flexíveis usaremos medidas relativas próprias. As seguintes declarações são aplicadas aos itens.
-
flex-grow
: define o tamanho de um item em relação aos demais no container. Aceita um número; -
flex-shrink
: especifica a proporção em que um item encolherá relativamente aos outros do container, quando o espaço livre em uma linha for preenchido. Aceita um número; -
flex-basis
: é equivalente à propriedademin-width
para os elementos em bloco (block
). É o tamanho mínimo até onde um elemento encolherá antes de ir para a próxima linha. Aceita um valor e uma unidade de medida (ex:200px
).
Podemos declarar estas três regras individualmente, ou, como é recomendado na especificação do flexbox, utilizar a versão curta flex
:
.item {
background-color: #999;
padding: 10px;
flex: 0 0 60px;
}
.box-5 {
flex: 1;
background-color: red;
}
Os valores de flex
aparecem nesta ordem: flex-grow
flex-shrink
flex-basis
No exemplo acima, definimos que todos os itens terão tamanho inicial de 60px
, enquanto que a .box-5
terá o valor de 1 para flex-grow
(quando apenas um valor é fornecido à propriedade flex
, ele equivale a flex-grow
). Veja o resultado no navegador.
Experimente alterar o valor de flex
da .box-5
para 8, por exemplo. Note como este item agora é proporcionalmente maior que os demais da mesma linha (o item 4 nesse caso).
Todo o código para a parte 2 do livro está disponível aqui.
Vamos aos últimos exercícios do livro e a partir do próximo capítulo aplicaremos tudo o que aprendemos até agora em um site completo.
Com o conteúdo atual você já é capaz de criar qualquer layout estático da internet. Digo estático pois é necessário, no mínimo, Javascript para dar interatividade à página.
Caso você queira ficar para os festejos finais, vamos criar um portfólio para você começar a divulgar seus trabalhos, com base no conteúdo do livro.
Aperte os cintos, pois a brincadeira começa agora!
Algumas ferramentas que podem nos auxiliar no desenvolvimento em geral:
Se você ainda não está utilizando nenhum editor de código, sugiro que comece usando o Brackets. Ele é desenvolvido em HTML, CSS e Javascript pela Adobe e tem algumas funcionalidades incríveis que já vêm por padrão, como a função Live preview, em que você escreve o código e o editor atualiza o navegador automaticamente a cada alteração. Isso pode economizar tempo significativo entre mudanças de janela e F5s. Além disso, é gratuito.
Como citei durante o livro, nem todos os navegadores têm as mesmas propriedades implementadas da mesma forma, por isso, esta ferramenta é tão útil. Com ela, você pode copiar o seu CSS no site e ter como resultado o mesmo código, porém, com os prefixos para cada navegador para as propriedades que precisam.
O Google das imagens de qualidade e gratuitas. São mais de 354 milhões de imagens para usar em qualquer projeto.
Nem sempre uma fonte disponível em nosso computador estará presente no computador dos usuários do nosso site. Para isso contornar esta situação, existem duas opções: disponibilizar para download o arquivo da fonte que temos em nosso computador ou utilizar um serviço que faça exatamente isso com diversas fontes.
Usaremos no projeto a seguir o Google Fonts. Com ele é possível escolher diversos tipos de fontes (708 nesse momento) de qualidade e gratuitas, ou seja, não precisamos nos preocupar com direitos autorais.
Dedique algum tempo para conhecer melhor seu navegador, em específico as ferramentas de desenvolvedor. No Firefox ou Chrome, é possível ter acesso a elas pelo atalho ctrl
+ shift
+ i
. Com estas ferramentas você será capaz de visualizar o código de qualquer site na internet, inclusive o HTML e CSS, fazer alterações no documento e visualizar em tempo real, entre muitas outras funcionalidades.
Para Firefox, você encontra mais informações aqui.
Enquanto que para o Chrome, aqui.
Cada navegador tem um padrão próprio para apresentar os elementos ao usuário. O projeto Normalize CSS é um "resetador" de estilos. Com ele na página, podemos adicionar nossos estilos sem nos preocupar com a aparência padrão de determinado elemento em cada navegador, já que o Normalize, que é apenas um arquivo .css
, padroniza os elementos por nós.
O download pode ser feito acessando o site e clicando com o botão direito do mouse em Download e Salvar como (ou algo similar). Salve este arquivo na pasta css do projeto e adicione um link
no head
de cada página.
Favicons são pequenos ícones, geralmente com tamanho de 16x16px, que são mostrados próximos ao título da página, no navegador. Servem para, além de diferenciar as abas/janelas do navegador, facilitar a identificação de seu site caso o usuário tenha sua página em seus favoritos junto de outras páginas.
Você pode criar sua própria imagem ou utilizar algum gerador gratuito online.
Para adicionar o favicon ao site, basta colocá-lo na pasta raiz do site e adicionar a seguinte linha ao head
do documento:
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
Antes de sair escrevendo código para todos os lados, é importante definir um escopo, limites para que não desperdicemos tempo, esforço e código.
Você geralmente criará um site a partir de um layout desenvolvido, geralmente, por um designer. Mas nem todo layout precisa de um designer. Com um pouco de pesquisa, analisando o que outros desenvolvedores e empresas estão utilizando em suas páginas, podemos ter ideias e apresentar um layout compatível.
Com um pouco de pesquisa, um lápis e um caderno, temos o seguinte wireframe (esboço).
Usaremos uma técnica conhecida como mobile-first, que consiste em desenvolver desde o começo a página como uma versão para dispositivos móveis, e, a partir daí, alterar os estilos para adaptarem-se a telas maiores.
Você pode simular o tamanho das telas destes dispositivos diminuindo e aumentando o tamanho da janela do navegador.
Como teremos mais arquivos que de costume (até agora usávamos apenas um .html e um .css), o ideal é separar cada arquivo com seus pares. Veja um exemplo de organização do diretório do projeto:
- projetos
- portfolio
- css
- estilos.css
- normalize.css
- imagens
- index.html
- css
- portfolio
Começamos com um diretório que será o destino de todos nossos projetos daqui em diante. Em seguida, na pasta portfolio ficarão todos os arquivos referentes ao projeto.
-
pasta css: lar dos nossos estilos CSS;
-
pasta imagens: onde ficarão as imagens utilizadas no projeto;
-
index.html
ficará dentro da pasta portfolio (na raíz) e conterá a estrutura do site.
É comum criar diversos arquivos .html
para cada projeto e muito do código destes arquivos é sempre o mesmo. Para evitar ter de escrever do início toda a estrutura básica cada vez que precisarmos de um arquivo ou projeto novo, criaremos um código que você poderá usar para seus próprios projetos.
Este tipo de arquivo é conhecido por boilerplate e é possível encontrar diversos modelos prontos na internet.
<!DOCTYPE html>
<!-- atributo lang define a linguagem predominante no site -->
<html lang="pt-br">
<head>
<!-- declaração da codificação dos caracteres -->
<meta charset="utf-8">
<!-- título da página -->
<title></title>
<!-- descrição da página. visível para os buscadores -->
<meta name="description" content="">
<!-- força o navegador a exibir o site de acordo com o tamanho do dispositivo -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- reseta os estilos do navegador -->
<link rel="stylesheet" href="css/normalize.css">
<!-- estilo próprio -->
<link rel="stylesheet" href="css/estilo.css">
</head>
<body>
<!-- conteúdo da página -->
</body>
</html>
A partir deste capítulo começaremos a desenvolver o HTML de nossa página.
Caso você queira utilizar as mesmas imagens, você as encontra no link abaixo:
Começaremos o desenvolvimento deste portfólio pelo head
.
-
Dê um título à página;
-
Altere o conteúdo da descrição;
-
Certifique-se de que os arquivos de CSS foram criados e estão na pasta "css";
-
Adicione o seguinte link de fontes depois da adição do
normalize.css
e antes deestilo.css
. Isso fará com que as fontes carregadas estejam disponíveis para uso dentro deestilos.css
, graças à cascata, que atinge os arquivos também.
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700|Roboto+Slab:400,700|Pacifico' rel='stylesheet' type='text/css'>
Já dentro do body
, começaremos a criar o conteúdo visível ao usuário.
-
Dentro de um
nav
, adicione um link com seu nome, que servirá como logo, e uma lista (ul
); -
Dentro da lista, adicione quatro
li
e, em cada um, crie um link; -
Em cada link, adicione o nome de cada seção do site: SOBRE, SERVIÇOS, PORTFÓLIO E CONTATO;
-
O destino de cada link será o id de cada seção, de mesmo nome, ex:
#sobre
.
-
Adicione um
header
na sequênca donav
; -
Dentro do
header
, adicione:- um cabeçalho
h1
com seu nome; - um parágrafo com uma breve descrição (aproximadamente oito palavras);
- e um link interno para o
id
sobre
, com aclass
button
e com o conteúdo "VER MAIS".
- um cabeçalho
-
Crie uma
section
comid
eclass
iguais asobre
. Oid
servirá de destino para nossos links internos, enquanto que aclass
receberá o estilo; -
Dentro da
section
, adicione:- um cabeçalho
h2
com o nome da seção: SOBRE; - um parágrafo com aproximadamente vinte palavras apresentando você;
- e um link interno para o
id
contato
, com aclass
button
e com o conteúdo "ENTRE EM CONTATO".
- um cabeçalho
-
Crie uma
section
comid
eclass
iguais aservicos
. Oid
servirá de destino para nossos links internos, enquanto que aclass
receberá o estilo; -
Dentro da
section
, teremos um cabeçalhoh2
, com o nome da seção, SERVIÇOS, e quatro componentes iguais que representam cada serviço. -
Cada serviço será composto por um
article
com aclass
servico
; -
Dentro de cada serviço teremos:
- uma
img
de um ícone; - um cabeçalho
h3
com o nome do serviço; - e um parágrafo com a descrição do serviço.
- uma
A estrutura final será:
section#servicos.servicos
h2
article.servico
(repetida a mesma estrutura para os 4 serviços)img
h3
p
-
Crie uma
section
comid
eclass
iguais aportfolio
. Oid
servirá de destino para nossos links internos, enquanto que aclass
receberá o estilo; -
Dentro da
section
, teremos um cabeçalhoh2
, com o nome da seção, PORTFÓLIO, e seis imagens com o mesmo tamanho (edite as fotos em um editor ou atribua a mesma altura e largura à imagem).
-
Crie uma
section
comid
eclass
iguais acontato
. Oid
servirá de destino para nossos links internos, enquanto que aclass
receberá o estilo; -
Dentro da
section
, adicione:- um cabeçalho
h2
, com o nome da seção, CONTATO; - um parágrafo com uma breve introdução ao contato;
- um formulário (detalhado a seguir);
- dois componentes para telefone e email (datalhado a seguir).
- um cabeçalho
- Ao
form
, adicione uma url fictícia para aaction
e omethod
post
. Adicione aoform
:- um
input
,type=text
,name=nome
,placeholder=Nome
; - um
input
,type=email
,name=email
,placeholder=Email
; - um
select
,name=assunto
com quatro opções:- a primeira
option
terá apenas o atributoselected
e o conteúdo "Selecione um assunto"; - as demais
option
terão valores (value
) e conteúdo diferentes;
- a primeira
- uma
textarea
,name=mensagem
,placeholder=Mensagem
; - um
button
,type=submit
,class=buttton
e o conteúdo "ENVIAR".
- um
O atributo placeholder
pode ser novo para você. Ele é responsável pelo conteúdo interno de um input
ou textarea
e some assim que o usuário começa a digitar no campo.
Assim como em serviços tínhamos quatro componentes repetidos para cada serviço, aqui teremos um componente repetido duas vezes, uma para cada forma de contato.
- Crie uma
div
com aclass
icone-contato e a ela adicione:- uma
img
com um ícone; - um link.
- uma
É possível criar um link que, ao ser acionado, inicie uma ligação. Para isso, basta adicionar ao atributo href
o número do telefone, sem espaços, precedido por tel:
. Por exemplo: <a href="tel:0xx99999990">(0XX) 9999 9990</a>
É possível criar um link que, ao ser acionado, crie um e-mail a partir do gerenciador padrão de emails do sistema. Para isso, basta adicionar ao atributo href
o email desejado, precedido por mailto:
. Por exemplo: <a href="mailto:email@contato.com">email@contato.com</a>
Crie um footer
e adicione a ele um parágrafo com algum texto. Geralmente o conteúdo do texto do rodapé fala sobre os direitos sobre o site, algo como: todos os direitos reservados a João Ninguém, ou, desenvolvido por João Ninguém.
Todos os estilos daqui visam atingir dispositivos móveis, portanto, sugiro que você simule o tamanho de um diminuindo a largura do navegador.
Estruturaremos nosso arquivo CSS de acordo com a ordem dos elementos no HTML. Porém, alguns estilos são comuns a elementos que aparecem em diversos locais da página. Para não repetir os estilos, vamos inserí-los no início do arquivo.
Separar cada seção com um comentário dizendo do que ela se trata pode ajudar você a encontrar estilos mais rapidamente dentro do documento.
Selecione a classe button
e adicione os seguintes estilos:
border
será0
, o que a tornará invisível;color
seráwhite
, para que o texto seja branco;background-color
igual a#13a9ba
resultará em um tom de azul;padding
de10px
em cima e embaixo e30px
em cada lado;border-radius
de3px
arredondará as bordas do elemento;font-family
igual a"Open Sans", "Helvetica Neue", Arial, sans-serif
. Não esqueça das aspas ao redor dos nomes com espaços;font-size
de0.9em
, para que o tamanho do texto seja de 90% relativo ao tamanho da fonte do elemento pai;text-decoration
, que define a decoração do texto será "nenhum", ounone
.
Selecione o body
e adicione os seguintes estilos:
font-family
igual a"Open Sans", Helvetica, Arial, sans-serif
;color
será#333
, para que o texto de todos os elementos seja cinza escuro.
Selecione os cabeçalhos h1
, h2
e h3
e aplique os seguintes estilos:
margin
será0
, para que não haja margens em nenhum lado;font-family
igual a"Roboto Slab", "Helvetica Neue", Arial, sans-serif
;font-weight
será700
, que se parece combold
.
Usando o seletor universal *
, aplique o seguinte estilo a todos os elementos:
box-sizing
terá o valor deborder-box
. Isso fará com que o comprimento de todos elementos seja calculado sem levar em conta opadding
.
Selecione todas as section
com o atributo id ([id]
) e aplique 58px
ao padding-top
.
Selecione todos os nav
e aplique o seguinte estilo:
display
igual aflex
, tornará o elemento um container flex;flex-flow
apenas com o valorcolumn
, direcionará os elementos em coluna além de implicitamente atribuir o valor denowrap
à propriedadeflex-wrap
, que seria a segunda propriedade da declaração deflex-flow
;align-items
sendocenter
centralizará os itens no container;background-color
será#333
, o que torna o fundo cinza escuro.
Selecione todos os a
filhos diretos (>
) de nav
e aplique o seguinte estilo:
text-decoration
none
removerá o sublinhado padrão dos links;color
seráwhite
para que o texto seja branco;font-weight
será700
;font-size
será de28px
;font-family
igual aPacifico, serif
para termos uma fonte diferente para o logo;margin-bottom
igual a8px
para aumentar o espaçamento abaixo do link.
Selecione todos os ul
dentro de nav
e aplique os seguintes estilos:
list-style
sendonone
, significa que não teremos estilo para os itens da lista;padding
igual a0
, remove o espaçamento interno da lista;margin
igual a0
, remove o espaçamento externo da lista;display
igual aflex
, tornará o elemento um container flex;flex-flow
apenas com o valorcolumn
, direcionará os elementos em coluna além de implicitamente atribuir o valor denowrap
à propriedadeflex-wrap
, que seria a segunda propriedade da declaração deflex-flow
;align-items
sendo ```center, centralizará os itens no container;width
com valor de100%
, fará com que a lista ocupe toda a largura da tela.
Selecione todos li
, dentro de ul
, dentro de nav
e aplique os seguintes estilos:
text-align
altera o alinhamento do texto e, neste caso, será igual acenter
;width
igual a100%
, fará com que cada item da lista ocupe toda a largura disponível.
Selecione todos os a
, dentro de li
, dentro de ul
, dentro de nav
e aplique os seguintes estilos:
display
igual ainline-block
, fará com que nossos links, que tem como padrão o valorinline
, se comportem como blocos em linha, o que nos permite dar valores a eles como largura;padding
tendo o valor10px 0
, atribuirá10px
acima e abaixo do conteúdo além de remover qualquer espaço interno nas laterais;width
igual a100%
forçará os links a também ocuparem toda a largura disponível para eles;text-decoration
igual anone
remove a decoração padrão dos links;color
seráwhite
para que o texto dos links seja branco.
Selecione todos os header
e aplique os seguintes estilos:
background-image
igual aurl("http://i.imgur.com/lxiJa87.jpg")
, colocará a imagem entreurl()
como fundo. Você pode inserir um imagem de outro site ou que você tenha no seu computador;background-size
com valor decover
, será responsável por cobrir o fundo com a imagem;background-position
posiciona a imagem ao fundo. Nesse caso terá o valor decenter
;background-repeat
igual ano-repeat
evita que o a imagem de fundo seja repetida;color
seráwhite
, para que o texto do cabeçalho seja branco;display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container;text-align
igual acenter
, alinha o o conteúdo dos itens ao centro;padding
igual a50px 0
, cria espaço interno no topo e na base do elemento, além de zerar o espaçamento lateral.
Selecione todos os p
dentro de header
e aplique o seguinte estilo:
margin-bottom
igual a2em
, corresponde a duas vezes o tamanho de fonte definido para o elemento pai.
Selecione a classe sobre
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container;text-align
igual acenter
, alinha o o conteúdo dos itens ao centro;background-color
igual a#13a9ba
, colorirá o fundo em um tom de azul;color
igual awhite
, tornará o texto branco;padding-bottom
com o valor de58px
aumenta o espaçamento inferior do elemento.
Selecione todos os p
dentro da classe sobre
e aplique os seguintes estilos:
margin-bottom
igual a2em
, corresponde a duas vezes o tamanho de fonte definido para o elemento pai;max-width
determina que a largura máxima será de1000px
.
Selecione todos os elementos da classe button
dentro da classe sobre
e aplique os seguintes estilos:
background-color
igual awhite
, tornará o fundo branco;color
sendo#333
, deixará o texto legível em um tom de cinza escuro.
Selecione a classe servicos
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container.
Selecione todos os elementos da classe servico
dentro da classe servicos
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container;text-align
serácenter
, para centralizar o conteúdo no elemento;margin-top
igual a30px
, criará mais espaço com uma margem no topo.
Selecione todos os h3
, dentro da classe servico
, dentro da classe servicos
e aplique o seguinte estilo:
margin-top
igual a10px
, para aumentar o espaçamento externo no topo;
Selecione todas as img
, dentro da classe servico
, dentro da classe servicos
e aplique os seguintes estilos:
width
igual a100%
, fará com que a imagem ocupe toda a largura disponível;max-width
com o valor de80px
evitará que as imagens dos ícones creçam excessivamente e fiquem deformadas.
Selecione a classe portfolio
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container.
Selecione todos os h2
dentro da classe portfolio
e aplique o seguinte estilo:
margin-bottom
igual a20px
, adicionará espaço à margem inferior.
Selecione todas as img
dentro da classe portfolio
e aplique o seguinte estilo:
width
igual a 100%, fará com que a imagem ocupe toda a largura disposnível.
Selecione a classe contato
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;align-items
sendocenter
, centralizará os itens no container;text-align
serácenter
, para centralizar o conteúdo no elemento.
Selecione todos os a
dentro da classe contato
e aplique os seguintes estilos:
display
igual ablock
, evitará que os links que estão junto a imagens fiquem na mesma linha delas;color
receberá o valor deinherit
, que significa herdar, ou seja, nossos links herdarão a cor do texto do elemento pai.
Selecione todos os form
e aplique os seguintes estilos:
display
igual aflex
, tornará o elemento um container flex;flex-flow
com o valor decolumn
direcionará os itens do container em coluna;width
igual a80%
, fará com que o formulário ocupe 80% da largura disponível;margin-bottom
com o valor de30px
, aumentará o espaçamento inferior para os outros elementos.
Selecione todos os input
, select
e textarea
e aplique os seguintes estilos:
width
igual a100%
, fará com que os elementos ocupem toda a largura disponível;margin-bottom
igual a10px
, separará os elementos entre si.
Selecione o último elemento filho com a classe icone-contato
(usando :last-child
) e aplique o seguinte estilo:
margin-top
igual a10px
, fará com que o último elemento, que nesse caso é o segundo, ao ficar abaixo do primeiro componenteicone-contato
, tenha10px
de margem superior para aquele elemento. Removeremos este estilo quando o objetivo de tela for desktop.
Selecione todos os footer
e aplique os seguintes estilos:
text-align
igual acenter
, centralizará o conteúdo ;padding
com o valor de10px
, aumentará o espaçamento interno do elemento;background-color
igual a#13a9ba
, colorirá o fundo em um tom de azul;color
igual awhite
, tornará o texto branco;margin-top
igual58px
aumentará o espaço superior.
A partir daqui, nossos estilos terão por objetivo atingir determinadas resoluções de tela. No caso deste exemplo especificamente, maiores que 768px.
@media
inicia a declaração de uma media query;screen
define que pretendemos atingir telas e monitores;and (min-width: 768px)
e que tenha largura mínima de768px
.
Completa, a media query deve se parecer com isso, e os estilos a seguir serão inseridos entre as chaves {}
:
@media screen and (min-width: 768px) {
}
Apenas alguns estilos serão alterados ou adicionados, uma vez que estas regras já foram, em sua maioria, escritas anteriormente e seu estilo é herdado.
Selecione todos os nav
e aplique os seguintes estilos:
flex-flow
passará a ter o valor derow
, que antes era decolumn
;position
igual afixed
, fixará a barra de navegação na posição definida abaixo;top
igual a0
, equivale ao mais próximo possível do topo do navegador;left
igual a0
, equivale ao mais próximo possível da lateral esquerda do navegador;width
com valor de100%
, fará a barra ocupar toda a largura disponível;justify-content
igual aspace-around
, organizará os itens para que o espaço livre fique ao redor deles;background-color
será igual argba(0, 0, 0, 0.8)
, que é equivalente a preto com 80% de opacidade (ou 20% transparente, como preferir).
Selecione todos os ul
dentro de nav
e aplique os seguintes estilos:
flex-flow
passará a ter o valor derow
, que antes era decolumn
;width
passará a ter o valor de50%
, para que ocupe largura equivalente a 50% do disponível na tela.
Selecione todos os header
e aplique os seguintes estilos:
height
igual a100vh
, tornará o cabeçalho da altura da janela, automaticamente. A unidadevh
significaviewport height
e equivale à porcentagem da altura da tela.50vh
é equivale à metade, e assim por diante;justify-content
igual acenter
, centralizará os itens do container verticalmente.
Selecione a classe sobre
e aplique o seguinte estilo:
justify-content
igual acenter
, centralizará os itens do container verticalmente.
Selecione a classe servicos
e aplique os seguintes estilos:
flex-flow
passará a ter o valor derow wrap
, que antes era decolumn
;align-items
igual aflex-start
alinhará todos os itens no topo do container flex;max-width
terá o valor de1000px
para limitar a largura do container;margin
terá o valor de0 auto
, que removerá as margens do topo e base além de tornar automático o tamanho das margens laterais.
Selecione todos os h2
da classe servicos
e aplique os seguintes estilos:
text-align
com o valor decenter
, centralizará o conteúdo do elemento;width
igual a100%
, fará com que o elemento ocupe toda a largura disponível, forçando os demais itens a ocuparem outra linha (graças ao container estar configurado comorow
e a quebra de linhawrap
).
Selecione todos os elementos da classe servico
dentro da classe servicos
e aplique os seguintes estilos:
flex
igual a1 1 150px
, dá um tamanho proporcional a todos os itens além de largura mínima de150px
;padding
igual a0 10px
, remove o espaçamento interno do topo e base e adiciona10px
às laterais.
Selecione a classe portfolio
e aplique o seguinte estilo:
flex-flow
passará a ter o valor derow wrap
, que antes era decolumn
.
Selecione todos os h2
dentro da classe portfolio
e aplique os seguintes estilos:
text-align
com o valor decenter
, centralizará o conteúdo do elemento;width
igual a100%
, fará com que o elemento ocupe toda a largura disponível, forçando os demais itens a ocuparem outra linha (graças ao container estar configurado comorow
e a quebra de linhawrap
).
Selecione todas as img
dentro da classe portfolio
e aplique o seguinte estilo:
width
igual a33.33333333333%
(experimente uma precisão um pouco menor...), dá um tamanho proporcional a todos os itens, colocando assim, três itens em cada linha;
Selecione a classe contato
e aplique os seguintes estilos:
flex-flow
passará a ter o valor derow wrap
, que antes era decolumn
;justify-content
igual aspace-around
, distribuirá a mesma quantidade de espaço ao redor de cada item;max-width
com valor de500px
, limitará a largura do container;margin
terá o valor de0 auto
, que removerá as margens do topo e base além de tornar automático o tamanho das margens laterais.
Selecione todos os h2
dentro da classe contato
e aplique os seguintes estilos:
text-align
com o valor decenter
, centralizará o conteúdo do elemento;width
igual a100%
, fará com que o elemento ocupe toda a largura disponível, forçando os demais itens a ocuparem outra linha (graças ao container estar configurado comorow
e a quebra de linhawrap
).
Selecione o último elemento filho com a classe icone-contato
(usando :last-child
) e aplique o seguinte estilo:
margin-top
será igual a0
, já que não é mais necessário que o último elemento tenha margem superior.
Se tudo correu conforme planejado, você tem um site pronto.
Você pode conferir o resultado aqui.
Mas, ainda há o que fazer. Alguns estilos são repetidos ao longo do CSS e poderiam ser agrupados em uma classe específica e aplicada aos elementos desejados. Outros detalhes, como o espaçamento interno dos containeres, para que o texto não toque nas laterais, não foram adicionados. Os botões estão estáticos ao passar do mouse. Você pode, a partir de agora, fazer modificações e, inclusive, melhorar este layout.
Não se esqueça de prefixar as propriedades necessárias. O Autoprefixer pode te ajudar nessa tarefa.