The HTML Handbook
The HTML Handbook
org
               Table	of	Contents
Introduction
Preface
HTML	Basics
The	document	heading
The	document	body
Tags	that	interact	with	text
Links
Container	tags	and	page	structure	HTML
Forms
Tables
Multimedia	tags:	audio	and	video
iframes
Images
Accessibility
                                         2
Introduction
Introduction
Welcome!
I	wrote	this	book	to	help	you	quickly	learn	HTML	and	get	familiar	with
the	advanced	HTML	topics.
HTML	was	officially	born	in	1993	and	since	then	it	evolved	into	its
current	state,	moving	from	simple	text	documents	to	powering	rich
Web	Applications.
                                                                         3
                                                                       www.dbooks.org
Introduction
Even	if	you	don't	write	HTML	in	your	day	to	day	work,	knowing	how
HTML	works	can	help	save	you	some	headaches	when	you	need	to
understand	it	from	time	to	time,	for	example	while	tweaking	a	web
page.
Flavio
My website is flaviocopes.com.
                                                                    4
Preface
Preface
Preface
HTML	is	the	foundation	of	the	marvel	called	the	Web.
My	first	HTML	book	came	out	in	1997	and	was	called	"HTML
Unleashed".	A	big,	lots-of-pages,	long	tome.
20+	years	have	passed,	and	HTML	is	still	the	foundation	of	the	Web,
with	minimal	changes	from	back	then.
                                                                          5
                                                                         www.dbooks.org
Preface
And	the	whole	Web	platform	did	one	thing	right:	it	never	broke
backward	compatibility.	Pretty	incredibly,	we	can	go	back	to	HTML
documents	written	in	1991,	and	they	look	pretty	much	as	they	looked
back	then.
We	even	know	what	the	first	web	page	was.	It's	this:
http://info.cern.ch/hypertext/WWW/TheProject.html
And	you	can	see	the	source	of	the	page,	thanks	to	another	big	feature
of	the	Web	and	HTML:	we	can	inspect	the	HTML	of	any	web	page.
Don't	take	this	for	granted.	I	don't	know	any	other	platform	that	gives
us	this	ability.
The	exceptional	Developer	Tools	built	into	any	browser	let	us	inspect
and	take	inspiration	from	HTML	written	by	anyone	in	the	world.
If	you	are	new	to	HTML	this	book	aims	to	help	you	get	started.	If	you
are	a	seasoned	Web	Developer	this	book	will	improve	your
knowledge.
I	learned	so	much	while	writing	it,	even	though	I've	been	working	with
the	Web	for	20+	years,	and	I'm	sure	you'll	find	something	new,	too.
In	any	case,	the	goal	of	the	book	is	to	be	useful	to	you,	and	I	hope	it
succeeds.
                                                                          6
HTML	Basics
HTML Basics
HTML	Basics
HTML	is	a	standard	defined	by	the	WHATWG,	an	acronym	for	Web
Hypertext	Application	Technology	Working	Group,	an	organization
formed	by	people	working	on	the	most	popular	web	browser.	This
means	it's	basically	controlled	by	Google,	Mozilla,	Apple	and	Microsoft.
In	the	past	the	W3C	(World	Wide	Web	Consortium)	was	the
organization	in	charge	of	creating	the	HTML	standard.
It	was	a	big	change.	We	had	to	know,	and	respect,	more	rules.	Stricter
rules.
Eventually	browser	vendors	realized	this	was	not	the	right	path	for	the
Web,	and	they	pushed	back,	creating	what	is	now	known	as	HTML5.
W3C	did	not	really	agree	on	giving	up	control	of	HTML,	and	for	years
we	had	2	competing	standards,	each	one	aiming	to	be	the	official	one.
Eventually	on	28	May	2019	it	was	made	official	by	W3C	that	the	"true"
HTML	version	was	the	one	published	by	WHATWG.
                                                                       7
                                                                     www.dbooks.org
HTML	Basics
I	mentioned	HTML5.	Let	me	explain	this	little	story.	I	know,	it's	kind	of
confusing	up	to	now,	as	with	many	things	in	life	when	many	actors	are
involved,	yet	it's	also	fascinating.
Busy times!
20+	years	went	by,	we	had	this	entire	XHTML	thing,	and	eventually	we
got	to	this	HTML5	"thing",	which	is	not	really	just	HTML	any	more.
The	key	thing	to	understand	here	is	this:	there	is	no	such	thing	(any
more)	as	an	HTML	version	now.	It's	a	living	standard.	Like	CSS,	which
is	called	"3",	but	in	reality	is	a	bunch	of	independent	modules
developed	separately.	Like	JavaScript,	where	we	have	one	new
edition	each	year,	but	nowadays,	the	only	thing	that	matters	is	which
individual	features	are	implemented	by	the	engine.
Yes	we	call	it	HTML5,	but	HTML4	is	from	1997.	That's	a	long	time	for
anything,	let	alone	for	the	web.
                                                                            8
HTML	Basics
Let's	dive	into	this	last	case.	Although	in	practice	it's	probably	the	least
popular	way	to	generate	HTML,	it's	still	essential	to	know	the	basic
building	blocks.
Tags	wrap	the	content,	and	each	tag	gives	a	special	meaning	to	the
text	it	wraps.
This	HTML	snippet	creates	a	list	of	items	using	the	 	ul		tag,	which
means	unordered	list,	and	the	 	li		tags,	which	mean	list	item:
  <ul>
  		<li>First	item</li>
  		<li>Second	item</li>
                                                                           9
                                                                         www.dbooks.org
HTML	Basics
  		<li>Third	item</li>
  </ul>
Some	of	those	rules	are	built-in,	such	as	how	a	list	renders	or	how	a
link	is	underlined	in	blue.
HTML	is	not	presentational.	It's	not	concerned	with	how	things	look.
Instead,	it's	concerned	with	what	things	mean.
It's	up	to	the	browser	to	determine	how	things	look,	with	the	directives
defined	by	who	builds	the	page,	with	the	CSS	language.
Now,	those	two	examples	I	made	are	HTML	snippets	taken	outside	of
a	page	context.
Things	start	with	the	Document	Type	Declaration	(aka	doctype),	a	way
to	tell	the	browser	this	is	an	HTML	page,	and	which	version	of	HTML
we	are	using.
<!DOCTYPE html>
                                                                        10
