Manual_HTML-Letra-grande
Manual_HTML-Letra-grande
2 Introducción 5
3 Bases de HTML 7
3.1 Estructura de una página en HTML . . . . . . . . . . . . . . . . 8
3.2 Etiquetas o elementos . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4 ¿Mayúsculas o minúsculas? . . . . . . . . . . . . . . . . . . . . . 11
3.5 Espaciado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 La etiqueta head 14
4.1 La etiqueta title . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2 La etiqueta script . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3 La etiqueta noscript . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4 La etiqueta link . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.5 La etiqueta style . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.6 La etiqueta base . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.7 La etiqueta meta . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5 La etiqueta ´body´ 22
5.1 Bloques o líneas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7 Enlaces 31
9 Formularios 37
1
9.1 La etiqueta input . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.2 Envío de formulario . . . . . . . . . . . . . . . . . . . . . . . . . 40
9.3 Validación de Formulario . . . . . . . . . . . . . . . . . . . . . . 41
9.4 Otros campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
9.5 La etiqueta textarea . . . . . . . . . . . . . . . . . . . . . . . . 46
9.6 La etiqueta select . . . . . . . . . . . . . . . . . . . . . . . . . . 46
10 Tablas 48
10.1 Descripción de tabla . . . . . . . . . . . . . . . . . . . . . . . . . 55
12 Iframes 60
12.1 Srcdoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
12.2 Sandbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
12.3 Allow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
12.4 Referrer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
13 Imágenes 64
13.1 La etiqueta figure . . . . . . . . . . . . . . . . . . . . . . . . . . 64
13.2 Imágenes responsivas usando srcset . . . . . . . . . . . . . . . . 65
13.3 La etiqueta picture . . . . . . . . . . . . . . . . . . . . . . . . . 66
14 Accesibilidad 68
14.1 Uso de HTML semático . . . . . . . . . . . . . . . . . . . . . . . 69
14.2 Use atributos alt para las imágenes . . . . . . . . . . . . . . . . 70
14.3 Use el atributo role . . . . . . . . . . . . . . . . . . . . . . . . . 70
14.4 Use el atributo tabindex . . . . . . . . . . . . . . . . . . . . . . 71
14.5 Use los atributos aria . . . . . . . . . . . . . . . . . . . . . . . . 71
14.6 Dónde aprender más . . . . . . . . . . . . . . . . . . . . . . . . . 73
2
1 Prefacio del autor
HTML es la base de la maravilla que hoy conocemos como la Web.
Hay un increíble poder bajo este relativamente simple y limitado conjunto de reglas,
que nos permite crear documentos, aplicaciones y experiencias para personas
alrededor del mundo.
Mi primer libro de HTML (refiriéndose al autor original) fue lanzado en 1997 y
se llamaba “HTML Unleashed”. Un tomo largo, grande y de muchas páginas.
20+ años han pasado desde entonces, y HTML es todavía la base de la web tal y
como la conocemos hoy en día, con cambios mínimos desde entonces.
Sí, tenemos nuevas etiquetas semánticas, se dejó de usar HTML para dar estilos,
y CSS ha tomado las riendas del diseño.
Pero el éxito de HTML se basa en una sola cosa: su sencillez.
Resistió su transformación a un dialecto de XML por medio de XHTML, cuando,
eventualmente, la gente se dió cuenta que era demasiado complejo.
Logró hacerlo gracias a otra de sus funciones: su flexibilidad. Aunque hay
algunas reglas, después de aprenderlas el usuario tiene mucha libertad para
programar.
Los navegadores de internet aprendieron a ser resilientes y a intentar hacer lo
mejor al presentar código HTML a sus usuarios.
Y había algo que la plataforma Web hacía muy bien: siempre funcionaba con
documentos antiguos. Por increíble que sea, podemos ir hoy en día a documentos
HTML escritos en 1991, y se ven prácticamente iguales a como se veían en aquel
entonces.
Incluso sabemos cuál fue la primera página. Es ésta: http://info.cern.ch/hyperte
xt/WWW/TheProject.html.
Y puedes ver su código fuente ya que, gracias a otra gran función de HTML,
podemos inspeccionar el código HTML de cualquier página web.
Sin embargo, no crea que es algo común. No conozco otra plataforma que nos dé
ésta habilidad.
Las excepcionales Herramientas de Desarrollador incluidas en cualquier naveg-
ador nos permiten tomar inspiración de cualquier documento HTML escrito por
cualquier persona del mundo.
Si recién aprendes sobre HTML, este libro apunta a darte una mano en tu
aprendizaje. Si eres un desarrollador web experimentado, este libro mejorará tus
conocimientos.
3
Aprendí mucho al escribirlo, a pesar que llevo trabajando en la web más de 20
años, y estoy seguro que usted también aprenderá algo nuevo.
. . . O tal vez vuelva a aprender algo que había olvidado.
De cualquier manera, la finalidad del libro es que le sea útil, y espero tenga éxito
en su misión.
4
2 Introducción
HTML es un estándar definido por el WHATWG, un acrónimo para Web
Hypertext Application Technology Working Group, una organización formada por
gente trabajando en los navegadores web más populares. Básicamente significa
que está controlado por Google, Mozilla, Apple y Microsoft.
En el pasado, el W3C (Consorcio World Wide Web) era la organización a cargo
de crear el estándar HTML.
El control del mismo pasó del W3C al WHATWG cuando quedó claro que la
inclinación del W3C hacia el XHTML no era una buena idea.
Si nunca has escuchado de XHTML, acá tienes una historia corta. A principios
de los 2000, todos creíamos que el futuro del internet era XML (en serio). Así
que HTML pasó de ser un lenguaje de marcado basado en SMGL a un lenguaje
de marcado XML.
Era un cambio bastante grande. Teníamos que conocer y respetar más reglas,
siendo estas también más estrictas.
Eventualmente, las empresas detrás de los navegadores se dieron cuenta que no
era el camino a tomar, creando lo que es ahora conocido como HTML5.
El W3C no cedió al principio el control de HTML, y por años tuvimos dos
estándares competidores, cada uno buscando ser el oficial. El 28 de mayo de 2019,
eventualmente, se hizo oficial por medio del W3C que la “verdadera” versión de
HTML era la publicada por WHATWG.
Mencioné HTML5, así que tengo otra pequeña historia. Lo sé, es un poco confuso
hasta ahora, como con cualquier cosa en la vida en la que hay muchos actores en
juego, pero es igual de fascinante.
Tuvimos la versión 1 de HTML en 1993. Acá está el RFC original.
HTML 2 apareció en 1995.
Tuvimos HTML 3 en enero de 1997, y HTML 4 en diciembre del mismo año.
¡Tiempos ajetreados!
Más de 20 años pasaron y tuvimos esta cosa del XHTML, y eventualmente
terminamos teniendo HTML5, que ya no es simplemente HTML.
HTML5 es ahora un término que define un conjunto entero de tecnologías, las
cuales incluyen a HTML, pero también así a un montón de APIs y estándares
como WebGL, SVG y más.
Es importante entender que ahora ya no existe una cosa tal como una versión
HTML. Es ahora un estándar viviente como CSS, que es llamado “3”, pero es en
realidad un montón de módulos independientes desarrollados por separado, justo
5
como JavaScript, donde tenemos cada año una nueva edición. Sin embargo, lo
único que importa son las características individuales que son implementadas por
el motor.
Sí, lo llamamos HTML5, pero HTML4 viene de 1997. Para cualquier cosa eso es
un montón de tiempo, aún más para el área de tecnologia.
La definición del estándar ahora “vive” en https://html.spec.whatwg.org/multi
page.
6
3 Bases de HTML
HTML es el lenguaje de marcado que usamos para estructural el contenido que
consumimos en internet.
HTML se sirve al navegador de diferentes maneras. * Puede ser generado por
una aplicación del servidor que lo construya dependiendo de la petición o de los
datos de la sesión, como por ejemplo con Rails, Laravel o Django. * Puede ser
generado por una aplicación de JavaScript del lado del cliente que genere HTML
en su ejecución. * De manera más simple, puede ser almacenado en un archivo y
servido al navegador por medio de un servidor web.
Vayamos a este último caso. Aunque en la práctica posiblemente es la forma
menos popular para generar HTML, sigu siendo esencial conocer al menos los
bloques más básicos.
Por convención, un archivo HTML es guardado con una extensión .html o .htm.
Dentro de este archivo, organizamos el contenido usando etiquetas (o tags, en
inglés).
Las etiquetas están alrededor del contenido, y cada una le da un significado
especial al texto que rodea.
Hagamos algunos ejemplos.
Este fragmento de HTML crea un parágrafo usando la etiqueta p:
<p>Un parágrafo de texto</p>
Este otro fragmento crea una lista de objetos usando la etiqueta ul, que significa
lista sin ordenar (el nombre viene del inglés unordered list), y las etiquetas li,
que significan objeto de lista (list item, en inglés):
<ul>
<li>Primer objeto</li>
<li>Segundo objeto</li>
<li>Tercer objeto</li>
</ul>
Cuando una página HTML es servida por el navegador, las etiquetas son interpre-
tadas, y el navegador muestra los elementos de acuerdo con las reglas que definen
su apariencia visual.
Algunas de estas reglas están estrablecidas de fábrica, como la manera en la que
una lista se muestra o como un enlace está subrayado y en color azul.
Algunas otras reglas pueden ser establecidas por usted usando hojas de estilo en
cascada, conocidas más comúnmente como CSS..
7
HTML no es un lenguaje de presentación. No se preocupa por cómo las cosas se
ven, sino por qué significan.
Queda de parte del navegador determinar cómo se ven las cosas con las reglas
establecidas por la persona que crea la página usando el lenguaje CSS.
Sin embargo, esos dos ejemplos eran fragmentos tomados fuera del contexto de
una página real.
Luego tenemos el elemento html, que tiene una etiqueta de apertura y de clausura:
<!DOCTYPE html>
<html>
...
</html>
8
...
</body>
</html>
Dentro de head tendremos etiquetas esenciales para la creación de una página web,
como el título, los metadatos, el CSS interno o externo y el código de JavaScript.
La mayoría de estas cosas no aparecen directamente en la página, sino que ayudan
al navegador (o a los bots de búsqueda) a mostrarla apropiadamente.
Dentro de body tendremos el contenido de la página. Las cosas visibles.
3.3 Atributos
La etiqueta de apertura de un elemento puede tener fragmentos especiales de
información que podemos agregarle, llamados atributos.
Los atributos tienen una sintaxis de atributo="valor":
<p class="una-clase">Un parágrafo de texto</p>
algunos de los atributos son booleanos, lo que significa que solo se necesita el
atributo:
9
<script defer src="archivo.js"></script>
y no así:
<P>Un parágrafo de texto</P>
3.5 Espaciado
Un detalle importante. En HTML, el espaciado no es relevante. A la hora de la
interpretación, los espacios en blanco se quitan de la ecuación.
Para el navegador,
<p>Un parágrafo de texto</p>
10
es lo mismo que
<p> Un parágrafo de texto</p>
y lo mismo que
<p>Un parágrafo
de
texto </p>
Le aconsejaría que usara una sintaxis que le permita organizar visualmente los
elementos, de manera que sea más fácil de leer, pero es libre de usar cualquier
sintaxis que desee.
Yo prefiero,
<p>Un parágrafo de texto</p>
o
<p>
Un parágrafo de texto
</p>
Las etiquetas que estén dentro de otras deberían ser indentadas con 2 o 4 espacios
(o tabulaciones, dependiendo de su gusto):
<body>
<p>
Un parágrafo de texto
</p>
<ul>
<li>Un objeto de lista</li>
</ul>
</body>
11
4 La etiqueta head
Esta etiqueta contiene otras etiquetas especiales que definen las propiedades del
documento.
Siempre se escribe antes de la etiqueta body, justo después de la etiqueta html
de apertura:
<!DOCTYPE html>
<html>
<head>
...
</head>
...
</html>
12
<script src="archivo.js"></script>
Con esto, se tiene un escenario que llevará a un camino más rápido para cargar
tanto la página como el JavaScript.
13
para alterar los recursos servidos por la página, en caso que los scripts estén
deshabilitados.
En este ejemplo, establezco un elemento con la clase no-script-alert a mostrarse
si los scripts están desactivados, ya que tiene la clase de CSS display: none por
defecto:
<!DOCTYPE html>
<html>
<head>
...
<noscript>
<style>
.no-script-alert {
display: block;
}
</style>
</noscript>
...
</head>
...
</html>
14
El atributo media permite cargar diferentes hojas de estilo dependiendo de las
capacidades del dispositivo:
<link href="file.css" media="screen" rel="stylesheet">
<link href="print.css" media="print" rel="stylesheet">
Esta etiqueta fue usada por Google para contenido multipágina, para indicar la
página anterior y previa, usando rel="prev" y rel="next". Hasta el momento
de la escritura de este libro (2019), Google anunció que ya no usa más esta
etiqueta, ya que puede encontrar la estructura correcta del libro sin ella.
Como con a etiqueta link, peude usar el atributo media para ajustar dónde se
usará, específicamente, ese CSS:
<style media="print">
.some-css {}
</style>
15
<!DOCTYPE html>
<html>
<head>
...
<base href="https://github.com/zetta102">
...
</head>
...
</html>
Esto “puede” ser usado por Google para generar la descripción de la página en
sus resultados de búsqueda, en caso que lo encuentre mejor que el contennido
dentro de la misma (no me pregunte cómo).
La etiqueta meta de charset es usada para establecer la codificación de los
caracteres de la página. Suele ser utf-8 en la mayoría de los casos:
<meta charset="utf-8">
O si deberían seguir los enlaces o no (esto significa pedir que los enlaces sean
ono
16
<meta name="robots" content="noindex, nofollow">
Y otros motores de búsqueda podrían también tener sus propias etiquetas meta.
Hablando de ello, podemos pedirle a Google que deshabilite algunas características.
Esto previene, por ejemplo, que se active la funcionalidad de traducción en los
resultados del motor de búsqueda:
<meta name="google" content="notranslate">
17
5 La etiqueta ´body´
Después de cerrar la etiqueta ´head´, solo podemos tener una etiqueta más en
un documento HTML: el elemento body.
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
...
</body>
</html>
Tal como las etiquetas head y html, solo podemos tener una etiqueta ´body´ en
una página.
Dentro de la etiqueta body tenemos todas las etiquetas que definen el contenido
de la página.
Técnicamente, las etiquetas de apertura y clausura son opcionales, pero considero
que es una buena práctica agregarlas solo por cuestiones de claridad.
En los próximos capítulos definiremos la variedad de etiquetas que se pueden usar
dentro del cuerpo de la página.
Pero antes, debemos presentar la diferencia entre elementos de bloque y elementos
de línea.
18
los elementos en bloque, mientras que no podemos en el caso de los bloques en
línea.
Nótese que usar CSS permite cambiar los valores por defecto de
los elementos, haciendo que una etiqueta p esté en línea, o que un
elemento span esté en bloque.
Otra diferencia es que los elementos en línea pueden estar dentro de elementos en
bloque, pero no al revés.
Algunos elementos en bloque pueden contener otros elementos en bloque, pero
depende de cada caso. La etiqueta p, por ejemplo, no permite tal opción.
19
6 Etiquetas que interactúan con el texto
6.1 La etiqueta p
Define un parágrafo de texto.
<p>Algún texto</p>
Es un elemento en bloque.
Dentro, podemos agregar cualquier elemento en línea que queramos, como un
span o a.
No podemos agregar elementos en bloque. Tampoco podemos crear un elemento
p dentro de otro.
Por defecto, los navegadores dan estilo a los parágrafos con un margen arriba
y debajo del mismo. Es de 16px en Chrome, pero el valor exacto puede variar
entre navegadores.
Esto causa que dos parágrafos consecutivos estén espaciados entre ellos, replicando
lo que esperaríamos de un “parágrafo” en medios como un periódico.
6.3 La etiqueta br
Esta etiqueta representa un salto de línea. Es un elemento en línea, y no necesita
una etiqueta de clausura.
La usamos para crear saltos de línea dentro de una etiqueta p, sin crear un nuevo
parágrafo.
Y, comparados con un nuevo parágrafo, no necesitan espaciado adicional.
<p>Algo de texto<br>Una nueva línea</p>
20
página.
Los encabezados, especialmente durante la organización de los mismos, son
esenciales para el SEO, donde los motores de búsqueda los usan de diferentes
maneras.
El navegador mostrará por defecto a la etiqueta h1 con el tamaño de texto más
grande, reduciéndolo a medida que el número cerca de h aumenta:
21
6.5 La etiqueta strong
Esta etiqueta es usada para marcar al texto que lleva dentro como importante.
Vale notar esto porque no es una ayuda visual sino semántica, cuya interpretación
dependerá del medio usado.
Los navegadores, por defecto, cambiarán el texto que tengan dentro a negritas.
6.6 La etiqueta em
Esta etiqueta es usada para darle énfasis al texto que lleva dentro. Como strong,
no es una ayuda visual sino semántica.
Los navegadores, por defecto, cambiarán el texto que tengan dentro a cursiva.
6.7 Citas
La etiqueta HTML blockquote es útil para insertar citas en el texto. Es una
etiqueta en bloque.
Los navegadores, por defecto, aplicarán un margen a un elemento blockquote.
Chrome aplica un margen de 40px izquierdo y derecho, y un margen de 10px
arriba y abado.
La etiqueta HTML q es usada también para citas, pero en línea.
Esta etiqueta es típicamente agregada dentro de una etiqueta pre tag, ya que el
elemento code ignora el espacio y los saltos de línea, similar a la etiqueta p.
Chrome le da el siguiente estilo a la etiqueta pre:
22
pre {
display: block;
font-family: monospace;
white-space: pre;
margin: 1em 0px;
}
6.10 Listas
Tenemos 3 tipos de listas:
• listas sin ordenar
• listas ordenadas
• listas de definiciones
Las listas sin ordenar son creadas usando la etiqueta ul. Cada objeto en la lista
es creado con la etiqueta li:
<ul>
<li>Primero</li>
<li>Segundo</li>
</ul>
Las listas ordenadas son similares, solo que con la etiqueta ol en su lugar:
<ol>
<li>Primero</li>
<li>Segundo</li>
</ol>
La diferencia entre ambas es que las listas ordenadas tienen un número antes de
cada objeto:
23
Las listas de definición son un poco más diferentes. Están compuestas de un
término y su descripción:
<dl>
<dt>Flavio</dt>
<dd>El nombre</dd>
<dt>Copes</dt>
<dd>El apellido</dd>
</dl>
Debo admitir que no se ven tanto en el día a día como las dos anteriores, pero
pueden ser útiles en algunas ocasiones.
24
6.11 Otras etiquetas de texto
Hay otro número de etiquetas con propósitos de presentación:
• la etiqueta mark
• la etiqueta ins
• la etiqueta del
• la etiqueta sup
• la etiqueta sub
• la etiqueta small
• la etiqueta i
• la etiqueta b
Este es un ejemplo de la la visualización aplicada por los navegadores:
25
7 Enlaces
Los enlaces son definidos usando la etiqueta a. El destino del enlace estará en su
atributo href.
Ejemplo:
<a href="https://flaviocopes.com">haz click aquí</a>
``
```html
<a href="/test">haz click aquí</a>
26
8 Etiquetas de contenedor y estructura de página
8.1 Etiquetas de contenedor
HTML provee un conjunto de etiquetas contenedor. Estas etiquetas contienen un
conjunto no especificado de otras etiquetas.
Tenemos:
• article
• section
• div
y puede ser difícil entender la diferencia entre ellas.
Veamos cuándo usar cada una de ellas.
8.1.1 article
Esta etiqueta identifica una cosa que puede ser independiente de otras cosas en
una página.
Por ejemplo, una lista de posts en la página principal.
O una lista de enlaces.
<div>
<article>
<h2>Un post</h2>
<a ...>Leer más</a>
</article>
<article>
<h2>Otro post</h2>
<a ...>Leer más</a>
</article>
</div>
El límite no son solo las listas: un articulo puede ser el elemento principal de una
página.
<article>
<h2>Un post</h2>
<p>Contenido...</p>
</article>
27
8.1.2 section
Representa una sección de un documento. Cada sección tiene una etiqueta de
encabezado (h1-h6), y luego la sección del cuerpo.
Ejemplo:
<section>
<h2>Una sección de la página</h2>
<p>...</p>
<img ...>
</section>
8.1.3 div
div es el elemento contenedor genérico:
<div>
...
</div>
28
8.2.2 aside
La etiqueta aside es usada para agregar una pieza de contenido que está rela-
cionado al contenido principal.
Una caja en la cual agregar una cita, por ejemplo. O una barra lateral.
Ejemplo:
<div>
<p>algún texto..</p>
<aside>
<p>Una cita..</p>
</aside>
<p>otro texto...</p>
</div>
Usar aside permite señalar que las cosas que contiene no son parte del flujo
regular del documento.
8.2.3 header
La etiqueta header representa la introducción (o también el resumen) de una
página. Puede, por ejemplo, contener una o más etiquetas de encabezado (h1-h6),
un resumen, o una imagen.
<article>
<header>
<h1>Título del Artículo</h1>
</header>
...
</div>
8.2.4 main
La etiqueta main representa la parte principal del artículo main:
<article>
....
<main>
<p>....</p>
</main>
</div>
8.2.5 footer
La etiqueta footer se usa para determinar el pie de un artículo, o el pie de una
página:
29
<article>
....
<footer>
<p>Pie de nota..</p>
</footer>
</div>
30
9 Formularios
Los formularios son una forma de interacturar on una página o una aplicación
construida con tecnologías web.
Tiene un conjunto de controles, y cuando envía el formulario, ya sea con un boton
dedicado o por medio de código, el navegador enviará la información al servidor.
Por defecto, este envío de información hace que la página se recargue después
de enviar los datos, pero este comportamiento puede ser alterado con JS. Sin
embargo, este libro está dedicado únicamente a HTML.
Un formulario se crea usando la etiqueta form:
<form>
...
</form>
Por defecto, los formularios son enviados usando el método HTTP GET, el cual
tiene algunas contraindicaciones, por lo que usualmente preferirá usar POST.
Puede ajustar el método a POST al enviar usando el atributo method:
<form method="POST">
...
</form>
Esto causará que el navegador envíe los datos de formulario con método POST a
la dirección /new-contact del mismo origen.
Si el origen (esto es, protocolo + dominio + puerto) es https://flaviocopes.com
(siendo el puerto 80 el usado por defecto), esto significa que los datos del formulario
serán enviados a https://flaviocopes.com/new-contact.
31
Hablé de datos, ¿pero cuáles datos?
Los datos son provistos por los usuarios por medio de un conjunto de controles
que están disponibles en la plataforma web:
• Cajas de texto (de línea única)
• Áreas de texto (de líneas múltiples)
• Cajas de selección (de selección única de una lista)
• Botones radio (o radio buttons, de selección única de una lista siempre
visible)
• Cajas de tildado (o checkboxes, de selección múltiple, o ninguna)
• Subida de archivos
• ¡Y mucho más!
Procederé a presentar cada uno de ellos a continuación.
Y eso es equivalente a:
<input type="text">
Como con todos los otros campos a continuación, se debe dar un nombre al campo
para que su contenido sea correctamente identificado al ser enviado el formulario
al servidor:
<input type="text" name="username">
9.1.1 Email
Usar type="email" validará la información introducida del lado del cliente (en
otras palabras, en el navegador), para asegurarse que esté semáticamente correcto
(lo que significa que no verificará si existe el correo), antes de enviar el formulario.
32
<input type="email" name="email" placeholder="Su correo">
9.1.2 Contraseña
Usar type="password" hará que cualquier información introducida se muestre
como un asterisco (*), o un punto, útil para campos que estén destinados a
contraseñas.
<input type="password" name="password" placeholder="Su contraseña">
9.1.3 Números
Puede tener un campo que únicamente reciba números:
<input type="number" name="edad" placeholder="Su edad">
Puede especificar un valor máximo y mínimo por medio de los atributos max y
min, respectivamente:
<input type="number" name="edad" placeholder="Su edad" min="18" max="110">
El atributo step permite establecer los ‘pasos’ entre distintos valores. Por ejemplo,
este campo acepta un valor entre 10 y 50, en incrementos de 5 unidades:
<input type="number" name="un-numero" min="10" max="50" step="5">
Esto es usado para almacenar valores como un token CSRF, conocido por ser
útil para seguridad e identificación de usuario, e inclusive la detección de bots de
envío de spam, usando técnicas especiales.
También se puede usar para identificar un formulario y su acción.
Si usa un placeholder, ese valor aparecerá si el usuario borra el valor dentro del
campo:
33
<input type="number" name="edad" placeholder="Su edad" value="18">
El atributo value ajusta el texto del botón, el cual se ajusta por defecto a
“Submit”:
<input type="submit" value="Haz click">
34
<input type="text" name="username" pattern="[a-zA-Z]{8}">
Puede especificar uno o más tipos de archivo permitido con el atributo accept.
Este ejemplo en particular acepta imágenes:
<input type="file" name="documentos-secretos" accept="image/*">
9.4.2 Botones
Los campos type="button" pueden ser usados para agregar botones adicionales
a el formulario, que no sean botones de envíos:
<input type="button" value="Hazme click">
Son usados para hacer algo por medio de un método de código, usando JS.
Hay un campo especial mostrado como un botón, cuya acción es la de limpiar el
formulario entero y reestablecer el estado de los campos:
<input type="reset">
35
<input type="radio" name="color" value="amarillo">
<input type="radio" name="color" value="rojo">
<input type="radio" name="color" value="azul">
Una vez el formulario sea enviado, la propiedad de datos color tendrá un único
valor.
Siempre hay al menos un elemento seleccionado. El primer objeto es el seleccionado
por defecto.
Se puede establecer el valor preseleccionado por medio del atributo checked. Solo
puede ser usado una vez por cada grupo de botones radio.
Ninguna de estas cajas estarán tildadas por defecto. Puede usar el atributo
checked para tildarlas al cargar la página.
Ya que este campo permite múltiples valores, al enviar el formulario, estos serán
enviados al servidor como un array.
36
<input type="week" name="elegir-semana">
Todos estos campos permiten limitar el rango y los incrementos entre cada valor.
Recomiendo revisar la Red de Desarrolladores de Mozilla (abreviado MDN) para
los pormenores de su uso.
El campo type="datetime-local" te permite elegir una fecha y una hora.
<input type="datetime-local" name="fechar-y-hora">
9.4.7 Rango
Este elemento muestra una barra deslizante, la cual puede ser movida desde un
valor de inicio hasta un valor final:
<input type="range" name="edad" min="0" max="100" value="30">
9.4.8 Teléfono
El campo type="tel" se usa para introducir un número de teléfono:
<input type="tel" name="numero-telefono">
37
9.4.9 Dirección
El campo type="url" se usa para introducir una dirección.
<input type="url" name="sitio-web">
Puede ajustar sus dimensiones usando CSS, así como también usando los atributos
rows y cols:
<textarea rows="20" cols="10"></textarea>
38
<select name="color">
<option value="">None</option>
<option value="rojo">Rojo</option>
<option value="amarillo">Amarillo</option>
</select>
Las opciones pueden ser agrupadas usando la etiqueta optgroup. Cada grupo de
opciones tiene un atributo label:
<select name="color">
<optgroup label="Primarios">
<option value="rojo">Rojo</option>
<option value="amarillo">Amarillo</option>
<option value="azul">Azul</option>
</optgroup>
<optgroup label="Otros">
<option value="verde">Verde</option>
<option value="rosa">Rosa</option>
</optgroup>
</select>
39
10 Tablas
En los primeros días de la web, las tablas eran parte importante en la construcción
de interfaces.
Luego, fueron reemplazadas por CSS y su capacidad de creación de interfaces, y
hoy tenemos poderosas herramientas como Grid y Flexbox de CSS para construir
interfaces. Las tablas son hoy en día usadas para, como se puede imaginar, ¡crear
tablas!
</table>
10.0.2 Filas
Una fila se agrega usando la etiqueta tr, y es lo único que podemos agregar a
una etiqueta table:
<table>
<tr></tr>
<tr></tr>
<tr></tr>
</table>
40
Se define el encabezado usando la etiqueta th:
<table>
<tr>
<th>Columna 1</th>
<th>Columna 2</th>
<th>Columna 3</th>
</tr>
<tr></tr>
<tr></tr>
</table>
41
</table>
42
10.0.5 Tamaño de filas y columnas
Una fila puede expandirse a dos o más columnas, usando el atributo colspan:
<table>
<tr>
<th>Columna 1</th>
<th>Columna 2</th>
<th>Columna 3</th>
</tr>
<tr>
<td colspan="2">Fila 1 Columnas 1-2</td>
<td>Fila 1 Columna 3</td>
</tr>
<tr>
<td colspan="3">Fila 2 Columnas 1-3</td>
</tr>
</table>
43
</tr>
</table>
44
10.0.7 Más etiquetas para organizar las tablas
Existen tres etiquetas más que pueden ser agregadas a una tabla para tenerla
más organizada.
Son mejor usadas con tablas grandes, para así definir correctamente tanto el pie
como el encabezado de la misma.
Esas etiquetas son:
• thead
• tbody
• tfoot
Estas envuelven las etiquetas tr de manera que claramente definan las diferentes
secciones de la tabla. Aquí un ejemplo:
<table>
<thead>
<tr>
<th></th>
<th>Columna 2</th>
<th>Columna 3</th>
</tr>
</thead>
<tbody>
<tr>
<th>Fil 1</th>
<td>Col 2</td>
<td>Col 3</td>
</tr>
45
<tr>
<th>Fil 2</th>
<td>Col 2</td>
<td>Col 3</td>
</tr>
</tbody>
<tfoot>
<tr>
<td></td>
<td>Pie de Col 1</td>
<td>Pie de Col 2</td>
</tr>
</tfoot>
</table>
46
<td>Solovino</td>
<td>7</td>
</tr>
</table>
47
11 Etiquetas multimedia: audio y video
En esta sección quiero mostrarte las etiquetas audio y video.
Por defecto el navegador no muestra controles para este elemento, lo que significa
que el audio solo será reproducido si se establece con reproducción automática
(explicación al respecto más adelante) y el usuario no puede detenerlo, cambiar el
volumen, o moverse a una posición específica del audio.
Para mostrar controles, puede agregar el atributo controls:
<audio src="file.mp3" controls>
Usando Javascript puede ‘escuchar’ (detectar) varios eventos que puedan ocurrir
en un elemento audio, siendo los más básicos:
• play cuando el archivo comience a reproducirse
48
• pause cuando la reproducción del archivo se pause
• playing cuando la reproducción de un archivo se continue
• ended cuando la reproducción del archivo se termine
Tal como los archivos de audio, el navegador no muestra por defecto controles
para este elemento, solo el video en cuestión.
Por defecto el navegador no muestra controles para este elemento, lo que significa
que el audio solo será reproducido si se establece con reproducción automática
(explicación al respecto más adelante) y el usuario no puede detenerlo, cambiar el
volumen, o moverse a una posición específica del video.
Para mostrar los controles, puede agregar el atributo controls:
<video src="file.mp4" controls>
49
También puede definir una imagen para que se vea por defécto antes que se
reproduzca el video.
<video src="file.mp4" poster="picture.png">
50
12 Iframes
La etiqueta iframe nos permite agregar contenido de origen distinto (otras
páginas) a nuestra página web.
A nivel técnico, un iframe crea el contenido de forma anidada. Esto significa que
el iframe no interfiere con la página original y viceversa. JavaScript y/o CSS no
“gotean” desde/hacia los iframes.
Muchos sitios usan iframes para ejecutar varios procesos. Puede que conozca
CodePen, Glitch u otros sitios que le permiten escribir código en una parte de la
página, y luego ver el resultado en otra. Eso es un iframe.
Puede crear uno de la siguiente manera:
<iframe src="page.html"></iframe>
12.1 Srcdoc
El atributo srcdoc le permite especificar algún código HTML para mostrar. Es
un alternativa a src, pero más reciente y no soportada por Edge 18 y versiones
anteriores, así como por Internet Explorer:
<iframe srcdoc="<p>My dog is a good dog</p>"></iframe>
12.2 Sandbox
El atributo sandbox permite limitar las operaciones permitidas dentro de los
iframes.
Si lo omitimos, todo estará permitido:
<iframe src="page.html"></iframe>
51
ellas. Esta es una lista incompleta de las opciones posibles:
• allow-forms: permite enviar el contenido de las forms.
• allow-modals: permite abrir ventanas modales, incluyendo llamar a
alert() en JavaScript.
• allow-orientation-lock permite bloquear la orientación de pantalla.
• allow-popups permite popups, usando window.open() y enlaces
target="_blank".
• allow-same-origin trata el recurso que está cargándose como si fuera del
mismo origen.
• allow-scripts deja que el iframe cargado corra scripts (pero no que deje
crear popups).
• allow-top-navigation da al iframe acceso al nivel superior de navegación.
12.3 Allow
Actualmente experimental y solo soportado por navegadores basados en
Chromium, es el futuro de intercambio de recursos entre la ventana padre y el
iframe.
Es similar al atributo sandbox, pero permitiéndonos características más específi-
cas, incluyendo:
• accelerometer, que da acceso a la interfaz API de acelerómetros.
• ambient-light-sensor, que da acceso a la interfaz API de AmbientLight-
Sensor.
• autoplay, que permite reproducir automáticamente archivos de audio y
video.
• camera, que da acceso a la cámara del dispositivo por medio de la interfaz
API getUserMedia.
• display-capture, que permite acceder al contenido de la pantalla usando
la API getDisplayMedia.
• fullscreen, que permite acceder al modo de pantalla completa.
• geolocation, que permite acceder a la API de geolocalización.
• gyroscope, que da acceso a la interfaz API del giroscopio.
• magnetometer, que da acceso a la interfaz API del magnetómetro.
• microphone, que da acceso al micrófono del dispositivo por medio de la
interfaz API getUserMedia.
• midi, que da acceso a la API Web MIDI.
• payment, que da acceso a la API de petición de pagos.
• speaker, que da acceso a la reproducción de audio por medio de los altavoces
del dispositivo.
• usb, que da acceso a la API WebUSB.
• vibrate, que da acceso a la API de vibración.
• vr, que da acceso a la API WebVR.
52
12.4 Referrer
Al cargar un iframe, el navegador envía información importante sobre el usuario
que lo carga con el encabezado de Referer.
El atributo referrerpolicy nos deja establecer la información del usuario a
enviar al iframe cuando carga. Esta etiqueta es un encabezado HTTP que deja
que la página sepa quién la está cargando. Estos son los valores permitidos:
• no-referrer-when-downgrade, que es el atributo por defecto, y envía la
información cuando la página actual esté cargada sobre HTTPS y el iframe
en HTTP.
• no-referrer, que no envía la información del encabezado.
• origin, que envía la información, y solo contiene el origen (puerto, protocolo
y dominio), no solo el origen más la dirección, que suele ser la información
que envía por defecto.
• origin-when-cross-origin, que envía la información del encabezado en
su forma completa (origen + dirección) al cargarlo en una página del mismo
dominio (puerto, protocolo y dominio). De otra manera, solo envía el origen.
• same-origin, la información se envía solamente si el iframe se carga desde
el mismo dominio (puerto, protocolo y dominio).
• strict-origin, envía la información de origen como el encabezado si la
página actual fue cargada sobre HTTPS y el iframe también. No envía
nada si el iframe se envía sobre HTTP.
• strict-origin-when-cross-origin, envía el origen + dirección como
infomación de encabezado al trabajar en el mismo origen. Envía el origen
como infomación si la página actual se carga sobre HTTPS y el iframe
también. No envía nada si el iframe se carga sobre HTTP.
• unsafe-url, que envía el origen + dirección como información incluso al
cargar recursos sobre HTTP mientras que la página haya sido cargada sobre
HTTPS.
53
13 Imágenes
Las imágenes pueden ser mostradas usando la etiqueta img.
Esta etiqueta acepta un atributo src, usado para configurar la fuente de la
imagen:
<img src="image.png">
Podemos usar una amplia cantidad de imágenes, estando las más comunes en
formato PNG, JPEG, GIF, SVG y, más recientemente, en WebP.
El estándar HTML requiere que esté presente un atributo alt que describa el
contenido de la imagen. Esto es usado tanto por herramientas de lectura de
pantalla como por bots de motores de búsqueda:
<img src="dog.png" alt="Una foto de un perro">
Puede cambiar los atributos width y height para configurar el espacio que el
elemento tomará, de manera que el navegador pueda tomarlo en cuenta y no
cambie la interfaz al terminarse de cargar. Toma un valor numérico, expresado
en píxeles.
<img src="dog.png" alt="Una foto de un perro" width="300" height="200">
54
Acá un ejemplo, donde damos 4 imágenes adicionales para 4 tamaños de pantalla
diferentes:
<img src="dog.png"
alt="Una foto de un perro"
srcset="dog-500.png 500w,
dog-800.png 800w,
dog-1000.png 1000w,
dog-1400.png 1400w">ventana de
55
13.3 La etiqueta picture
HTML también nos otorga la etiqueta picture, que hace un trabajo similar a
srcset, con diferencias muy sutiles pero importantes.
Puede usar picture cuando, en lugar de mostrar una versión más pequeña de la
imagen, quiera cambiarla completamente. O usar un formato distinto.
El mejor caso que he encontrado es usarlo al mostrar una imagen en formato
WebP, que no está todavia ampliamente soportado. En la etiqueta picture
puede especificar una lista de imágenes, y éstas serán mostradas en orden, de
manera que, en el siguiente ejemplo, los navegadores que soporten WebP usarán
la primera, o JPG si no es el caso:
<picture>
<source type="image/webp" srcset="image.webp">
<img src="image.jpg" alt="An image">
</picture>
Aunque funciona más o menos de la misma manera, lleva un poco más de código
que la etiqueta img.
Esta etiqueta es muy reciente, pero ya es soportada por todos los navegadores
más populares, salvo Opera Mini e IE en todas sus versiones.
56
14 Accesibilidad
Es importante que diseñemos nuestro HTML con la accesibilidad en mente.
Tener un HTML con esto en mente significa que las personas con discapacidad
puedan usar tu página. Existen personas completa o parcialmente invidentes,
personas con pérdida auditiva y una multitud de otras diferentes discapacidades.
Desafortunadamente, no suele dársele a esta sección la importancia que requiere,
ya que no es tan llamativa como las demás.
¿Qué pasaría si una persona que no puede ver tu página quiere consumir su
contenido? En primer lugar, ¿cómo lo hacen? No pueden usar el ratón, usan
algo llamado lector de pantalla. No tiene por qué imaginárselo cuando puede
probarlo. Google provee la extensión gratuita de Chrome, ChromeVox. La
accesibilidad también debe tomar en cuenta que se permita a estas herramientas
seleccionar los elementos o navegar por las páginas con tranquilidad.
Las páginas y aplicaciones web no son siempre construidas con la accesibilidad
como una de sus primeras metas y, aunque tal vez la versión 1 no tenga este
acercamiento, puede hacerse accesible en una iteración futura. Mientras antes se
haga, mejor, pero nunca es demasiado tarde.
Es importante tomar esto siempre en cuenta, especialmente cuando se habla de
contenido de interés público, como puede ser las páginas web de los gobiernos u
otras organizaciones públicas.
¿Qué significa hacer una página HTML accesible? Déjeme ilustrarle las cosas
principales que debe tomar en cuenta.
Nota: hay una gran cantidad de cosas extra para tomar en cuenta,
pero van dentro de otra sección, dedicada a CSS, como podría ser los
colores, el contraste y las fuentes. O tal vez cómo hacer las imágenes
en formato SVG accesibles. No hablaremos de esto en este libro.
57
h3
h2
h2
h3
h4
Use strong y em en lugar de b e i, respectivamente. Tienen el mismo aspecto
visual, pero las dos primeras tienen significado semántico asociado a ellas. b e i
son elementos mas visuales.
Las listas también son parte importante en la accesibillidad. Un lector de pantalla
puede detectar uan lista y proveer un resumen, dejando luego que el usuario
decida leer el resto o no.
Una tabla debería tener una etiqueta caption que describa su contenido:
<table>
<caption>Edad de los perros</caption>
<tr>
<th>Perro</th>
<th>Edad</th>
</tr>
<tr>
<td>Roger</td>
<td>7</td>
</tr>
</table>
58
la página. Los lectores de pantalla pueden inferirlo de la etiqueta HTML en la
mayoría de los casos. Por ejemplo, no necesita agregar este atributo a etiquetas
como nav, button o form.
Tomemos un ejemplo con la etiqueta nav. Puede usarla para definir la navegación
de página de la siguiente manera:
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
</ul>
</nav>
Si estuviera forzado a usar una etiqueta div en lugar de nav, debería entonces
usar el rol navigation:
<div role="navigation">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
</ul>
</div>
Así que acá tiene un ejemplo práctico: role es usado para asignar un valor
significativo cuando la etiqueta no entrega el significado deseado
Por otra parte, usar tabindex="-1" en su lugar elimina este tipo de navegación
del elemento, siendo bastante útil en algunos casos.
59
14.5.1 aria-label
Este atributo se usa para agregar una oración que describa a un elemento.
Ejemplo:
<p aria-label="Descripción de un producto">...</p>
14.5.2 aria-labelledby
Este atributo configuta una correlación entre el elemento actual y el que lo
etiqueta.
Si entiende cómo un elemento input se puede asociar a un elemento label, puede
pensar esto en términos similares.
Pasamos la identificación del objetoq ue describe el elemento actual.
Ejemplo:
<h3 id="descripcion">Descripción del producto</h3>
<p aria-labelledby="descripcion">
...
</p>
14.5.3 aria-describedby
Este atributo nos permite asociar un elemento con otro elemento que sirva como
descripción.
Ejemplo:
<button aria-describedby="pADescripcion" >Pague Ahora</button>
60
• Google Developers
61