Apostila HTML Css Javascript
Apostila HTML Css Javascript
A Caelum espera que você aproveite esse material. Todos os comentários, críticas e sugestões serão
muito bem-vindos.
Esse material é parte integrante do treinamento Desenvolvimento Web com HTML, CSS e
JavaScript e distribuído gratuitamente exclusivamente pelo site da Caelum. Todos os direitos são
reservados à Caelum. A distribuição, cópia, revenda e utilização para ministrar treinamentos são
absolutamente vedadas. Para uso comercial deste material, por favor, consulte a Caelum previamente.
Caelum Sumário
Sumário
3 Introdução ao HTML 8
3.1 Exibindo informações na Web 8
3.2 Sintaxe do HTML 13
3.3 Tags HTML 14
3.4 Imagens 15
3.5 Primeira página 16
6 Espaçamentos e dimensões 31
6.1 Dimensões 31
6.2 Espaçamentos 32
7 Listas HTML 35
7.1 Listas de definição 35
7.2 Links no HTML 36
15 Progressive Enhancement 69
16.1 Condições, opções, limitações e restrições 69
16 Display Flex 72
17.1 Flex Container 72
17 Responsividade e Fallback 75
18 Display: grid 77
19.1 grid-template-columns 82
Caelum Sumário
19.2 grid-template-rows 82
Versão: 24.6.3
.
CAPÍTULO 1
Vivemos hoje numa era em que a Internet ocupa um espaço cada vez mais importante em nossas
vidas pessoais e profissionais. O surgimento constante de Aplicações Web, para as mais diversas
finalidades, é um sinal claro de que esse mercado está em franca expansão e traz muitas oportunidades.
Aplicações corporativas, comércio eletrônico, redes sociais, filmes, músicas, notícias e tantas outras
áreas estão presentes na Internet, fazendo do navegador (o browser) o software mais utilizado de nossos
computadores.
Esse curso pretende abordar o processo de desenvolvimento de sites que acessamos por meio do
navegador de nossos computadores, utilizando padrões atuais de desenvolvimento e conhecendo a fundo
suas características técnicas. Discutiremos as implementações dessas tecnologias nos diferentes
navegadores, a adoção de frameworks que facilitam e aceleram nosso trabalho, além de dicas técnicas
que destacam um profissional no mercado. HTML e CSS serão vistos em profundidade além de eventos
no JavaScript.
Além do acesso por meio do navegador de nossos computadores, hoje o acesso à Internet a partir de
dispositivos móveis representa um grande avanço da plataforma, mas também implica em um pouco
mais de atenção no trabalho de quem vai desenvolver. No decorrer do curso, vamos conhecer algumas
dessas necessidades e como utilizar os recursos disponíveis para atender também a essa grande
necessidade.
Durante o curso, serão desenvolvidas páginas semelhantes com o site da MusicDot. Os exercícios
foram projetados para apresentar gradualmente ao aluno quais são as técnicas mais recomendadas e
utilizadas quando assumimos o papel de pessoa que desenvolve para front-end, quais são os desafios
mais comuns e quais são as técnicas e padrões recomendados para atingirmos nosso objetivo,
transformando imagens estáticas (os layouts) em código que os navegadores entendem e exibem como
páginas da Web.
Os conteúdos e o design do site já foram pré-definidos. Vamos, aqui, focar na implementação, papel
de pessoas que desenvolvem.
Se você está acompanhando essa apostila em casa, pense também em fazer o curso presencial na
Caelum. Você terá contato direto com nossa equipe para esclarecer suas dúvidas, aprender mais tópicos
além da apostila, e trocar experiências.
https://www.guj.com.br
A Alura também é um ótimo lugar para aprender e tirar suas dúvidas. Ela é uma plataforma de
cursos online do grupo Caelum que conta com mais de 1000 cursos voltados tanto para tecnologia
quanto para outras áreas. Possui uma comunidade ativa nos fórums e nossa equipe está sempre disposta
a ajudar.
https://alura.com.br
1.5 BIBLIOGRAFIA
Além do conhecimento disponível na Internet pela comunidade, existem muitos livros interessantes
sobre o assunto. Algumas referências:
HTML5 e CSS3: Domine a web do futuro - Lucas Mazza, editora Casa do Código;
A Web Mobile: Design Responsivo e além para uma Web adaptada ao mundo mobile - Sérgio
Lopes, editora Casa do Código;
A Arte E A Ciência Do CSS - Adams & Cols;
Pro JavaScript Techniques - John Resig;
The Smashing Book - smashingmagazine.com
https://www.caelum.com.br/formacao-frontend
Se o seu desejo é entrar mais a fundo no desenvolvimento Web, incluindo a parte server-side,
oferecemos o curso Desenvolvimento Web com PHP e MySQL, a Formação Java e a Formação
.NET que abordam três caminhos possíveis para esse mundo.
https://www.caelum.com.br/
CAPÍTULO 2
Como todo tipo de projeto de software, existem algumas recomendações quanto à organização dos
arquivos de um site. Não há nenhum rigor técnico quanto a essa organização e, na maioria das vezes,
você vai adaptar as recomendações da maneira que for melhor para o seu projeto.
Como um site é um conjunto de páginas Web sobre um assunto, empresa, produto ou qualquer outra
coisa, é comum todos os arquivos de um site estarem dentro de uma só pasta e, assim como um livro, é
recomendado que exista uma "capa", uma página inicial que possa indicar para o visitante quais são as
outras páginas que fazem parte desse projeto e como ele pode acessá-las, como se fosse o índice do site.
Ter esse índice, não por coincidência, é uma convenção adotada pelos servidores de páginas Web. Se
desejamos que uma determinada pasta seja servida como um site e dentro dessa pasta existe um arquivo
chamado index.html, esse arquivo será a página inicial, ou seja o índice, a menos que alguma
configuração determine outra página para esse fim.
Dentro da pasta do site, no mesmo nível que o index.html , é recomendado que sejam criadas mais
algumas pastas para manter separados os arquivos de imagens, as folhas de estilo e os scripts. Para
iniciar um projeto, teríamos uma estrutura de pastas como a demonstrada na imagem a seguir:
Muitas vezes, um site é servido por meio de uma aplicação Web e, nesses casos, a estrutura dos
arquivos depende de como a aplicação necessita dos recursos para funcionar corretamente. Porém, no
geral, as aplicações também seguem um padrão bem parecido com o que estamos adotando para o nosso
projeto.
Web site
Podemos considerar um Web site uma coleção de páginas HTML estáticas, ou seja, que não
interagem com um banco de dados através de uma linguagem de servidor Web. Ou seja, aqui todo o
conteúdo do site está escrito diretamente no documento HTML, assim como as imagens e outras mídias.
Claro que, para qualquer página Web ser fornecida publicamente a mesma deve estar hospedada em um
simples servidor Web (hospedagem de sites).
Aplicação Web
Uma aplicação Web pode conter uma coleção de páginas, porém o conteúdo destas páginas é
montado dinamicamente, ou seja, é carregado através de solicitações (requisições) à um banco de dados,
que conterá armazenado os textos e indicação dos caminhos das imagens ou mídias que a página precisa
exibir. Porém um HTML não tem acesso direto à um banco de dados, e esta comunicação deve ser feita
por uma linguagem de programação de servidor Web. Esta aplicação escrita com uma linguagem de
servidor que tem o poder de acessar o banco de dados e montar a página HTML conforme o solicitado
pelo navegador. Estas solicitações podem ser feitas de várias maneiras, inclusive utilizando JavaScript.
Portanto uma aplicação Web é mais complexa porque precisa de uma linguagem de servidor para poder
intermediar as solicitações do navegador, um banco de dados, e muitas vezes (porém não
obrigatoriamente) exibir páginas HTML com estes conteúdos.
Exemplo de linguagens de servidor Web: Java EE, PHP, Python, Ruby on Rails, NodeJS etc...
Os editores de texto são programas de computador leves e ideais para escrever e editar as páginas de
um site, como Visual Studio Code (https://code.visualstudio.com/), Sublime
(https://www.sublimetext.com/), Atom (https://atom.io/) e Notepad++ (https://notepad-plus-plus.org),
que possuem realce de sintaxe e outras ferramentas para facilitar o desenvolvimento de páginas.
Há também IDEs (Integrated Development Environment) que são editores mais robustos e trazem
mais facilidades para o desenvolvimento de aplicações Web, se integrando com outras funcionalidades.
São alguns deles: WebStorm (https://www.jetbrains.com/webstorm/) Eclipse (https://www.eclipse.org/) e
Visual Studio (https://visualstudio.microsoft.com).
CAPÍTULO 3
INTRODUÇÃO AO HTML
"Quanto mais nos elevamos, menores parecemos aos olhos daqueles que não sabem voar." -- Friedrich
Wilhelm Nietzsche
Para conhecer o comportamento dos navegadores quanto ao conteúdo descrito antes, vamos
reproduzir esse conteúdo em um arquivo de texto comum, que pode ser criado com qualquer editor de
texto puro. Salve o arquivo como index.html e abra-o a partir do navegador à sua escolha.
8 3 INTRODUÇÃO AO HTML
.
Parece que obtemos um resultado um pouco diferente do esperado, não? Apesar de ser capaz de
exibir texto puro em sua área principal, algumas regras devem ser seguidas caso desejemos que esse
texto seja exibido com alguma formatação, para facilitar a leitura pelo usuário final.
Uma nota de atenção é que a imagem acima foi tirada dos navegadores: Microsoft Edge e
Microsoft Internet Explorer 11. Veja o que acontece quando obtemos a mesma imagem porém com
navegadores mais atuais:
A imagem acima foi tirada nos navegadores: Brave, Mozilla Firefox e Google Chrome.
Obs: existe a possibilidade de que mesmo nesses navegadores, se utilizada uma versão mais antiga,
pode ser que o texto seja mostrado igual na foto dos navegadores da Microsoft.
Usando os resultados acima podemos concluir que os navegadores mais antigos e até mesmo o
Microsoft Edge por padrão:
Para que possamos exibir as informações desejadas com a formatação, é necessário que cada trecho
de texto tenha uma marcação indicando qual é o significado dele. Essa marcação também influencia a
maneira com que cada trecho do texto será exibido. A seguir é listado o texto com esta marcação
esperada pelo navegador:
<!DOCTYPE html>
<html>
<head>
<title>MusicDot</title>
<meta charset="utf-8">
</head>
<body>
<h1>MusicDot</h1>
<h2>Bem-vindo à MusicDot, seu portal de cursos de música online.</h2>
<ul>
<li>Confira nossas promoções.</li>
<li>Receba informações sobre nossos lançamentos por email.</li>
<li>Navegue por todos nossos cursos disponíveis.</li>
<li>Aprenda sem sair de casa.</li>
</ul>
</body>
</html>
O texto com as devidas marcações, comumente chamado de "código". Reproduza então o código
anterior em um novo arquivo de texto puro e salve-o como index-2.html. Não se preocupe com a
sintaxe, vamos conhecer detalhadamente cada característica destas marcações nos próximos capítulos.
Abra o arquivo no navegador.
Agora, uma página muito mais agradável e legível é exibida. Para isso, tivemos que adicionar as
marcações que são pertencentes ao HTML. Essas marcações são chamadas de tags, e elas basicamente
dão uma representação ao texto contido entre sua abertura e fechamento.
Começaremos por partes, primeiro entenderemos como o HTML funciona, para depois aprendermos
estilos, elementos gráficos e interações.
No código de antes, vimos por exemplo o uso da tag <h1> . Ela representa o título principal da
página.
<h1>MusicDot</h1>
Note a sintaxe. Uma tag é definida com caracteres < e > , e seu nome (h1 no caso). Muitas tags
possuem conteúdo, como o texto do título ("MusicDot"). Nesse caso, para determinar onde o conteúdo
acaba, usamos uma tag de fechamento com a barra antes do nome: </h1> .
Algumas tags podem receber algum tipo de informação extra dentro de sua definição chamada de
atributo. São parâmetros usando a sintaxe de atributo="valor" . Para definir uma imagem, por
exemplo, usamos a tag <img> e, para indicar o caminho que está essa imagem, usamos o atributo
src :
<img src="../imagens/casa_de_praia.jpg">
Repare que a tag img não possui conteúdo por si só, e sim ela carrega ali o conteúdo de um arquivo
externo (a imagem). Nesses casos, não é necessário usar uma tag de fechamento como antes no h1 .
Nesse momento, vamos focar em tags que representam títulos, parágrafo e ênfase.
Títulos
Quando queremos indicar que um texto é um título em nossa página, utilizamos as tags de heading
em sua marcação:
<h1>MusicDot</h1>
<h2>Bem-vindo à MusicDot, seu portal de cursos de música online.</h2>
As tags de heading são para exibir conteúdo de texto e contém 6 níveis, ou seja de <h1> à <h6> ,
seguindo uma ordem de importância, sendo <h1> o título principal, o mais importante, e <h6> o título
de menor importância.
Utilizamos, por exemplo, a tag <h1> para o nome, título principal da página, e a tag <h2> como
subtítulo ou como título de seções dentro do documento.
Obs: a tag <h1> só pode ser utilizada uma vez em cada página porque não pode existir mais de um
conteúdo mais importante da página.
A ordem de importância tem impacto nas ferramentas que processam HTML. As ferramentas de
indexação de conteúdo para buscas, como o Google, Bing ou Yahoo! levam em consideração essa ordem
e relevância. Os navegadores especiais para acessibilidade também interpretam o conteúdo dessas tags
de maneira a diferenciar seu conteúdo e facilitar a navegação do usuário pelo documento.
Parágrafos
Quando exibimos qualquer texto em nossa página, é recomendado que ele seja sempre conteúdo de
alguma tag filha da tag <body> . A marcação mais indicada para textos comuns é a tag de parágrafo:
<p>
A MusicDot é a maior escola online de música em todo o mundo.
</p>
Se você tiver vários parágrafos de texto, use várias dessas tags <p> para separá-los:
<p>
A MusicDot é a maior escola online de música em todo o mundo.
</p>
<p>
Nossa matriz fica em Mafra, em Santa Catarina. De lá, saem grande parte das gravações de nossos cu
rsos.
</p>
Marcações de ênfase
Quando queremos dar uma ênfase diferente a um trecho de texto, podemos utilizar as marcações de
ênfase. Podemos deixar um texto "mais forte" com a tag <strong> ou deixar o texto com uma "ênfase
acentuada" com a tag <em> . Do mesmo jeito que a tag <strong> deixa a tag "mais forte", temos
também a tag <small> , que diminui o "peso" do texto.
Por padrão, os navegadores exibem o texto dentro da tag <strong> em negrito e o texto dentro da
tag <em> em itálico. Existem ainda as tags <b> e <i> , que atingem o mesmo resultado visualmente,
mas as tags <strong> e <em> são mais indicadas por definirem nossa intenção de significado ao
conteúdo, mais do que uma simples indicação visual. Vamos discutir melhor a questão do significado
das tags mais adiante.
<p>Aprenda de um jeito rápido e barato na <strong>MusicDot</strong>.</p>
3.4 IMAGENS
A tag <img> indica para o navegador que uma imagem deve ser "renderizada"
(mostrada/desenhada) naquele lugar e necessita dois atributos preenchidos: src e alt . O primeiro é
um atributo obrigatório para exibir a imagem e aponta para a sua localização (pode ser um local do seu
computador ou um endereço na Web), já o segundo é um texto alternativo que aparece caso a imagem
não possa ser carregada ou visualizada.
O atributo alt não é obrigatório, porém é considerado um erro caso seja omitido, pois ele provê o
entendimento da imagem para pessoas com deficiência que necessitam o uso de leitores de tela para
acessar o computador, e também auxilia na indexação da imagem para motores de busca, como o
Google etc.
O HTML 5 introduziu duas novas tags específicas para imagem: <figure> e <figcaption> . A
tag <figure> define uma imagem em conjunto com a tag <img> . Além disso, permite adicionar uma
legenda para a imagem por meio da tag <figcaption> .
<figure>
<img src="img/matriz-musicdot.png" alt="Foto da matriz da musicdot">
3.4 IMAGENS 15
.
<figcaption>Matriz da MusicDot</figcaption>
</figure>
Recebemos o design já pronto, assim como os textos. Nosso trabalho, como pessoas
desenvolvedoras de front-end, é codificar o HTML e CSS necessários para esse resultado.
Uma prática sempre recomendada, ligada à limpeza e utilizada para facilitar a leitura do código,
é o uso correto de recuos, ou indentação, no HTML. Costumamos alinhar elementos "irmãos" na
mesma margem e adicionar alguns espaços ou um tab para elementos "filhos".
Quando iniciamos nosso projeto, utilizamos poucas tags HTML. Mais tarde adicionaremos uma
quantidade razoável de elementos, o que pode gerar uma certa confusão. Para manter o código mais
legível, é recomendada a adição de comentários antes da abertura e após do fechamento de tags
estruturais (que conterão outras tags). Dessa maneira, nós podemos identificar claramente quando
um elemento está dentro dessa estrutura ou depois dela.
CAPÍTULO 4
Um documento HTML válido precisa seguir obrigatoriamente a estrutura composta pelas tags <html> ,
<head> e <body> e a instrução <!DOCTYPE> . Esta estrutura está informada em uma documentação
que descreve todos os detalhes do HTML, no caso as tags e atributos, e como os navegadores devem
considerar e interpretar estas tags, esta documentação é chamada de "especificação do HTML", e através
do que está declarado nela que é possível entender se um documento HTML válido. Um documento
HTML inválido é carregado pelo navegador, porém em um "modo de compatibilidade", vamos entender
melhor sobre isto logo mais.
Abaixo, vamos conhecer em detalhes cada uma das tags estruturais obrigatórias:
são "irmãs", pois estão no mesmo nível hierárquico em relação à sua tag "mãe", que é <html> .
<html> <!-- mãe -->
<head></head> <!-- filha -->
<body></body> <!-- filha -->
</html>
Editoras tradicionais pouco ligam para ebooks e novas tecnologias. Não dominam
tecnicamente o assunto para revisar os livros a fundo. Não têm anos de
experiência em didáticas com cursos.
Conheça a Casa do Código, uma editora diferente, com curadoria da Caelum e
obsessão por livros de qualidade a preços justos.
Podemos configurar qual codificação queremos utilizar em nosso documento por meio da
configuração de charset na tag <meta> . Um dos valores mais comuns usados hoje em dia é o UTF-
8, também chamado de Unicode. Há outras possibilidades, como o latin1, muito usado antigamente.
O UTF-8 é a recomendação atual para encoding na Web por ser amplamente suportada em
navegadores e editores de código, além de ser compatível com praticamente todos os idiomas do mundo.
É o que usaremos no curso.
<html>
<head>
<meta charset="utf-8">
<title>MusicDot</title>
</head>
<body>
</body>
</html>
4.2 A TAG 19
.
Nesse exemplo, usamos a tag <h1> , que indica o título principal da página.
A imagem da esquerda é a página sem Doctype e a imagem da direita é a página com Doctype .
Dá para ver que existe uma leve diferença entre as duas páginas, principalmente com relação aos
espaçamentos.
Utilizaremos <!DOCTYPE html> , que indica para o navegador a utilização da versão mais recente
do HTML - a versão 5, atualmente*.
Há muitas possibilidades mais complicadas nessa parte de DOCTYPE que eram usados em versões
anteriores do HTML e do XHTML. Hoje em dia, nada disso é mais importante. O recomendado é
sempre usar a última versão do HTML, usando a declaração de DOCTYPE simples:
<!DOCTYPE html>
A declaração do DOCTYPE, pode ser escrita toda em maiúsculo ou toda em minúsculo ou com a
primeira letra maiúscula: <!DOCTYPE HTML> , <!DOCTYPE html> , <!Doctype HTML> , <!Doctype
html> , <!doctype html> , <!doctype HTML> . O resultado será o mesmo para todos os casos.
*Obs: desde maio de 2019 o desenvolvimento do HTML é mantido pelo W3C (World Wide Web
Consortium) https://www.w3.org/, WHATWG e comunidade de desenvolvedores, e sua especificação é
aberta no Github https://github.com/whatwg/html, e desde este movimento o HTML é considerado um
"padrão vivo" (living standard) onde sua versão a partir da 5 é atualizada continuamente.
CAPÍTULO 5
Quando escrevemos o HTML, marcamos o conteúdo da página com tags que melhor representam o
significado daquele conteúdo. Quando abrimos a página no navegador é possível perceber que ele
mostra as informações com estilos diferentes.
Um h1, por exemplo, por padrão é apresentado em negrito numa fonte maior. Parágrafos de texto
são espaçados entre si, e assim por diante. Isso quer dizer que o navegador tem um estilo padrão para as
tags que usamos. Porém para fazer sites bonitos, ou com o visual próximo de uma dada identidade
visual (design), vamos precisar personalizar a apresentação padrão dos elementos da página.
Antigamente, isso era feito no próprio HTML. Caso houvesse a necessidade de um título ser
vermelho, era só fazer:
<h1><font color="red">MusicDot anos 90</font></h1>
Além da tag <font> , várias outras tags de estilo existiam. Mas isso é passado. Hoje em dia tags
HTML para estilo são má prática e jamais devem ser usadas, são interpretadas apenas para o modo de
compatibilidade.
Em seu lugar, surgiu o CSS (Cascading Style Sheet ou folha de estilos em cascata), que é uma outra
linguagem, separada do HTML, com objetivo único de cuidar da estilização da página. A vantagem é
que o CSS é bem mais robusto que o HTML para estilização, como veremos. Mas, principalmente,
escrever formatação visual misturado com conteúdo de texto no HTML se mostrou algo impraticável. O
CSS resolve isso separando as coisas; regras de estilo não aparecem mais no HTML, apenas no CSS.
O elemento que receber essas propriedades será exibido com o texto na cor azul e com o fundo
amarelo. Essas propriedades podem ser declaradas de três maneiras diferentes.
Atributo style
A primeira delas é com o atributo style no próprio elemento:
Mas tínhamos acabado de discutir que uma das grandes vantagens do CSS era manter as regras de
estilo fora do HTML. Usando esse atributo style não parece que fizemos isso. Justamente por isso
não se recomenda esse tipo de uso na prática, mas sim os que veremos a seguir.
A tag style
A outra maneira de se utilizar o CSS é declarando suas propriedades dentro de uma tag <style> .
No exemplo a seguir, usaremos o seletor que pega todas as tags p e altera sua cor e background:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Sobre a MusicDot</title>
<style>
p {
color: blue;
background-color: yellow;
}
</style>
</head>
<body>
<p>
O conteúdo desta tag será exibido em azul com fundo amarelo!
</p>
<p>
<strong>Também</strong> será exibido em azul com fundo amarelo!
</p>
</body>
</html>
O código dentro da tag <style> indica que estamos alterando a cor e o fundo de todos os
elementos com tag p . Dizemos que selecionamos esses elementos pelo nome de sua tag, e aplicamos
certas propriedades CSS apenas neles.
Algumas propriedades contém "subpropriedades" que modificam uma parte específica daquela
propriedade que vamos trabalhar, sendo sua sintaxe:
seletor {
propriedade-subpropriedade: valor;
}
No exemplo abaixo, em ambos os casos, trabalhamos com a propriedade text , que estiliza a
aparência do texto do seletor informado. Podemos especificar quais propriedades específicas do texto
queremos modificar, no caso text-align o alinhamento do texto, e com text-decoration
colocamos o efeito de sublinhado.
p {
text-align: center;
text-decoration: underline;
}
Arquivo externo
A terceira maneira de declararmos os estilos do nosso documento é com um arquivo externo com a
extensão .css . Para que seja possível declarar nosso CSS em um arquivo à parte, precisamos indicar
em nosso documento HTML uma ligação entre ele e a folha de estilo (arquivo com a extensão .css ).
Além da melhor organização do projeto, a folha de estilo externa traz ainda as vantagens de manter
nosso HTML mais limpo e do reaproveitamento de uma mesma folha de estilos para diversos
documentos.
A indicação de uso de uma folha de estilos externa deve ser feita dentro da tag <head> de um
documento HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>MusicDot | Sobre a empresa</title>
<!-- Inclusão do arquivo CSS -->
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<p>
O conteúdo desta tag será exibido em azul com fundo amarelo!
</p>
<p>
<strong>Também</strong> será exibido em azul com fundo amarelo!
</p>
</body>
</html>
color: blue;
background-color: yellow;
}
A propriedade font-family pode receber seu valor com ou sem aspas dependendo da sua
composição, por exemplo, quando uma fonte tem o nome separado por espaço.
Por padrão, os navegadores mais conhecidos exibem texto em um tipo que conhecemos como
"serif". As fontes mais conhecidas (e comumente utilizadas como padrão) são "Times" e "Times New
Roman", dependendo do sistema operacional. Elas são chamadas de fontes serifadas pelos pequenos
ornamentos em suas terminações.
Podemos alterar a família de fontes que queremos utilizar em nosso documento para a família "sans-
serif" (sem serifas), que contém, por exemplo, as fontes "Arial" e "Helvetica". Podemos também
declarar que queremos utilizar uma família de fontes "monospace" como, por exemplo, a fonte
"Courier".
Obs: Fontes monospace podem ser tanto com serifa ou sem serifa. Monospace quer dizer apenas
que todas as letras possuem o mesmo tamanho
h1 {
font-family: serif;
}
h2 {
font-family: sans-serif;
}
p {
font-family: monospace;
}
É possível, e muito comum, declararmos o nome de algumas fontes que gostaríamos de verificar se
existem no computador, permitindo que tenhamos um controle melhor da forma como nosso texto será
exibido.
Em nosso projeto, as fontes não têm ornamentos, vamos declarar essa propriedade para todo o
documento por meio do seu elemento body :
body {
font-family: "Helvetica", "Lucida Grande", sans-serif;
}
Nesse caso, o navegador verificará se a fonte "Helvetica" está disponível e a utilizará para exibir os
textos de todos os elementos do nosso documento que, por cascata, herdarão essa propriedade do
elemento body .
Caso a fonte "Helvetica" não esteja disponível, o navegador verificará a disponibilidade da próxima
fonte declarada, no nosso exemplo a "Lucida Grande". Caso o navegador não encontre também essa
fonte, ele solicita qualquer fonte que pertença à família "sans-serif", declarada logo a seguir, e a utiliza
para exibir o texto, não importa qual seja ela.
Temos outras propriedades para manipular a fonte, como a propriedade font-style , que define o
estilo da fonte que pode ser: normal (normal na vertical), italic (inclinada) e oblique (oblíqua).
p {
text-align: right;
}
O exemplo determina que todos os parágrafos da nossa página tenham o texto alinhado para a
direita. Também é possível determinar que um elemento tenha seu conteúdo alinhado ao centro ao
definirmos o valor center para a propriedade text-align , ou então definir que o texto deve ocupar
toda a largura do elemento aumentando o espaçamento entre as palavras com o valor justify . Por
padrão o texto é alinhado à esquerda, com o valor left , porém é importante lembrar que essa
Com essa declaração, o navegador vai requisitar um arquivo sobre-background.jpg , que deve
estar na mesma pasta do arquivo CSS onde consta essa declaração. Mas podemos também passar um
endereço da web para pegar imagens remotamente:
body {
background-image: url(https://i.imgur.com/uAhjMNd.jpg);
}
5.5 BORDAS
As propriedades do CSS para definirmos as bordas de um elemento nos apresentam uma série de
opções. Podemos, para cada borda de um elemento, determinar sua cor, seu estilo de exibição e sua
largura. Por exemplo:
body {
border-color: red;
border-style: solid;
border-width: 1px;
}
A propriedade border tem uma forma resumida para escrever os mesmos estilos que adicionamos
acima, mas de uma maneira mais simples:
body {
border: 1px solid red;
}
Para que o efeito da cor sobre a borda surta efeito, é necessário que a propriedade border-style
tenha qualquer valor diferente do padrão none .
Podemos também falar em qual dos lados do nosso elemento queremos a borda usando a
subpropriedade que indica lado:
h1 {
border-top: 1px solid red; /* borda vermelha em cima */
border-right: 1px solid red; /* borda vermelha à direita */
border-bottom: 1px solid red; /* borda vermelha embaixo */
border-left: 1px solid red; /* borda vermelha à esquerda */
}
h2 {
background-color: yellow;
}
O difícil é acertar a exata variação de cor que queremos no design e também cada navegador tem o
seu padrão de cor para os nomes de cores. A W3C obriga que todos os navegadores tenham pelo menos
140 nomes de cores padronizados, mas existem mais de 16 milhões de cores na web e seria
extremamente complicado nomear cada uma delas. Por isso, é bem incomum usarmos cores com seus
nomes. O mais comum é definir a cor com base em sua composição RGB.
RGB é o sistema de cor usado nos monitores, já que cada pixel nos monitores possuem 3 leds (um
vermelho, um verde e um azul) e a combinação dessas 3 cores formam todas as outras 16 milhões de
cores que vemos nos monitores. Podemos escolher a intensidade de cada um desses três leds básicos,
numa escala de 0 a 255.
Um amarelo forte, por exemplo, tem 255 de Red, 255 de Green e 0 de Blue (255, 255, 0). Se quiser
um laranja, basta diminuir um pouco o verde (255, 200, 0). E assim por diante.
No CSS, podemos escrever as cores tendo como base sua composição RGB. Aliás, no CSS3 - que
veremos melhor depois - há até uma sintaxe bem simples pra isso:
h3 {
color: rgb(255, 200, 0);
}
Essa sintaxe funciona nos browsers mais modernos e até alguns browsers super antigos mas não é a
mais comum na prática, por questões de compatibilidade. O mais comum é a notação hexadecimal.
Essa sintaxe tem suporte universal nos navegadores e é mais curta de escrever, apesar de ser mais
enigmática.
h3 {
background-color: #f2eded;
}
No fundo, porém, as duas formas são baseadas no sistema RGB. Na notação hexadecimal (que
começa com #), temos 6 caracteres, os primeiros 2 indicam o canal Red, os dois seguintes, o Green, e os
dois últimos, Blue; ou seja, RGB. E usamos a matemática pra escrever menos, trocando a base numérica
de decimal para hexadecimal.
Na base hexadecimal, os algarismos vão de zero a quinze (ao invés do zero a nove da base decimal
comum). Para representar os algarismos de dez a quinze, usamos letras de A a F. Nessa sintaxe, portanto,
podemos utilizar números de 0-9 e letras de A-F.
Há uma conta por trás dessas conversões, mas seu editor de imagens deve ser capaz de fornecer
ambos os valores para você sem problemas. Um valor 255 vira FF na notação hexadecimal. A cor
#f2eded, por exemplo, é equivalente a rgb(242, 237, 237), um cinza claro.
Vale aqui uma dica quanto ao uso de cores hexadecimais, toda vez que os caracteres presentes na
composição da base se repetirem, estes podem ser simplificados. Então um número em hexadecimal
3366ff, pode ser simplificado para 36f.
Obs: os 3 pares de números devem ser iguais entre si, ou seja, se tivermos um hexadecimal #33aabc
não podemos simplificar nada do código.
CAPÍTULO 6
ESPAÇAMENTOS E DIMENSÕES
Temos algumas maneiras de trabalhar com dimensões e espaçamentos. Para espaçamento interno e
externo usamos respectivamente padding e margin , e para redimensionar elementos podemos usar as
propriedades de largura e altura ou width e height . Vamos ver mais a fundo essas propriedades.
6.1 DIMENSÕES
É possível determinar as dimensões de um elemento, por exemplo:
p {
background-color: red;
height: 300px;
width: 300px;
}
Todos os parágrafos do nosso HTML ocuparão 300 pixels de altura e de largura, com cor de fundo
vermelha.
Se usarmos o inspetor de elementos do navegador veremos que o restante do espaço ocupado pelo
elemento vira margin
6 ESPAÇAMENTOS E DIMENSÕES 31
.
6.2 ESPAÇAMENTOS
Padding
A propriedade padding é utilizada para definir um espaçamento interno em elementos (por
espaçamento interno queremos dizer a distância entre o limite do elemento, sua borda, e seu respectivo
conteúdo) e tem as subpropriedades listadas a seguir:
padding-top
padding-right
padding-bottom
padding-left
Essas propriedades aplicam uma distância entre o limite do elemento e seu conteúdo acima, à direita,
abaixo e à esquerda respectivamente. Essa ordem é importante para entendermos como funciona a
shorthand property (encurtamento) do padding.
Podemos definir todos os valores para as subpropriedades do padding em uma única propriedade,
chamada exatamente de padding , e seu comportamento é descrito nos exemplos a seguir:
Se passado somente um valor para a propriedade padding , esse mesmo valor é aplicado em todas
as direções.
p {
padding: 10px;
}
Se passados dois valores, o primeiro será aplicado acima e abaixo (equivalente a passar o mesmo
valor para padding-top e padding-bottom ) e o segundo será aplicado à direita e à esquerda
(equivalente ao mesmo valor para padding-right e padding-left ).
p {
padding: 10px 15px;
}
Se passados três valores, o primeiro será aplicado acima (equivalente a padding-top ), o segundo
será aplicado à direita e à esquerda (equivalente a passar o mesmo valor para padding-right e
padding-left ) e o terceiro valor será aplicado abaixo do elemento (equivalente a padding-bottom ).
p {
padding: 10px 20px 15px;
}
32 6.2 ESPAÇAMENTOS
.
Quando precisar omitir valores, sempre omita no sentido anti-horário começando a partir da
subpropriedade -left .
Se tivermos um padding:
h1 {
padding: 10px 25px 10px 15px;
}
O código não pode sofrer o encurtamento porque por mais que os valores de top e bottom
sejam iguais, os valores right e left não são e eles são os primeiros a serem omitidos. Veja o
que acontece quando vamos omitir o valor de 10px do bottom:
h1 {
padding: 10px 25px 15px;
}
E esses valores não são os que nós colocamos no começo com padding: 10px 25px 10px
15px;
Margin
A propriedade margin é bem parecida com a propriedade padding , exceto que ela adiciona
espaço após o limite do elemento, ou seja, é um espaçamento além do elemento em si (espaçamento
externo). Além das subpropriedades listadas a seguir, há a shorthand property margin que se comporta
da mesma maneira que a shorthand property do padding vista no tópico anterior.
6.2 ESPAÇAMENTOS 33
.
margin-top
margin-right
margin-bottom
margin-left
Há ainda uma maneira de permitir que o navegador defina qual será a dimensão da propriedade
padding ou margin conforme o espaço disponível na tela: definimos o valor auto para os
No exemplo a seguir, definimos que um elemento não tem nenhuma margem acima ou abaixo de seu
conteúdo e que o navegador define uma margem igual para ambos os lados de acordo com o espaço
disponível:
p {
margin: 0 auto;
}
34 6.2 ESPAÇAMENTOS
.
CAPÍTULO 7
LISTAS HTML
Não são raros os casos em que queremos exibir uma listagem em nossas páginas. O HTML tem algumas
tags definidas para que possamos fazer isso de maneira correta. A lista mais comum é a lista não-
ordenada definida pela tag <ul> (unordered list).
<ul>
<li>Primeiro item da lista</li>
<li>
Segundo item da lista:
<ul>
<li>Primeiro item da lista aninhada</li>
<li>Segundo item da lista aninhada</li>
</ul>
</li>
<li>Terceiro item da lista</li>
</ul>
Note que, para cada item da lista não-ordenada, utilizamos uma marcação de item de lista <li>
(list item). No exemplo acima, utilizamos uma estrutura composta na qual o segundo item da lista
contém uma nova lista. A mesma tag de item de lista <li> é utilizada quando demarcamos uma lista
ordenada.
<ol>
<li>Primeiro item da lista</li>
<li>Segundo item da lista</li>
<li>Terceiro item da lista</li>
<li>Quarto item da lista</li>
<li>Quinto item da lista</li>
</ol>
As listas ordenadas ( <ol> - ordered list) também podem ter sua estrutura composta por outras listas
ordenadas como no exemplo que temos para as listas não-ordenadas. Também é possível ter listas
ordenadas aninhadas em um item de uma lista não-ordenada e vice-versa.
7 LISTAS HTML 35
.
Para estilizar o formato padrão das listas ordenadas e não-ordenadas, podemos utilizar a propriedade
list-style-type no CSS:
ul {
/* alterar para circulo antes de cada <li> da lista não-ordenada */
list-style-type: circle;
}
ol {
/* alterar para uma sequência alfabética antes de cada <li> da lista ordenada */
list-style-type: upper-alpha;
}
Note que a âncora está demarcando apenas a palavra Caelum de todo o conteúdo do parágrafo
exemplificado. Isso significa que, ao clicarmos com o cursor do mouse na palavra Caelum, o navegador
redirecionará o usuário para o site da Caelum, indicado no atributo href .
Podemos adicionar o atributo target="" para especificar onde que essa página irá carregar. Por
padrão a página irá abrir na mesma aba da página que tem o link, mas se quisermos que a página
abra em outra aba podemos colocar o valor _blank dentro desse atributo:
<a href="https://www.caelum.com.br" target="_blank">
Outro uso para a tag de âncora é a demarcação de destinos para links dentro do próprio documento,
o que chamamos de bookmark.
<p>Mais informações <a href="#info">aqui</a>.</p>
<p>Conteúdo da página...</p>
De acordo com o exemplo acima, ao clicarmos sobre a palavra aqui, demarcada com um link, o
usuário será levado à porção da página onde o bookmark info é visível. Bookmark é o elemento que tem
o atributo id .
É possível, com o uso de um link, levar o usuário a um bookmark presente em outra página.
<a href="http://www.caelum.com.br/curso/wd43/#contato">
Entre em contato sobre o curso
</a>
O exemplo acima fará com que o usuário que clicar no link seja levado à porção da página indicada
no endereço, especificamente no ponto onde o bookmark contato seja visível.
O outro uso para a tag de âncora é a demarcação de destinos para links dentro do próprio site, mas
não na mesma página que estamos. Por exemplo, estamos na página sobre.html e queremos um link
para a página index.html.
<p>Acesse <a href="index.html">nossa loja</a>.</p>
CAPÍTULO 8
Durante o curso veremos outros tipos de seletores. Por hora veremos um seletor que deixa nossa
estilização um pouco mais precisa do que fazemos agora.
HTML:
<img src="img/logo-musicdot" atl="Logo da MusicDot">
<figure>
<img src="img/matriz-musicdot" alt="Foto da matriz da MusicDot">
<figcaption>Matriz da MusicDot</figcaption>
</figure>
<figure>
<img src="img/familia-tupfeln" alt="Foto da família Tupfeln">
<figcaption>Família Tüpfeln</figcaption>
</figure>
CSS:
img {
width: 300px;
}
No código acima estamos aplicando uma largura de 300px para todas as tags <img> . Mas e se nós
só quisermos aplicar essa largura apenas para as imagens que estão nas figuras? É aí que entra o seletor
mais específico:
figure img {
width: 300px;
}
Agora estamos aplicando a largura de 300px apenas às imagens que são filhas de uma tag
<figure> .
Outra forma de selecionar elementos mais específicos é usando o atributo id="" nos elementos que
queremos estilizar e depois fazer a chamada de seletor de id :
HTML:
<figure>
<img src="img/matriz-musicdot" alt="Foto da matriz da MusicDot" id="matriz-musicdot">
<figcaption>Matriz da MusicDot</figcaption>
</figure>
<figure>
<img src="img/familia-tupfeln" alt="Foto da família Tupfeln" id="familia-tupfeln">
<figcaption>Família Tüpfeln</figcaption>
</figure>
CSS:
#matriz-musicdot {
width: 300px;
}
#familia-tupfeln {
width: 300px;
}
Só que não é recomendado o uso de id para a estilização de elementos já que a idéia do atributo é
para fazer uma referência única na página como fizemos na parte dos links. Quando queremos estilizar
elementos específicos é melhor utilizar o atributo class="" . O comportamento no CSS será idêntico
ao do atributo id="" , mas class foi feito para ser usado no CSS e no JavaScript.
HTML:
<img src="img/logo-musicdot" atl="Logo da MusicDot">
<figure>
<img src="img/matriz-musicdot" alt="Foto da matriz da MusicDot" class="matriz-musicdot">
<figcaption>Matriz da MusicDot</figcaption>
</figure>
<figure>
<img src="img/familia-tupfeln" alt="Foto da família Tupfeln" class="familia-tupfeln">
<figcaption>Família Tüpfeln</figcaption>
</figure>
CSS:
.matriz-musicdot {
width: 300px;
}
.familia-tupfeln {
width: 300px;
}
entender estas regras de especificidade de um selector, ao criarmos um seletor de tag a sua pontuação se
torna 1. Quando usamos um seletor de classe sua pontuação se torna 10. Quando usamos um seletor de
id sua pontuação se torna 100. Ao fim, o navegador soma a pontuação dos seletores aplicados à um
elemento, e as propriedades com o seletor de maior pontuação são as que valem.
<body>
<p class="paragrafo" id="paragrafo-rosa">Texto</p>
</body>
p { /* Pontuação 1 */
color: blue;
}
.paragrafo { /* Pontuação 10 */
color: red;
}
No exemplo acima o parágrafo vai ficar com a cor rosa porque o seletor que tem a cor rosa é o
seletor de maior pontuação.
Quando elementos possuem a mesma pontuação quem prevalece é a propriedade do último seletor:
p { /* Pontuação 1 */
color: blue;
}
p { /* Pontuação 1 */
color: red;
}
Podemos também somar os pontos para deixar nosso seletor mais forte:
body p { /* Seletor de tag + outro seletor de tag = 2 pontos */
color: brown;
}
p { /* Pontuação 1 */
color: blue;
}
No exemplo acima nós deixamos nosso seletor mais específico para os <p> que estão dentro de
uma tag <body> , portanto a cor do parágrafo será marrom.
Em resumo:
Quanto mais específico é o nosso seletor, maior sua pontuação no nível de especificidade do CSS.
Portanto devemos sempre trabalhar com uma baixa especificidade, para que não seja impossível
sobrescrever valores quando necessário em uma situação específica.
Herança
A cascata do CSS, significa justamente a possibilidade de elementos filhos herdarem características
de estilização de elementos superiores, estas definidas por suas propriedades, que podem ou não passar
aos seus descendentes seus valores.
Vamos mudar a família da fonte de toda a página. Uma maneira que podemos fazer é selecionar
todas as tags que contém text ( <p> , <a> e <figcaption> ) e colocar a família de fonte que
queremos:
p {
font-family: 'Helvetica', sans-serif;
}
a {
font-family: 'Helvetica', sans-serif;
}
figcaption {
font-family: 'Helvetica', sans-serif;
}
Mas isso dá muito trabalho e estamos repetindo código. Ao invés de colocar essa propriedade em
cada um dos elementos textuais da nossa página, podemos colocar no elemento superior a estas tags,
neste caso é o elemento <body> .
body {
font-family: 'Helvetica', sans-serif;
}
No exemplo acima todos os elementos filhos da tag <body> vão receber a propriedade font-
family: e isso é o que nós chamamos de herança. Herança acontece quando elementos herdam
Obs: Para saber se uma propriedade deixa herança ou não, é possível consultar na sua
especificação ou no site MDN https://developer.mozilla.org/.
div {
border: 2px solid;
border-color: red;
width: 30px;
height: 30px;
}
Queremos que a imagem preencha todo o espaço da <div> , mas as propriedades width e
height não são aplicadas em cascata, sendo assim, somos obrigados a definir o tamanho da imagem
manualmente:
img {
width: 30px;
height: 30px;
}
Esta não é uma solução sustentável, porque, caso alterarmos o tamanho da <div> , teremos que
lembrar de alterar também o tamanho da imagem. Uma forma de resolver este problema é utilizando o
valor inherit para as propriedades width e height da imagem:
img {
width: inherit;
height: inherit;
}
O valor inherit indica para o elemento filho que ele deve utilizar o mesmo valor presente no
elemento pai, sendo assim, toda vez que o tamanho do elemento pai for alterado, automaticamente o
elemento filho herdará o novo valor, facilitando assim, a manutenção do código.
Lembre-se de que o inherit também afeta propriedades que não são aplicadas em cascata.
Editoras tradicionais pouco ligam para ebooks e novas tecnologias. Não dominam
tecnicamente o assunto para revisar os livros a fundo. Não têm anos de
experiência em didáticas com cursos.
Conheça a Casa do Código, uma editora diferente, com curadoria da Caelum e
obsessão por livros de qualidade a preços justos.
CAPÍTULO 9
Muitas vezes quando estamos declarando os estilos de uma página HTML, achamos mais fácil usar o
seletor de nome da tag ao invés de usar classes. Porém isto pode causar problemas imprevistos se não
usado com cautela. Vamos analisar o seguinte código para entender a situação:
HTML:
<h1>MusicDot</h1>
<h2>História</h2>
<p>Texto</p>
<h2>Diferenciais</h2>
<ul>
<li>Diferencial 1</li>
<li>Diferencial 2</li>
<li>Diferencial 3</li>
</ul>
CSS:
h2 {
font-size: 24px;
font-weight: bold;
border-bottom: 1px solid #000000;
}
No exemplo acima adicionamos estilo nas tags <h2> para ter um tamanho de fonte maior, uma
fonte mais grossa e uma borda abaixo para fazer o efeito de linha divisória. Até aqui tudo certo. Mas
agora vamos colocar um outro título na página chamada "Sobre a MusicDot" e esse título tem relevância
maior do que os dois outros títulos que temos (História e Diferenciais), portanto vamos ter que
modificar suas tags para uma de menos importância:
<h1>MusicDot</h1>
<h2>Sobre a MusicDot</h2>
<p>Introdução</p>
<!-- Mudamos para h3 pois queremos que tenham menos relevância que o título "Sobre a MusicDot" -->
<h3>História</h3>
<p>Texto</p>
<!-- Mudamos para h3 pois queremos que tenham menos relevância que o título "Sobre a MusicDot" -->
<h3>Diferenciais</h3>
<ul>
<li>Diferencial 1</li>
<li>Diferencial 2</li>
<li>Diferencial 3</li>
</ul>
Agora com essa mudança da estrutura do HTML o nosso CSS está alterando um elemento que não é
o que nós inicialmente queríamos mudar. Vamos ter que fazer a mudança no CSS para usar as nossas
alterações no elemento certo.
Neste exemplo a solução é relativamente simples, porém imagine que temos seletores bem mais
complexos, com heranças etc... a mudança não seria tão simples. Por isso o ideal é declarar estilos com
classes ao invés de nomes de tags. Uma dica pra dar nome às classes é elas representarem o papel que
estas tags estão exercendo em conjunto com os estilos declarados, no nosso caso, estamos declarando
um conjunto de estilo para subtítulos.
Veja como fica o resultado do desacoplamento do conjunto de estilos do nome da tag, para ser agora
com classes:
HTML:
<h1>MusicDot</h1>
<h2>Sobre a MusicDot</h2>
<p>Introdução</p>
CSS:
.subtitulo {
font-size: 24px;
font-weight: bold;
border-bottom: 1px solid #000000;
}
Usando classes, podemos alterar toda a estrutura HTML sem nos preocupar se estas alterações
afetarão a estilização que fizemos no começo.
CAPÍTULO 10
ELEMENTOS ESTRUTURAIS E
SEMÂNTICA DOS ELEMENTOS
Vimos muitas tags para representar diversos elementos em nossa página HTML como, por exemplo,
<h1> para títulos, <p> para parágrafos, <figure> para figuras, etc. Nossa maior preocupação com
desenvolvimento de páginas deve ser conseguir representar tudo com tags que condizem com o seu
conteúdo. Veremos tags como, por exemplo, <section> , <article> , <address> , entre outras, com
a intenção de representar com maior precisão o conteúdo que queremos mostrar. Estas tags são
chamadas também de elementos semânticos, ou seja, que conseguem passar uma informação com um
significado específico para o conteúdo interpretado pelo navegador, não depende apenas do texto dentro
da tag para se entender o que há naquela parte do site.
Um dos grandes motivos para nos preocuparmos com a semântica que usamos no site vem das
ferramentas de indexação de buscadores, que colocam os sites mais semânticos e estruturados como
prioridade nas respostas das buscas. A outra grande preocupação é com as ferramentas de acessibilidade,
que permitem que pessoas com deficiência, por exemplo pessoas cegas, consigam usar um site através
de softwares leitores de tela de maneira padronizada e sem problemas.
Uma coisa que precisamos lembrar é que devemos escolher as tags pelo o que elas representam e
não como elas são mostradas na tela do navegador. Estilização deve ficar no CSS e estrutura no HTML.
As únicas tags que são de propósito genérico e que são usadas apenas para facilitar a estilização no
CSS são as tags <div> e <span> . Essas duas tags não representam nenhum conteúdo
necessariamente. <div> representa uma divisão de blocos e <span> uma marcação para texto (sem
quebrar a linha do texto).
CAPÍTULO 11
Vimos já o conceito de desacoplar estilos usando classes e os benefícios que isso nos traz, mas para cada
elemento que nós vamos estilizar precisamos pensar em um nome diferente e isso pode ficar muito
complicado sem um padrão para seguir.
Existem vários padrões de CSS mas durante o curso vamos usar um chamado BEMCSS. A
vantagem de se usar BEMCSS para quem está começando com desenvolvimento HTML e CSS é que
ele é um padrão que foca bastante em estrutura e facilita bastante na hora planejar os nomes das classes.
BEM usa um conceito de bloco__elemento--modificador para nomear suas classes, sendo que
bloco é o elemento html que representa uma divisão de conteúdo cuja sua existência já tenha um
sentido por si só, elemento representa uma parte semântica do bloco e modificador é uma
sinalização de comportamento ou estilização.
Da maneira que montamos a estrutura acima fica bem fácil saber o que estamos estilizando no CSS.
Veja a diferença:
section h2 { /* É o h2 da section que tem os produtos? E se precisar mudar minha estrutura para um h3
? */
font-size: 40px;
font-weight: 800;
}
.produtos__titulo { /* Agora aqui eu sei que vou estilizar o título do painel de produtos. Mesmo se m
udar para um h3 */
font-size: 40px;
font-weight: 800;
}
tags que possuem essas propriedades por padrão, <p> e <a> respectivamente, e colocar uma cor de
fundo.
HTML:
<p>Um parágrafo que é block</p>
<a>Um link que é inline</a>
CSS:
p {
background-color: blue;
}
a {
background-color: red;
}
Veja o espaço que esses elementos realmente ocupam. A tag <p> ocupa toda a largura da página
enquanto a tag <a> ocupa apenas o espaço necessário para mostrar o texto que colocamos. Vamos
colocar mais elementos no nosso exemplo acima.
HTML:
<p>Um parágrafo que é block</p>
<p>Mais um parágrafo que é block</p>
<a>Um link que é inline</a>
<a>Mais um link que é inline</a>
CSS:
p {
background-color: blue;
}
a {
background-color: red;
}
Podemos observar que agora um parágrafo ficou um embaixo do outro e os links ficaram um do lado
do outro. Esses comportamentos são os esperados de elementos block e inline . Como um elemento
block ocupa toda a largura da tela não podemos colocar outro elemento do lado porque não há espaço.
Agora como no inline o elemento ocupa só o espaço necessário para mostrar nosso texto então
podemos colocar outros elementos que caibam naquele espaço. Bom, vamos então resolver o problema
de espaço da tag <p> :
HTML:
<p>Um parágrafo que é block</p>
<p>Mais um parágrafo que é block</p>
<a>Um link que é inline</a>
<a>Mais um link que é inline</a>
CSS:
p {
background-color: blue;
width: 30%;
}
a {
background-color: red;
width: 60%;
}
Bom, agora temos dois problemas. Mesmo com o espaço extra os parágrafos não ficaram um do lado
do outro e nossos links não tiveram alterações em suas larguras. Vamos usar o inspetor de elementos de
nosso navegador para ver o que está acontecendo com esses elementos.
Selecionando a tag <p> com nosso inspetor conseguimos ver que ela realmente está ocupando
30% do espaço da tela do navegador, mas agora tem alguma coisa a mais que não colocamos no CSS.
Margin. Existe uma margin ocupando o restante do espaço que era ocupado pela tag <p> . Utilizando
a propriedade margin-right: 0px; não parece fazer efeito. Mas está tudo bem! Esse é o
comportamento esperado de um elemento block .
Vamos ver agora o que aconteceu com nossos links. Nossos links parecem ter ignorado
completamente a propriedade de largura que colocamos. Mais uma vez, está tudo bem! Esse é o
comportamento padrão de um elemento inline . Diferente de um elemento block , um elemento
inline não recebe propriedades de tamanho ( width e height ) e isso pode gerar alguns problemas
com estilização. Foi criado então o display: inline-block que permite usar o melhor dos dois
mundos. Vamos usar o exemplo acima novamente só que mudando o tipo de display do link:
HTML:
<p>Um parágrafo que é block</p>
<p>Mais um parágrafo que é block</p>
<a>Um link que é inline</a>
<a>Mais um link que é inline</a>
CSS:
p {
background-color: blue;
width: 30%;
}
a {
background-color: red;
width: 60%;
display: inline-block;
}
Perfeito! Agora nosso link recebeu o tamanho que colocamos e agora deixamos um <a> debaixo do
outro. Se mudarmos o tamanho dessa tag <a> para um tamanho de 40% , por exemplo, vemos que as
nossas tags <a> ficam uma do lado da outra.
display: block :
display: inline :
Permite que outro elemento fique do seu lado caso haja espaço
O elemento ocupa apenas o espaço para mostrar seu conteúdo
Não recebe propriedades de tamanho
display: inline-block :
Permite que outro elemento fique do seu lado caso haja espaço
O elemento inicialmente ocupa apenas o espaço para mostrar seu conteúdo
Recebe propriedades de tamanho
CAPÍTULO 12
Já vimos em exercícios passados o uso da unidade de medida relativa com % . Usamos essa medida
relativa quando queremos que um elemento use, por exemplo, 100% do espaço disponível.
HTML:
<div>
<img src="img/flor.png" alt="Foto de uma flor">
</div>
CSS:
div {
width: 400px;
}
No exemplo acima, dependendo do tamanho da imagem, a imagem pode ultrapassar o espaço que
definimos para a <div> ou pode ocupar um espaço menor. Se queremos que a imagem ocupe todo o
espaço da <div> podemos usar a unidade relativa % :
div {
width: 400px;
}
img {
width: 100%; /* Ocupe 100% do espaço disponível */
}
A grande vantagem de se usar % é que não importa o tamanho que colocamos na <div> , a <img>
sempre vai acompanhar o tamanho da sua tag mãe (a <div> ).
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Um exemplo</title>
</head>
<body>
<div>
<img src="img/foto" alt="Uma foto">
</div>
</body>
</html>
CSS:
html {
font-size: 10px;
}
div {
font-size: 20px;
}
img {
width: 10em; /* A largura será de 200px */
height: 10rem; /* A altura será de 100px */
}
A vantagem de usar essas medidas é que se tivermos outros elementos usando essas medidas e
precisarmos mudar o tamanho de todos os elementos proporcionalmente, basta mudarmos em um lugar
só. Estas unidades de medida são ideais para quando o site precisa ser exibido em diferentes tamanhos
de telas, onde em cada tamanho de tela a fonte deve ser exibida em escalas de tamanhos diferentes e
proporcionais entre si.
CAPÍTULO 13
O volume de usuários que acessam a Internet por meio de dispositivos móveis cresceu
exponencialmente nos últimos anos. Usuários de iPhones, iPads e outros smartphones e tablets têm
demandas diferentes dos usuários desktop. Pois estes dispositivos muitas vezes estão conectados em
uma rede móvel com dados transmitidos via 3G ou 4G, este tipo de conexão muitas vezes apresenta
instabilidade na velocidade de carregamento de dados e arquivos. Além disso é preciso se preocupar
com a acessibilidade para pessoas com deficiência, que também usam este tipo de dispositivo no dia a
dia, como seus recursos de comando de voz, e tela touchscreen que suporta diferentes tipos de gestos
com os dedos, ativando funcionalidades do smartphones.
Para que suportemos usuários móveis, antes de tudo, precisamos tomar uma decisão: fazer um site
exclusivo - e diferente - focado em dispositivos móveis ou adaptar nosso site para funcionar em
qualquer dispositivo?
Vários sites na internet adotam a estratégia de ter um site diferente voltado para dispositivos móveis
usando um subdomínio diferente como "m." ou "mobile.", como https://m.kabum.com.br.
Essa abordagem é a que traz maior facilidade na hora de pensar nas capacidades de cada plataforma,
desktop e mobile, permitindo que entreguemos uma experiência customizada e otimizada para cada
situação. Porém, há diversos problemas envolvidos nesta escolha:
Como atender adequadamente diversos dispositivos tão diferentes quanto um smartphone com tela
pequena e um tablet com tela mediana? E se ainda considerarmos as SmartTVs, ChromeCast,
AppleTV? Teríamos que montar um site específico para cada tipo de plataforma?
Muitas vezes esses sites mobile são versões limitadas dos sites de verdade e não apenas ajustes de
usabilidade para o dispositivo diferente. Isso frustra a pessoa que usa onde, cada vez mais, usa
dispositivos móveis para completar as mesmas tarefas que antes fazia no desktop.
Você terá conteúdos duplicados entre sites "diferentes", podendo prejudicar seu SEO (otimização
para motores de busca) se não for feito com o cuidado que as recomendações para este cenário
pedem.
Terá que lidar com redirecionamento entre URLs móveis e normais, dependendo do dispositivo.
Como por exemplo, se uma pessoa receber um link de uma página com o endereço do site desktop,
e abrir no celular, terá ser redirecionada automaticamente para a versão mobile. E a mesma coisa no
sentido contrário, ao abrir um link do endereço mobile em um computador ou tela grande, deverá
ser redirecionado para a URL normal.
Uma abordagem que costuma ser muito utilizada é a de ter um único site, acessível em todos os
dispositivos móveis. Adeptos da ideia da Web única (One Web) consideram que o melhor para o
usuário é ter o mesmo site do desktop normal também acessível no mundo móvel. É o melhor também
para quem desenvolve, que não precisará manter vários sites diferentes. E é o que garante a
compatibilidade com a maior variedades de dispositivos.
Certamente, a ideia não é fazer o acesso ao site mobile exatamente da mesma maneira que o desktop.
Usando as tecnologias do CSS3, hoje já muito bem suportadas pelos navegadores, podemos usar a
mesma base de layout e marcação porém ajustando o design para cada tipo de dispositivo.
Hoje em dia não existe tanto essa crença de que o site precisa ser exatamente a mesma experiência
do que no desktop. Podemos criar experiências exclusivas para cada tipo de dispositivo, mas é
importante que o usuário ainda consiga fazer as funções (por exemplo realizar uma compra).
Do ponto de vista de código, é a abordagem mais simples: basta fazer sua página com design
mais enxuto e levando em conta que a tela será pequena (em geral, usa-se width de 100% para que
se adapte à pequenas variações de tamanhos de telas entre smartphones diferentes).
Uma dificuldade estará no servidor para detectar se o usuário está vindo de um dispositivo
móvel ou não, e redirecioná-lo para o lugar certo. Isso costuma envolver código no servidor que
detecte o navegador do usuário através do User-Agent do navegador.
É uma boa prática também incluir um link para a versão normal do site caso o usuário não
queira a versão móvel.
HTML:
Outra forma de declarar os media types é separar as regras dentro do próprio arquivo CSS usando a
notação @media :
@media screen {
body {
background-color: blue;
color: white;
}
}
@media print {
body {
background-color: white;
color: black;
}
}
O media type screen determina a visualização padrão, que é uma tela digital (monitores de
computador ou telas de smarthphones). É muito comum também termos um CSS com media type print
com regras de impressão (por exemplo, retirar navegação, formatar cores para serem mais adequadas
para leitura em papel etc).
E havia também o media type handheld, voltado para dispositivos móveis. Com ele, conseguíamos
adaptar o site para os pequenos dispositivos como celulares tipo WAP e palmtops.
O problema é que esse tipo handheld nasceu em uma época em que os celulares eram bem mais
simples do que hoje, principalmente seus visores ou telas, portanto, costumavam ser usados para fazer
visualização das páginas de maneira bem simples. Quando os novos smartphones touchscreen
começaram a surgir - em especial, o iPhone -, eles tinham capacidade para abrir páginas completas e tão
complexas quanto as do desktop, devido a sua tela digital avançada. Por isso, o iPhone e outros celulares
modernos ignoram as regras de handheld e acabam por se encaixar na categoria media type screen.
Além disso, mesmo que handheld funcionasse nos smartphones, como trataríamos os diferentes
dispositivos de hoje em dia como tablets, televisões etc?
Em vez de simplesmente falar que determinado CSS é para handheld em geral, nós podemos agora
indicar que determinadas regras do CSS devem ser vinculadas a propriedades do dispositivo como
tamanho da tela, orientação (landscape ou portrait) e até resolução em dpi (dots per inch).
<link rel="stylesheet" href="base.css" media="screen">
<!-- usando media queries -->
<link rel="stylesheet" href="mobile.css" media="(max-width: 480px)">
Outra forma de declarar os media queries é separar as regras dentro do mesmo arquivo CSS:
@media screen {
body {
font-size: 16px;
}
}
Repare como @media agora pode receber expressões complexas. No caso, estamos indicando que
queremos que as telas com largura máxima de 480px tenham uma fonte de 1em.
Você pode testar isso apenas redimensionando seu próprio navegador desktop para um tamanho
13.3 VIEWPORT
Mas, se você tentar rodar nosso exemplo anterior em um iPhone ou Android de verdade, verá que
ainda estamos vendo a versão desktop da página. A regra do max-width parece ser ignorada!
Na verdade, a questão é que os smartphones modernos têm telas grandes e resoluções altas,
justamente para nos permitir ver mídias em alta resolução, como fotos e vídeos. As dimensões da tela de
um iPhone SE por exemplo é 1280px por 720px. E existem smartphones com Android que chegam ter
telas com resolução 4K.
Ainda assim, a experiência desses celulares é bem diferente dos desktops. 4K em uma tela de 4
polegadas é bem diferente de 4K em um notebook de 16 polegadas. A resolução muda. Celulares
costumam ter uma resolução em dpi bem maior que desktops.
Os smartphones sabem que considerar a tela como 4K não ajudará o usuário a visualizar uma página
Web otimizada para telas menores. Há então o conceito de device-width que, resumidamente, representa
um número em pixels que o fabricante do aparelho considera como mais próximo da sensação que o
usuário tem ao visualizar a tela.
Nos iPhones, por exemplo, o device-width é considerado como 370px, mesmo tendo uma tela com
capacidade de exibir uma resolução bem mais alta.
Por padrão, iPhones, Androids e afins costumam considerar o tamanho da tela visível, chamada de
viewport como grande o suficiente para comportar os sites desktop normais. Por isso a nossa página foi
mostrada sem zoom como se estivéssemos no desktop.
A Apple criou então uma solução utilizando meta dados, que depois foi copiada pelos outros
smartphones, que é configurar o valor que julgarmos mais adequado para o viewport:
<meta name="viewport" content="width=370">
Isso faz com que a tela seja considerada com largura de 370px, fazendo com que nosso layout
mobile finalmente funcione e nossas media queries também.
Melhor ainda, podemos colocar o viewport com o valor device-width definido pelo fabricante,
dando mais flexibilidade com dispositivos diferentes com tamanhos diferentes:
<meta name="viewport" content="width=device-width">
58 13.3 VIEWPORT
.
Pequenas mudanças que fazemos usando @media tentando fazer a experiência do usuário em
diversos dispositivos mais atraente é o que o mercado chama de Web Design Responsivo. O termo
surgiu num famoso artigo de Ethan Marcotte e diz o seguinte:
13.5 MOBILE-FIRST
Nossos exercícios seguiram o processo que chamamos de "desktop-first". Isso significa que
tínhamos nossa página montada para o layout desktop e, num segundo momento, precisaremos escrever
a adaptação a mobile.
Na prática, isso não é muito interessante porque precisamos desfazer algumas coisas do que
tínhamos feito no nosso layout para desktop: tiramos alguns posicionamentos e desfizemos diversos
ajustes na largura de elementos que já eram padrões deles.
É muito mais comum e recomendado o uso da prática inversa: o Mobile-first. Isto é, começar o
desenvolvimento pelo mobile e, depois, adicionar suporte a layouts desktop. No código, não há nenhum
13.5 MOBILE-FIRST 59
.
segredo: vamos apenas usar mais media queries min-width ao invés de max-width, mais comum em
códigos desktop-first.
A grande mudança do mobile-first é que ela permite uma abordagem muito mais simples e
evolutiva/incremental. Inicia-se o desenvolvimento pela área mais simples e limitada, com mais
restrições, o mobile. O uso da tela pequena vai nos forçar a criar páginas mais simples, focadas e
objetivas. Depois, a adaptação pra desktop com media queries, é apenas uma questão de readaptar o
layout.
A abordagem desktop-first começa pelo ambiente mais livre e vai tentando cortar coisas quando
chega no mobile. Esse tipo de adaptação é, na prática, muito mais trabalhosa.
60 13.5 MOBILE-FIRST
.
CAPÍTULO 14
O PROCESSO DE DESENVOLVIMENTO
DE UMA TELA
Existe hoje no mercado uma grande quantidade de empresas especializadas no desenvolvimento de sites
e aplicações web, bem como algumas empresas de desenvolvimento de software ou agências de
comunicação que têm pessoas capacitadas para executar esse tipo de projeto.
Um projeto de site ou aplicação web envolve muitas disciplinas em sua execução, pois são diversas
características a serem analisadas e diversas as possibilidades apresentadas pela plataforma. Por
exemplo, devemos conhecer muito bem as características do público alvo, pois ele define qual a melhor
abordagem para definir a navegação, tom linguístico e visual a ser adotado, entre outras. A afinidade do
público com a Internet e o dispositivo pode inclusive definir o tipo e a intensidade das inovações que
podem ser utilizadas.
Por isso, a primeira etapa do desenvolvimento do projeto fica a cargo da pessoa que cuida da
experiência de usuário (UX Designer) junto com uma pessoa de Design e alguém de conteúdo. Esse
grupo de pessoas analisa e endereça uma série de informações da característica humana do projeto,
definindo a quantidade, conteúdo, localização e estilização de cada informação.
Algumas das motivações e práticas de Experiência do Usuário são conteúdo do curso Design de
Interação, Experiência do Usuário e Usabilidade. O resultado do trabalho dessa equipe é uma série de
definições sobre a navegação (mapa do site) e um esboço de cada uma das visões, que são os layouts das
páginas, e visões parciais como, por exemplo, os diálogos de alerta e confirmação da aplicação. Por
essas visões serem esboços ainda, a parte de estilo do site fica mais genérica: são utilizadas fontes, cores
e imagens neutras, embora as informações escritas devam ser definidas nessa fase do projeto.
Esses esboços das visões são o que chamamos de wireframes e guiam o restante do processo de
design.
Com os wireframes em mãos, é hora de adicionar as imagens, cores, fontes, fundos, bordas e outras
características visuais. Esse trabalho é realizado pela mesma equipe acima, só que agora sem a pessoa de
conteúdo, que utilizam ferramentas gráficas como Adobe Photoshop, Adobe Illustrator, Figma, entre
outras. O resultado do trabalho dessa equipe é que chamamos de layout. Os layouts são imagens
estáticas já com o visual completo a ser implementado. Apesar de os navegadores serem capazes de
exibir imagens estáticas, exibir uma única imagem para o usuário final no navegador não é a forma ideal
de se publicar uma página.
Para que as informações sejam exibidas de forma correta e para possibilitar outras formas de uso e
interação com o conteúdo, é necessário que a equipe de programação front-end transforme essas
imagens em páginas interativas utilizáveis pelos navegadores.
Uma recomendação é a de começar a planejar o código sempre analizando de fora para dentro.
Portanto, depois de ver as 3 principais camadas ( <header> , <main> e <footer> ) vamos nos
aprofundar em uma delas. Vamos partir da ordem de declaração e nos aprofundar mais na tag
<header> . Dentro de header temos uma logo e 3 links. Sabemos já que a logo é uma imagem:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>MusicDot</title>
</head>
<body>
<header>
<!-- Conteúdo do header -->
<img src="img/logo-musicdot.png" alt="Logo da MusicDot">
</header>
<main>
<!-- Conteúdo principal -->
</main>
<footer>
<!-- Conteúdo do footer -->
</footer>
</body>
</html>
Agora com os links precisamos notar que são links que vão para outras páginas dentro do nosso
próprio site portanto esses 3 links fazem parte de uma navegação e que são 3 links em sequência.
Quando temos elementos iguais em sequência temos uma lista! Em nosso caso aqui a ordem dos links
não importa:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>MusicDot</title>
</head>
<body>
<header>
<!-- Conteúdo do header -->
<img src="img/logo-musicdot.png" alt="Logo da MusicDot">
<nav>
<ul>
<li><a href="#">Contato</a></li>
<li><a href="#">Entrar</a></li>
<li><a href="#">Matricule-se</a></li>
</ul>
</nav>
</header>
<main>
<!-- Conteúdo principal -->
</main>
<footer>
<!-- Conteúdo do footer -->
</footer>
</body>
</html>
O próximo passo seria fazer o aprofundamento de outra tag e assim por diante. Lembre-se de que
essa é apenas uma recomendação!
CAPÍTULO 15
Para evitar esse tipo de interferência, alguns desenvolvedores e empresas criaram alguns estilos que
chamamos de CSS Reset. A intenção é setar (definir) um valor básico para todas as características do
CSS, sobrescrevendo totalmente os estilos padrão do navegador.
Desse jeito podemos começar a estilizar as nossas páginas a partir de um ponto que é o mesmo para
todos os casos, o que nos permite ter um resultado muito mais sólido em vários navegadores.
Existem algumas opções para resetar os valores do CSS. Algumas que merecem destaque hoje são as
seguintes:
HTML5 Boilerplate
O HTML5 Boilerplate é um projeto que pretende fornecer um excelente ponto de partida para quem
pretende desenvolver um novo projeto com HTML5. Uma série de técnicas para aumentar a
compatibilidade da nova tecnologia com navegadores um pouco mais antigos estão presentes e o código
é totalmente gratuito. Em seu arquivo "style.css", estão reunidas diversas técnicas de CSS Reset. Apesar
de consistentes, algumas dessas técnicas são um pouco complexas, mas é um ponto de partida que
podemos considerar.
https://html5boilerplate.com/
Criado pelos desenvolvedores front-end do Yahoo!, uma das referências na área, esse CSS Reset é
composto de 3 arquivos distintos. O primeiro deles, chamado de Reset, simplesmente muda todos os
valores possíveis para um valor padrão, onde até mesmo as tags <h1> e <small> passam a ser
exibidas com o mesmo tamanho. O segundo arquivo é chamado de Base, onde algumas margens e
dimensões dos elementos são padronizadas. O terceiro é chamado de Font, onde o tamanho dos tipos é
definido para que tenhamos um visual consistente inclusive em diversos dispositivos móveis.
Há também o famoso CSS Reset de Eric Meyer, que pode ser obtido em
http://meyerweb.com/eric/tools/css/reset/. É apenas um arquivo com tamanho bem reduzido.
Vale lembrar que o uso de cada reset varia conforme a necessidade. Alguns CSS Resets são mais
agressivos do que outros, e também é importante saber que eles podem ser modificados para suas
próprias necessidades. Existem pessoas que desenvolvem seus próprios CSS Resets e elas costumam
compartilhar seus códigos em certos fórums voltados para HTML e CSS .
O ideal é fazer essa importação antes de qualquer arquivo CSS para garantir que todos os arquivos
depois vão conseguir utilizar essa fonte.
A outra maneira de importar é fazendo um @import no próprio arquivo CSS que você vai usar a
fonte:
@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');
body {
font-family: 'Roboto', sans-serif;
}
Outra maneira de importar fonte sem depender de serviços externos é importar o próprio arquivo de
fonte no arquivo CSS que essa fonte será utilizada usando o @font-face:
@font-face {
font-family: minhaFonte;
src: url(fonts/minha-fonte-customizada.woff);
}
body {
font-family: 'minhaFonte', sans-serif;
}
Antes de usar qualquer fonte verifique os direitos autorais dela e veja se é necessário permissão
ou compra da fonte. A vantagem de se usar o Google Fonts é que todas as fontes são abertas para
uso livre, mas no caso de outras fontes é bom verificar antes. O que não queremos é o uso indevido
de fontes.
CSS que vai conter estilos específicos daquela página. Como tudo na vida, existem vantagens e
desvantagens dessa abordagem.
Vantagens:
Só é necessário a importação de um arquivo CSS para que a página já tenha um estilo padrão.
Como todas as classes de estilos estão em um lugar só, podemos escrever o html já colocando
os nomes de classes que precisamos. Quase como um framework.
Desvantagens:
Todas as páginas terão de carregar um arquivo de estilos gigantesco independete se vão usar
todas as classes ou não, o que pode impactar performance.
Dependendo do tamanho do arquivo geral pode ser muito complexo encontrar seletores que
queremos usar.
Se por algum motivo queremos usar algo que era para ser exclusivo de uma página em outra
página, teremos de fazer a "portabilidade" para o arquivo geral o que pode bagunçar o arquivo
geral.
Manutenção pode ser complexo dependendo do tamanho do arquivo.
Vantagens:
Como cada componente tem seu próprio CSS só é necessário importar os componentes que
precisamos usar em cada página, evitando importar estilos desnecessários.
Organização e manutenção fica menos complicada porque é mais claro saber exatamente qual
arquivo trabalhar.
Desvantagens:
Precisamos importar um arquivo CSS diferente para cada componente que queremos usar que
pode gerar linhas de imports gigantescas.
CAPÍTULO 16
PROGRESSIVE ENHANCEMENT
Se alguma dessas melhorias não for suportada pelo navegador, o usuário ainda assim conseguirá
acessar o website, mesmo que tenha sua experiência reduzida.
Este conceito não se aplica uniformemente numa página e deve ser pensando isoladamente para a
estrutura, estilo e comportamento. Cada ponto da tríade se comporta diferentemente quando degradado,
isto é, quando não é suportado pelo navegador.
Pessoas diferentes vão usar nosso site em dispositivos diferentes dos que nós usamos para
desenvolver, em lugares diferentes do que estamos e em condições muito diferentes das que nos
desenvolvemos o site.
15 PROGRESSIVE ENHANCEMENT 69
.
O que isso significa pra quem está desenvolvendo o site: definir e garantir que o site seja acessível
nessas condições definidas. Como garantir isso? Testar em todas as situações e modificar o código
sempre que o teste numa dada situação falhe. Se não pensarmos e testarmos em dispositivos e casos de
uso em condições difrentes ou com limitações e restrições há grandes chances de que nosso site só fique
utilizável pra quem se enquadre no perfil testado. E se não der para testar em todas as situações? Como
tentar "reduzir" ou padronizar o esforço? Tentar seguir um fluxo de desenvolvimento (ou pensamento?)
que "automaticamente" inclua a maior parte das situações:
Em relação a espaço de tela: analogia da caixa de fósforo vs caixa de sapato. O que cabe numa
caixa de sapato cabe numa caixa de fósforo? e o contrário?
Devemos pensar e testar primeiro na base que é igual/mínima para todas as pessoas e depois
"melhorar"/ adicionar código para situações onde caibam essas melhorias. Uma ordem de
desenvolvimento, o porquê de cada passo e como testar:
1. Conteúdo: conteúdo é o que todas as pessoas querem ver num site e começamos por ele.
Qual tipo de conteúdo a página vai ter? Como o conteúdo vai ser agrupado? Onde vai cada
conteúdo? Qual a quantidade de conteúdo em cada lugar?
Teste: revisão de conteúdo, ortografia e etc.
2. Semântica com HTML: semântica é uma melhoria em cima do conteúdo que está sem marcação.
Como se localizar entre 1000 linhas de conteúdo para marcar e dar manutenção nesse conteúdo?
Teste: a tag escolhida (ex: <footer> ) melhora a localização do código e a legibilidade para
quem está desenvolvendo?
Como usar o site sem acesso ao visual dele? Muitas pessoas dependem só do conteúdo para
navegar no site. Essas pessoas usam leitores de tela que interpretam a página e deixam ela
acessível e navegável de uma maneira similar à forma que quem desenvolve o código se localiza
no código (pelas tags). Leitores de tela permitem que uma pessoa leia diretamente o conteúdo do
<footer> ao invés de ler todo o conteúdo da página do início até o fim para chegar no conteúdo
do <footer> .
Teste: definir casos de uso, abrir e usar o site de acordo em um leitor de tela
Outro teste: programas que exibem a árvore de acessibilidade (ex: Dev Tools do Firefox)
3. CSS: estilos farão o conteúdo ser exibido de uma maneira melhor. O foco ainda é o conteúdo, então
estilos são o terceiro passo, uma melhoria.
Recomendamos começar limitando a largura e/ou a altura do viewport. Isso incentivará que CSS
não impeça o acesso ao conteúdo em telas menores e o conteúdo que está numa tela menor acaba
sendo acessível em telas maiores (por mais que as vezes seja feio).
Testar em diversas versões de navegadores.0
CSS sem limitação de tamanhos já deixa o site responsive! O que pode deixar um site não
responsivo é o CSS de quem está desenvolvendo o site.
Na hora de escolher qual código HTML e CSS escrever. O W3C, o Progressive Enhancement e os
navegadores desatualizados recomendam:
A tag que estou escolhendo é identificada pelos User Agents que vamos dar suporte? Se tag é
nova e não existe ainda naquela versão de navegador, o que acontece? Tags novas são
melhoria e em navegadores desatualizados viram <div> . O conteúdo não vai deixar de ser
exibido.
O site não vai parar de funcionar. Coisas antigas não deixam de existir ou de funcionar. Este
conceito é também utilizado para atualizar o HTML, o CSS e outros padrões a cada nova
versão. Novas versões geralmente não mudam o que havia antes, melhoram.
Editoras tradicionais pouco ligam para ebooks e novas tecnologias. Não dominam
tecnicamente o assunto para revisar os livros a fundo. Não têm anos de
experiência em didáticas com cursos.
Conheça a Casa do Código, uma editora diferente, com curadoria da Caelum e
obsessão por livros de qualidade a preços justos.
CAPÍTULO 17
DISPLAY FLEX
Por padrão, quando aplicamos display: flex para um elemento, automaticamente todos
elementos filhos ficam um ao lado do outro como se estivessem sob o efeito de display:
inline .
72 16 DISPLAY FLEX
.
align-items :
stretch: É o valor padrão. Os elementos se "esticam" para que todos fiquem com a mesma altura.
flex-start: Os elementos ficam todos alinhados com o topo do flex container.
flex-end: Os elementos ficam todos alinhados com a base do flex container.
center: Os elementos ficam todos alinhados com o meio do flex container.
baseline: Os elementos ficam alinhados com base do conteúdo textual de cada um deles.
flex-wrap :
nowrap: É o valor padrão. Os elementos vão ficar um do lado do outro mesmo que não exista
mais espaço horizontal.
wrap: Os elementos que não cabem mais no espaço lateral recebem uma quebra de linha, ou
seja, vão para a linha debaixo.
wrap-reverse: Os elementos que não cabem mais no espaço lateral recebem uma quebra de
linha acima, ou seja, vão para a linha de cima.
Também é possível aplicar propriedades para os flex items, no blog CSS Tricks existe um guia
completo e visual com os efeitos de cada propriedade em um flexbox: https://css-
tricks.com/snippets/css/a-guide-to-flexbox/
CAPÍTULO 18
RESPONSIVIDADE E FALLBACK
No dia a dia de desenvolvimento de páginas para Web e aplicações, sempre acabamos encontrando casos
de incompatibilidade de propriedades CSS com os browsers que usamos. Nem todas as pessoas
atualizam seus browsers, seja por não saber atualizar, por uma feature específica daquela versão,
compatibilidade com o sistema operacional, etc... por conta disso, algumas propriedades CSS que
usamos não vão funcionar em todos os browsers.
Vimos em capítulos anteriores que o site caniuse.com mostra um gráfico falando sobre
compatibilidade de propriedades CSS com diversas versões de browsers, e a idéia de usar esse site é por
conta das métricas que ele nos apresenta. Uma dessas métricas é a quantidade de usuários utilizando
versões diferentes de browsers.
Vamos montar nosso site pensando na maioria dos usuários (que costumam usar versões mais
atualizadas de browsers) mas não esquecendo das pequenas porcentagens que usam navegadores mais
antigos (IE 10 por exemplo). Só que não podemos deixar de colocar novas propriedades e tags por conta
da pequena porcentagem de pessoas que usam navegadores muito antigos. O que fazemos então?
No exemplo nós colocamos uma cor de fundo vermelha num elemento que possui a classe meu-
elemento . Agora vamos observar o exemplo abaixo:
.meu-elemento {
background-color: #f00;
background-color: #0f0;
}
Agora o navegador vai ler primeiro a cor vermelha e depois vai substituir pela cor verde porque
estamos usando a mesma propriedade no mesmo elemento, ou seja, quem for declarado por último
ganha a preferência. Agora vamos ver mais um exemplo.
.meu-elemento {
background-color: #f00;
background-color: corlinda(10);
}
A função corlinda() não é um CSS válido portanto o navegador vai ler a cor vermelha primeiro e
17 RESPONSIVIDADE E FALLBACK 75
.
depois vai tentar ler a função, mas como essa função não existe o navegador vai ignorar a sobrescrita e
vai manter a cor de fundo vermelha.
Isto pode parecer um erro de código, mas na verdade é uma técnica chamada de fallback, onde caso
uma propriedade não possa ser interpretada, outra pode assumir seu lugar. Essa é a maneira mais ideal
de manter compatibilidade com browsers mais antigos. Seguindo o conceito de Progressive
Enhancement, começamos a colocar nossas propriedades baseadas nos navegadores mais antigos e
depois vamos crescendo para propriedades mais novas de navegadores mais novos, assim naturalmente
vamos deixando nosso site responsivo e compatível com diversos navegadores.
É importante ver que na hora de decidir qual propriedade antiga usar como "base" do
aprimoramento contínuo, caso essa propriedade faça sentido para a época que o site for criado.
76 17 RESPONSIVIDADE E FALLBACK
.
CAPÍTULO 19
DISPLAY: GRID
.flex-container {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}
.foto {
width: 200px;
height: 200px;
border-radius: 5px;
background-color: #ff002b;
margin-bottom: 1rem;
}
18 DISPLAY: GRID 77
.
display: flex por conta não consegue lidar o posicionamento bidimensional. Precisamos
modificar a estrutura para que os elementos ocupem o espaço de uma linha:
<main>
<div class="flex-container"> <!-- Primeira linha que contém "apenas" o bloco verde e o container
que guarda os elementos vermelhos-->
<div class="foto foto-destaque-verde"></div> <!-- Bloco verde e primeiro elemento da linha -->
<div class="flex-container foto-container"> <!-- Container que vai guardar o restante dos ele
entos vermelhos e segundo elemento da linha -->
<div class="foto"></div>
<div class="foto"></div>
<div class="foto"></div>
<div class="foto"></div>
</div>
</div>
</main>
.flex-container {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
}
.foto-container {
width: 66%;
}
78 18 DISPLAY: GRID
.
.foto {
width: 200px;
height: 200px;
border-radius: 5px;
background-color: #ff002b;
margin-bottom: 1rem;
}
.foto-destaque-verde {
background-color: #24cc2d;
height: 400px;
}
Vamos entender o que aconteceu. Como o flex só consegue trabalhar com uma direção, então
vamos criar a primeira linha contendo apenas dois elementos: o bloco verde e uma caixa vazia. Nessa
caixa vazia, vamos criar nossa segunda linha (deixar a caixa como um flex container ) com os 4
blocos vermelhos dentro e vamos limitar o tamanho dessa caixa para que o espaço seja melhor dividido.
Já conseguimos perceber com esse exemplo simples que o código já começou a ficar muito complicado.
Imagine fazer layouts mais complexos usando essa técnica do diplay: flex . Por conta dessa
dificuldade de fazer layouts com uma complexidade bidimensional que surgiu o display: grid .
A idéia do grid é exatamente de não precisar mudar a estrutura do HTML e que toda a parte de
18 DISPLAY: GRID 79
.
um grid container coloca cada item em uma linha e todos eles ficam em uma coluna:
80 18 DISPLAY: GRID
.
Para ver melhor as marcações de grid, use a ferramenta de desenvolvimento de seu navegador.
18 DISPLAY: GRID 81
.
Nós sabemos que nós precisamos de 3 colunas e 2 linhas para conseguir o efeito que queremos.
Então vamos usar as propriedades de grid container que vão definir o número de colunas e o número de
linhas respectivamente: grid-template-columns: e grid-template-rows . A propriedade de grid
permite que nós usemos outra unidade de medida: fr (que significa fraction/ fração).
19.1 GRID-TEMPLATE-COLUMNS
Podemos colocar infinitos valores dentro dessa propriedade, mas cada valor dentro dessa
propriedade vai representar uma coluna. Queremos 3 colunas que ocupem igualmente o espaço da
página. Vamos usar a nova unidade de medida fr .
.grid-container {
display: grid;
No código acima, quando escrevemos 1fr 1fr 1fr estamos dizendo que queremos 3 colunas que
ocupem 1 fração do espaço disponível, ou seja, cada coluna vai ter 1/3 do espaço disponível
lateralmente.
19.2 GRID-TEMPLATE-ROWS
A propriedade que cria as linhas funciona da mesma maneira que a propriedade que cria colunas.
Portanto se queremos duas linhas que ocupam o mesmo espaço:
.grid-container {
display: grid;
82 19.1 GRID-TEMPLATE-COLUMNS
.
Só que mesmo depois de ter colocado as duas linhas ainda assim os elementos não ficaram dispostos
corretamente. O elemento verde ainda ocupa apenas uma linha e não duas, então precisamos indicar para
o navegador:
.foto-destaque-verde {
background-color: #24cc2d;
grid-row: span 2;
height: 400px;
}
A propriedade grid-row é usada apenas nos elementos filhos de um grid container e ela recebe
dois valores: linha de início e linha de término. No nosso exemplo usamos o valor span que diz que
queremos mesclar linhas e o 2 a quantidade de linhas que vamos mesclar. Quando usamos o span o
próximo valor vai ser a quantidade de linhas ou colunas que vamos mesclar, portanto não indicamos
qual linha é a linha de término. Quando não colocamos o valor de término o navegador coloca
automaticamente span 1 que quer dizer "ocupe apenas 1 linha/coluna".
Agora sim nosso bloco verde está na posição correta em relação aos elementos vermelhos. Usado
grid nós não precisamos mudar a estrutura HTML para conseguir o efeito que queríamos no começo e
Vamos dificultar um pouco nosso exemplo. Vamos trocar a posição do bloco verde para a direita.
Vamos usar a propriedade grid-columns para dizer onde que queremos que nosso bloco verde comece
e termine, mas apenas colocar essa propriedade no bloco verde não vai ser o suficiênte, precisamos
colocar essa propriedade também nos blocos vermelhos e isso já começa a aumentar significativamente
a complexidade e dificuldade de manutenção.
Para melhorar essa capacidade de movimentação de elementos dentro do grid, foi criado uma
propriedade chamada grid-template-areas, que nomeia cada espaço do grid criado. Vamos pegar nosso
layout normal e tentar nomear baseado no que já temos:
.grid-container {
display: grid;
Então no exemplo acima na primeira linha (o primeiro conjunto de aspas): primeiro espaço:
bloco verde, segundo espaço: bloco vermelho, terceiro espaço: bloco vermelho ; segunda
19.2 GRID-TEMPLATE-ROWS 83
.
linha (o segundo conjunto de aspas): primeiro espaço: bloco verde, segundo espaço: bloco
vermelho, terceiro espaço: bloco vermelho . Agora só precisamos dizer quem é o bloco vermelho
.foto-destaque-verde {
background-color: #24cc2d;
/*
grid-column: 4;
grid-row: span 2;
Esse código não é mais necessário por conta do grid-template-area
*/
grid-area: verde;
height: 400px;
}
Antes de colocar nome nos outros blocos, vamos nomear apenas o bloco verde e depois testar.
Podemos observar que os elementos continuaram na mesma posição. Agora vamos mudar a posição do
bloco verde:
.grid-container {
display: grid;
.foto-destaque-verde {
background-color: #24cc2d;
/*
grid-column: 4;
grid-row: span 2;
Esse código não é mais necessário por conta do grid-template-area
*/
grid-area: verde;
height: 400px;
}
Mesmo sem nomear os blocos vermelhos com a propriedade grid-area chegamos no nosso
objetivo. Neste caso só queremos mudar a posição do bloco verde e queremos que o restante se adapte
conforme necessário, então podemos trocar os valores de vermelho para apenas um ponto "." .
84 19.2 GRID-TEMPLATE-ROWS
.
.grid-container {
display: grid;
.foto-destaque-verde {
background-color: #24cc2d;
/*
grid-column: 4;
grid-row: span 2;
Esse código não é mais necessário por conta do grid-template-area
*/
grid-area: verde;
height: 400px;
}
Não podemos deixar espaços vazios que o browser não vai entender, precisamos deixar alguma
coisa para indicar o espaço do grid.
19.2 GRID-TEMPLATE-ROWS 85
.
CAPÍTULO 20
Uma tendência em alta no mundo front-end é o uso de frameworks CSS com estilos base para nossa
página. Ao invés de começar todo projeto do zero, criando todo estilo na mão, existem frameworks que
já trazem toda uma base construída de onde partiremos nossa aplicação.
Existem muitas opções, porém o Bootstrap talvez seja o de maior notoriedade. Ele foi criado pelo
pessoal do Twitter a partir de códigos que eles já usavam internamente. Foi liberado como opensource e
ganhou muitos adeptos. O projeto cresceu bastante em maturidade e importância no mercado a ponto de
se desvincular do Twitter e ser apenas o Bootstrap.
https://getbootstrap.com/
Reset CSS
Estilo visual base pra maioria das tags
Ícones
Grids prontos pra uso
Componentes CSS
Plugins JavaScript
Tudo responsivo e mobile-first
Só isso já nos traz uma série de benefícios. Um reset é aplicado, e nossas tags ganham estilo e
tipografia base. Isso quer dizer que podemos usar tags como um <h1> ou um <p> agora e elas terão
um estilo característico do Bootstrap.
Além disso, ganhamos muitas classes com componentes adicionais que podemos aplicar na página.
São várias opções. Por exemplo, pra criar um título com uma frase de abertura em destaque, usamos a
classe jumbotron :
<div class="container">
<h1 class="display-4">Ótima escolha!</h1>
<p class="lead">Obrigada por se matricular na MusicDot!</p>
</div>
</div>
O Bootstrap utiliza a idéia de reaproveitamento de classes que vimos em capítulos anteriores para
estilizar páginas. No exemplo acima, para criar um componente do tipo jumbotron nós só precisamos
criar um elemento e chamar a classe que representa esse componente. Isso facilita muito na hora de criar
páginas do zero porque se a pessoa já está acostumada com a nomenclatura e conhece bem os
componentes do Bootstrap, já é possível escrever o HTML com os nomes de classes corretos. Então
reduz o tempo quase que pela metade na hora de desenvolver porque não precisamos mais focar tanto
em propriedades CSS e sim em estrutura. Na documentação do Bootstrap existem vários exemplos de
estruturas que podemos literalmente copiar e colar e alterar para o conteúdo que precisamos.
A recomendação para o uso do Bootstrap (principalmente para pessoas novas com o framework) é
deixar uma aba aberta do navegador com a documentação para conferir os componentes, estruturas
e ferramentas enquanto escreve a estrutura.
Podemos fazer nossa prórpria adaptação do CSS do Bootstrap. Basta sobrescrever as classes que
queremos usar em um arquivo separado e fazer o import depois do CSS do Bootstrap.
https://jquery.com/
A importação desses JavaScripts é feita logo antes do fechamento da tag </body> e o import do
jQuery deve vir antes do arquivo do Bootstrap:
...
<script src="js/jquery.js"></script>
<script src="js/bootstrap.js.js"></script>
</body>
</html>
CAPÍTULO 21
UM POUQUINHO DA HISTÓRIA DO
JAVASCRIPT
No início da Web as páginas eram pouco ou nada interativas, eram documentos que apresentavam seu
conteúdo exatamente como foram criados para serem exibidos no navegador. Existiam algumas
tecnologias para a geração de páginas no lado do servidor, mas havia limitações no que diz respeito a
como o usuário consumia aquele conteúdo. Navegar através de links e enviar informações através de
formulários era basicamente tudo o que se podia fazer.
21.1 HISTÓRIA
Visando o potencial da Web na Internet para o público geral e a necessidade de haver uma interação
maior do usuário com as páginas, a Netscape, criadora do navegador mais popular do início dos anos 90,
de mesmo nome, criou o Livescript, uma linguagem simples que permitia a execução de scripts contidos
nas páginas dentro do próprio navegador.
Aproveitando o iminente sucesso do Java, que vinha conquistando cada vez mais espaço no mercado
de desenvolvimento de aplicações corporativas, a Netscape logo rebatizou o Livescript como JavaScript
num acordo com SUN (hoje adquirida pela Oracle) para alavancar o uso das duas. A então vice-líder dos
navegadores, Microsoft, adicionou ao Internet Explorer o suporte a scripts escritos em VBScript e criou
sua própria versão de JavaScript, o JScript.
Se usarmos todo o poder que ela tem para oferecer, podemos chegar a resultados impressionantes.
Excelentes exemplos disso são aplicações Web complexas como Gmail, Google Maps e Google Docs.
Outra característica comum nas linguagens de scripting é que normalmente elas são linguagens
interpretadas, ou seja, não dependem de compilação para serem executadas. Essa característica é
presente no JavaScript: o código é interpretado e executado conforme é lido pelo navegador, linha a
linha, assim como o HTML.
O JavaScript também possui grande tolerância a erros, uma vez que conversões automáticas são
realizadas durante operações. Como será visto no decorrer das explicações, nem sempre essas
conversões resultam em algo esperado, o que pode ser fonte de muitos problemas/bugs, caso não
conheçamos bem esse mecanismo.
O script programado é enviado em conjunto com o HTML para o navegador, mas como o navegador
saberá diferenciar o script de um código html? Para que essa diferenciação seja possível, é necessário
envolver o script dentro da tag <script> .
O Console JavaScript exibe diagnósticos do código e da página aberta, interage com o JavaScript da
página, e executa qualquer javascript digitado.
No Chrome, por exemplo, é possível acessar ao Console apertando F12 e em seguida acessar a aba
"Console" ou diretamente pelo atalho de teclado control + shift + j, e no Firefox pelo atalho control +
shift + k.
DEVELOPER TOOLS
O console faz parte de uma série de ferramentas embutidas nos navegadores especificamente
para nós que estamos desenvolvendo um site. Essa série de ferramentas é o que chamamos de
Developer Tools, ou apenas de Dev Tools. Mais instruções em:
https://developers.google.com/web/tools/chrome-devtools/
Figura 21.1: #
Operadores
Podemos somar, subtrair, multiplicar e dividir como em qualquer linguagem:
Variáveis
Para armazenarmos um valor para uso posterior, podemos criar uma variável:
> var resultado = 102 / 17;
undefined
comportamento padrão ao criar uma variável no console é receber a mensagem: undefined. Para obter o
valor que guardamos nela ou mudar o seu valor, digitamos seu nome no console, por exemplo:
> resultado
6
> resultado
16
Também podemos alterar o valor de uma variável, reatribuindo novos valores, por exemplo, usando
as operações básicas com uma sintaxe bem compacta:
> var idade = 10; // undefined
> idade += 10; // idade vale 20
> idade -= 5; // idade vale 15
> idade /= 3; // idade vale 5
> idade *= 10; // idade vale 50
Number
Com esse tipo de dado é possível executar todas as operações que vimos anteriormente:
var pi = 3.14159;
var raio = 20;
var perimetro = 2 * pi * raio
Obs: no JavaScritp os números decimais são declarados com ponto, poisa usa o padrão americano.
String
Não são apenas números que podemos salvar numa variável. O JavaScript tem vários tipos de dados.
Uma string em JavaScript é utilizada para armazenar trechos de texto:
var empresa = "Caelum";
Para exibirmos o valor da variável empresa fora do console, podemos executar o seguinte código:
alert(empresa);
A função alert serve para criação de "janelinhas" do navegador (popup) com algum conteúdo de
texto que colocarmos dentro dos parênteses. O que acontece com o seguinte código?
var numero = 30;
alert(numero)
O número 30 é exibido sem problemas dentro da popup. O que acontece é que qualquer variável
pode ser usada no alert . O JavaScript não irá diferenciar o tipo de dados que está armazenado numa
variável, e se necessário, tentará converter o dado para o tipo desejado, neste caso um valor tipo Number
foi convertido para String, e assim pôde ser exibido pelo alert.
Editoras tradicionais pouco ligam para ebooks e novas tecnologias. Não dominam
tecnicamente o assunto para revisar os livros a fundo. Não têm anos de
experiência em didáticas com cursos.
Conheça a Casa do Código, uma editora diferente, com curadoria da Caelum e
obsessão por livros de qualidade a preços justos.
Para um código JavaScript ser executado na abertura de uma página, é necessário utilizar a tag
<script> :
<script>
alert("Olá, Mundo!");
</script>
A tag <script> pode ser escrita dentro da tag <head> assim como na tag <body> , mas devemos
ficar atentos, porque o código é lido e executado imediatamente dentro do navegador. Veja a
consequência disso nos dois exemplos abaixo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Aula de JS</title>
<script>
alert("Olá, Mundo!");
</script>
</head>
<body>
<h1>JavaScript</h1>
<h2>Linguagem de programação</h2>
</body>
</html>
Repare que, ao ser executado, o script trava o processamento da página. Imagine um script que
demore um pouco mais para ser executado ou que exija alguma interação do usuário como uma
confirmação. Não seria interessante carregar a página toda primeiro antes de sua execução por uma
questão de performance e experiência para o usuário?
Para fazer isso, basta removermos o script do <head> , colocando-o no final do <body> :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Aula de JS</title>
</head>
<body>
<h1>JavaScript</h1>
<h2>Linguagem de Programação</h2>
<script>
alert("Olá, Mundo!");
</script>
</body>
</html>
Devemos sempre colocar o script antes de fecharmos a tag </body> ? Na maioria esmagadora das
vezes sim.
HTML:
<script type="text/javascript" src="js/hello.js"></script>
JS:
alert("Olá, Mundo!");
durante a execução do código. Nesses casos, poderíamos usar um alert. Porém, se esse conteúdo deveria
somente ser mostrado para o desenvolvedor, o console do navegador pode ser utilizado no lugar do alert
para imprimir essa mensagem:
var mensagem = "Olá mundo";
console.log(mensagem);
impressa no console.
21.9 QUERYSELECTOR
Antes de sair alterando nossa página, precisamos em primeiro lugar acessar no JavaScript o
elemento que queremos alterar. Como exemplo, vamos alterar o conteúdo de um título da página. Para
acessar ele:
document.querySelector("h1")
Esse comando usa os seletores CSS para encontrar os elementos na página. Usamos um seletor de
nome de tag mas poderíamos ter usado outros:
document.querySelector(".class")
document.querySelector("#id")
Executando no console, você vai perceber que o elemento correspondente é selecionado. Podemos
então manipular seu conteúdo. Você pode ver o conteúdo textual dele com:
titulo.textContent
21.11 QUERYSELECTORALL
As vezes você precisa selecionar vários elementos na página. Várias tags com a classe .cartao por
exemplo. Se o retorno esperado é mais de um elemento, usamos querySelectorAll que devolve uma
lista de elementos, esta lista é devolvida na estrutura de um array.
document.querySelectorAll(".cartao")
Podemos então acessar elementos nessa lista através da posição dele (começando em zero) e usando
o colchetes:
// primeiro cartão
document.querySelectorAll(".cartao")[0]
Para guardarmos um código para ser executado em algum outro momento, por exemplo, quando o
usuário clicar num botão, é necessário utilizar alguns recursos do JavaScript no navegador. Primeiro
vamos criar uma função:
function mostraAlerta() {
alert("Funciona!");
}
Ao criarmos uma função, simplesmente guardamos o que estiver dentro da função, e esse código
guardado só será executado quando chamarmos a função, como no seguinte exemplo:
function mostraAlerta() {
alert("Funciona!");
}
// fazendo uma chamada para a função mostraAlerta, que será executada nesse momento
mostraAlerta()
Para chamar a função mostraAlerta só precisamos utilizar o nome da função e logo depois abrir e
fechar parênteses.
21.11 QUERYSELECTORALL 97
.
Agora, para que essa nossa função seja chamada quando o usuário clicar no botão da nossa página,
precisamos do seguinte código:
function mostraAlerta() {
alert("Funciona!");
}
botao.onclick = mostraAlerta;
Note que primeiramente foi necessário selecionar o botão e depois definir no onclick que o que
vai ser executado é a função mostraAlerta . Essa receita será sempre a mesma para qualquer código
que tenha que ser executado após alguma ação do usuário em algum elemento. O que mudará sempre é
qual elemento você está selecionando, a qual evento você está reagindo e qual função será executada.
Existem também uma série de outros eventos mais avançados que permitem a criação de interações
para drag-and-drop, e até mesmo a criação de eventos customizados.
function mostraTamanho(){
outputTamanho.value = inputTamanho.value
}
Há algum outro lugar do código no qual precisamos chamar essa função? Não! Porém, é pra isso que
damos um nome à uma função, para que seja possível usá-la em mais de um ponto do código.
É muito comum que algumas funções tenham uma única referência no código. É o nosso caso com a
função mostraTamanho . Nesses casos, o JavaScript permite que criemos a função no lugar onde antes
estávamos indicando seu nome.
inputTamanho.oninput = function() {
outputTamanho.value = inputTamanho.value
}
Transformamos a função mostraTamanho em uma função sem nome, uma função anônima. Ela
continua sendo executada normalmente quando o usuário alterar o valor para o tamanho.
Uma variável que armazena um string faz muito mais que isso! Ela permite, por exemplo, consultar
o seu tamanho e realizar transformações em seu valor.
var empresa = "Caelum";
A partir da variável empresa , usamos o ponto seguido da ação replace . O ponto permite
acessarmos atributos (que guardam valores) ou funções de um elemento/objeto.
21.16 IMUTABILIDADE
String é imutável. Logo, no exemplo abaixo, se a variável empresa for impressa após a chamada
da função replace , o valor continuará sendo "Caelum". Para obter uma string modificada, é necessário
receber o retorno de cada função que manipula a string, pois uma nova string modificada é retornada:
var empresa = "Caelum";
empresa = empresa.replace("lum","tano");
console.log(empresa); // imprime Caetano, mudou!
21.17 CONVERSÕES
O JavaScript possui funções de conversão de string para number:
var textoInteiro = "10";
var inteiro = parseInt(textoInteiro);
Perceba que no primeiro exemplo temos uma string com os caracteres 1 e 0 dentro. Parece um
number, mas não é; é possível ver que não é possível por exemplo somar "10"+2 , isso vai retornar
"102" , ou seja, o JavaScript transforma tudo em string e concatena os valores (junta os 2 e retorna um
novo valor). Por isso muitas vezes é necessário usar o parseInt para garantir que números sejam
realmente do tipo number, possibilitando realizar todas as operações aritméticas.
A mesma situação ocorre com o parseFloat , que transforma strings em número com ponto
flutuante (float).
21.19 CONCATENAÇÕES
É possível concatenar (juntar) tipos diferentes e o JavaScript se encarregará de realizar a conversão
entre os tipos, podendo resultar em algo não esperado.
// Exemplo 1:
console.log(num1 + nome + num2); // imprime 2Caelum3
// Exemplo 2:
console.log(num1 + num2 + nome); // imprime 5Caelum
// Exemplo 3:
console.log(nome + num1 + num2); // imprime Caelum23
// Exemplo 4:
console.log(nome + (num1 + num2)); // imprime Caelum5
// Exemplo 5:
console.log(nome + num1 * num2); // imprime Caelum6
// A multiplicação tem precedência
O resultado é NaN (not a number - não é um número). Isto significa que estamos tentando
fazer operações matemáticas com valores que não são números. O valor NaN ainda possui uma
peculiaridade, definida em sua especificação:
var resultado = 10-"curso"; // retorna NaN
resultado == NaN; // false
NaN == NaN; // false
Não é possível comparar uma variável com NaN , nem mesmo NaN com NaN ! Para saber se
uma variável é NaN , deve ser usada a função isNaN:
CAPÍTULO 22
PROPRIEDADES CSS
Editoras tradicionais pouco ligam para ebooks e novas tecnologias. Não dominam
tecnicamente o assunto para revisar os livros a fundo. Não têm anos de
experiência em didáticas com cursos.
Conheça a Casa do Código, uma editora diferente, com curadoria da Caelum e
obsessão por livros de qualidade a preços justos.
/* Controla o tamanho da indentação que é colocado antes de uma linha de texto em um bloco */
text-indent: px, em, rem, %;
}
/* Controla o tamanho do plano de fundo. Dois valores podem ser colocados, x e y ou apenas o valor
de x que ele será adicionad/removido proporcionalmente em y */
background-size: x y, x/y, cover, contain, %, px, rem, em;
/* Controla o comportamento dos elementos internos que "vazam" do espaço horizontal definido pela
tag mãe */
overflow-x: visible, hidden, scroll, auto;
/* Controla o comportamento dos elementos internos que "vazam" do espaço vertial definido pela tag
mãe */
overflow-y: visible, hidden, scroll, auto;
}