HTML	Basics
Then	we	have	the	 	html		element,	which	has	an	opening	and	closing
tag:
  <!DOCTYPE	html>
  <html>
  ...
  </html>
Most	tags	come	in	pairs	with	an	opening	tag	and	a	closing	tag.	The
closing	tag	is	written	the	same	as	the	opening	tag,	but	with	a	 	/	:
<sometag>some content</sometag>
There	are	a	few	self-closing	tags,	which	means	they	don't	need	a
separate	closing	tag	as	they	don't	contain	anything	in	them.
The	 	html		starting	tag	is	used	at	the	beginning	of	the	document,	right
after	the	document	type	declaration.
The html ending tag is the last thing present in an HTML document.
  <!DOCTYPE	html>
  <html>
  				<head>
  				...
  				</head>
  				<body>
  				...
  				</body>
  </html>
                                                                       11
                                                                       www.dbooks.org
HTML	Basics
Inside	 	head		we	will	have	tags	that	are	essential	to	creating	a	web
page,	like	the	title,	the	metadata,	and	internal	or	external	CSS	and
JavaScript.	Mostly	things	that	do	not	directly	appear	on	the	page,	but
only	help	the	browser	(or	bots	like	the	Google	search	bot)	display	it
properly.
Inside body we will have the content of the page. The visible stuff.
Tags	vs	elements
I	mentioned	tags	and	elements.	What's	the	difference?
    starting	tag
    text	content	(and	possibly	other	elements)
    closing	tag
If	an	element	has	doesn't	have	a	closing	tag,	it	is	only	written	with	the
starting	tag,	and	it	cannot	contain	any	text	content.
That	said,	I	might	use	the	tag	or	element	term	in	the	book	meaning	the
same	thing,	except	if	I	explicitly	mention	starting	tag	or	ending	tag.
Attributes
The	starting	tag	of	an	element	can	have	special	snippets	of	information
we	can	attach,	called	attributes.
                                                                          12
HTML	Basics
  You	can	also	use	single	quotes,	but	using	double	quotes	in	HTML
  is	a	nice	convention.
and some attributes are boolean, meaning you only need the key:
The	 	class		and	 	id		attributes	are	two	of	the	most	common	you	will
find	used.
They	have	a	special	meaning,	and	they	are	useful	both	in	CSS	and
JavaScript.
                                                                        13
                                                                        www.dbooks.org
HTML	Basics
Those	are	just	two	of	the	possible	attributes	you	can	have.	Some
attributes	are	only	used	for	one	tag.	They	are	highly	specialized.
Other	attributes	can	be	used	in	a	more	general	way.	You	just	saw	 	id	
and	 	class	,	but	we	have	other	ones	too,	like	 	style		which	can	be
used	to	insert	inline	CSS	rules	on	an	element.
Case	insensitive
HTML	is	case	insensitive.	Tags	can	be	written	in	all	caps,	or
lowercase.	In	the	early	days,	caps	were	the	norm.	Today	lowercase	is
the	norm.	It	is	a	convention.
White	space
Pretty	important.	In	HTML,	even	if	you	add	multiple	white	spaces	into	a
line,	it's	collapsed	by	the	browser's	CSS	engine.
                                                                       14
HTML	Basics
<p>A paragraph
     of
     											text										</p>
     Using	the	 	white-space		CSS	property	you	can	change	how	things
     behave.	You	can	find	more	information	on	how	CSS	processes
     white	space	in	the	CSS	Spec
I'd	say	use	the	syntax	that	makes	things	visually	more	organized	and
easier	to	read,	but	you	can	use	any	syntax	you	like.
I typically favor
or
     <p>
     				A	paragraph	of	text
     </p>
<body>
                                                                       15
                                                                       www.dbooks.org
HTML	Basics
 				<p>
 								A	paragraph	of	text
 				</p>
 				<ul>
 								<li>A	list	item</li>
 				</ul>
 </body>
 Note:	this	"white	space	is	not	relevant"	feature	means	that	if	you
 want	to	add	additional	space,	it	can	make	you	pretty	mad.	I
 suggest	you	use	CSS	to	make	more	space	when	needed.
 Note:	in	special	cases,	you	can	use	the	 	 		HTML	entity	(an
 acronym	that	means	non-breaking	space)	-	more	on	HTML	entities
 later	on.	I	think	this	should	not	be	abused.	CSS	is	always	preferred
 to	alter	the	visual	presentation.
                                                                      16
The	document	heading
It's	always	written	before	the	 	body		tag,	right	after	the	opening	 	html	
tag:
  <!DOCTYPE	html>
  <html>
  				<head>
  								...
  				</head>
  				...
  </html>
We never use attributes on this tag. And we don't write content in it.
It's	just	a	container	for	other	tags.	Inside	it	we	can	have	a	wide	variety
of	tags,	depending	on	what	you	need	to	do:
title
script
noscript
link
style
base
meta
                                                                          17
                                                                          www.dbooks.org
The	document	heading
You	can	include	it	inline,	using	an	opening	tag,	the	JavaScript	code
and	then	the	closing	tag:
  <script>
  ..some	JS
  </script>
Or you can load an external JavaScript file by using the src attribute:
<script src="file.js"></script>
Sometimes	this	tag	is	used	at	the	bottom	of	the	page,	just	before	the
closing	 	</body>		tag.	Why?	For	performance	reasons.
Loading	scripts	by	default	blocks	the	rendering	of	the	page	until	the
script	is	parsed	and	loaded.
                                                                           18
The	document	heading
My	opinion	is	that	this	is	now	bad	practice.	Let	 	script		live	in	the
	head		tag.
This	is	the	scenario	that	triggers	the	faster	path	to	a	fast-loading	page,
and	fast-loading	JavaScript.
                                                                          19
                                                                          www.dbooks.org
