:tocdepth: 2
======
HTML
======
.. include:: commondefs.rst.inc
.. ifslides::
.. include:: credits.rst.inc
Un langage à balises
====================
.. index:: balise
see: tag; balise
see: markup language; langage à balise
Notion de balise
++++++++++++++++
* HTML est un format textuel,
* il peut donc être édité dans n'importe quel éditeur de texte.
* Le texte normal sera affiché tel quel.
* Les **balises** sont des codes, qui ne sont pas affichés tels quels,
mais servent à indiquer le rôle du texte balisé,
* et donc *indirectement* comment il sera présenté.
.. admonition:: Vocabulaire
En anglais, les balises sont appelées `tags`:eng:;
« langage à balise » se traduit par `markup language`:eng:.
Exemple
-------
Si vous écrivez ::
Qu'est-ce qu'une balise?
.. container:: build
.. container::
\... vous verrez :
.. raw:: html
Qu'est-ce qu'une balise?
Le mot « balise » est marqué comme important (em = emphase),
c'est pourquoi il est affiché en italique.
.. index:: chevron
see: bracket; chevron
single: balise; ouvrante
single: balise; fermante
Structure des balises
+++++++++++++++++++++
.. code-block:: html
Qu'est-ce qu'une balise?
* Tout texte entre les **chevrons** (en anglais `brackets`:eng:) ``<`` et ``>``
est considéré une balise.
* ```` est une balise *ouvrante*,
```` est la balise *fermante* qui lui correspond;
elles délimitent le texte concerné.
.. tip::
Les éditeurs de texte reconnaissent les balises,
et les mettent automatiquement en couleur
pour faciliter la lecture du code HTML.
.. index:: emboîtement
Emboîtement
-----------
.. image:: _static/matroshka.jpg
:height: 15ex
:align: right
:alt: http://commons.wikimedia.org/wiki/File:Russian-Matroshka2.jpg
:class: float-right
On peut appliquer plusieurs balises au même texte,
à condition de respecter la règle d'**emboîtement** :
toute balise B ouverte à l'intérieur d'une balise A
doit également être fermée à l'intérieur de A.
Exemples :
.. code-block:: html
Emboîtement correct
.. code-block:: html
Emboîtement incorrect
.. index:: arbre
.. _structure_en_arbre:
Structure en arbre
------------------
De la règle d'emboîtement,
il découle que les balises confèrent une structure d'**arbre** au document :
.. rst-class:: big
.. code-block:: html
Lorem ipsum dolor sit.
.. graphviz::
graph {
X -- Y
Y -- Lorem
Y -- Z
Z -- ipsum
X -- dolor
X -- X2
X2 -- "sit."
X [ label="", shape=box, style=rounded ]
Y [ label="", shape=box, style=rounded ]
Z [ label="", shape=box, style=rounded ]
X2 [ label="", shape=box, style=rounded ]
Lorem [ shape=elipse, style=filled ]
ipsum [ shape=elipse, style=filled ]
dolor [ shape=elipse, style=filled ]
"sit." [ shape=elipse, style=filled ]
}
.. index:: attribut
Attributs
---------
Certaines balises, en plus du contenu textuel qu'elles délimitent,
ont besoin d'information supplémentaire
(mais qui n'apparaîtra pas dans le document).
Cette information est donnée par des **attributs**,
qui ont la forme ``nom=valeur``
et sont placés *entre les chevrons* de la balise ouvrante,
après son nom.
Par exemple ::
P-A. Champin
n'affichera que le texte « P-A. Champin ».
.. index:: balise; vide
.. _balisevide:
Balises vides
-------------
Certaines balises particulières n'attendent pas de contenu textuel.
Ces balises **vides** n'ont donc pas de balise fermante correspondante ::
Cette balise n'a pas de contenu.
On peut (mais ce n'est pas une obligation) indiquer explicitement
l'absence de balise fermante en ajoutant la barre oblique
à la fin de la balise ouvrante ::
Cette balise n'a pas de contenu.
Gestion des espaces
+++++++++++++++++++
Si vous écrivez ::
Gestion des
espaces.
.. container:: build
.. container::
\... vous verrez :
.. raw:: html
Gestion des
espaces.
.. index:: espaces
Explication
-----------
HTML considère tous les caractères d'espacements
(espaces, retours à la ligne...)
comme des séparations entre mots,
et les affiche comme une *simple espace*.
Cela donne de la souplesse dans la mise en page du *code* HTML
(notamment en utilisant l'*indentation*, comme en programmation).
On va voir dans la suite comment faire afficher des retours à la ligne.
.. index:: structure logique, structure physique, fond / forme,
feuille de style
Séparation fond / forme
+++++++++++++++++++++++
Depuis la version 4, HTML vise a décrire la *structure logique* du document,
c'est à dire le **fond** et non la **forme**.
La mise en forme (qu'on appelle parfois *structure physique*) est gérée par
une **feuille de style** qui sera décrite en `css`:doc:.
Cette séparation est indispensable pour assurer l'**adaptabilité** du contenu,
et cette adaptabilité est incontournable dans un environnement ouvert comme le Web:
* `responsive design`__
* `accessibilité`__
__ http://en.wikipedia.org/wiki/Responsive_design
__ http://www.w3.org/standards/webdesign/accessibility
.. note::
Considérez que votre page web peut être visualisée sur
* un ordinateur fixe (grand écran, clavier, souris)
* un ordinateur portable (écran moyen, clavier, touchpad)
* une tablette (écran moyen à petit, écran tactile, clavier éventuellement)
* un smartphone (petit écran tactile, accéléromètre?, voix?)
* un téléviseur (très grand écran, télécommande)
* un terminal pour non-voyant (lecteur d'écran, afficheur braille)
Structure d'un document
=======================
.. _structure_globale:
Structure globale
+++++++++++++++++
.. code-block:: html
:linenos:
Titre du document
...
.. index:: , , , , charset
Explication
-----------
* La 1e ligne indique la version de HTML (ici, HTML5).
* Tout document html (``:html:) comprend deux parties.
- La tête (``:html:) contient les méta-données,
qui ne sont pas directement affichées :
* le titre (``:html:) est obligatoire,
* l'indication d'encodage (ligne 5) est facultative,
mais recommandée ;
- Le corps (``:html:) contient
le contenu à proprement parler du document.
.. note::
On remarque que l'indication d'encodage est un exemple
de balise sans contenu et possédant un attribut.
Valideur
--------
Le W3C fournit un service de validation en ligne :
http://validator.w3.org/
Son utilisation vous est *vivement* recommandée.
Titres et paragraphes
+++++++++++++++++++++
Un document typique est une séquence de
* titres (ou en-tête, en anglais `heading`:eng:), et de
* paragraphes.
Les titres ont différents niveaux d'importance,
repérables à leur typographie (et parfois à leur numérotation),
et donnent une structure *hiérarchique* au document
(en parties, sous-parties, *etc*.).
.. container:: build
.. admonition:: Question
Identifiez-vous les différents niveaux de titre dans l'exemple suivant ?
.. _exemple_regle_du_jeu:
Exemple
-------
.. figure:: _static/exo_structure/sujet.png
:width: 100%
:class: shadow
.. _balises_html:
.. index::
,
,
,
,
,
,
Titres et paragraphes en HTML
-----------------------------
* Les paragraphes sont délimités par la balise `
`:html:
* Les titres sont délimités par les balises `
`:html:, `
`:html:..., `
`:html: ;
* `
`:html: est le niveau le plus important,
et `
`:html: le moins important.
Illustration ::
Ceci est un titre
Ceci est un paragraphe.
Ceci est un deuxième paragraphe.
Illustration plus élaborée
``````````````````````````
.. rst-class:: big
.. code-block:: html
Ma dissertation
Thèse
Paragraphe d'introduction
Argument 1
...
...
...
Argument 2
...
...
...
Antithèse
Contre-argument 1
...
...
...
Contre-argument 2
...
...
...
Synthèse
...
...
...
Notez l'indentation pour faciliter la lecture.
Cohérence
---------
⚠ L'enchaînement des niveaux de titre doit être cohérent :
* le premier titre devrait toujours être de niveau 1 ;
* un titre ne devrait pas monter de plus d'un niveau par rapport au précédent.
.. warning::
« Mais si le `
`:html: ne se différencie pas assez du `
`:html:
visuellement, j'ai le droit de mettre un `
`:html: à la place ? »
→ non; HTML doit être cohérent avec la *structure* du document.
Pour changer la typographie, on modifiera plutôt le `css`:doc:.
Cohérence (suite)
`````````````````
NB : ces règles de cohérence ne sont pas *normatives*,
leur non-respect n'est *pas* signalé par le valideur,
mais il est tout de même à proscrire.
.. warning::
C'est donc à vous d'être attentifs à bien les respecter.
.. _exo_catane:
Exercice
````````
#. Téléchargez le `texte`__ correspondant à l'`exemple ci-avant`__
en utilisant les balises `
`:html: et ``:html:.
__ _static/exo_structure/texte.txt
__ _static/exo_structure/sujet.png
NB : la mise en forme sera différente,
mais cherchez surtout à reproduire la structure *logique* du document.
#. Téléchargez le `modèle HTML`__ correspondant à l'exemple,
et recopiez votre code à l'intérieur de la balise ``:html: .
Ce modèle contient un lien vers la feuille de style appropriée.
__ _static/exo_structure/modele.html
Dans les deux cas, ne tenez pas compte pour l'instant
des mots en gras, italique et souligné.
Sections
++++++++
Les titres définissent en fait une structure de plus haut niveau :
* chaque titre indique le début d'une *section*,
* qui se termine au prochain titre de même niveau ;
Une section contient donc
* un titre,
* éventuellement des paragraphes,
* éventuellement une ou plusieurs section(s) de niveau suivant.
.. index::
Sections en HTML
----------------
* Jusqu'à HTML 4.01, la structuration en sections était laissée implicite.
* Depuis HTML5, on `peut`:del: est encouragé à utiliser
la balise ``:html:,
* d'autant que les anciens navigateurs l'ignoreront purement et simplement.
Arbre avec des sections implicites
``````````````````````````````````
.. container:: big
.. graphviz::
graph {
node [ shape=elipse, style=filled ]
body -- h1 -- "Ma dissertation"
body -- h2_1 -- "Thèse"
body -- p_1 -- "...1"
body -- h3_1 -- "Argument 1"
body -- p_2 -- "...2"
body -- p_3 -- "...3"
body -- h3_2 -- "Argument 2"
body -- p_4 -- "...4"
body -- p_5 -- "...5"
body -- h2_2 -- "Anti-thèse"
body -- h3_3 -- "Contre-argument 1"
body -- p_6 -- "...6"
body -- p_7 -- "...7"
body -- h3_4 -- "Contre-argument 2"
body -- p_8 -- "...8"
body -- p_9 -- "...9"
body -- h2_3 -- "Synthèse"
body -- p_10 -- "...10"
body [ label="", shape=box, style=rounded ]
h1 [ label="
", shape=box, style=rounded ]
"...1" [ label="..." ]
"...2" [ label="..." ]
"...3" [ label="..." ]
"...4" [ label="..." ]
"...5" [ label="..." ]
"...6" [ label="..." ]
"...7" [ label="..." ]
"...8" [ label="..." ]
"...9" [ label="..." ]
"...10" [ label="..." ]
}
.. note::
À ce stade, on pourrait arguer que l'ordinateur *peut* reconstruire
la structure des sections à partir des niveaux de titre,
et donc qu'il est superflu d'alourdir le code HTML
avec cette information redondante.
Lorsqu'on étudiera `css`:doc: et les scripts (`l'an prochain`__),
on comprendra mieux l'intérêt de rendre cette structure explicite.
__ http://champin.net/enseignement/intro-js
.. _exo_catane2:
Exercice
````````
Améliorez votre version de l'`exemple ci-avant`__
en ajoutant les balises ``:html:.
__ _static/exo_structure/sujet.png
Redondance et compatibilité
---------------------------
RMQ: l'emboîtement des sections suffit à déterminer leur niveau,
donc l'information portée par le numéro de titre est *redondante*.
→ en HTML5, on peut en théorie n'utiliser que `
`:html: à tous les niveaux,
* les navigateurs compatibles adapteront la typographie
en fonction de la « profondeur ».
⚠ cependant, en pratique on évitera de le faire, car
* ce n'est pas compatible avec les anciens navigateurs,
* certains outils (moteurs de recherche, lecteurs d'écran)
attendent un *unique* ``h1`` dans la page.
.. note::
Pour ces raisons,
le valideur HTML du W3C émet un *warning* lorsqu'une page contient plusieurs ``h1``.
Illustration
````````````
.. rst-class:: big
.. code-block:: html