Notebook HTML
Notebook HTML
Para acessar um servidor precisamos acessar de um IP, porém para facilitar a entrada
desses dados pelo navegar e o nosso entendimento temos o DNS (Domain name System)
Quando acessamos um site estamos fazendo download dos arquivos deste site e ai o
navegador lê os arquivos para mostrar ao usuário. e para agilizar o processo o navegador
salva uma cópia dos arquivos temporariamente e isso damos o nome de cache
Como foi dito anteriormente, a Internet é uma rede de computadores e obtemos arquivos
através da Web.
O cliente é o computador do usuário, assim como o seu. É utilizado pelas pessoas para
acessar sites ou sistemas a partir de um endereço. Os arquivos vindos por esse endereço
são disponibilizados por um outro computador que serve estes arquivos. Estes
computadores que estão em algum lugar do mundo que servem arquivos e outros serviços
são chamados de servidores.
Nos servidores programamos com linguagens de programação como PHP, Java, C#,
Python, Ruby, etc. e gerenciamos bancos de dados. Chamamos essa parte de back-end.
Os clientes, que podem ser qualquer dispositivo conectado à Internet como smartphones,
notebooks e tablets, recebem arquivos desses servidores, como imagens, vídeos, arquivos
HTML, CSS e JavaScript. Chamamos essa parte de front-end.
Tópicos interessantes
Internet
Rede de computadores conectados
Servidores
Computadores em algum lugar do mundo que fornecem serviços pela web
Clientes
Dispositivos que consomem serviços dos servidores
IP
Número que serve para a Identificação de dispositivos na rede, ex: 192.168.0.10
Nome de Domínio
Identificação mais legível de um computador na rede, ex: http://www.treinaweb.com.br
DNS
Sistema que traduz um nome de domínio para um IP
Hipertexto
Apresentação de informações de modo que o leitor tenha a liberdade de escolher o fluxo de
leitura
Navegadores (Browsers)
Softwares usados por clientes para navegar pela web, consumindo arquivos e serviços dos
servidores e interpretando HTML, CSS e JavaScript.
HTML
Linguagem de marcação de hipertexto, usada para estruturar documentos.
CSS
Folhas de estilo em cascata. O CSS é usado para estilizar elementos HTML, permitindo até
mesmo criar animações e efeitos 3D.
JavaScript
Linguagem de programação que pode ser interpretada pelo navegador para adicionar
comportamentos às páginas web.
HTML
<!DOCTYPE html>
<head>
<meta>
<title>
<body>
<!---->
Estruturas de Texto
Algumas tags não possuem o fechamento e podemos usar atributos em algumas tags para
elas fazerem algo de diferente
Tags de Títulos
<ins>(sublinhado) -vem de inserir, para mostrar algo que foi adicionado depois do texto ter
sido publicado.
<del> - vem de deletar, para mostrar algo que foi deletado do texto.
<small> - indica um texto pequeno, algo que não tem muita importancia.
<sup> - pode ser usado para fórmulas matemáticas ou para elevar um pouco o texto
<sub> - pode ser usado em fórmulas químicas, ele abaixa um pouco o texto.
<q> - indica uma tag para citação.
<p> - indica um paragrafo.
<span> - serve para reutilizar o texto, pode servir para estilizar o texto.
<br/> - serve para dar quebras de linhas
<wbr> - serve para quebrar linha em algum lugar específico do texto
<hr /> - serve como uma linha horizontal para separar textos
<code> - serve para representar códigos dentro do html
<time> - serve para colocar uma data específica.
<mark> - serve para marcar, como um marca texto.
<ruby> - usada junto com RT serve para colocar simbolos japoneses e seus significados
<bdo> Podemos utilizar para definir que o texto deverá ser renderizado em uma
determinada direção. O atributo “dir” no exemplo acima tem o valor “rtl” (Right to Left -
direita para esquerda), indicando que o texto será renderizado nesta direção,
Caracteres Especiais
Escapando caracteres especiais
a saída do código é <h1> - <h1>
Imagens
Para separarmos os arquivos podemos criar uma pasta para conter os arquivos de CSS,
JS e imagens (img)
<img> - serve para indicar que será colocada uma imagem ali
atributos
src - Indica o caminho que o navegador deve procurar a imagem
width - indica o comprimento da imagem
heigth - indica a altura da imagem
(Devemos usar as imagens dessa maneira para deixar os usuários terem uma melhor
experiência na usabilidade)
alt - serve como texto alternativo (se a imagens não carregou irá aparecer um texto.
Âncoras e Links
âncoras
<a> - serve para ancorar partes da pagina (ou outras paginas) no documento.
atributos:
href =”sobre.html”
o endereço de onde está o documento to
href = “#nome_do_id”
(para linkar uma informação que está na mesma página deve ser usado #nome_do_id)
criarmos um id para uma tag e a colocamos com a # para acessar)
href=”mailto:[email protected]”
redireciona para a criação do email
href=”tel{numero}
redireciona para um aplicativo de ligação
target =”blank”
serve para redirecionar para uma página em branco
rel="noreferrer noopener"
serve para não ser rastreável e não invadirem seu site
download="nome do arquivo"
serve para disponibilizar arquivos para downloads.
Listas
Lista ordenada
Indica uma lista ordenada por números ou letras. Para isso utilizamos a tag <ol> para criar a
lista, e cada item da lista é indicado pela tag <li>
<ol>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</ol>
Podemos passar um atributo “type” para a tag <ol> para indicar o tipo de ordenação que
queremos.
Listas de Descrição
Essas listas são formadas pela tag <dl>, e nelas a gente indica o nome de um termo(<dt>) e
depois listamos descrições sobre esse termo(<dd>);
<dl>
<dt>HTML</dt>
<dd>- HyperText Markup Language</dd>
<dt>CSS</dt>
<dd>- Cascading Style Sheet</dd>
</dl>
Progress
Podemos representar o progresso de algum processo com a tag de progresso. Passamos o
valor total do progresso no atributo “max”, e o valor do progresso em “value”.
<progress value="30" max="100" ></progress>
Meter
Podemos ter algo parecido com a tag <meter>. Também podemos indicar quais valores são
considerados altos e baixos com os atributos high e low.
<meter value="30" max="100" min="0" ></meter>
Tabelas
Tabelas servem para exibir dados tabulados. Para iniciar uma tabela utilizamos a tag
<table>.
Em seguida temos que definir uma linha. Linhas são definidas pela tag <tr>. Dentro de cada
linha temos as colunas, que são definidas pela tag <td>.
<table>
<thead>
<tr>
<th>Nome</th>
<th>Sobrenome</th>
<th>Idade</th>
</tr>
</thead>
<tbody>
<tr>
<td>João</td>
<td>Silva</td>
<td>28</td>
</tr>
<tr>
<td>Maria</td>
<td>Souza</td>
<td>23</td>
</tr>
</tbody>
</table>
formulários
Uma necessidade muito comum para desenvolvedores são locais onde o usuário possa
interagir com a página e enviar informações para serem processadas, como por exemplo,
um formulário de cadastro, um formulário de login ou um campo para pesquisa.
Essas formas de se comunicar com a página irão variar de acordo com a necessidade de
cada desenvolvedor. Em um determinado site podemos fazer um cadastro somente com
nome, e-mail e senha, já em outros sites pode haver a necessidade de obtermos várias
outras informações.
A tag de formulário (form) pode aceitar vários tipos de atributos, com os quais poderemos,
por exemplo, configurar como o formulário irá enviar as informações digitadas para o
servidor.
Accept-charset
o para definir qual o charset será utilizado pelo formulário. Por exemplo: utf-8
<form accept-charset="utf-8"></form>
Autocomplete
Sempre que definirmos o atributo autocomplete (auto completar), a medida em que usamos
os campos de um formulário o navegador irá começar a sugerir valores para o que estamos
digitando, com base em valores que foram digitados anteriormente. Por exemplo:
<form autocomplete="on">
<input type="text" name="email">
</form>
Action
Este atributo especifica para onde os dados do formulário serão enviados. Normalmente
será o link de uma página no servidor:
<form action="http://www.nosso-servidor.com.br/cadastro/usuario.php"></form>
method
Especifica o método do HTTP que será utilizado para a submissão (get ou post):
<form action="http://www.nosso-servidor.com.br/cadastro/usuario.php"
method="post"></form>
enctype
Específica quando os dados do formulário precisam ser codificados antes de serem
enviados ao servidor. ( Só funciona no método POST
<form action="http://www.nosso-servidor.com.br/cadastro/usuario.php" method="post"
enctype="multipart/form-data"></form>
novalidate
Impede a validação dos campos antes da submissão:
<form novalidate></form>
target:
Assim como na tag <a>, o target indica onde a página de destino será aberta.
<form target="_blank"></form>
Elementos
Os formulários possuem campos onde inserimos dados. Os campos mais comuns dos
formulários são criados pela tag <input />, que tem o atributo type onde indicamos o tipo de
campo que queremos. Vamos ver cada um deles:
Type text
Seleciona o tipo de dado que será informado no input
Para escrever um pequeno texto utilizamos a tag <input />. Note que ela não tem uma tag
de fechamento, ela mesma se fecha.
Quando não passamos o atributo type, por padrão ele será do tipo “text”, mas é uma boa
prática sempre passar o tipo.
<input type="text" />
Caso queira permitir que o usuário escreva mais de uma linha, utilize a tag
<textarea></textarea>
<textarea>Meu Texto</textarea>
No textarea podemos passar os atributos rows e cols para indicar quantas linhas e colunas
o campo irá exibir.
Esses tipos são idênticos ao tipo “text”. Em dispositivos que exibem teclado na tela, como
smartphones e tablets, esses tipos fazem com que o teclado exibido seja diferente. Um
exemplo é o tipo “email”, que exibe uma tecla @, ou “url” que exibe uma tecla “.com”.
Number
Indica um campo do tipo number. Em computadores o campo fica com botões para
aumentar e diminuir o número. Em dispositivos com teclado virtual é exibido um teclado
numérico
<input type="number" />
CheckBox
Diferente do Radio Button, onde só selecionamos uma opção, o CheckBox serve para
selecionarmos mais de uma opção.
<h2>Escolha quantas cores você desejar.</h2>
<form>
<input type="checkbox" name="cor1" /> Azul
<input type="checkbox" name="cor2" /> Vermelho
<input type="checkbox" name="cor3" /> Amarelo
</form>
Datas
Serve para selecionar datas e tempo.
Range
Permite que o usuário escolha um valor entre os valores mínimos e máximo passados
<input type="range" min="0" max="10" />
color
Abre uma paleta de cores para a seleção de uma cor
<input type="color" />
File
Permite que selecionamos um arquivo no nosso computador
<input type="file" />
Botões
button, submit e Reset
Esses tipos criam um botão.
<input type="button" value="Botão" />
O tipo “submit” é usado para que o usuário clique quando quiser enviar o formulário.
O tipo “reset” serve para quando o usuário quiser reiniciar o formulário. Cuidado, pois ao
clicar o formulário inteiro será apagado!
Select
A tag <select> nos permite criar uma lista onde podemos selecionar um item. Cada uma das
opções é criada pela tag <option>. O atributo “value” da tag option é o valor a ser enviado
ao servidor, e o valor escrito dentro da tag é o que será exibido ao usuário.
<select>
<option value="html">HTML 5</option>
<option value="css">CSS 3</option>
<option value="js">JavaScript</option>
</select>
DataList
Podemos ter um efeito parecido com a tag DataList, mas ela funciona em conjunto com a
tag input.
<input list="browsers" name="browser">
<datalist id="browsers">
<option value="Internet Explorer">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>
Note que a tag <datalist> também recebe um conjunto de <option>, mas ela também tem
um id para identificá-la. Enquanto isso, também temos um input de texto. Ele tem um
atributo “list”, onde passamos o id da nossa <datalist>.
Perceba que conforme a gente digita algo no input, as options de datalist aparecem como
um autocomplete.
Fieldset e Legend
Serve para criarmos um campo dentro do formulário para poder melhor organizar os
campos. A tag <legend> serve para darmos um título à seção.
<fieldset>
<legend>Cadastro</legend>
Nome: <input type="text"><br>
Email: <input type="text"><br>
</fieldset>
Label
Esta tag serve para darmos nomes aos campos. Se passarmos o id do input no atributo
“for”, estaremos indicando ao navegador que o Label é referente àquele campo. Quando o
usuário clicar no texto do Label, o input receberá foco, permitindo que o usuário já entre
com os dados.
<form autocomplete="on">
<label for="email">Email</label>
<input type="text" id="email">
</form>
Output
Esse campo serve para exibirmos a saída de alguma entrada.
<form oninput="x.value=parseInt(a.value)+parseInt(b.value)">
0 <input type="range" id="a" value="50"> 100
+
<input type="number" id="b" value="50">
=
<output name="x" for="a b"></output>
</form>
Neste exemplo, utilizamos o range e um campo de número que o usuário pode mudar à
vontade. Conforme os valores forem alterados, o campo output exibe o resultado da soma
que fizemos por JavaScript
áudio
A tag de áudio permite colocarmos um player para sons e músicas na nossa página.
<audio controls>
</audio>
O atributo “controls” indica que os controles, como play/pause, devem ser exibidos.
Cada navegador suporta certos tipos de arquivos de áudio, por isso é comum passarmos
mais de uma tag <source>.
A tag <source> é onde indicamos o arquivo a ser executado. Caso o navegador não
reconheça um tipo de arquivo, ele irá ler o próximo.
Outros atributos muito usados são o autoplay, que faz a mídia ser executada assim que for
carregada, e o loop, que indica se a mídia deve reiniciar assim que ela acabar de ser
executada.
Video
A tag <video> funciona da mesma maneira que a tag <audio>, com a diferença que a tag
também aceita os atributos width e height, assim como a tag <img />, para que possamos
definir largura e altura do vídeo.
</video>
Um atributo muito usado também é o “poster”. Nele nós podemos passar o endereço de
uma imagem que será exibida enquanto o vídeo carrega, ou enquanto o usuário não der
Play.
Semântica
Quando criamos uma página, precisamos marcar o que cada elemento dentro dela
representa e qual é o papel de cada uma das estruturas ali presentes.
Mas dentro de uma página, nunca criamos somente um botão ou um texto simples. Sempre
criamos elementos mais complexos, elementos formados por outros elementos, como por
exemplo um cabeçalho que pode conter um texto, um menu com vários botões, e assim por
diante.
Search Egines
Search Engines, ou Motores de Busca, são softwares que varrem a Web para indexar
páginas, permitindo que as pessoas encontrem esta página baseando-se em uma pesquisa,
como é o caso do Google, Yahoo! e Bing.
Isso fazia com que as pessoas não tivessem os melhores resultados em suas pesquisas.
Com o tempo, os motores de busca começaram a utilizar outras estratégias para o retorno
dos resultados, como utilizar inteligência artificial para descobrir as melhores palavras-
chaves automaticamente, números de acessos da página, números de sites que
referenciam aquela página. Esses e muitos outros pontos são utilizados hoje como base
para medir a importância e relevância de sites, colocando-os como primeiros resultados das
buscas.
É nessa parte que entram os robôs dos motores de buscas. Eles medem todos esses
pontos analisando a página. Mas esses robôs não são pessoas que olham para uma
página, enxergam um botão e sabem que aquilo é algo para se clicar.
Os robôs analisam o código. Por isso, um código escrito com boa semântica faz os robôs
entenderem melhor a estrutura da sua página, podendo colocar o site em melhores
posições nos resultados de pesquisas.
Melhorando a Semântica
Antes era muito comum a criação de layouts utilizando a tag <table>. Isso hoje em dia é
visto como um erro grave, pois tabelas são utilizadas para exibir dados.
Com o avanço do CSS, as pessoas começaram a parar de usar tabelas e a utilizar a tag
<div> para criar os layouts. A tag <div> serve para criarmos divisões. Ela não exibe nada, a
menos que a gente estilize-a com CSS.
O problema é que as pessoas começaram a usar a tag <div> para tudo, o que no final das
contas não melhorou a semântica em relação a usar <table>. Com o HTML5, novas tags
foram criadas para dar mais significado ao código. Imagine a estrutura do seguinte blog:
</div>
</div>
<div class="conteudo-secundario" >
</div>
<div class="conteudo-principal" >
<div class="post" >
</div>
</div>
<div class="rodape" >
</div>
</main>
</footer>
Div e Span
Como dito antes, a tag <div> não exibe nada, a menos que a gente estilize algo com CSS.
As demais tags também são assim. Servem apenas para fazermos divisões.
Assim como a <div>, a tag <span> também não tem um significado. A diferença é que a
<div> é um elemento de bloco, o que significa que preenche uma linha inteira, ou seja,
elementos após a <div> serão exibidos na linha de baixo.
A tag <span> é um elemento de linha, o que significa que os elementos seguintes a ela
virão na sua frente caso ainda haja espaço na linha. Portanto, caso queira marcar algo no
meio de um texto, sem pular linha, rodeie o texto com uma tag <span>.
abbr
Define uma abreviatura ou sigla. Pode ajudar buscadores e tradutores a entenderem que o
texto não se trata de uma palavra completa.
A <abbr title="União Nacional dos Estudantes" >UNE</abbr> esta semana anunciou que …
Adress
</address>
Article
Aside
</aside>
Code
Define um pedaço de código de computador
<code>
var counter = 0;
</code>
Details e Summary
Este aqui apresenta uma pequena alteração na exibição do que o usuário enxerga.
A tag <details> serve para acrescentar detalhes adicionais sobre algo, mas essa informação
fica escondida, sendo exibida apenas quando o usuário clicar para ler.
A tag <summary> serve para exibir um título para o <details>, que ficará sempre visível.
<details>
<summary>Lista de Cursos</summary>
<ul>
<li>HTML5 e CSS3</li>
<li>JavaScript</li>
<li>Node.js</li>
</ul>
</details>
dfn
Marca a definição de um termo. Espera-se que conteúdo mais próximo contenha a definição
do termo que estiver dentro dessa tag.
Com isso, buscadores podem procurar pela definição de uma palavra caso alguém
pesquise por algo como “O que é HTML?”. Faça essa pesquisa no Google e veja que além
dos resultados, ele também te retorna uma resposta com a definição do termo.
Dialog
A tão esperada tag <dialog> serve para criarmos modais (aquelas janelinhas que abrem em
cima do conteúdo principal).
Meu Texto
<dialog open > Minha Modal </dialog>
Footer
Define um rodapé para o documento ou seção.
<footer>©TreinaWeb Tecnologia LTDA</footer>
Header
<article>
<header>
Main
Define a parte principal de um documento. Por ser algo indicado como principal, o conteúdo
dessa tag deve ser único e ela não deve ser filha de tags como <article>, <footer>,
<header> ou <nav>.
<main>
<h1>Notícias do Dia</h1>
<article>
<h1>Novo curso de JavaScript</h1>
<p>Conheça o novo curso de . . . </p>
</article>
<article>
<h1>Chrome lança nova funcionalidade</h1>
<p>O navegador lançou ontem uma nova maneira de . . . </p>
</article>
</main>
Nav
Define um grupo de links de navegação. Essa tag é muito utilizada nos menus utilizados
para se navegar entre as páginas de um site.
Section
Define seções no documento, como capítulos, cabeçalhos, rodapés, etc.
Time
Essa tag é utilizada no meio de textos, e define data/hora.
Pode ser utilizado para que softwares encontrem facilmente datas nos documentos,
podendo utilizá-las para melhorar pesquisas ou se oferecer para guardar aquela data em
alguma agenda.
O conteúdo da tag é o tempo apresentado ao usuário, o que ele irá ler. A tag também pode
receber o atributo datetime, que representa essa mesma data/hora no formato que
computadores entendam.
E se quisermos criar uma aplicação educacional com uma seção de vídeos sobre
determinada matéria? Poderíamos utilizar a API de busca de vídeos do YouTube em nossa
aplicação e exibir uma lista de vídeos do assunto no nosso aplicativo.
Algumas dessas APIs não são mais consideradas pertencentes ao HTML5, mas é
importante conhecermos para quando formos desenvolver uma página.
JavaScript
Podemos criar efeitos, capturar cliques do mouse, eventos de teclado, alterar o HTML e
CSS, etc.
Possibilidades
Nas aulas seguintes conheceremos algumas funcionalidades que deixarão nossas páginas
mais poderosas.
Veremos como controlar áudio e vídeo, permitir arrastar e soltar elementos, salvar dados na
página, desenhar, reaproveitar HTML criando componentes, etc.
Basicamente, com o poder do HTML5 e JavaScript, hoje em dia é possível criar mais do
que simples páginas. Podemos criar grandes softwares instalados em nossos PCs,
sistemas web, aplicativos mobile, jogos, etc.
Ambiente
Até agora podíamos simplesmente abrir nossos arquivos HTML direto no nosso navegador.
Algumas das funcionalidades que serão mostradas aqui não podem ser executadas
diretamente de um arquivo por razões de segurança.
Para isso, precisamos que os nossos arquivos sejam servidos por um servidor.
Uma maneira simples é utilizar o "http-server", um módulo que podemos instalar pelo
Node.js.
Após esse comando ser executado, teremos um servidor de arquivos estáticos para poder
servir os nossos arquivos.
Para iniciar o servidor, basta abrir o seu terminal na pasta com os seus arquivos e executar
o comando "http-server"
Isso iniciará um servidor, normalmente na porta 8080. Caso esta porta esteja sendo
utilizada, outra será escolhida. Uma mensagem no próprio console dirá onde seus arquivos
estarão disponíveis.
Basta acessar o endereço pelo seu navegador e poderemos acessar nossos arquivos
normalmente. Caso seja a porta "8080", o endereço será "localhost:8080"
Controle de audio e video
O HTML5 possibilitou que colocássemos áudio e vídeo de forma nativa em nossas páginas,
dispensando a necessidade de instalarmos plugins nos navegadores para podermos
desfrutar de determinado tipo de mídia.
Além disso, o HTML5 disponibiliza uma API para podermos ter total controle de áudio e
vídeo a partir do JavaScript, o que nos permite criar uma integração entre nossa mídia e
nossa página.
Vamos ver como controlar essas mídias e até como criar um pequeno player.
Para focarmos nas APIs, o CSS não será apresentado, mas você pode baixá-lo depois para
poder seguir a aula.
Criando o elemento
O primeiro passo é criar o elemento de vídeo na nossa página. Vamos simplesmente criar
um elemento <video> sem o atributo de controle, pois nós iremos criar nossos próprios
controles.
<video src="meu_video.mp4" id="myVideo" width="300" height="170" controls ></video>
Agora que temos um elemento com o nosso vídeo podemos pegar uma referência dele por
JavaScript.
var myVideo = document.getElementById('myVideo');
Guardamos o elemento com o nosso vídeo na variável "myVideo". Com ela nós podemos
acessar propriedades, métodos e eventos relacionados ao vídeo. Lembrando que essas
propriedades, métodos e eventos também estão disponíveis quando você estiver
trabalhando com áudio.
Propriedades
Eventos
Os eventos são ações que o nosso elemento fica observando. Nós passamos uma função
com o código que deve ser executado em cada situação. Quando determinada ação
ocorrer, nossa função é executada. Aqui listamos os principais eventos relacionados às
mídias.
Controlando a Mídia
Vimos nas tabelas anteriores que temos como obter muita informação e controle das
nossas mídias. Como tudo estará sendo controlado por JavaScript, não é difícil perceber
que podemos ter um grande poder de integração entre nossa página e mídia.
Que tal criarmos o nosso Player? Ele terá efeitos no vídeo de acordo com ações do usuário.
Vamos brincar com as possibilidades para ver o poder das APIs em ação.
O Drag & Drop (Arrastar e Soltar) é uma funcionalidade muito utilizada para melhorar a
experiência do usuário.
Você pode pensar no seu próprio sistema operacional. Quantas vezes você quis alterar um
arquivo de lugar e simplesmente arrastou o ícone do arquivo para o destino desejado? É
algo simples e intuitivo, e por isso algumas aplicações incluem a possibilidade de arrastar e
soltar elementos.
Antes a gente precisava utilizar muito código JavaScript para criar essa funcionalidade. Era
muito comum o uso de plugins para jQuery que foram criadas para criar essa ação nas
páginas.
Com o HTML5 isso se tornou muito mais simples. Ainda precisamos de JavaScript, mas é
bem menos, a ponto de não precisarmos mais de bibliotecas para fazer este efeito.
Arrastar elementos
Vamos utilizar uma imagem aqui no nosso exemplo. Teremos duas caixas, e poderemos
pegar a imagem e soltar na outra caixa.
Qualquer elemento pode ser arrastável. No nosso exemplo, apenas a imagem será.
Para tornar um elemento arrastável, basta acrescentar a propriedade "draggable" à sua tag
igual a true.
Então no código acima nós criamos a nossa tag de imagem com o atributo "draggable" com
o valor "true" para que ela possa ser arrastável.
Agora precisamos indicar o que acontece quando um elemento é arrastado. Para isso
iremos criar uma função chamada "dragStart" e acrescentar à tag marcada como arrastável,
<img>, pelo evento "ondragstart".
<img src="logo.png" id="minhaImagem" draggable="true" ondragstart="dragStart(event)" />
function dragStart(event){
event.dataTransfer.setData('text', event.target.id);
}
No script acima, nós pegamos o objeto "event", o qual contém informações sobre o evento
realizado, e pegamos o objeto "dataTransfer". O "dataTransfer" é um objeto utilizado para
carregar os dados do que está sendo arrastado.
Nós utilizamos a sua função "setData" para salvar um dado. Primeiro passamos o tipo do
dado e o valor dele. Estamos salvando o ID do elemento <img>, então passamos que o tipo
é "text" e o valor é o ID do evento alvo do evento (target).
Soltando elementos
Agora vamos fazer com que nossas caixas permitam que algo seja solto nelas.
Normalmente os elementos não podem ser soltos em qualquer lugar, então temos que
evitar esse comportamento padrão quando o nosso elemento arrastável estiver sendo
arrastado sobre as caixas.
Por último, basta programarmos o que irá ocorrer quando o elemento for finalmente solto
nas nossas caixas. Para isso iremos criar a função "drop" e acrescentar às nossas caixas
pelo "ondrop"
.
<div class="drop-area-container" >
<div class="drop-area" ondragover="allowDrop(event)" ondrop="drop(event)"></div>
<div class="drop-area" ondragover="allowDrop(event)" ondrop="drop(event)"></div>
</div>
function drop(event){
var imageId = event.dataTransfer.getData('text'),
image = document.getElementById(imageId);
event.target.appendChild(image);
}
Na função "drop()" recebemos um evento, que é o próprio "drop". Ele possui o elemento
alvo (target) do evento, que é a caixa onde estaremos soltando a nossa imagem.
Então, primeiro nós pegamos o ID da imagem que estava guardado no "dataTransfer". Pelo
ID nós pegamos o próprio elemento da imagem.
Em seguida nós pegamos a caixa onde soltamos o elemento, que está em "event.target".
Utilizamos a função "appendChild" e passamos a imagem. Com isso o elemento da imagem
será inserido dentro do elemento alvo.
Então vimos que com poucas linhas de código nós podemos criar o efeito de Drag & Drop
facilmente.
Com o Application Cache podemos fazer com que nossa aplicação funcione mesmo quando
o usuário estiver sem conexão com a Internet.
Isso é muito útil, pois com a possibilidade de acessarmos páginas e aplicações de qualquer
dispositivo e lugar, muitas vezes estamos sem conexão.
Além do acesso offline, com o App Cache a página também será carregada mais
rapidamente, já que os arquivos necessários serão armazenados na máquina do usuário.
Com isso também há uma diminuição de acessos ao servidor, já que o navegador só irá
baixar novos arquivos ou arquivos que precisam ser atualizados.
A diferença com o cache comum é que com o App Cache nós especificamos quais os
arquivos serão armazenados.
Cada navegador tem diferentes tamanhos para o limite de dados cacheados. Alguns ficam
por volta de 5MB por site.
Cache Manifest
Para fazer com que o cache comece a ser armazenado temos que criar um arquivo de
manifesto. Ele que irá indicar os arquivos que devem ser armazenados na máquina do
usuário.
A primeira linha, "CACHE MANIFEST", é obrigatória. Ela que indica o começo do arquivo.
Linhas iniciadas com "#" são apenas comentários, mas podem nos ajudar a versionar o
nosso cache.
O cache só é atualizado quando o Manifest é alterado. Então podemos criar uma linha,
como na imagem acima, com uma data ou número de versão. Quando alterarmos algum
HTML, CSS, imagem, etc, podemos alterar a nossa linha de comentário para forçar o
navegador a atualizar os arquivos.
Agora que já sabemos como criar o nosso arquivo de manifesto, Cache Manifest, temos que
indicar ao navegador que o arquivo de manifesto deve ser utilizado.
Para isso, basta fazer uma referência ao arquivo de manifesto pelo atributo "manifest" na
tag <html>.
Este atributo deve ser inserido em todas as páginas em que se queira armazenar, do
contrário, o navegador não irá guardar o arquivo em cache, a menos que você liste o
arquivo no próprio Manifest.
Note que no nosso manifesto, não incluímos o "index.html". Isso porque ele possui o
atributo "manifest" na tag <html>. Isso já faz o navegador guardá-lo automaticamente.
Atualizando o cache
Após ter os arquivos armazenados em cache, ele irá continuar até que uma destas
situações ocorra:
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
window.applicationCache.swapCache();
window.location.reload();
}
}, false);
Dentro nos asseguramos que o estado dele está certo. Então executamos a função
"swapCache()", que força a troca do cache.
Para que essa função tenha efeito, é necessário baixar os novos arquivos, então
executamos "location.reload()" para que a página recarregue, e assim, baixando os arquivos
atualizados e armazenando o novo cache.
Eventos do AppCache
Além do "updateready" que vimos anteriormente, também há como criarmos outros listeners
para o AppCache.
cached disparado após o primeiro cacheamento do manifesto
obsolete disparado quando o manifesto retornar 404 ou 410. Isso faz com que o
cache da aplicação seja apagado
Armazenamento de Dados
Quando desenvolvemos páginas que vão além de apenas exibir informações, normalmente
precisamos que elas armazenem alguns dados.
Vamos ver cada uma das maneiras possíveis de se armazenar dados no navegador.
Cookies
Após fazermos uma requisição ao servidor, a conexão é fechada e o servidor não saberá
quem somos nós quando fizermos uma nova conexão.
Os Cookies são armazenados em uma string onde há o nome, valor e data de expiração.
Quando a data é atingida, o Cookie é apagado automaticamente.
Criando Cookies
Para criar um Cookie basta acessar o objeto "cookie" presente em "document" e passar
uma string contendo o nome e valor do Cookie que se deseja criar.
document.cookie = "nome=TreinaWeb";
document.cookie = "sobre=Cursos Web";
Alterando Cookies
Para alterar um Cookie, basta alterar o valor dele.
document.cookie = "sobre=Vários Cursos Web";
Lendo Cookies
Para ler um Cookie, basta chamar o "document.cookies". Isso irá retornar uma string com
todos os cookies e seus valores.
var cookies = document.cookies;
Removendo Cookies
Para apagar um Cookie, basta defini-lo com uma data de expiração que já passou. Assim
ele será apagado
document.cookie = "sobre=; expires= Thu, 01 Jan 1970 00:00:00 UTC";
Note que o valor do Cookie nem precisa ser especificado, apenas o nome.
.
A primeira função serve para criarmos um Cookie. Passamos para ela o nome, valor e
quantidade de dias até a expiração.
Dentro da função, a string para a criação do Cookie é gerada com as informações que
passamos para a função.
A segunda função serve para retornar o valor do Cookie de acordo com o nome, ao invés
de retornar uma string com todos os Cookies armazenados.
Nós passamos o nome do Cookie para a função e ela procura na string pelo nome e seu
respectivo valor. Caso não seja encontrado, retorna uma string vazia.
WebStorage
Com o WebStorage podemos armazenar strings maiores, de maneira mais segura e sem
afetar a performance da página.
Diferentes dos Cookies, os dados no WebStorage não são enviados ao servidor e nem
possuem uma data de expiração.
Salvando Dados
Para se salvar um dado, basta utilizar a função "setItem", passando o nome do dado e o
seu valor.
localStorage.setItem("nome", "treinaweb");
Caso precise atribuir um valor com o mesmo nome de um atributo do objeto localStorage,
utilize a função setItem. localStorage.setItem("setItem", "5") funcionará, mas
localStorage.setItem = "5" irá sobreescrever uma função do objeto.
Alterando Dados
Para alterar um dado, basta atribuir um novo valor ao nome do campo.
localStorage.nome = "TreinaWeb";
Lendo Dados
Para ler dados, basta utilizar a função "getItem()" e passar o nome do dado que se quer.
localStorage.getItem("nome");
Caso precise retornar um valor com o mesmo nome de um atributo do objeto localStorage,
utilize a função getItem. localStorage.getItem("getItem" funcionará, mas
localStorage.getItem irá retornar a função do objeto.
Apagando Dados
Para apagar um determinado dado do localStorage, basta utilizar a função "removeItem()"
com o nome do dado a ser apagado
localStorage.removeItem("nome");
Se estivermos em uma única página, realmente não faz diferença. Mas caso a gente vá
para uma outra página, as variáveis são apagadas, enquanto o SessionStorage só é
apagado se fecharmos a página.
IndexedDB
O WebStorage é bom para pequenas porções de dados, e por ser síncrona pode travar a
navegação se tiver muitos dados.
O evento "onupgradeneeded" é executado sempre que uma versão nova do banco for
aberta. Dentro dele nós criamos uma store, onde iremos armazenar nossos dados.
Passamos o nome da Store, "Cursos", e o nome da chave pela qual iremos fazer operações
de busca.
O evento "onsuccess" é executado sempre que a página é aberta. Pegamos o banco, que é
retornado dentro de "event.target.result", e guardamos na variável db. É por ela que
faremos as operações do banco.
Adicionando Dados
var transaction = db.transaction(["Cursos"], "readwrite");
var store = transaction.objectStore("Cursos");
store.add({"id": 1, "nome": "Angular"})
Primeiro criamos uma transação, passando a coleção e uma permissão de leitura e escrita.
Lendo Dados
var transaction = db.transaction(["Cursos"], "readwrite");
var store = transaction.objectStore("Cursos");
var request = store.get(1);
request.onsuccess = function(event){
console.log(request.result)
}
No código acima acessamos a Store da mesma maneira que fizemos para inserir um dado.
Então utilizamos a função "get()" e passamos o código do dado que queremos.
Isso irá retornar uma request, a qual passamos uma função para o método "onsuccess",
que será executado assim que o dado for retornado, estando dentro de "request.result".
Alterando Dados
Para alterar algum dado basta obtê-lo com "get()", como explicado no exemplo acima,
alterá-lo e utilizar a função "put()".
Removendo Dados
var transaction = db.transaction(["Cursos"], "readwrite");
var store = transaction.objectStore("Cursos");
store.delete(1);
Para remover os dados basta fazer a mesma operação de antes para se obter a store, mas
ao invés de fazer a operação "get()", fazemos a operação "delete()", passando o código do
item que queremos apagar.
Leitura de Arquivos
Antes, quando queríamos interagir com algum arquivo, era necessário enviar o arquivo para
o servidor, fazer a leitura e enviar uma resposta ao cliente.
Hoje em dia é possível fazer tudo isso no próprio navegador. Vamos ver passo a passo
como trabalhar com arquivos.
Vamos começar carregando um arquivo. Para isso utilizamos a tag <input> do tipo "file".
ambém inserimos um atributo "accept". Nele nós podemos passar o tipo de arquivo que
iremos aceitar. No caso, apenas arquivos com extensão ".txt".
O <input> do tipo "file" também aceita o atributo "multiple" para indicar que aceitamos vários
arquivos, mas neste exemplo iremos aceitar apenas um mesmo.
Teremos um arquivo do tipo ".txt" com um conteúdo qualquer para o nosso exemplo.
Lendo Arquivos
Agora que já permitimos a seleção de um arquivo, vamos fazer a leitura dele. Para isso
precisamos de um pouco de JavaScript.
Quando um <input> possui um ou mais arquivos selecionados, ele irá popular um objeto
chamado "files" com os arquivos selecionados.
Como demos um ID para o nosso <input>, podemos facilmente acessar esses arquivos
com:
document.getElementById(‘myFile’).files;
Com esse objeto podemos ter ideia da quantidade de arquivos selecionados, nome,
tamanho, tipo e data de modificação de cada arquivo.
Vamos começar a fazer a leitura então. A leitura irá ocorrer assim que selecionarmos um
arquivo, ou seja, quando o valor de <input> alterar.
reader.readAsText(myFile);
}
Como o processo de leitura é assíncrono, vamos passar uma função que indica o que
deverá acontecer quando o arquivo terminar de ser lido. Isso é passado no "onload" do
objeto "reader".
Dentro da função passada no "onload" nós guardamos o resultado da leitura numa variável
chamada "content". Ela armazenará o conteúdo do nosso arquivo de texto.
Salvando arquivos
Agora que temos o conteúdo do nosso arquivo num <textarea>, podemos alterar o
conteúdo do arquivo. Por medidas de segurança não podemos alterar o arquivo da máquina
do usuário diretamente, mas podemos disponibilizar o arquivo alterado por meio de
download.
É assim que editores online como Google Docs e Microsoft Word funcionam. Você pode
fazer upload de um arquivo, alterar e depois fazer o download.
No nosso caso será um download rápido, já que não estamos pegando um arquivo de um
servidor, pois esse tempo todo o arquivo está na memória da própria máquina do usuário.
A tag de âncora (<a>) permite que a gente faça downloads. Basta passar o endereço de um
arquivo e acrescentar o atributo "download" à tag.
Não temos uma url para passar, já que não estamos falando de um arquivo que está em um
servidor. O que podemos fazer é transformar o conteúdo do nosso arquivo em Base64 e
passá-la para a nossa âncora.
Vamos criar um botão que irá chamar a função "saveFile()". Essa função irá criar uma
âncora na memória do navegador, transformar o conteúdo do nosso arquivo em Base64 e
iniciar o download.
function saveFile(){
var element = document.createElement('a'),
content = document.getElementById('fileContent').value;
element.setAttribute('href', 'data:plain/text;charset=utf-8,' +
encodeURIComponent(content));
element.setAttribute('download', 'myNewFile.txt');
element.click();
}
Depois adicionamos o atributo "download" à nossa âncora. O valor será o nome do arquivo
a ser baixado, "myNewFile.txt".
Por último, demos um clique no nosso elemento <a> para que o download seja iniciado.
E com isso conseguimos selecionar arquivos, ler seu conteúdo, alterar e salvar sem
precisar de um servidor.
Além de textos, também é possível trabalhar com imagens, áudios, vídeos, pdfs, etc. São
inúmeras possibilidades.
Canvas
O elemento <canvas> é utilizado para se desenhar elementos gráficos em uma página com
JavaScript.
Podemos utilizar para a criação de gráficos, animações com interações do usuário, etc.
Criando Canvas
Para se criar um Canvas basta declararmos a tag, indicar as dimensões e um ID, que
utilizaremos para acessá-lo pelo JavaScript.
<canvas id="meuCanvas" width="400" height="300"></canvas>
Isso é tudo o que teremos de HTML. Agora vamos pegar esse elemento e armazenar em
uma variável.
Desenhando
Imagine que temos um cursor posicionado no nosso Canvas, e posicionamos ele pelas
posições X e Y, sendo a posição (0,0) o topo esquerdo.
Desenhando Linhas
ctx.moveTo(5, 5);
ctx.lineTo(100, 300);
ctx.stroke();
Em elementos que podem ser preenchidos, podemos utilizar a função "fill()" ao invés de
"stroke()" para preencher o elemento.
Podemos alterar a cor com "fillStyle".
ctx.arc(200,150,60,0,2*Math.PI);
ctx.fillStyle = "#FF0000";
ctx.fill();
Desenhando Retângulos
Para retângulos, temos a função "strokeRect" e "fillRect"
ctx.strokeRect(15, 25, 300, 250);
● Posição X do início;
● Posição Y do início;
● Posição X do final;
● Posição Y do final.
Desenhando Textos
ctx.font = "30px Arial";
ctx.fillStyle = "blue";
ctx.fillText("TreinaWeb", 150, 150);
Para se trabalhar com textos podemos configurar a fonte e então utilizamos a função
"fillText()" para se escrever com letras preenchidas.
Ambas as funções recebem três parâmetros:
Desenhando Gradientes
O gradiente é uma estilização, então podemos juntá-lo com as funções descritas acima.
Vamos ver como criar um retângulo gradiente utilizando a função "fillRect", mas você
também pode utilizar com a função de textos, arcos, etc.
ctx.fillRect(50,50,250,200);
Desenhando Imagens
Também podemos inserir imagens no Canvas.
Animações
Então para isso, basta que a gente apague o canvas antes da nova ação de desenho.
Podemos criar um looping que irá alterar a posição de onde nossa imagem será desenhada,
fazendo assim, uma simulação de movimento.
As pessoas costumavam utilizar a função "setInterval()" para fazer isso, mas hoje em dia é
preferível utilizar a função "requestAnimationFrame()".
Vamos fazer um simples exemplo, onde mudaremos a posição X da nossa imagem para dar
a impressão de que ela está se movendo pelo nosso Canvas.
var posX = 0;
var img = document.getElementById('logo');
function drawLogo(){
window.requestAnimationFrame(drawLogo);
ctx.clearRect(0,0,meuCanvas.width,meuCanvas.height);
ctx.drawImage(img, posX, 50);
posX += 5;
if(posX > meuCanvas.width){ posX = -150; }
}
drawLogo();
Criamos uma função que desenha a nossa imagem. No começo ela chama o
"requestAnimationFrame()", o qual chama a própria função de desenho, criando um looping.
Para podermos ficar vendo a repetição da nossa animação, verificamos que se a posição X
estiver maior do que a largura do Canvas (o que significa que a imagem já saiu dele),
voltamos a posição X para um lugar antes do 0 para que nossa imagem possa entrar no
Canvas novamente.
Podemos pegar o conteúdo do canvas como uma imagem e até possibilitar o download do
arquivo pelo usuário.
O Canvas nos fornece uma função chamada "toDataURL()". Isso irá retornar a imagem
atual do canvas em um formato chamado Base64, que é uma grande String.
Essa String pode ser passada tanto na propriedade "src" do elemento <img> como também
pode ser passado no "href" do elemento <a>.
Quando temos um elemento <a> com o atributo "download". o conteúdo de "href" será
baixado, como vimos em aulas anteriores.
element.setAttribute('href', img);
element.setAttribute('download', 'myImage.png');
element.click();
SVG
O SVG (Scalable Vector Graphics) é uma linguagem XML que utilizamos para a criação de
imagens vetoriais. Mas, o que são essas Imagens Vetoriais? Qual a vantagem de utilizá-
las?
Bitmap
As imagens com as quais costumamos trabalhar ( do tipo PNG, JPEG, GIF, etc ) são
conhecidas como Imagens Bitmap. Isso porque são basicamente um mapa de bits.
Essas imagens são compostas de vários pixels coloridos, pequenos quadradinhos que
juntos formam uma imagem.
É por isso que quando redimensionamos essas imagens, ou quando damos zoom, vemos
vários quadradinhos e dizemos que a imagem fixou "pixelada". Conforme redimensionamos,
essas imagens perdem a qualidade.
Vetoriais
Diferente das imagens bitmap, as imagens vetoriais não são compostas por pixels. Elas são
compostas por fórmulas matemáticas que descrevem formas.
Já que não possuem pixels e as formas são criadas a partir de cálculos matemáticos, basta
alterarmos alguns valores para redimensionar essas imagens, o que resulta em novos
cálculos baseados nas mesmas fórmulas, formando a mesma imagem com um tamanho
diferente.
Isso significa que as imagens vetoriais nunca perdem qualidade, não importa se deixarmos
a imagem do tamanho da cabeça de um alfinete ou do tamanho de um grande prédio.
Aqui temos algumas vantagens e desvantagens de cada um dos tipos para podermos
pensar qual o melhor a se usar em cada situação.
Bitmap
Vantagens:
Desvantagens:
● Arquivos mais pesados, pois cada pixel deve ter as informações de cor e posição em
que deve ser apresentado;
● Ao ampliar a imagem, o pixel fica maior, fazendo a imagem perder qualidade.
Vetores
Vantagens:
Desvantagens:
● Precisa de mais processamento para leitura, já que são feitos cálculos para poder
apresentar as formas;
● Não dá para ter todos os detalhes de cada ponto que seriam necessários para algo
como uma fotografia.
Como os computadores e dispositivos móveis hoje em dia são rápidos, essa ideia de tempo
de leitura não faz muita diferença.
Em geral podemos dizer que imagens que precisam de detalhes ( como fotografias e
objetos gráficos com muitas cores ) precisam ser em bitmap.
Podemos criar imagens vetoriais em softwares, como Adobe Illustrator e Inkscape, e salvar
no formato SVG. Mas também é importante entender como é a estrutura de uma imagem
SVG para podermos tirar total vantagem de imagens vetoriais em nossas páginas.
Tanto o SVG quanto o HTML são arquivos que seguem o formato XML, então você verá
muitas semelhanças.
Vamos criar um arquivo "index.html" e escrever nosso SVG no corpo dele mesmo.
Para declarar um SVG nós utilizamos a tag <svg> com as propriedades de largura e altura.
Dentro dele nós declaramos um círculo, e então passamos algumas propriedades para o
navegador saber como apresentar o círculo:
A única diferença aqui é que incluímos o atributo "xmlns" na tag <svg>, que é um
namespace.
No nosso arquivo HTML, basta chamarmos o nosso arquivo como uma imagem comum:
<img src="mycircle.svg" />
E com isso poderemos trabalhar com o SVG como se fosse uma imagem normal, com a
diferença de que quando redimensionamos não temos perda de qualidade.
Porém, desta maneira não poderemos mexer com os elementos do SVG, pois agora ele
será visto como uma imagem comum.
● <rect>;
● <ellipse>;
● <line>;
● <polyline>;
● <polygon>;
● <path>.
Podemos estilizar cada elemento do nosso SVG com CSS. Muitas propriedades são
diferentes das propriedades do CSS que conhecemos, mas são basicamente o nome das
propriedades dos elementos do SVG como fill, stroke-width, stroke, etc.
<svg width="200" height="200">
<circle style="stroke: red; stroke-width: 10; fill: green; cx: 100; cy:100; r: 40;" />
</svg>
Para melhor organização, é recomendado pensar no SVG assim como um HTML: separar
estrutura de estilização. Então podemos criar um ID para o nosso círculo e criar um CSS
separado.
#myCircle{
stroke: red;
stroke-width: 10;
fill: green;
cx: 100;
cy: 100;
r: 40;
}
Podemos até mesmo criar transições e animações com CSS. Muitas pessoas preferem
utilizar SVG para a criação de animações e efeitos gráficos que seriam mais complicados
apenas com HTML para poder compor seus designs.
O HTML também possui Pré Processadores. Os mais famosos são o Haml e o Pug
(conhecido como Jade até dezembro de 2015).
Além de tentar facilitar a criação de HTML, estes Pré Processadores também tentam fazer
com que o nosso código seja mais limpo, sem repetições e fácil de ler. Por isso eles
normalmente possuem uma sintaxe bem diferente do HTML.
Caso queira testar agora os exemplos apresentados aqui, mesmo sem precisar instalar ou
configurar nada, nestes sites você pode escrever o seu código e ver como ficará a saída:
div
Resultará em:
<div></div>
Caso queira inserir IDs e classes, basta utilizar a sintaxe que utilizaríamos para criar um
seletor CSS
div#minhaDiv.classe1.classe2
Resultará em:
div#minhaDiv.classe1.classe2
Quando queremos colocar um elemento dentro do outro, basta ir para a linha de baixo e dar
espaço. Neste caso os espaços são importantes.
ul
li
li
Note que como os "li" estão com a mesma quantidade de espaços, isso indica que estão no
mesmo nível, e não um dentro do outro. Mas como eles estão com mais espaço do que "ul",
isso indica que estão dentro dele.
Será:
<input type="checkbox" name="agreement" checked="checked" />
Evitando Repetições
Muitas vezes precisamos ficar repetindo elementos. Com o Pug podemos escrever meno
ul
each numero in [1, 2, 3, 4, 5]
li= numero
será:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
Veja só. Escrevemos bem menos código. O "each" começa um laço de repetição, e então
passamos uma lista com os itens que queremos jogar nos nossos elementos. Cada um dos
itens será jogado na variável que criamos. Neste exemplo demos o nome de "numero".
Para que um elemento tenha uma variável como conteúdo, basta utilizar o "=" na frente do
nome do elemento e passar a variável.
Definindo Condições
Também podemos criar condições, assim como em programação, para indicar se algo deve
ou não ser renderizado.
Resultará em:
<div>
<span>Aberto</span>
</div>
O "-" é um escape e nos permite escrever scripts. Então no nosso código escrevemos um
"if" comum e passamos um <span> que será apresentado caso a condição seja verdadeira.
Web componets
Hoje em dia utilizamos a web para criar tantas coisas em que muitas vezes precisamos criar
muitos elementos com muito HTML.
O problema é que normalmente temos que reutilizar esses elementos em vários lugares, e a
estilização ou comportamento dos elementos podem acabar sendo afetados por outros
elementos nossos, sem contar a repetição de código em algumas ocasiões.
Imagine então se pudéssemos criar nossos próprios elementos HTML, chamá-los apenas
pelo nome ao invés de copiar um enorme HTML, e seu comportamento e estilização não
fossem afetados por outros códigos.
Um exemplo muito utilizado é um Slider de imagens. Seu HTML poderia ser algo assim:
<div id="slider">
<input checked="" type="radio" name="slider" id="slide1" selected="false">
<input type="radio" name="slider" id="slide2" selected="false">
<input type="radio" name="slider" id="slide3" selected="false">
<input type="radio" name="slider" id="slide4" selected="false">
<div id="slides">
<div id="overflow">
<div class="inner">
<img src="img1.png">
<img src="img2.png">
<img src="img3.png">
<img src="img4.png">
</div>
</div>
</div>
<label for="slide1"></label>
<label for="slide2"></label>
<label for="slide3"></label>
<label for="slide4"></label>
</div>
reste atenção em todo o código com o qual não iremos mexer, como os inputs e labels. O
que nos interessa são as imagens.
<image-slider>
<img src="img1.png">
<img src="img2.png">
<img src="img3.png">
<img src="img4.png">
</image-slider>
E então passamos para ele as nossas imagens, que é o que nos interessa. Veja como ficou
mais limpo, e como ficaria mais simples reaproveitá-lo em várias páginas.
Todo o resto de código que não importa fica escondido. Até mesmo alguns elementos do
HTML são formados por outros elementos mais simples, como é o caso da tag <video>.
● Templates;
● Shadow DOM;
● Custom Elements;
● Imports.
Templates
Template é basicamente onde nossos códigos do componente ficarão. Seu conteúdo é
ignorado pelo navegador até que o JavaScript os ative.
Para isso utilizamos a tag <template>. Vamos aproveitar o código do menu que criamos em
aulas anteriores.
.menu-item{
list-style-type: none;
}
#meuMarcador:checked + .menu{
display: block;
}
#meuMarcador{
display: none;
}
</style>
<label class="menu-button" for="meuMarcador" >
<i class="fa fa-bars" >X</i>
</label>
<input type="checkbox" id="meuMarcador" />
<ul class="menu" >
<li class="menu-item" >Home</li>
<li class="menu-item" >Produtos</li>
<li class="menu-item" >Sobre Nós</li>
<li class="menu-item" >Contato</li>
</ul>
</template>
Se colocarmos isso no nosso HTML, veremos que o navegador ignora tudo o que está
dentro da tag <template>, não exibindo nada.
Note que no nosso CSS estamos fazendo com que o elemento da classe ".menu" não seja
exibido (display: none).
Experimente criar um elemento qualquer com esta mesma classe fora da tag <template> e
veja o que acontece: o elemento será exibido.
Isso porque o que está na tag <template> é isolado do resto do nosso documento,
mostrando o que dissemos antes: vários elementos em uma mesma página não terão
conflitos de estilização e comportamento.
Shadow DOM
Lembra dos elementos escondidos na tag <video>? Esse lugar escondido chama-se
Shadow DOM.
Caso esteja utilizando o Google Chrome, basta ir nas configurações do navegador e ativar a
exibição do Shadow DOM para poder vê-los no inspecionador de elementos.
Precisamos agora criar o nosso Shadow DOM para poder jogar o código da nossa template.
shadowRoot.appendChild(templateContent);
Custom Elements
Ao invés de ficar criando contêineres com nomes de classes, podemos criar nossas
próprias tags!
Dentro dele criamos uma classe que irá herdar as informações de protótipo dos elementos
HTML. Com esse objeto conseguiremos criar um elemento HTML que se comporta como
outro qualquer.
Como registramos com o nome "meu-menu", podemos utilizar este nome como nossa tag.
Vamos arrumar nosso HTML então:
<meu-menu ></meu-menu>
Pontos de Inserção
Nosso menu funciona, mas os itens do menu estão fixos. E se quiséssemos reaproveitar
este mesmo menu em outros sites? Não seria melhor podermos escolher os itens do nosso
menu?
Utilizamos a tag <slot> para indicar que ali será inserido algum elemento, e passamos o
nome "menu-list".
Já que a estrutura foi mudada, teremos que fazer uma pequena alteração em nosso CSS.
O antigo seletor ".menu-item" agora será "::slotted(*)". Ele indicará que queremos pegar os
elementos que estarão no "slot" do elemento de classe ".menu".
Fazemos isso porque só podemos selecionar o contêiner de um slot, o que nos impede de
selecionar os <li>.
E por último vamos passar os itens que quisermos em nosso menu. Faremos isso em uma
<div> que utilizaremos como contêiner:
<meu-menu>
<div slot="menu-list" >
<li>Home</li>
<li>Produtos</li>
<li>Sobre Nós</li>
<li>Contato</li>
</div>
</meu-menu>
Criamos uma <div> com o nome do slot onde queremos inserir nosso conteúdo, "menu-list".
Com isso essa <div> terá seu conteúdo inserido dentro do <slot> de mesmo nome.
Agora temos um componente de Menu onde não precisamos nos preocupar com CSS,
<label>, <input>, etc e ainda podemos escolher quais os seus itens.
Imports
Quando criamos nossas páginas, podemos organizar nossas imagens, CSS, JavaScript, etc
e depois simplesmente importamos eles em nosso HTML, certo?
Vamos remover todo o conteúdo da tag <template> do nosso arquivo "index.html" e jogar
em um novo arquivo chamado "menu.html".
Para importá-lo, basta fazer o mesmo que fazemos para importar arquivos CSS:
<link rel="import" href="menu.html" id="meuMenu">
Caso queira, todo o JavaScript pode ser inserido dentro do "menu.html" também. Com isso
só precisamos importar um arquivo para poder utilizar nosso componente.