The	document	heading
We're	talking	about	the	document	head	now,	so	let's	first	introduce	this
usage.
In this case, the noscript tag can only contain other tags:
link tags
style tags
meta tags
  <!DOCTYPE	html>
  <html>
  				<head>
  								...
  								<noscript>
  												<style>
  																.no-script-alert	{
  																				display:	block;
  																}
  												</style>
  								</noscript>
  								...
  				</head>
  				...
  </html>
  Let's	solve	the	other	case:	if	put	in	the	body,	it	can	contain	content,
  like	paragraphs	and	other	tags,	which	are	rendered	in	the	UI.
                                                                          20
The	document	heading
Usage:
  <!DOCTYPE	html>
  <html>
  				<head>
  								...
  								<link	href="file.css"	rel="stylesheet">
  								...
  				</head>
  				...
  </html>
                                                                      21
                                                                      www.dbooks.org
The	document	heading
This	tag	was	also	used	for	multi-page	content,	to	indicate	the	previous
and	next	page	using	 	rel="prev"		and	 	rel="next"	.	Mostly	for	Google.
As	of	2019,	Google	announced	it	does	not	use	this	tag	any	more
because	it	can	find	the	correct	page	structure	without	it.
Usage:
  <style>
  .some-css	{}
  </style>
As	with	the	 	link		tag,	you	can	use	the	 	media		attribute	to	use	that
CSS	only	on	the	specified	medium:
  <style	media="print">
  .some-css	{}
  </style>
                                                                          22
The	document	heading
  <!DOCTYPE	html>
  <html>
  				<head>
  								...
  								<base	href="https://flaviocopes.com/">
  								...
  				</head>
  				...
  </html>
The	 	charset		meta	tag	is	used	to	set	the	page	character	encoding.
	utf-8		in	most	cases:
                                                                          23
                                                                          www.dbooks.org
The	document	heading
<meta charset="utf-8">
The	 	robots		meta	tag	instructs	the	Search	Engine	bots	whether	to
index	a	page	or	not:
  You	can	set	nofollow	on	individual	links,	too.	This	is	how	you	can
  set	 	nofollow		globally.
You can also just tell Google instead of targeting all search engines:
And other search engines might have their own meta tag, too.
                                                                         24
The	document	heading
The	 	viewport		meta	tag	is	used	to	tell	the	browser	to	set	the	page
width	based	on	the	device	width.
After	this	document	heading	introduction,	we	can	start	diving	into	the
document	body.
                                                                        25
                                                                       www.dbooks.org
The	document	body
  <!DOCTYPE	html>
  <html>
  				<head>
  								...
  				</head>
  				<body>
  								...
  				</body>
  </html>
Just	like	the	 	head		and	 	html		tags,	we	can	only	have	one	 	body		tag	in
one	page.
Inside	the	 	body		tag	we	have	all	the	tags	that	define	the	content	of	the
page.
Technically,	the	start	and	ending	tags	are	optional.	But	I	consider	it	a
good	practice	to	add	them.	Just	for	clarity.
In	the	next	chapters	we'll	define	the	variety	of	tags	you	can	use	inside
the	page	body.
                                                                        26
The	document	body
The	difference	also	lies	in	the	visual	properties	we	can	edit	using	CSS.
We	can	alter	the	width/height,	margin,	padding	and	border	of	block
elements.	We	can't	do	that	for	inline	elements.
  Note	that	using	CSS	we	can	change	the	default	for	each	element,
  setting	a	 	p		tag	to	be	inline,	for	example,	or	a	 	span		to	be	a	block
  element.
                                                                             27
                                                                         www.dbooks.org
Tags	that	interact	with	text
The	 	p		tag
This	tag	defines	a	paragraph	of	text.
<p>Some text</p>
Inside it, we can add any inline element we like, like span or a .
                                                                          28
Tags	that	interact	with	text
The	 	br		tag
This	tag	represents	a	line	break.	It's	an	inline	element,	and	does	not
need	a	closing	tag.
Typically	a	page	will	have	one	 	h1		element,	which	is	the	page	title.
Then	you	might	have	one	or	more	 	h2		elements	depending	on	the
page	content.
                                                                         29
                                                                         www.dbooks.org
Tags	that	interact	with	text
The	browser	by	default	will	render	the	 	h1		tag	bigger,	and	will	make
the	elements	size	smaller	as	the	number	near	 	h		increases:
All	headings	are	block	elements.	They	cannot	contain	other	elements,
just	text.
                                                                         30
Tags	that	interact	with	text
The	 	em		tag
This	tag	is	used	to	mark	the	text	inside	it	as	emphasized.	Like	with
	strong	,	it's	not	a	visual	hint	but	a	semantic	hint.
Quotes
The	 	blockquote		HTML	tag	is	useful	to	insert	citations	in	the	text.
Horizontal	line
Not	really	based	on	text,	but	the	 	hr		tag	is	often	used	inside	a	page.	It
means	 	horizontal	rule	,	and	it	adds	a	horizontal	line	in	the	page.
Code blocks
                                                                        31
                                                                        www.dbooks.org
Tags	that	interact	with	text
That's	typically	the	only	thing	that	browsers	do.	This	is	the	CSS	applied
by	Chrome:
  code	{
  				font-family:	monospace;
  }
  pre	{
  				display:	block;
  				font-family:	monospace;
  				white-space:	pre;
  				margin:	1em	0px;
  }
Lists
We	have	3	types	of	lists:
      unordered	lists
      ordered	lists
      definition	lists
                                                                      32
Tags	that	interact	with	text
Unordered	lists	are	created	using	the	 	ul		tag.	Each	item	in	the	list	is
created	with	the	 	li		tag:
  <ul>
  				<li>First</li>
  				<li>Second</li>
  </ul>
  <ol>
  				<li>First</li>
  				<li>Second</li>
  </ol>
The	difference	between	the	two	is	that	ordered	lists	have	a	number
before	each	item:
Definition lists are a bit different. You have a term, and its definition:
                                                                             33
                                                                             www.dbooks.org
Tags	that	interact	with	text
  <dl>
  				<dt>Flavio</dt>
  				<dd>The	name</dd>
  				<dt>Copes</dt>
  				<dd>The	surname</dd>
  </dl>
