Séance 5
Objectifs
Être capable d’intégrer et de décrire des images correctement.
Être capable d’intégrer l’accessibilité dans le code.
Savoir insérer des icônes pour enrichir une interface.
Méthode : Arborescence

Des images ainsi que leurs versions miniatures ont été ajoutées.
Méthode : index.html
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Portfolio de Vincent Vanneste</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/accueil.css">
</head>
<body>
<header id="haut" role="banner" aria-label="En-tête du site">
<figure role="img" aria-labelledby="figcaption-vv">
<img src="images/photo.jpg" alt="Photo de Vincent Vanneste">
<figcaption id="figcaption-vv">Vincent Vanneste</figcaption>
</figure>
<h1>Portfolio de Vincent Vanneste</h1>
<nav role="navigation" aria-label="Navigation principale">
<ul>
<li><a href="index.html">Accueil</a></li>
<li><a href="projets.html">Projets</a></li>
<li><a href="https://www.univ-littoral.fr/" target="_blank">ULCO</a></li>
</ul>
</nav>
</header>
<main role="main">
<nav role="navigation" aria-label="Navigation interne à la page">
<ul>
<li><a href="#about">À propos</a></li>
<li><a href="#competences">Compétences</a></li>
<li><a href="#experiences">Expériences</a></li>
<li><a href="#formations">Formations</a></li>
</ul>
</nav>
<!-- À propos -->
<section id="about" role="region" aria-labelledby="titre-about">
<h2 class="icon-about" id="titre-about">À propos</h2>
<p>Je suis directeur des études du DEUST WMI de Calais et j'enseigne les fondamentaux du développement web
(HTML, CSS, JavaScript, PHP). Passionné par la transmission des connaissances, j'accompagne mes
étudiants dans l'acquisition des compétences nécessaires pour réussir dans le secteur du numérique.</p>
<address role="contentinfo" aria-label="Coordonnées">
<dl>
<dt>Localisation :</dt>
<dd>Calais, France</dd>
<dt>Site :</dt>
<dd><a href="https://vincent-vanneste.fr/" target="_blank">vincent-vanneste.fr</a></dd>
<dt>Email :</dt>
<dd><a href="mailto:vincent.vanneste@univ-littoral.fr">vincent.vanneste@univ-littoral.fr</a></dd>
</dl>
</address>
</section>
<!-- Compétences -->
<section id="competences" role="region" aria-labelledby="titre-competences">
<h2 class="icon-competences" id="titre-competences">Compétences</h2>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>Responsive</li>
<li>Accessibilité</li>
<li>JavaScript</li>
<li>PHP • Laravel 11</li>
<li>MySQL</li>
<li>Git & GitHub</li>
</ul>
</section>
<!-- Expériences -->
<section id="experiences" role="region" aria-labelledby="titre-experiences">
<h2 class="icon-experiences" id="titre-experiences">Expériences récentes</h2>
<ul>
<li>
<strong>Enseignant – Licence 1 Informatique</strong><br>
<time datetime="2025">2025</time> •
<address>
<a href="https://www.univ-littoral.fr/" target="_blank">ULCO</a>
</address><br>
Introduction à HTML, CSS, JS
</li>
<li>
<strong>Directeur des études – DEUST WMI</strong><br>
<time datetime="2024-2025">2024 → 2025</time> •
<address>
<a href="https://www.univ-littoral.fr/" target="_blank">FCU ULCO</a>
</address>
</li>
</ul>
</section>
<!-- Formations -->
<section id="formations" role="region" aria-labelledby="titre-formations">
<h2 class="icon-formations" id="titre-formations">Formations</h2>
<ul>
<li>
<strong>Doctorat productique, automatique et informatique industrielle</strong><br>
<time datetime="2000">2000</time> •
<address>
<a href="https://www.univ-lille.fr/" target="_blank">Université de Lille</a>
</address>
</li>
<li>
<strong>CAPET Technologie</strong><br>
<time datetime="1998">1998</time> •
<address>
<a href="https://www.iufm-douai.fr/" target="_blank">IUFM Douais</a>
</address>
</li>
</ul>
</section>
</main>
<footer role="contentinfo" aria-label="Pied de page">
<p>© 2025 <strong>Vincent Vanneste</strong>. Tous droits réservés. | <a href="#haut">Haut de page</a></p>
</footer>
</body>
</html>
Rôle des attributs role
L’attribut role
indique la fonction ou le rôle sémantique d’un élément pour les technologies d’assistance (lecteurs d’écran, etc.). Il permet à l’utilisateur d’identifier rapidement la structure et la fonction de chaque section du site, même si la balise HTML ne donne pas cette information.
Dans ton document :
role="banner"
sur<header>
:Indique que l’en-tête contient des informations importantes comme le logo ou le titre du site. Il s’agit généralement de la zone introductive du site.
role="img"
sur<figure>
:Indique que l’élément est une image (ou un ensemble image + description) à des fins d’accessibilité, même si la balise
<img>
est déjà présente.role="navigation"
sur<nav>
:Signale que le bloc est un menu de navigation. Les lecteurs d’écran peuvent ainsi proposer aux utilisateurs de sauter directement à la navigation.
role="main"
sur<main>
:Définit la zone principale du document, distincte des en-têtes, menus et pieds de page.
role="region"
sur<section>
:Délimite une section du contenu que l’utilisateur peut atteindre rapidement avec des aides à la navigation.
role="contentinfo"
sur<footer>
et<address>
:Indique que cet élément contient des informations sur le site ou le contact, généralement situées en pied de page.
Rôle des attributs ARIA (aria-*
)
Les attributs ARIA (Accessible Rich Internet Applications) fournissent des informations supplémentaires aux technologies d’assistance sur la structure ou le contenu d’un élément.
Dans ton document :
aria-label
:Sert à donner un nom ou une description explicite à un élément lorsque son rôle ou son contenu n’est pas suffisamment clair.
Exemples :
<header aria-label="En-tête du site">
→ décrit le contenu de l’en-tête.<nav aria-label="Navigation principale">
→ précise que ce menu est le menu principal du site.<footer aria-label="Pied de page">
→ décrit la fonction du pied de page.
aria-labelledby
:Permet de lier un élément à un autre élément qui le décrit. L’élément lié fournit la description ou le titre qui sera lu par les lecteurs d’écran.
Exemple :
<figure role="img" aria-labelledby="figcaption-vv"> <img src="images/photo.jpg" alt="Photo de Vincent Vanneste"> <figcaption id="figcaption-vv">Vincent Vanneste</figcaption> </figure>
Ici, l’image a pour description le contenu du
<figcaption>
identifié parfigcaption-vv
.
Résumé pratique
role
→ dit quoi est l’élément (en-tête, navigation, image, section, etc.).aria-*
→ fournit des détails supplémentaires pour les lecteurs d’écran (nom, description, lien avec un autre élément).
En combinant ces deux attributs, ton site devient beaucoup plus accessible, surtout pour les personnes utilisant des technologies d’assistance.
Méthode : projets.html
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Portfolio - Projets</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/projets.css">
</head>
<body>
<header id="haut" role="banner" aria-label="En-tête du site">
<figure role="img" aria-labelledby="figcaption-vv">
<img src="images/photo.jpg" alt="Photo de Vincent Vanneste">
<figcaption id="figcaption-vv">Vincent Vanneste</figcaption>
</figure>
<h1>Portfolio de Vincent Vanneste</h1>
<nav role="navigation" aria-label="Navigation principale">
<ul>
<li><a href="index.html">Accueil</a></li>
<li><a href="projets.html">Projets</a></li>
<li><a href="https://www.univ-littoral.fr/" target="_blank">ULCO</a></li>
</ul>
</nav>
</header>
<main role="main">
<h1>Mes projets</h1>
<section role="region" aria-labelledby="liste-projets">
<h2 id="liste-projets">Liste des projets</h2>
<div class="projets">
<article role="article" aria-labelledby="titre-projet1">
<h3 id="titre-projet1"><a href="projet1.html">Projet 1</a></h3>
<figure role="img" aria-labelledby="fig-projet1">
<img src="images/vignettes/projet1.jpg" alt="Aperçu du Projet 1">
<figcaption id="fig-projet1">Aperçu du Projet 1</figcaption>
</figure>
<p>Un projet qui présente les bases du HTML et de la mise en page.</p>
</article>
<article role="article" aria-labelledby="titre-projet2">
<h3 id="titre-projet2"><a href="projet2.html">Projet 2</a></h3>
<figure role="img" aria-labelledby="fig-projet2">
<img src="images/vignettes/projet2.jpg" alt="Aperçu du Projet 2">
<figcaption id="fig-projet2">Aperçu du Projet 2</figcaption>
</figure>
<p>Un site en CSS avec une mise en forme responsive adaptée aux mobiles.</p>
</article>
<article role="article" aria-labelledby="titre-projet3">
<h3 id="titre-projet3"><a href="projet3.html">Projet 3</a></h3>
<figure role="img" aria-labelledby="fig-projet3">
<img src="images/vignettes/projet3.jpg" alt="Aperçu du Projet 3">
<figcaption id="fig-projet3">Aperçu du Projet 3</figcaption>
</figure>
<p>Un mini-site en JavaScript avec des interactions simples.</p>
</article>
<article role="article" aria-labelledby="titre-projet4">
<h3 id="titre-projet4"><a href="projet4.html">Projet 4</a></h3>
<figure role="img" aria-labelledby="fig-projet4">
<img src="images/vignettes/projet4.jpg" alt="Aperçu du Projet 4">
<figcaption id="fig-projet4">Aperçu du Projet 4</figcaption>
</figure>
<p>Une application web utilisant PHP et MySQL pour gérer des données.</p>
</article>
<article role="article" aria-labelledby="titre-projet5">
<h3 id="titre-projet5"><a href="projet5.html">Projet 5</a></h3>
<figure role="img" aria-labelledby="fig-projet5">
<img src="images/vignettes/projet5.jpg" alt="Aperçu du Projet 5">
<figcaption id="fig-projet5">Aperçu du Projet 5</figcaption>
</figure>
<p>Un projet complet combinant HTML, CSS, JS et base de données.</p>
</article>
</div>
</section>
</main>
<footer role="contentinfo" aria-label="Pied de page">
<p>© 2025 <strong>Vincent Vanneste</strong>. Tous droits réservés.</p>
</footer>
</body>
</html>
Intérêt principal de <figure>
Sémantique claire :
<figure>
signale que l’image a une valeur informative ou illustrative, et que son contenu est autonome par rapport au reste du texte.Les moteurs de recherche et les technologies d’assistance comprennent mieux le rôle de l’image.
Accessibilité améliorée :
Associé à
<figcaption>
ouaria-labelledby
, un lecteur d’écran peut annoncer la légende de l’image, ce qui aide les utilisateurs malvoyants à comprendre le contenu visuel.
Organisation du contenu :
<figure>
permet de regrouper l’image et sa légende dans un seul bloc, pratique pour le style et la mise en page.Le navigateur sait que l’image et sa légende sont liées et peuvent être déplacées ensemble avec CSS si nécessaire.
Indépendance du contenu :
Le contenu d’un
<figure>
peut être référencé indépendamment dans le texte, par exemple avec<a href="#id-figure">…</a>
.Cela montre que l’image et sa légende ont un sens complet même hors du contexte immédiat.
3. Bonnes pratiques
Toujours fournir un
alt
descriptif sur l’image pour l’accessibilité.Utiliser
<figcaption>
pour décrire l’image ou donner un titre explicatif.Éviter
<figure>
pour des images purement décoratives (dans ce cas,<img>
avecalt=""
suffit).
Résumé :
Utiliser <figure>
avec <figcaption>
rend ton contenu plus structuré, sémantique et accessible, et permet aux utilisateurs et moteurs de recherche de comprendre le rôle et le sens de l’image.
Méthode : css/style.css
/* --- Styles généraux --- */
body {
font-family: Arial, sans-serif;
/* Définit la police principale du texte */
color: #333;
/* Couleur du texte (gris foncé) */
background: #fff;
/* Couleur d’arrière-plan blanche */
margin: 0;
/* Supprime la marge par défaut du navigateur autour du body */
}
/* --- Header --- */
header {
text-align: center;
/* Centre le contenu du header horizontalement */
padding: 20px;
/* Ajoute de l’espace intérieur (haut/bas/gauche/droite) */
background: #f0f0f0;
/* Couleur de fond gris clair */
border-bottom: 2px solid #ddd;
/* Ligne grise en bas du header */
}
/* Figure contenant la photo et le nom */
header figure {
margin: 0;
/* Supprime la marge par défaut de la balise figure */
display: inline-block;
/* Permet de garder la figure à côté d’autres éléments */
text-align: center;
/* Centre le contenu de la figure (image + légende) */
}
header figure img {
width: 150px;
/* Largeur fixe de l’image */
height: auto;
/* Hauteur automatique (conserve les proportions) */
border-radius: 50%;
/* Rend l’image parfaitement ronde */
border: 3px solid #0066cc;
/* Bordure bleue autour de la photo */
}
header figure figcaption {
margin-top: 8px;
/* Espace au-dessus de la légende */
font-size: 1rem;
/* Taille du texte normale */
color: #333;
/* Couleur du texte */
}
/* Titre principal du site */
header h1 {
margin: 10px 0;
/* Espace vertical autour du titre */
font-size: 2rem;
/* Taille du texte plus grande */
color: #333;
/* Couleur du texte */
}
/* Liste de navigation principale */
header nav ul {
list-style: none;
/* Supprime les puces de la liste */
padding: 0;
/* Supprime le retrait interne */
margin: 10px 0 0;
/* Marge au-dessus de la navigation */
}
header nav li {
display: inline-block;
/* Affiche les éléments de la liste sur une même ligne */
margin: 0 15px;
/* Espace horizontal entre les liens */
}
header nav a {
text-decoration: none;
/* Supprime le soulignement des liens */
color: #0066cc;
/* Couleur bleue pour les liens */
font-weight: bold;
/* Met le texte en gras */
}
header nav a:hover {
text-decoration: underline;
/* Soulignement au survol */
}
/* --- Main --- */
main>h1 {
text-align: center;
/* Centre le titre principal du main */
color: #1e3a5f;
/* Couleur bleu foncé */
font-size: 2rem;
/* Taille du texte plus grande */
margin: 20px 0;
/* Espace vertical autour du titre */
}
main>section {
max-width: 900px;
/* Largeur maximale du contenu */
margin: 0 auto 40px;
/* Centre horizontalement + marge basse */
padding: 0 15px;
/* Espace intérieur à gauche et à droite */
}
main>section h2 {
color: #1e3a5f;
/* Couleur du titre (bleu foncé) */
font-size: 1.5em;
/* Taille du texte 1,5 fois la taille normale */
}
/* --- Footer --- */
footer {
background: #1e3a5f;
/* Fond bleu foncé */
color: #fff;
/* Texte blanc */
text-align: center;
/* Centre le texte horizontalement */
padding: 20px;
/* Espace intérieur autour du contenu */
}
footer a {
color: #ff8c42;
/* Liens orange */
text-decoration: none;
/* Pas de soulignement */
}
footer a:hover {
color: #ffcc00;
/* Jaune vif au survol */
}
Méthode : css/accueil.css
/* --- Navigation interne dans <main> --- */
main nav ul {
list-style: none;
/* Supprime les puces */
padding: 0;
/* Supprime le retrait interne */
margin: 0 0 20px;
/* Espace en dessous de la liste */
text-align: center;
/* Centre les éléments horizontalement */
}
main nav li {
display: inline-block;
/* Place les éléments sur une seule ligne */
margin: 0 10px;
/* Espace horizontal entre les liens */
}
main nav a {
text-decoration: none;
/* Supprime le soulignement */
color: #1e90ff;
/* Couleur bleue claire */
font-weight: bold;
/* Met le texte en gras */
}
main nav a:hover {
color: #0056b3;
/* Change la couleur au survol (bleu plus foncé) */
}
/* --- Sections principales dans <main> --- */
main>section p {
color: #333;
/* Couleur du texte */
font-family: Georgia, serif;
/* Police à empattements (meilleure lisibilité pour le corps du texte) */
}
main>section a {
color: #1e90ff;
/* Couleur des liens */
text-decoration: underline;
/* Soulignement visible par défaut */
}
main>section a:hover {
color: #0056b3;
/* Change la couleur au survol */
}
Méthode : css/projets.css
/* --- Projets --- */
.projets {
text-align: center;
/* centre les articles à l'intérieur du conteneur */
}
.projets article {
display: inline-block;
/* affiche les articles les uns à côté des autres (comme du texte) */
vertical-align: top;
/* aligne le haut des articles entre eux */
width: 220px;
/* largeur fixe pour chaque carte */
margin: 10px;
/* espace extérieur autour de chaque carte */
padding: 10px;
/* espace intérieur entre le bord et le contenu */
background: #f9f9f9;
/* couleur de fond gris très clair */
border: 1px solid #ddd;
/* bordure fine et grise autour des cartes */
border-radius: 8px;
/* arrondit légèrement les coins de la carte */
text-align: left;
/* le texte à l’intérieur est aligné à gauche */
}
.projets h3 {
margin-top: 0;
/* supprime l’espace au-dessus du titre */
font-size: 1.1rem;
/* définit la taille du titre en unités relatives */
}
.projets a {
text-decoration: none;
/* enlève le soulignement par défaut des liens */
color: #0066cc;
/* applique une couleur bleue au lien */
font-weight: bold;
/* met le lien en gras */
}
.projets a:hover {
text-decoration: underline;
/* remet le soulignement quand on survole le lien */
}
.projets p {
font-size: 0.9rem;
/* définit une taille de texte légèrement plus petite */
color: #333;
/* applique une couleur gris foncé au texte */
}
.projets figure {
margin: 0;
/* supprime les marges par défaut autour de la figure */
padding: 0;
/* supprime le padding par défaut */
}
.projets figure img {
width: 100%;
/* l'image prend toute la largeur de la carte */
height: auto;
/* la hauteur s'ajuste automatiquement pour garder les proportions */
border-radius: 4px;
/* arrondit légèrement les coins de l'image */
border: 1px solid #ccc;
/* ajoute une bordure grise claire autour de l'image */
margin-bottom: 8px;
/* espace entre l'image et la légende */
}
.projets figure figcaption {
font-size: 0.85rem;
/* taille de la police de la légende */
color: #666;
/* couleur gris moyen pour la légende */
text-align: center;
/* centre le texte de la légende */
}
Exemple :
See the Pen Séance 5-index by Vincent-Vanneste (@vincent-vanneste) on CodePen.
Exemple :
See the Pen Séance 5-projets by Vincent-Vanneste (@vincent-vanneste) on CodePen.