Web Design Responsivo Com HTML5 e CSS3
Web Design Responsivo Com HTML5 e CSS3
br
Sumário
Capítulo 1 - Introdução..................................................................................................4
1.1 Ambiente de desenvolvimento................................................................. 4
1.2 O projeto do curso......................................................................................6
Capítulo 2 - Introdução ao HTML5................................................................................ 8
2.1 Estrutura básica..........................................................................................8
2.2 Estrutura do projeto...................................................................................9
2.3 Viewport................................................................................................... 10
2.4 Elementos inline e block.......................................................................... 11
2.5 Página inicial: cabeçalho.......................................................................... 13
2.6 Página inicial: navegação......................................................................... 14
2.7 Página inicial: produtos............................................................................15
2.8 Página inicial: rodapé............................................................................... 16
2.9 Página de contatos................................................................................... 18
Capítulo 3 - Introdução ao CSS3, metodologia BEM e container do Bootstrap........ 21
3.1 Estrutura básica do CSS............................................................................21
3.2 Apresentação da metodologia BEM........................................................ 25
3.3 Apresentando o container do Bootstrap.................................................27
3.4 Estilizando a página inicial: cabeçalho e menu....................................... 27
3.5 Estilizando a página inicial: navegação................................................... 35
3.6 Estilizando a página inicial: produtos...................................................... 37
3.7 Estilizando a página inicial: rodapé......................................................... 42
3.8 Estilizando a página de contatos............................................................. 43
Capítulo 4 - Conclusão................................................................................................. 47
4.1 Próximos passos....................................................................................... 47
Capítulo 1 - Introdução
Seja bem-vindo! Estou muito feliz por você ter baixado esse livro digital. Espero
que ele sirva para alavancar a sua carreira profissional como desenvolvedor
front-end. Neste capítulo inicial, mostraremos como preparar o ambiente de
desenvolvimento e apresentaremos a proposta final do projeto que vamos
desenvolver.
Vale destacar que ao final desse capítulo as páginas não terão a aparência que
foi mostrada no capítulo anterior, pois o que teremos aqui, serão as páginas HTML
sem os estilos CSS, ou seja, construiremos a estrutura e adicionaremos apenas o
conteúdo das páginas. A partir do próximo capítulo, estilizaremos essas páginas com
CSS e elas ficarão idênticas à proposta inicial.
<!DOCTYPE html>
<html lang="pt-br"></html>
Dentro das tags <html>, existem dois elementos filhos de grande importância: o
cabeçalho <head> e o corpo do documento <body>.
<head>
<meta charset="utf-8" />
<title>Hat Shop - Contato.</title>
</head>
<body>
Meu primeiro HTML!
</body>
Esse código HTML deverá ser salvo no seu computador com a extensão .html, p.
ex.: estrutura_basica.html e poderá ser exibido no Google Chrome (figura 2.2),
clicando-se duas vezes sobre o arquivo. Note que a página será renderizada e apenas
o conteúdo do elemento <title> é mostrado na barra de títulos e o conteúdo das tags
<body> é mostrado na área de conteúdo do navegador. As demais tags são
informativas, mas são de extrema importância.
padrão: HTML e Codificação: UTF-8, como apresentado na figura 2.3. Essa última
configuração é importante para que todos os documentos criados pelo editor sejam
gravados com a mesma codificação UTF-8 que informamos ao browser, por meio do
atributo charset, da tag <meta>, no arquivo HTML. Se essa configuração não for
realizada, o browser pode não entender corretamente alguns caracteres específicos
da língua portuguesa, como cedilhas e acentos, substituindo-os por caracteres
desconhecidos.
Crie também duas subpastas, uma para armazenar as imagens dos produtos e a
logomarca da nossa loja fictícia e outra para arquivos CSS que será útil no próximo
capítulo. Se tiver alguma dúvida compare o que você já fez com o projeto pronto no
GitHub.
2.3 Viewport
Como mencionamos anteriormente, o HTML é uma linguagem de marcação que
é interpretada e renderizada por navegadores e sua função é de descrever o
conteúdo, a estrutura e a semântica das páginas de Internet, logo, não vamos nesse
capítulo, mostrar estilização de cores, fontes, caixas de texto etc, pois essas
responsabilidades são do CSS, que veremos no próximo capítulo.
Elementos estruturais podem parecer sem sentido, mas pense que o seu arquivo
HTML pode ser grande e essa nominação dos elementos facilitará bastante a
compreensão sobre do sentido das áreas de sua página para qualquer desenvolvedor
que esteja lendo seu código-fonte.
Elementos inline são caixas que ocupam apenas a área específica de seu
conteúdo e não podem ter a definição de altura e largura por estilização CSS. São
exemplos de elementos inline:
Span <span>;
Link <a>;
Imagem <img>;
Negrito <b>;
Itálico <i>;
Dentre outras.
Na linha 14 temos uma tag <img> que é responsável por adicionar a logomarca
na página, localizada no caminho src="imagens/logo.png". Definimos que essa
imagem tem um comprimento de 99 pixels e altura de 68 pixels e um texto auxiliar
alt="Hat Shop", caso haja algum problema no seu carregamento.
O elemento <a> (linhas 13 a 15) cria um link para a imagem, através atributo
href, logo se o usuário clicar nele, será redirecionado para a própria página inicial, ou
seja, o index.html
<a href="index.html">
<img src="imagens/logo.png" width="99" height="68" alt="Hat Shop" />
</a>
Mais abaixo, nas linhas 17 a 26 criamos outra caixa genérica <div> que contém
uma lista não ordenada <ul> com dois elementos (linhas 18 a 25) com um link <a>
para cada item da lista <li> de HOME e Contato, respectivamente.
<div>
<ul>
<a href="index.html">
<li>HOME</li>
</a>
<a href="contato.html">
<li>Contato</li>
</a>
</ul>
</div>
Por fim, criamos um elemento <div>, na linha 27, para armazenar o nome do site
que ficará abaixo da logomarca depois que aplicarmos estilos CSS no próximo
capítulo.
<div>Hat Shop</div>
No nosso caso, utilizaremos esse elemento para criar uma área de publicação do
site, com um banner para levar o cliente a fazer o cadastro e ganhar 50% de
desconto na sua primeira compra.
Dentro de <section> há três produtos dentro de uma caixa genérica <div>, sendo
que cada produto está dentro de uma estrutura semântica <article>.
<article>
<header>
<img src="imagens/bowler.png" alt="Bowler" />
</header>
<section>
<div>Bowler</div>
<div>R$39,90</div>
<div>em até 5X sem juros!</div>
</section>
<footer>
<a href="#">Comprar</a>
</footer>
</article>
Essa estrutura <article> se repete para cada produto e essa semântica de caixas
que separam o conteúdo torna mais fácil o entendimento de quem está escrevendo
ou lendo o código-fonte, como mostrado na figura 2.11.
Perceba também que para cada <article>, temos estruturas semânticas que
delimitam as áreas de cada item informativo, dentro dele mesmo, como: um
cabeçalho, uma seção e um rodapé, da mesma forma que estamos definindo
semanticamente os espaços na página inicial.
Char Entity
© ©
® ®
€ €
™ ™
← ←
↑ ↑
→ →
↓ ↓
♠ ♠
♣ ♣
♥ ♥
♦ ♦
Se você abrir pelo navegador a página index.html, terá a imagem da figura 2.13.
Note que não parece em nada com a proposta do capítulo de introdução, mas não
desanime, pois como falei, o HTML é responsável pela estrutura e conteúdo da
página, mas a estilização de cores, fontes e caixas virá quando trabalharmos com CSS
no próximo capítulo.
Utilizamos requisição via GET quando submetemos dados não sigilosos, pois eles
aparecerão na URL do página após a submissão. Enviamos requisições via POST
quando precisamos transmitir dados sensíveis, como login e senha.
O elemento <label> (linhas 36, 41, 46, 51, 56) é um campo informativo para cada
campo de texto a ser preenchido no formulário, assim, sabemos que a primeira caixa
é destinada a colocar o nome do usuário (linha 35 a 38), a segunda para colocar o
e-mail e assim sucessivamente.
<div>
<label for="nome">Nome</label>
<input id="nome" name="nome" type="text" />
</div>
O elemento <input> é a caixa de texto que o usuário poderá escrever seus dados.
Ele tem 3 atributos principais: o id que identifica o elemento por um nome. Se ele
tiver o mesmo nome do atributo for do elemento <label>, fará o browser entender
que esses elementos são integrados, de forma que se você clicar no nome do <label>,
ativará a caixa de texto para ser preenchida. O segundo atributo é o name que é
responsável por passar o nome desse campo, quando o formulário for submetido. O
terceiro atributo é o type que pode ter os seguinte nomes:
Campo de texto simples: text;
Botão: button;
Senha: password;
Oculto: hidden;
Arquivo: file;
E muitos outros.
Por fim, temos as tags <button> que podem ser do tipo reset, para limpar todos
os campos do formulário e submit para submeter todas as informações preenchidas
no formulário para a página de processamento de informações, definida no
argumento action do elemento <form>.
<button type="reset">Limpar</button>
<button type="submit">Enviar</button>
O CSS3 é a versão mais nova do CSS e assim como o HTML, tem compatibilidade
com sua antecessora, bem como foram adicionadas novas propriedades para bordas
de caixas, planos de fundo, cores, textos, seletores etc. Existem, basicamente, três
formas de inserir estilização em páginas HTML:
A sintaxe para definir esse tipo estilo é colocar dentro da tag de abertura o
nome style, seguido dos atributos e seus valores, entre aspas e separados por ponto
e vírgula: "atributo1: valor1; atributo2: valor2; atributoN: valorN;".
Abaixo temos um comentário HTML entre os símbolos <!-- --> e uma tag <p> de
parágrafo que está sendo estilizada com a cor azul, através do atributo style="color:
blue;".
<head>
...
<!--Isto é um estilo incorporado a um elemento HTML-->
<style>
p{
color: red;
}
</style>
...
</head>
seletor {
atributo1: valor1;
atributo2: valor2;
atributoN: valorN;
}
<head>
...
<!--Isto é um estilo externo referenciado dentro do HTML-->
<link rel="stylesheet" href="estilos.css" />
...
</head>
A tag <link> possui o atributo rel que define o tipo de arquivo que será
referenciado (stylesheet) e o atributo href terá o caminho do arquivo CSS.
/* Arquivo estilos.css */
body {
margin: 0;
p{
color:red;
}
h1 {
background-color:blue;
}
header {
padding: 20px 0;
background-color: #454545;
color: #fff;
text-align: center;
}
<!--Código-fonte do HTML-->
<p class="personalizado" >Meu parágrafo</p>
/* Código-fonte do CSS */
.personalizado {
color: red;
}
Nesse caso, estamos personalizando apenas para esse parágrafo cuja classe está
definida para receber a cor vermelha, os demais parágrafos de um documento HTML
não serão estilizados com esse código CSS.
<!--Código-fonte do HTML4-->
<div id="header" >Meu cabeçalho</div>
/* Código-fonte do CSS */
#header {
color: red;
}
<!--Código-fonte do HTML5-->
<header>Meu cabeçalho</header>
/* Código-fonte do CSS */
header {
color: red;
}
<!--Código-fonte do HTML-->
<div>
<p>Esse filho direto de DIV poderá ser afetado por qualquer estilo abaixo,
vermelho ou azul, quem for declarado por último, pois ele é filho direto de
DIV.
</p>
<span>Span filho de DIV
/* Filho de DIV */
div p {
color: blue;
}
ou
Considere que um parágrafo <p> é filho de uma caixa genérica <div> e existem
dois estilos que podem ser aplicados, o primeiro é o div p{...} que estilizará todos os
filhos <p> diretos e indiretos do elemento <div> e o segundo é o div > p {...} que
significa que esse estilo será aplicado para o elemento <p> filho direto de <div>.
/* Uso de preferência da cor azul sobre todo e qualquer outro estilo que esteja
em conflito */
div p {
color: blue !important;
}
Uma das soluções para esse problema é o uso de metodologias que servem para
padronizar os nomes das folhas de estilo, a fim de criar uma cultura de organização
dentro de uma equipe de desenvolvimento, por isso vamos falar um pouco sobre a
metodologia BEM (block, element e modifier). Essa metodologia consiste em criar
dentro de uma página, áreas de bloco que são entidades independentes na página
web e elementos que dependem do bloco para existir. Ambas, podem ser
modificadas em algum momento por uma situação particular, denominado
modificador.
A sintaxe consiste em criar classes CSS de forma que o nome do bloco venha
primeiro, seguido de dois underscores (__) para seus elementos ou dois traços (--)
para seus modificadores, como nos exemplos das seguintes estruturas:
Bloco X qualquer: blocoX;
Elemento A de um bloco X: blocoX__ElementoA;
Modificador 1 de um blocoX: blocoX--modificador1;
Modificador 1 de um elemento A: elementoA--modificador1;
Modificador 1 do elemento A de um blocoX: blocoX__ElementoA--modificador1.
Para o bloco o header, temos um modificador que tornará essa área da página
fixa, mesmo que se role o conteúdo para baixo (block-header--fixed) e ainda dois
elementos filhos direto desse bloco: block-header__logomarca e
block-header__descricao. Temos ainda um bloco específico para o menu
(block-header__menu) e dentro dele seus elementos: header-menu__item. Nesse
último caso, basta apenas um estilo para ser utilizado em todos os ítens do menu,
pois seus estilos serão os mesmos.
Essa organização tratá ao código mais clareza quando for necessário editar ou
compreender o que está escrito. Vale salientar que a Metodologia BEM é flexivel
quanto ao que você define como bloco, elemento e modificador, ou seja, você pode
ter uma ideia diferente da proposta desse curso. O mais importante é manter a
organização do código-fonte CSS e da equipe de desenvolvimento, a fim de evitar
problemas futuros na compreensão do seu site.
A classe container pertence ao grid system e é responsável por criar uma caixa
adaptável que se ajusta, a medida que mudamos a tela do dispositivo sem gerar
barra de rolagem horizontal.
Podemos observar, nas figuras 3.3 e 3.4, que estamos importando dois arquivos
CSS externos (linhas 9 e 10), o primeiro é o arquivo CSS do Bootstrap que contém as
estilizações de container do grid system que falamos no tópico anterior e o segundo
é o estilo que estamos criando. É importante frisar que o estilo do Bootstrap deve
ser declarado primeiro, pois qualquer estilização que seja feita no seu CSS pessoal,
poderá sobrescrever o CSS do Bootstrap.
Partindo para a figura 3.5, veremos como ficou a estilização do cabeçalho das
nossas páginas index.html e contato.html.
Por fim, definimos os elementos que fazem parte dos blocos de cabeçalho e de
menu:
block-header__logomarca: classe de estilização específica para o elemento
logomarca da bloco header;
block-header__descricao: classe de elemento para estilizar a descrição da
logomarca do bloco header;
block-header__menu: classe de bloco para estilização da lista de menu;
header-menu__item: classe de elemento para estilizar os itens da lista
(botões Home e Contato).
Só definir classes nos arquivos HTML não fará as páginas serem estilizadas,
exceto a classe container do Bootstrap, para isso vamos conhecer como ficaram as
estilizações no arquivo estilos.css.
Antes de estilizar, precisamos entender que todo browser tem um estilo próprio
de formatações de fontes. No caso do Google Chrome o padrão das fontes é 16
pixels para resolução de 100%. Essa unidade fixa não é recomendada para nosso site
que será responsivo, por isso vamos transformar a fonte fixa do navegador em uma
fonte variável, equivalente 10 pixels, pois quando precisarmos aumentar ou reduzir
as fontes do documento, poderemos multiplicar facilmente de dez em dez. Com uma
regra de três simples, notaremos que 16 pixels equivale a 100% e 10 pixels
equivalem a 62,5%.:
html {
font-size: 62.5%;
}
Uma outra configuração muito importante é definir margin: 0, para que todos os
elementos estruturais, filhos de body, possam ocupar toda área da tela do
navegador, com margens zeradas, em todas as direções.
Precisamos definir as fontes padrão. Para isso, foi declarado que o navegador
use a fonte Arial, mas se o dispositivo não tiver essa fonte, tentará usar a Helvetica e
senão tiver nenhuma delas, usará a genérica sans-serif.
body {
margin: 0;
A parte em azul, da figura 3.7, equivale a área definida para conteúdo da caixa e
ele pode ser uma imagem, um texto ou até outro elemento de bloco ou inline.
/* Código CSS */
.block-header {
padding-top: 8px;
height: 110px;
background-color: #454545;
}
Logo abaixo temos um modificador (linha 21 a 27) para o nosso cabeçalho que
será responsável por informar ao navegador que o cabeçalho será fixo e seus pontos
extremos de referência são: top: 0; left: 0; right: 0. Como estamos usando o
container do Bootstrap, temos de colocar o elemento z-index com um valor alto,
para dar preferência ao menu em relação a outros containers (nav, header, main,
footer etc).
/* Código CSS */
.block-header--fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 99;
}
O bloco de menu (linha 30 a 36) será definido com margem zero em todos os
lados, fonte de 16 pixels, pois é 1.6rem, ou seja, 1.6 vezes o tamanho do elemento
pai que é o HTML, com valor de 62,5% (10 pixels) do valor da fonte do navegador (16
pixels). Por fim, informamos ao navegador que o nosso menu (lista) não terá
nenhum marcador, através do list-style.
/* Código CSS */
.header-menu {
margin: 0;
font-size: 1.6rem;
list-style: none;
}
/* Código CSS */
.block-header__logomarca {
float: left;
width: 99px;
height: 68px;
Na caixa que contém o nome da nossa loja virtual (linha 106 a 114), definimos
um comprimento de 98 pixels, alinhado ao centro, com fonte fixa de 21 pixels, de cor
branca #fff e formatação de texto em negrito, através do valor bold. Estamos
utilizando uma fonte fixa, pois quando essa página for renderizada em telas
pequenas, o nome da empresa deve ficar com o mesmo tamanho para destaque.
/* Código CSS */
.block-header__descricao {
width: 98px;
font-size: 21px;
font-weight: bold;
text-align: center;
color: #fff;
}
O menu dentro do cabeçalho da página (linha 116 a 119) foi definido com um
elemento block-header__menu que contém um o bloco header-menu (já falamos
anteriormente) e o seu elemento header-menu__item (linha 122 a 132). Perceba
que estamos jogando a caixa block-header__menu para a direita, com um padding
no topo de 25 pixel a fim de centralizar, de cima para baixo, os botões HOME e
Contato, no meio do cabeçalho.
/* Código CSS */
.block-header__menu {
float: right;
padding-top: 25px;
}
.header-menu__item {
display: inline-block;
position:relative;
padding: 10px;
width: 90px;
background-color: #00008b;
color: #fff;
text-align: center;
}
.header-menu__item:hover, .header-menu__item:focus {
background-color: #A0522D;
Perceba que criamos um bloco <nav> para toda a caixa e declaramos sua classe
block-nav. Dentro dele, utilizamos o container-fluid do Bootstrap a fim de que
ocupe toda a área horizontal do navegador. Na linha 36, declaramos o bloco <div>
com a classe nav-promocional e os seus elementos <h1> e <div>, de classes
nav-promocional__titulo e nav-promocional__button, respectivamente.
Agora vamos declarar os estilos CSS para o bloco promocional (linhas 39 a 44).
Inicialmente declaramos que esse bloco deve começar com 110 pixels de margem de
topo, pois essa é a dimensão já ocupada pela caixa fixa do cabeçalho. Em seguida,
inserimos um espaçamento interno de 40 pixels no topo e na base e uma cor de
fundo hexadecimal #A0522D.
.block-nav{
margin-top: 110px;
padding: 40px 0;
background-color: #A0522D;
}
Iremos estilizar a caixa dentro do bloco <nav>, onde teremos de fato o conteúdo
(linha 46 a 49). Definimos uma fonte de 16 pixels em relação ao <body> com texto
centralizado. Vale salientar que essa configuração é definida para dispositivos
.nav-promocional {
font-size: 1.6rem; /* 1.6 * 10px */
text-align: center;
}
Para dispositivos maiores que 760 pixels o CSS alterará o tamanho da fonte e
criará um espaçamento nas laterais de 5% em relação ao tamanho da tela.
@media(min-width: 760px) {
.nav-promocional {
padding: 0 5%;
font-size: 2.3rem;
}
}
O título será sem margem e terá cor branca para contrastar com a cor de fundo
do bloco <nav>, além de uma fonte 5 vezes maior em relação ao seu pai, com um
espaçamento superior e inferior de 1em e uma sombra deslocada em 2 pixels para a
direita e para baixo de cor #454545.
.nav-promocional__titulo {
margin: 0;
color: #fff;
font-size: 5rem;
line-height: 1em;
text-shadow: 2px 2px #454545;
}
.nav-promocional__button {
margin-top: 50px;
margin-bottom: 20px;
font-size: 1em;
}
Para estilizar o link (linha 156 a 164), inserimos um padding de 15 pixels no topo
e na base e 35 pixels nas laterais. Utilizamos o border-radius para arredondar os
cantos da caixa em 10 pixels e inserimos estilo para o texto ser branco e sem
sublinhado, além de uma cor de fundo de #222 para o botão.
.nav-promocional__button > a {
padding: 15px 35px;
border-radius: 10px;
color: #fff;
text-decoration: none;
background-color: #222;
}
Para finalizar, colocamos um efeito que muda a cor do botão, quando o usuário
passar o mouse ou selecionar pelo teclado, através das pseudo-classes hover e focus,
respectivamente (linha 166 a 168).
/* Código CSS */
.block-section {
padding: 20px 0px;
}
/* Código CSS */
.section-produto {
padding: 10px 0;
width: 100%;
margin-bottom: 10px;
height: 380px;
text-align: center;
<article class="section-produto">
<header class="section-product__imagem">
<img src="imagens/bowler.png" alt="Bowler" />
</header>
<section>
<div class="section-product__descricao">Bowler</div>
<div class="section-product__valor">R$39,90</div>
<div class="section-product__pagamento">em até 5X...</div>
</section>
<footer class="section-product__button">
<a href="#">Comprar</a>
</footer>
</article>
.section-product__imagem {
height: 150px;
}
.section-product__descricao, .section-product__valor {
margin: 10px 0;
font-size: 2.8rem;
}
.section-product__pagamento {
margin: 10px 0;
font-size: 2rem;
}
.section-product__button {
padding: 10px 0;
}
.section-product__button > a {
padding: 10px 15px;
color: #fff;
text-decoration: none;
background-color: #00008B;
}
Perceba que assim como o cabeçalho e a seção de produtos, o rodapé tem uma
caixa <footer> com 100% do comprimento, mas possui uma caixa filha <div> que é
responsiva, devido ao uso da classe container do Bootstrap.
/* Código CSS */
.block-form {
margin-top: 110px 0 70px;
padding: 20px 0;
}
O formulário está dentro de uma caixa semântica <main> (figura 3.18) que
consideramos como um bloco com margem no topo de 110 pixels, zero nas laterais,
70 pixels na base e com um espaçamento interno de 20 pixels nas laterais (linha 94 a
97 da figura 3.19):
block-form: classe que estiliza a caixa que envolve todo o formulário.
/* Código CSS */
.form__titulo {
text-align: center;
}
.form__grupo {
margin: 10px 0;
}
.form__field {
width: 100%;
height: 3em;
padding: 5px;
display: block;
border-radius: 10px;
border: 1px solid #ccc;
font-size: 1.4rem;
background-color: #fff;
}
Capítulo 4 - Conclusão
Nesse ebook você aprendeu a criar do zero um site responsivo utilizando HTML5,
CSS3, metodologia BEM e o container do grid system do Bootstrap. Agora você pode
iniciar a sua carreira profissional como desenvolvedor front-end e entrar no mercado
de trabalho. Para isso, continue aprofundando seus conhecimentos, buscando
sempre material relacionado aos temas abordados e treinando com o
desenvolvimento de outros sites.