I	must	say	you	rarely	see	them	in	the	wild,	for	sure	not	much	as	 	ul	
and	 	ol	,	but	sometimes	they	might	be	useful.
                                                                         34
Tags	that	interact	with	text
the b tag
There	are	a	number	of	other,	less	used	tags	related	to	text.	I	just
mentioned	the	ones	that	I	see	used	the	most.
                                                                          35
                                                                         www.dbooks.org
Links
Links
Links
Links	are	defined	using	the	 	a		tag.	The	link	destination	is	set	via	its
	href		attribute.
Example:
Between the starting and closing tag we have the link text.
The	above	example	is	an	absolute	URL.	Links	also	work	with	relative
URLs:
In	this	case,	when	clicking	the	link	the	user	is	moved	to	the	 	/test	
URL	on	the	current	origin.
                                                                            36
Links
https://flaviocopes.com/axios/test
Link	tags	can	include	other	things	inside	them,	not	just	text.	For
example,	images:
  <a	href="https://flaviocopes.com">
  				<img	src="test.jpg">
  </a>
If	you	want	to	open	the	link	in	a	new	tab,	you	can	use	the	 	target	
attribute:
                                                                       37
                                                                       www.dbooks.org
Container	tags	and	page	structure	HTML
Container	tags
HTML	provides	a	set	of	container	tags.	Those	tags	can	contain	an
unspecified	set	of	other	tags.
We have:
article
section
div
	article	
The	article	tag	identifies	a	thing	that	can	be	independent	from	other
things	in	a	page.
                                                                        38
Container	tags	and	page	structure	HTML
Or a list of links.
  <div>
  				<article>
  								<h2>A	blog	post</h2>
  								<a	...>Read	more</a>
  				</article>
  				<article>
  								<h2>Another	blog	post</h2>
  								<a	...>Read	more</a>
  				</article>
  </div>
We're not limited to lists: an article can be the main element in a page.
  <article>
  				<h2>A	blog	post</h2>
  				<p>Here	is	the	content...</p>
  </article>
	section	
Represents	a	section	of	a	document.	Each	section	has	a	heading	tag
( 	h1	- 	h6	),	then	the	section	body.
Example:
  <section>
  				<h2>A	section	of	the	page</h2>
  				<p>...</p>
  				<img	...>
  </section>
                                                                       39
                                                                      www.dbooks.org
Container	tags	and	page	structure	HTML
	div	
	div		is	the	generic	container	element:
  <div>
  				...
  </div>
We	use	 	div		in	any	place	where	we	need	a	container	but	the	existing
tags	are	not	suited.
  <nav>
  				<ol>
  								<li><a	href="/">Home</a></li>
  								<li><a	href="/blog">Blog</a></li>
  				</ol>
  </nav>
                                                                              40
Container	tags	and	page	structure	HTML
	aside	
The	 	aside		tag	is	used	to	add	a	piece	of	content	that	is	related	to	the
main	content.
Example:
  <div>
  		<p>some	text..</p>
  		<aside>
  				<p>A	quote..</p>
  		</aside>
  		<p>other	text...</p>
  </div>
Using	 	aside		is	a	signal	that	the	things	it	contains	are	not	part	of	the
regular	flow	of	the	section	it	lives	into.
	header	
The	 	header		tag	represents	a	part	of	the	page	that	is	the	introduction.
It	can	for	example	contain	one	or	more	heading	tag	( 	h1	- 	h6	),	the
tagline	for	the	article,	an	image.
  <article>
  		<header>
  						<h1>Article	title</h1>
  		</header>
  		...
  </div>
                                                                             41
                                                                         www.dbooks.org
Container	tags	and	page	structure	HTML
	main	
The	 	main		tag	represents	the	main	part	of	a	page:
  <body>
  		....
  		<main>
  				<p>....</p>
  		</main>
  </body>
	footer	
The	 	footer		tag	is	used	to	determine	the	footer	of	an	article,	or	the
footer	of	the	page:
  <article>
  	....
  		<footer>
  				<p>Footer	notes..</p>
  		</footer>
  </div>
                                                                          42
Forms
Forms
Forms
Forms	are	the	way	you	can	interact	with	a	page,	or	an	app,	built	with
Web	technologies.
You	have	a	set	of	controls,	and	when	you	submit	the	form,	either	with
a	click	to	a	"submit"	button	or	programmatically,	the	browser	will	send
the	data	to	the	server.
By	default	this	data	sending	causes	the	page	to	reload	after	the	data	is
sent,	but	using	JavaScript	you	can	alter	this	behavior	(not	going	to
explain	how	in	this	book).
  <form>
  				...
  </form>
By	default	forms	are	submitted	using	the	GET	HTTP	method.	Which
has	its	drawbacks,	and	usually	you	want	to	use	POST.
You	can	set	the	form	to	use	POST	when	submitted	by	using	the
	method		attribute:
  <form	method="POST">
  				...
  </form>
                                                                        43
                                                                       www.dbooks.org
Forms
The	form	is	submitted,	either	using	GET	or	POST,	to	the	same	URL
where	it	resides.
This	will	cause	the	browser	to	submit	the	form	data	using	POST	to	the
	/new-contact		URL	on	the	same	origin.
Data	is	provided	by	users	via	the	set	of	controls	that	are	available	on
the	Web	platform:
                                                                         44
Forms
Let's introduce each one of them in the following form fields overview.
<input>
Equivalent to using:
<input type="text">
As	with	all	the	other	fields	that	follow,	you	need	to	give	the	field	a
name	in	order	for	its	content	to	be	sent	to	the	server	when	the	form	is
submitted:
                                                                         45
                                                                         www.dbooks.org
Forms
Email
Using	 	type="email"		will	validate	client-side	(in	the	browser)	an	email
for	correctness	(semantic	correctness,	not	ensuring	the	email	address
is	existing)	before	submitting.
Password
Using	 	type="password"		will	make	every	key	entered	appear	as	an
asterisk	(*)	or	dot,	useful	for	fields	that	host	a	password.
Numbers
You	can	have	an	input	element	accept	only	numbers:
                                                                        46
