<strong>
, <em>
, <mark>
, <del>
e <ins>
<ol>
) e não-numeradas (<ul>
)<a href="caminho-do-recurso">nome</a>
id
do elemento:
<a href="#banda-calypso">Ir para banda Calypso</a>
...
<h2 id="banda-calypso">Calypso</a>
inline
e outros são block
block
: fazem quebra de linha (e.g., <blockquote>
, <p>
etc.)inline
:
não fazem quebra de linha (e.g, <q>
, <strong>
etc.)border
, ou então
border-width
, border-style
e border-color
Tabelas são criadas com as tags
<table>...</table>
, para marcar a tabela<thead>...</thead>
, cabeçalho, contém linhas<tbody>...</tbody>
, corpo, contém linhas<tfoot>...</tfoot>
, rodapé, contém linhas<tr>...</tr>
, linha da tabela<td>...</td>
, célula de dados<th>...</th>
, célula do cabeçalho<caption>...</caption>
, legenda.html
.html
) para ter coloração de sintaxe<img>
)Instale uma extensão (plugin ou add-on) para atualizar automaticamente o navegador sempre que salvar um arquivo
VS Code ~ Live Server (link)
Atom ~ Atom Live Server (link)
Efeito colateral: estará acessando o site usando um servidor web
<meta>
<html>
<head>
<meta charset="utf-8">
<title>Aprendendo sobre as meta tags</title>
<meta name="author" content="Flávio">
<meta name="description" content="Textão explicativo">
<meta name="keywords" content="web,css,html,js">
⋮
</head>
<meta name="keywords" content="...">
<meta name="keywords"
content="livro,games,celular,ipad">
<meta name="description" content="...">
<meta name="description"
content="Meet the global face of [...]">
author
: nome dos autores da página
<meta name="author" content="Flávio Coutinho">
robots
: indicar a motores de busca (e.g., Google) se eles devem indexar
a página ou não
<meta name="robots" content="index,follow">
<meta name="refresh" content="X Y">
<meta name="refresh" content="5 ;url=http://www.pudim.com.br/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="...">
<meta name="color-scheme"
content="light dark">
<meta name="color-scheme"
content="only light">
::: figure
<meta property="twitter:card" content="summary">
<meta property="twitter:title"
content="Programação Web">
<meta property="twitter:description"
content="Slides...">
<meta property="twitter:image"
content="https://site.com/capa-1x1.webp">
<meta property="twitter:image:alt"
content="Capa dos slides...">
:::
<meta property="og:type" content="website">
<meta property="og:title" content="Programação Web">
<meta property="og:description"
content="Slides do curso de...">
<meta property="og:image"
content="https://site.com/capa-wide.webp">
<meta property="og:image:width" content="2354">
<meta property="og:image:height" content="1356">
<meta property="og:image:alt"
content="Capa dos slides com os dizeres...">
<meta property="og:url"
content="https://fegemo.github.io/cefet-web/">
<meta property="og:local" content="pt_BR">
:::
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Product",
"name": "Faye Small Leather Shoulder Bag",
"category": "Handbags",
"brand": {
"@type": "Brand", "name": "Chloé"
},
"image": "https://images.bloomingdalesassets...",
"productID": "1273751",
"url": "https://www.bloomingdales.com/shop/...",
"description": "Shop Faye Small Leather...",
"offers": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Product",
"color": "Black/Gold/Silver"
},
"price": "1450.00", "priceCurrency": "USD",
"url": "https://www.bloomingdales.com/...",
"availability": "http://schema.org/InStock"
}
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 3.5, "reviewCount": 4,
"bestRating": 5, "worstRating": 0
},
"review": [{
"@type": "Review",
"description": "This bag is gorgeous...",
"name": "Gorg!",
"reviewRating": {
"@type": "Rating",
"ratingValue": 5,
"bestRating": 5, "worstRating": 1
}
}]
}
</script>
...
<head>
<meta charset="utf-8"> <!-- USE ESTA META TAG -->
<title>...</title>
...
Em HTML, dentro do <head>
da página, usamos uma <meta>
tag com
o atributo charset
para isso ➡️
<!DOCTYPE ... >
<!DOCTYPE html> ✔️
<html>
...
<!-- um comentário --> ❌
<!DOCTYPE html>
<html>
HTML 4.01 ~ ```html <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
XHTML 1.1
~ ```html
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
HTML5 ~ ```html <!DOCTYPE html>
Hoje em dia usamos sempre HTML5 😉 <!-- {.flex-align-center} -->
---
<!-- {"layout": "section-header", "hash": "multimidia"} -->
# Multimídia
## Elementos não-textuais
- Imagem
- Vídeo
- Áudio
<!-- {ul:.content} -->
---
## Imagens
- Há três _tags_ relacionadas a imagens:
1. **`<img>`**
1. `<figure>`
1. `<picture>` <!-- {ol:.multi-column-list-3} -->
- A tag `<img>` (mais tradicional e comum) é um **elemento _void_**
- Ou seja, não tem conteúdo nem tag de fechamento
- Formato geral:
```html
<img src="imagens/nome-do-arquivo.jpg" alt="Descrição bacana">
```
- [Referência na Mozilla Developer Network][mdn-img]
- Mas que **formatos** <!-- {.underline.upon-activation} --> de imagens podem ser usados?
[mdn-img]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img
---
## Imagens: **formato** <small>(1/2)</small>
- Existem vários formatos de imagens suportados por navegadores: <!-- {.bullet} -->
**JPEG** (ou JPG) <!-- {strong:.alternate-color} --> <!-- {dl:.bulleted} -->
~ bom para **fotos** tiradas do mundo real, que possuem muita variação de cor. Não possui
transparência
**GIF** <!-- {strong:.alternate-color} -->
~ **transparência** de 1 bit e suporta **animações** de quadros
~ apenas 256 cores na imagem (muito pouco!!)
**PNG** <!-- {strong:.alternate-color} -->
~ **transparência** de 8 bits e suporta **mais cores** que GIF
~ bom formato para imagens com pouca variação de cor
**SVG** <!-- {strong:.alternate-color} -->
~ imagens **vetoriais** que não perdem qualidade se **ampliadas**
**WebP AVIF APNG**
~ recentes, veremos mais adiante
*[JPEG]: Joint Photographic Experts Group
*[GIF]: Graphics Interchange Format
*[PNG]: Portable Network Graphics
*[SVG]: Scalable Vector Graphics
*[WebP]: Web Picture Format
*[AVIF]: AV1 Image File Format
*[APNG]: Animated PNG
---
<!-- {"layout": "2-column-content-zigzag"} -->
## Transparência: PNG _vs_ GIF
**GIF** <!-- {dl:.width-20} -->
~ Um pixel é totalmente transparente ou totalmente opaco
::: figure .no-margin
 <!-- {p:.center-aligned} -->

:::
**PNG** <!-- {dl:.width-20} -->
~ Opacidade pode variar entre 0 (transparente) e 255 (opaco), ou
0% e 100%
::: figure .no-margin
 <!-- {p:.center-aligned} -->

:::
---
<!-- {"layout": "2-column-content-zigzag"} -->
## Imagens **vetoriais** (_e.g._, SVG)
Imagem _bitmap_ (JPG, GIF, PNG) original (pequena) e aumentada
(fica "estourada")
::: figure .no-margin
 <!-- {p:.center-aligned} -->
<!-- {style="width: 100px"} -->
:::
Imagem **vetorial** (SVG) original (pequena) e aumentada (mantém a qualidade)
::: figure .no-margin
 <!-- {p:.center-aligned} -->
<!-- { style="width: 100px"} -->
:::
---
## Imagens: **formato** (2/2)
**APNG** <!-- {dl:.width-10.full-width style="margin-bottom: 0.5em"} -->
~ Semelhante ao formato PNG, mas com suporte a animações
~ Melhor que PNG e GIF, menos eficiente que AVIF e WebP
**WebP**
~ Melhor que PNG e JPG, suporte a animação (sem rend. progres.)
~ ~26% menor que PNG, ~25-35% menor que JPG ([comparações][comparacoes-webp])
**AVIF**
~ Similar a WebP, mas ainda melhor (~50% menor que JPG)
~ Sem suporte para renderização progressiva
- <!-- {ul:.layout-split-3.no-padding.no-bullets.no-margin} -->
<div class="caniuse push-right" data-feature="apng"></div>
- <div class="caniuse push-right" data-feature="webp"></div>
- <div class="caniuse push-right" data-feature="avif"></div>
[comparacoes-webp]: https://developers.google.com/speed/webp/gallery1
*[WebP]: Web Picture Format
*[AVIF]: AV1 Image File Format
*[APNG]: Animated PNG
---
<!-- {"layout": "2-column-content", "slideStyles": {"grid-template-columns": "1fr auto", "grid-template-rows": "auto auto 1fr"}, "hash": "elemento-picture"} -->
## Elemento `<picture></picture>` <small>(1/2)</small>
```html
<picture>
<source srcset="philosoraptor.avif" type="image/avif">
<source srcset="philosoraptor.webp" type="image/webp">
<img src="philosoraptor.jpg" id="retrato" alt="...">
</picture>
::: result
:::
<picture>
pode conter vários <source>
e um <img>
<source>
aponta pra uma imagemsrc
da <img>
src
da <img>
uma fallback (carregado em último caso)srcset="..."
pode conter mais de um caminho indicado
<picture>
<source srcset="logo-768.png 768w, logo-128.png 128w">
...
<picture></picture>
(2/2)<picture>
tem alguns casos de uso:
<figure></figure>
<img>
<figcaption></figcaption>
<figure>
<figcaption>Filosofia</figcaption>
<img src="philosoraptor.jpg">
</figure>
<figure>
<p>Cavei cavei cavei<br>
Não é um poema<br>
Mas é profundo.
</p>
<figcaption>Ademar</figcaption>
</figure>
::: result .layout-split-2 justify-content: space-around;
Cavei cavei cavei
Não é um poema
Mas é profundo.
:::
<video></video>
<video src="videos/fendadobiquini.mp4"></video>
Resultado:
<video>
abre e fecha (i.e., </video>
)<vídeo>
surgiu no HTML5<video>...</video>
é exibido caso
o navegador não consiga exibi-locontrols
associa um conjunto de controles ao <video>
<video src="videos/fendadobiquini.mp4" controls></video>
Resultado:
controls
é um atributo que não requer um valor
controls
~ mostra um conjunto de controles
autoplay
~ começa a executar o vídeo assim que a página carregar
muted
~ tira o som
preload="..."
~ começa a baixar o vídeo assim que a página carrega
~ preload="none"
: não pré-carrega
~ preload="metadata"
: pré-carrega apenas metadados
~ preload="auto"
: pré-carrega todo o vídeo
loop="x"
~ quantas vezes deve ser executado (0 = infinitas)
poster="http://..."
~ imagem mostrada antes do vídeo ser executado
autopictureinpicture
~ coloca em modo PiP quando muda de aba
width="x"
e height="y"
<video>
:
<video width="320" height="240" controls>
<source src="bob-esponja.mp4" type="video/mp4; codecs=avc1.42E01E,mp4a.40.2">
<source src="bob-esponja.webm" type="video/webm; codecs=vp8,vorbis">
<source src="bob-esponja.ogv" type="video/ogg; codecs=theora,vorbis">
Seu navegador não suporta o elemento video.
</video>
bob-esponja.mp4
(i.e., o primeiro)
bob-esponja.webm
(2º)bob-esponja.ogv
(3º)<audio>
funciona exatamente da mesma forma que <video>
<audio src="banjo-kazooie.mp3" controls loop="0"></audio>
<div>...</div>
<span>...</span>
<h1>
quanto no <h2>
!h1, h2 {
background: url(coelho.png) #ff6d6d;
background-repeat: no-repeat;
background-position: right top;
}
<div>...</div>
pode ser usada para agrupar elementos<body>
<div id="topo-da-pagina">
<h1>Coelhos Vampiros</h1>
<h2>De onde vêm, onde...</h2>
</div>
<p>Sexta-feira no Globo Repórter</p>
</body>
#topo-da-pagina {
background: url(coelho.png) #ff6d6d;
background-repeat: no-repeat;
background-position: right top;
}
<div></div>
serve para agrupar outros elementos<p>
é um parágrafo (i.e., conteúdo)<img>
é uma imagem (i.e., conteúdo)<div>
é um agrupamento de elementosblock
É um mecanismo genérico que nos permite criar uma estrutura ou agrupamento de elementos quando não há outro elemento HTML mais apropriado, e ela pode ser estilizada usando CSS ou manipulada com JavaScript Containers genéricos na W3C
<body>
➡️ <div id="conteudo">
<h1>Tesouros</h1>
<table><!-- ... --></table>
<p>Ajude Barba-Ruiva ...</p>
➡️ </div>
</body>
body { background: url(ilha.png) }
#conteudo {
background: white;
}
<span></span>
tem exatamente
a mesma função que div
, porém inline
::: figure .figure-slides.no-margin.flex-align-center.invert-colors-dark-mode
:::
<div>
, vai quebrar linha (ele é block
)<span>
, que é inline
!
O preço da <span id="produto">camisa adornada</span> é
de <span id="preco">R$ 29,90</span>.