Forms
The	 	step		attribute	helps	identify	the	steps	between	different	values.
For	example	this	accepts	a	value	between	10	and	50,	at	steps	of	5:
Hidden	field
Fields	can	be	hidden	from	the	user.	They	will	still	be	sent	to	the	server
upon	the	form	submit:
This	is	commonly	used	to	store	values	like	a	CSRF	token,	used	for
security	and	user	identification,	or	even	to	detect	robots	sending	spam,
using	special	techniques.
If	you	set	a	placeholder,	that	value	will	appear	if	the	user	clears	the
input	field	value:
                                                                          47
                                                                          www.dbooks.org
Forms
Form	submit
The	 	type="submit"		field	is	a	button	that,	once	pressed	by	the	user,
submits	the	form:
<input type="submit">
The	 	value		attribute	sets	the	text	on	the	button,	which	if	missing
shows	the	"Submit"	text:
Form	validation
Browsers	provide	client-side	validation	functionality	to	forms.
You	can	set	fields	as	required,	ensuring	they	are	filled,	and	enforce	a
specific	format	for	the	input	of	each	field.
                                                                           48
Forms
The	 	pattern		attribute	gives	you	the	ability	to	set	a	regular	expression
to	validate	the	value	against.
pattern="https://.*"
Other	fields
File	uploads
You	can	load	files	from	your	local	computer	and	send	them	to	the
server	using	a	 	type="file"		input	element:
                                                                          49
                                                                          www.dbooks.org
Forms
You	can	specify	one	or	more	file	types	allowed	using	the	 	accept	
attribute.	This	accepts	images:
You	can	use	a	specific	MIME	type,	like	 	application/json		or	set	a	file
extension	like	 	.pdf	.	Or	set	multiple	file	extensions,	like	this:
Buttons
The	 	type="button"		input	fields	can	be	used	to	add	additional	buttons
to	the	form,	that	are	not	submit	buttons:
<input type="reset">
Radio	buttons
Radio	buttons	are	used	to	create	a	set	of	choices,	of	which	one	is
pressed	and	all	the	others	are	disabled.
                                                                          50
Forms
The name comes from old car radios that had this kind of interface.
You	define	a	set	of	 	type="radio"		inputs,	all	with	the	same	 	name	
attribute,	and	different	 	value		attribute:
Once	the	form	is	submitted,	the	 	color		data	property	will	have	one
single	value.
There's	always	one	element	checked.	The	first	item	is	the	one	checked
by	default.
You	can	set	the	value	that's	pre-selected	using	the	 	checked		attribute.
You	can	use	it	only	once	per	radio	inputs	group.
Checkboxes
Similar	to	radio	boxes,	but	they	allow	multiple	values	to	be	chosen,	or
none	at	all.
You	define	a	set	of	 	type="checkbox"		inputs,	all	with	the	same	 	name	
attribute,	and	different	 	value		attribute:
                                                                           51
                                                                        www.dbooks.org
Forms
Since	this	input	field	allows	multiple	values,	upon	form	submit	the
value(s)	will	be	sent	to	the	server	as	an	array.
The	 	type="date"		input	field	allows	the	user	to	enter	a	date,	and
shows	a	date	picker	if	needed:
The	 	type="time"		input	field	allows	the	user	to	enter	a	time,	and	shows
a	time	picker	if	needed:
The	 	type="month"		input	field	allows	the	user	to	enter	a	month	and	a
year:
The	 	type="week"		input	field	allows	the	user	to	enter	a	week	and	a
year:
All	those	fields	allow	to	limit	the	range	and	the	step	between	each
value.	I	recommend	checking	MDN	for	the	little	details	on	their	usage.
                                                                         52
Forms
Color	picker
You	can	let	users	pick	a	color	using	the	 	type="color"		element:
The browser will take care of showing a color picker to the user.
Range
This	input	element	shows	a	slider	element.	People	can	use	it	to	move
from	a	starting	value	to	an	ending	value:
                                                                    53
                                                                    www.dbooks.org
Forms
Telephone
The	 	type="tel"		input	field	is	used	to	enter	a	phone	number:
The	main	selling	point	for	using	 	tel		over	 	text		is	on	mobile,	where
the	device	can	choose	to	show	a	numeric	keyboard.
URL
The	 	type="url"		field	is	used	to	enter	a	URL.
<textarea></textarea>
                                                                       54
Forms
You	can	set	the	dimensions	using	CSS,	but	also	using	the	 	rows		and
	cols		attributes:
As	with	the	other	form	tags,	the	 	name		attribute	determines	the	name
in	the	data	sent	to	the	server:
<textarea name="article"></textarea>
Each	option	is	created	using	the	 	option		tag.	You	add	a	name	to	the
select,	and	a	value	to	each	option:
  <select	name="color">
  				<option	value="red">Red</option>
  				<option	value="yellow">Yellow</option>
  </select>
  <select	name="color">
  				<option	value="red"	disabled>Red</option>
  				<option	value="yellow">Yellow</option>
  </select>
                                                                     55
                                                                     www.dbooks.org
Forms
  <select	name="color">
  				<option	value="">None</option>
  				<option	value="red">Red</option>
  				<option	value="yellow">Yellow</option>
  </select>
Options	can	be	grouped	using	the	 	optgroup		tag.	Each	option	group
has	a	 	label		attribute:
  <select	name="color">
  				<optgroup	label="Primary">
  								<option	value="red">Red</option>
  								<option	value="yellow">Yellow</option>
  								<option	value="blue">Blue</option>
  				</optgroup>
  				<optgroup	label="Others">
  								<option	value="green">Green</option>
  								<option	value="pink">Pink</option>
  				</optgroup>
  </select>
                                                                      56
Tables
Tables
Tables
In	the	early	days	of	the	web	tables	were	a	very	important	part	of
building	layouts.
Later	on	they	were	replaced	by	CSS	and	its	layout	capabilities,	and
today	we	have	powerful	tools	like	CSS	Flexbox	and	CSS	Grid	to	build
layouts.	Tables	are	now	used	just	for,	guess	what,	building	tables!
<table>
</table>
Inside	the	table	we'll	define	the	data.	We	reason	in	terms	of	rows,
which	means	we	add	rows	into	a	table	(not	columns).	We'll	define
columns	inside	a	row.
Rows
A	row	is	added	using	the	 	tr		tag,	and	that's	the	only	thing	we	can	add
into	a	 	table		element:
                                                                      57
                                                                      www.dbooks.org
Tables
  <table>
  		<tr></tr>
  		<tr></tr>
  		<tr></tr>
  </table>
Column	headers
The	table	header	contains	the	name	of	a	column,	typically	in	a	bold
font.
  <table>
  		<tr>
  				<th>Column	1</th>
  				<th>Column	2</th>
  				<th>Column	3</th>
  		</tr>
                                                                      58
Tables
  		<tr></tr>
  		<tr></tr>
  </table>
  <table>
  		<tr>
  				<th>Column	1</th>
  				<th>Column	2</th>
  				<th>Column	3</th>
  		</tr>
  		<tr>
  				<td>Row	1	Column	1</td>
  				<td>Row	1	Column	2</td>
  				<td>Row	1	Column	3</td>
  		</tr>
  		<tr>
  				<td>Row	2	Column	1</td>
  				<td>Row	2	Column	2</td>
  				<td>Row	2	Column	3</td>
  		</tr>
  </table>
This is how browsers render it, if you don't add any CSS styling:
                                                                         59
                                                                         www.dbooks.org
Tables
  th,	td	{
  		padding:	10px;
  		border:	1px	solid	#333;
  }
                                                 60
Tables
A	row	can	decide	to	span	over	2	or	more	columns,	using	the	 	colspan	
attribute:
  <table>
  		<tr>
  				<th>Column	1</th>
  				<th>Column	2</th>
  				<th>Column	3</th>
  		</tr>
  		<tr>
  				<td	colspan="2">Row	1	Columns	1-2</td>
  				<td>Row	1	Column	3</td>
  		</tr>
  		<tr>
  				<td	colspan="3">Row	2	Columns	1-3</td>
  		</tr>
  </table>
  <table>
  		<tr>
  				<th>Column	1</th>
  				<th>Column	2</th>
  				<th>Column	3</th>
  		</tr>
  		<tr>
  				<td	colspan="2"	rowspan="2">Rows	1-2	Columns	1-2</td>
  				<td>Row	1	Column	3</td>
                                                                      61
                                                                      www.dbooks.org
Tables
  		</tr>
  		<tr>
  				<td>Row	2	Column	3</td>
  		</tr>
  </table>
Row	headings
Before	I	explained	how	you	can	have	column	headings,	using	the	 	th	
tag	inside	the	first	 	tr		tag	of	the	table.
You	can	add	a	 	th		tag	as	the	first	element	inside	a	 	tr		that's	not	the
first	 	tr		of	the	table,	to	have	row	headings:
  <table>
  		<tr>
  				<th></th>
  				<th>Column	2</th>
  				<th>Column	3</th>
  		</tr>
  		<tr>
  				<th>Row	1</th>
  				<td>Col	2</td>
  				<td>Col	3</td>
  		</tr>
  		<tr>
  				<th>Row	2</th>
  				<td>Col	2</td>
  				<td>Col	3</td>
                                                                        62
Tables
  		</tr>
  </table>
This	is	best	when	using	big	tables.	And	to	properly	define	a	header
and	a	footer,	too.
thead
tbody
tfoot
They	wrap	the	 	tr		tags	to	clearly	define	the	different	sections	of	the
table.	Here's	an	example:
  <table>
  		<thead>
  				<tr>
  						<th></th>
  						<th>Column	2</th>
  						<th>Column	3</th>
  				</tr>
  		</thead>
  		<tbody>
  				<tr>
                                                                           63
                                                                       www.dbooks.org
Tables
  						<th>Row	1</th>
  						<td>Col	2</td>
  						<td>Col	3</td>
  				</tr>
  				<tr>
  						<th>Row	2</th>
  						<td>Col	2</td>
  						<td>Col	3</td>
  				</tr>
  		</tbody>
  		<tfoot>
  				<tr>
  						<td></td>
  						<td>Footer	of	Col	1</td>
  						<td>Footer	of	Col	2</td>
  				</tr>
  		</tfoot>
  </table>
Table	caption
A	table	should	have	a	 	caption		tag	that	describes	its	content.	That	tag
should	be	put	immediately	after	the	opening	 	table		tag:
  <table>
  		<caption>Dogs	age</caption>
                                                                      64
Tables
  		<tr>
  				<th>Dog</th>
  				<th>Age</th>
  		</tr>
  		<tr>
  				<td>Roger</td>
  				<td>7</td>
  		</tr>
  </table>
                       65
                       www.dbooks.org
Multimedia	tags:	audio	and	video
<audio src="file.mp3">
By	default	the	browser	does	not	show	any	controls	for	this	element.
Which	means	the	audio	will	play	only	if	set	to	autoplay	(more	on	this
later)	and	the	user	can't	see	how	to	stop	it	or	control	the	volume	or
move	through	the	track.
To show the built-in controls, you can add the controls attribute:
                                                                        66
Multimedia	tags:	audio	and	video
You	can	specify	the	MIME	type	of	the	audio	file	using	the	 	type	
attribute.	If	not	set,	the	browser	will	try	to	automatically	determine	it:
An	audio	file	by	default	does	not	play	automatically.	Add	the	 	autoplay	
attribute	to	play	the	audio	automatically:
The	 	loop		attribute	restarts	the	audio	playing	at	0:00	if	set;	otherwise,
if	not	present,	the	audio	stops	at	the	end	of	the	file:
You	can	also	play	an	audio	file	muted	using	the	 	muted		attribute	(not
really	sure	what's	the	usefulness	of	this):
                                                                             67
                                                                             www.dbooks.org
Multimedia	tags:	audio	and	video
<video src="file.mp4">
By	default	the	browser	does	not	show	any	controls	for	this	element,
just	the	video.
Which	means	the	video	will	play	only	if	set	to	autoplay	(more	on	this
later)	and	the	user	can't	see	how	to	stop	it,	pause	it,	control	the	volume
or	skip	to	a	specific	position	in	the	video.
To show the built-in controls, you can add the controls attribute:
You	can	specify	the	MIME	type	of	the	video	file	using	the	 	type	
attribute.	If	not	set,	the	browser	will	try	to	automatically	determine	it:
A	video	file	by	default	does	not	play	automatically.	Add	the	 	autoplay	
attribute	to	play	the	video	automatically:
                                                                             68
Multimedia	tags:	audio	and	video
The	 	loop		attribute	restarts	the	video	playing	at	0:00	if	set;	otherwise,
if	not	present,	the	video	stops	at	the	end	of	the	file:
If	not	present,	the	browser	will	display	the	first	frame	of	the	video	as
soon	as	it's	available.
You	can	set	the	 	width		and	 	height		attributes	to	set	the	space	that
the	element	will	take	so	that	the	browser	can	account	for	it	and	it	does
not	change	the	layout	when	it's	finally	loaded.	It	takes	a	numeric	value,
expressed	in	pixels.
                                                                           69
                                                                           www.dbooks.org
Multimedia	tags:	audio	and	video
                                   70
iframes
iframes
iframes
The	 	iframe		tag	allows	us	to	embed	content	coming	from	other	origins
(other	sites)	into	our	web	page.
<iframe src="page.html"></iframe>
<iframe src="https://site.com/page.html"></iframe>
You	can	set	a	set	of	width	and	height	parameters	(or	set	them	using
CSS)	otherwise	the	iframe	will	use	the	defaults,	a	300x150	pixels	box:
                                                                         71
                                                                         www.dbooks.org
iframes
Srcdoc
The	 	srcdoc		attribute	lets	you	specify	some	inline	HTML	to	show.	It's
an	alternative	to	 	src	,	but	recent	and	not	supported	in	Edge	18	and
lower,	and	in	IE:
Sandbox
The	 	sandbox		attribute	allows	us	to	limit	the	operations	allowed	in	the
iframes.
<iframe src="page.html"></iframe>
alert() in JavaScript
                                                                        72
iframes
target="_blank" links
     origin
     	allow-scripts		lets	the	loaded	iframe	run	scripts	(but	not	create
     popups).
     	allow-top-navigation		gives	access	to	the	iframe	to	the	top	level
browsing context
Allow
Currently	experimental	and	only	supported	by	Chromium-based
browsers,	this	is	the	future	of	resource	sharing	between	the	parent
window	and	the	iframe.
It's	similar	to	the	 	sandbox		attribute,	but	lets	us	allow	specific	features,
including:
     interface
     	ambient-light-sensor		gives	access	to	the	Sensors	API
     AmbientLightSensor	interface
     	autoplay		allows	to	autoplay	video	and	audio	files
     getDisplayMedia	API
     	fullscreen		allows	to	access	fullscreen	mode
                                                                            73
                                                                            www.dbooks.org
iframes
    interface
     	microphone		gives	access	to	the	device	microphone	using	the
    getUserMedia	API
     	midi		allows	access	to	the	Web	MIDI	API
    speakers
     	usb		gives	access	to	the	WebUSB	API.
Referrer
When	loading	an	iframe,	the	browser	sends	it	important	information
about	who	is	loading	it	in	the	 	Referer		header	(notice	the	single	 	r	,	a
typo	we	must	live	with).
    the	referrer	when	the	current	page	is	loaded	over	HTTPS	and	the
    iframe	loads	on	the	HTTP	protocol
     	no-referrer		does	not	send	the	referrer	header
                                                                          74
iframes
origin the referrer is sent, and only contains the origin (port,
    is	loaded	over	HTTPS	and	the	iframe	also	loads	on	the	HTTPS
    protocol.	Sends	nothing	if	the	iframe	is	loaded	over	HTTP
    	strict-origin-when-cross-origin		sends	the	origin	+	path	as	the
    referrer	when	working	on	the	same	origin.	Sends	the	origin	as	the
    referrer	if	the	current	page	is	loaded	over	HTTPS	and	the	iframe
    also	loads	on	the	HTTPS	protocol.	Sends	nothing	if	the	iframe	is
    loaded	over	HTTP
    	unsafe-url	:	sends	the	origin	+	path	as	the	referrer	even	when
    loading	resources	from	HTTP	and	the	current	page	is	loaded	over
    HTTPS
                                                                          75
                                                                          www.dbooks.org
Images
Images
Images
Images	can	be	displayed	using	the	 	img		tag.
This	tag	accepts	a	 	src		attribute,	which	we	use	to	set	the	image
source:
<img src="image.png">
We	can	use	a	wide	set	of	images.	The	most	common	ones	are	PNG,
JPEG,	GIF,	SVG	and	more	recently	WebP.
You	can	set	the	 	width		and	 	height		attributes	to	set	the	space	that
the	element	will	take,	so	that	the	browser	can	account	for	it	and	it	does
not	change	the	layout	when	it's	fully	loaded.	It	takes	a	numeric	value,
expressed	in	pixels.
                                                                          76
Images
  <figure>
  				<img	src="dog.png"
  									alt="A	nice	dog">
  				<figcaption>A	nice	dog</figcaption>
  </figure>
  <img	src="dog.png"
  				alt="A	picture	of	a	dog"
  				srcset="dog-500.png	500w,
  															dog-800.png	800w,
  													dog-1000.png	1000w,
  													dog-1400.png	1400w">
                                                                       77
                                                                       www.dbooks.org
Images
  <img	src="dog.png"
  				alt="A	picture	of	a	dog"
  				sizes="(max-width:	500px)	100vw,	(max-width:	900px)	50vw,	800
  px"
  				srcset="dog-500.png	500w,
  															dog-800.png	800w,
  													dog-1000.png	1000w,
  													dog-1400.png	1400w">
The	media	condition	 	max-width:	500px		sets	the	size	of	the	image	in
correlation	to	the	viewport	width.	In	short,	if	the	window	size	is	<
500px,	it	renders	the	image	at	100%	of	the	window	size.
If	the	window	size	is	bigger	but	<	 	900px	,	it	renders	the	image	at	50%
of	the	window	size.
The	 	vw		unit	of	measure	can	be	new	to	you,	and	in	short	we	can	say
that	1	 	vw		is	1%	of	the	window	width,	so	 	100vw		is	100%	of	the
window	width.
                                                                          78
Images
The	best	use	case	I	found	is	when	serving	a	WebP	image,	which	is	a
format	still	not	widely	supported.	In	the	 	picture		tag	you	specify	a	list
of	images,	and	they	will	be	used	in	order,	so	in	the	next	example,
browsers	that	support	WebP	will	use	the	first	image,	and	fallback	to
JPG	if	not:
  <picture>
  		<source	type="image/webp"	srcset="image.webp">
  		<img	src="image.jpg"	alt="An	image">
  </picture>
  The	 	source		tag	defines	one	(or	more)	formats	for	the	images.	The
  	img		tag	is	the	fallback	in	case	the	browser	is	very	old	and	does
In	the	 	source		tag	inside	 	picture		you	can	add	a	 	media		attribute	to
set	media	queries.
The	example	that	follows	kind	of	works	like	the	above	example	with
	srcset	:
  <picture>
  		<source	media="(min-width:	500w)"	srcset="dog-500.png"	sizes="1
  00vw">
                                                                             79
                                                                         www.dbooks.org
Images
But	that's	not	its	use	case,	because	as	you	can	see	it's	much	more
verbose.
The	 	picture		tag	is	recent	but	is	now	supported	by	all	the	major
browsers	except	Opera	Mini	and	IE	(all	versions).
                                                                      80
Accessibility
Accessibility
Accessibility
It's	important	we	design	our	HTML	with	accessibility	in	mind.
Having	accessible	HTML	means	that	people	with	disabilities	can	use
the	Web.	There	are	totally	blind	or	visually	impaired	users,	people	with
hearing	loss	issues	and	a	multitude	of	other	different	disabilities.
Unfortunately	this	topic	does	not	take	the	importance	it	needs,	and	it
doesn't	seem	as	cool	as	others.
What	if	a	person	can't	see	your	page,	but	still	wants	to	consume	its
content?	First,	how	do	they	do	that?	They	can't	use	the	mouse,	they
use	something	called	a	screen	reader.	You	don't	have	to	imagine	that.
You	can	try	one	now:	Google	provides	the	free	ChromeVox	Chrome
Extension.	Accessibility	must	also	take	care	of	allowing	tools	to	easily
select	elements	or	navigate	through	the	pages.
Web	pages	and	Web	apps	are	not	always	built	with	accessibility	as
one	of	their	first	goals,	and	maybe	version	1	is	released	not	accessible
but	it's	possible	to	make	a	web	page	accessible	after	the	fact.	Sooner
is	better,	but	it's	never	too	late.
                                                                         81
                                                                       www.dbooks.org
Accessibility
  Note:	there	are	several	other	things	to	take	care	about,	which
  might	go	in	the	CSS	topic,	like	colors,	contrast	and	fonts.	Or	how	to
  make	SVG	images	accessible.	I	don't	talk	about	them	here.
It's	important	to	use	the	correct	structure	for	heading	tags.	The	most
important	is	 	h1	,	and	you	use	higher	numbers	for	less	important	ones,
but	all	the	same-level	headings	should	have	the	same	meaning	(think
about	it	like	a	tree	structure)
  h1
  				h2
  								h3
  				h2
  				h2
  								h3
  												h4
Lists	are	important.	A	screen	reader	can	detect	a	list	and	provide	an
overview,	then	let	the	user	choose	to	get	into	the	list	or	not.
  <table>
  		<caption>Dogs	age</caption>
                                                                           82
Accessibility
  		<tr>
  				<th>Dog</th>
  				<th>Age</th>
  		</tr>
  		<tr>
  				<td>Roger</td>
  				<td>7</td>
  		</tr>
  </table>
It's also good for search engines, if that's an incentive for you to add it.
                                                                         83
                                                                         www.dbooks.org
Accessibility
It's	a	lot	and	for	the	full	reference	of	each	of	them	I	give	you	this	MDN
link.	But	you	don't	need	to	assign	a	role	to	every	element	in	the	page.
Screen	readers	can	infer	from	the	HTML	tag	in	most	cases.	For
example	you	don't	need	to	add	a	role	tag	to	semantic	tags	like	 	nav	,
	button	,	 	form	.
Let's	take	the	 	nav		tag	example.	You	can	use	it	to	define	the	page
navigation	like	this:
  <nav>
  		<ul>
  				<li><a	href="/">Home</a></li>
  				<li><a	href="/blog">Blog</a></li>
  		</ul>
  </nav>
If	you	were	forced	to	use	a	 	div		tag	instead	of	 	nav	,	you'd	use	the
	navigation		role:
  <div	role="navigation">
  		<ul>
  				<li><a	href="/">Home</a></li>
  				<li><a	href="/blog">Blog</a></li>
  		</ul>
  </div>
                                                                          84
Accessibility
  <div	tabindex="0">
  ...
  </div>
	aria-label	
This	attribute	is	used	to	add	a	string	to	describe	an	element.
Example:
I	use	this	attribute	on	my	blog	sidebar,	where	I	have	an	input	box	for
search	without	an	explicit	label,	as	it	has	a	placeholder	attribute.
aria-labelledby
                                                                         85
                                                                         www.dbooks.org
Accessibility
This	attribute	sets	a	correlation	between	the	current	element	and	the
one	that	labels	it.
Example:
  <p	aria-labelledby="description">
  ...
  </p>
	aria-describedby	
This	attribute	lets	us	associate	an	element	with	another	element	that
serves	as	description.
Example:
                                                                        86
Accessibility
a	person	that	can't	see	the	page.	Like	my	logo	picture,	or	the
dark/bright	theme	selector.
    https://www.w3.org/TR/WCAG20/
    https://webaim.org
    https://developers.google.com/web/fundamentals/accessibility/
                                                                         87
                                                                         www.dbooks.org