(Info D2) Web 2/3 : HTML + CSS
— Organiser un projet web
Pour concevoir un projet web vous aurez besoin de 3 logiciels :
— Un éditeur de code
- Télécharger un éditeur de code : VS Code ou VS Codium. Il en existe d'autres : Adobe Dreamwaver, Sublime Text, Notepad++, etc. Un simple éditeur de texte de type bloc note pourait suffire, mais les éditeurs de code fournissent des fonctionnalités utiles pour l'écriture de documents pour le web : coloration syntaxique, explorateur de fichiers, sugggestions (avec ou sans IA), plugins multiples, etc.
- Dans VS Code/Codium (VSC), installer l'extension
Live Serverde ritwickdey. Cela ajoute une fonctionnaité de rechargemebt automatique de la page web dans le navigateur qui affiche le résultat, à chaque fois que vous enregistrez un fichier.
— Un navigateur web
- Tous les navigateurs sont désormais à peu près équivalents pour lire et interpréter les langages web : Firefox, Chrome, Safari, Edge, etc. Comme pour l'éditeur de code vous avez le possibilité de choisir un navigateur plus respectueux de votre vie privée : Chromium au lieu de Chrome, Firefox, voire Waterfox et LibreWolf qui sont des versions encore plus respctueuses des internautes que Firefox.
— Un logiciel pour transférer vos fichiers depuis votre machine vers un serveur
Une des solutions les plus courantes est d'utiliser un client FTP (File Transfer Protocol), c'est-à-dire un logiciel qui vous permet de glisser-déposer des fichiers depuis votre ordinateur vers un serveur, c'est-à-dire un autre ordinateur que vous louez chez un hébergeur, et qui est configuré pour servir vos pages web. Un des logiciels les plus connus, gratuit et open source, est FileZilla.
— Une structure de dossiers et fichiers
L'organisation et le nommage des fichiers sont essentiels pour éviter les erreurs. QUand vous débutez un projet web créez un nouveau dossier dans lequel seront stockés l'ensemble des dossiers et fichiers utilisés : fichier .html, .css, .js, médias .jpg, .png, autres documents, etc. Voici une structure type de petit projet web :
Vous noterez que les noms des dossiers et les fichiers ne comportent :
- aucun espace
- aucun caractère spécial autre que
-(il est aussi possible d'utiliser_)
— Le langage HTML : structurer le contenu
— Un langage pour structurer des documents hypertextuels
HTML = Hypertext Markup Language (Langage de balisage hypertextuel)
Pour écrire un document avec du HTML, on utilise des éléments, qui à quelques exceptions près comportent toujours une balise d'ouverture et une balise de fermeture. Le langage a une structure hiérarchique (boîtes dans des boîtes, ou pour reprendre le vocabulaire exact : parents et enfants) :
<article>
<p>
Contenu textuel, avec certains mots en <strong>gras</stonrg> ou avec des <a href="https://dsaadesign-lyon.fr">liens</a>.
</p>
</article>
Les balises ouvrent et ferment les éléments de description du contenu.
Il existe quelques cas particuliers pour lesquels il n'y a pas de balise de fermeture. On dit que la balise d'ouverture est auto-fermante. C'est le cas pour les images <img/>, et pour les lignes de séparation <br/> :
<img src="image/mon_image.png" />
<br/>
Les balises d'ouverture des éléments comportent la plupart du temps des attributs, comme dans les exemples ci-dessus. Ces attributs permettent de donner des praramètres, des styles, et souvent de nommer les éléments utilisés. Exemples :
<!-- Ici l'attribut href permet de définir l'adresse à laquelle le lien renvoie -->
Un <a href="https://dsaadesign-lyon.fr">lien hypertexte</a> vers un site.
<!-- Ici l'attribut src précise l'image qui sera chargée par l'élément img -->
<img src="image/mon_image.png" />
— Les éléments HTML
Il existe 2 grands types d'éléments qui déterminent la façon dont ils se positionnent dans la page :
- Les balises inline, qui vont se juxtaposer naturellement de manière horizontale ;
- Les balises block, qui vont elles prendre toute la largeur de la page (du navigateur) et s'empiler verticalement.
Les balises ci-dessous respectent une approche dite sémantique : elles sont choisies en fonction du contenu qu'elles décrivent.
Remarques :
- Le web d'aujourd'hui a en partie mis de côté cette approche, préférant utiliser les balises sémantiquement indéfinies :
<div>et<span>. - Les environnements de développement (framework) actuels offrent la possibilité de créer ses propres éléments :
<v-produit></v-produit>par exemple
<!-- inline -->
<a href="#">lien hypertexte</a>
<img> image
<span>élément au contenu indéfini</span>
<i>texte en italique</i><strong>texte en gras</strong><del>texte barré</del>
<input> qui est un élément de formulaire
<!-- block -->
<section>grand bloc de page</section>
<article>article</article>
<div>bloc de contenu indéterminé</div>
<p>paragraphe</p>
<!-- Listes -->
<ul>
<li>item de liste</li>
<li>item de liste</li>
<li>item de liste</li>
</ul>
<h1>Titre de niveau 1</h1>
<h2>Titre de niveau 2</h2>
<h3>Titre de niveau 3</h3>
<!-- Jusqu'à 6 -->
<form>Formulaire</form>
<!-- etc. Vioir la liste complète ici : https://developer.mozilla.org/fr/docs/Web/HTML/Reference/Elements -->
Chaque élément, une fois rendu dans un navigateur, a un positionnement et une mise en forme par défaut. Voici une capture écran du rendu du code qui liste les éléments HTML.
— Structure de page type
Un document HTML a en général cette structure :
<!-- en-tête de la page -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Titre de la page, visible en haut du navigateur (et par les moteurs de recherche)</title>
</head>
<!-- fin de l'en-tête de la page -->
<!-- corps de la page -->
<body>
Contenu visible de la page : c'est ici, entre <body> et </body> que les éléments HTML listés ci-dessus prennent place.
</body>
<!-- fin du corps de la page -->
</html>
Et voilà à quoi pourrait ressembler un site avec un header, un menu de navigation, une galerie de projet et un footer :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mon portfolio</title>
</head>
<body>
<header>
<h1>Portfolio</h1>
<p>Hello, bienvenue sur mon portfolio.</p>
</header>
<nav>
<ul>
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
<main>
<article>
<img src="assets/images/min-projet-1.png">
<h2>Titre de mon projet</h2>
<p>Court descriptif du projet en quelques mots</p>
</article>
<article>
<img src="assets/images/min-projet-2.png">
<h2>Titre de mon projet</h2>
<p>Court descriptif du projet en quelques mots</p>
</article>
<article>
<img src="assets/images/min-projet-3.png">
<h2>Titre de mon projet</h2>
<p>Court descriptif du projet en quelques mots</p>
</article>
<!-- etc. -->
</main>
</body>
</html>
Pour tester cette page vous pouvez copier le code suivant, et le coller dans un nouveau fichier index.html. L'extension .html est essentielle car elle va permettre au navigateur de lire le code et de l'interpréter pour l'afficher.
index est un nom standard important, puisque le serveur va toujours chercher un document avec le nom index pour savoir quelle page servir en premier, si aucune n'est définie dans l'url : par exemple si je demande cette page https://info.cern.ch/hypertext/WWW sans préciser de nom de fichier, le serveur va automatiquement renvoyer https://info.cern.ch/hypertext/WWW/index.html.
— Naviguer dans une page et entre des pages
Le HTML permet donc de créer des documents hypertextuels, ce qui signifie qu'il est possible de faire des liens vers d'autres documents.
L'élément qui permet de créer des liens est l'élément <a>, sans doute le plus emblématique du web.
Il est possible de faire des liens internes comme externes grâce à l'attribut href de l'élément <a>. Les liens internes fonctionnent avec des ancres, et les liens externes avec des urls, dont le chemin peut être relatif ou absolu.
Liens vers un élément du document :
Ici la page n'est pas rechargée et aucune autre page n'est appelée.
<a href="#id-element-a-atteindre">Lien interne</a>
<h2 id="id-element-a-atteindre">
Titre de niveau 2
</2>
Quand on clique, le lien fait défiler la page jusqu'à l'élement dont l'ID correspond. Attention dans le lien il faut ajouter # devant l'ID.
Il est possible d'ajouter un effet d'animation grâce à CSS :
body{
scroll-behavior:smooth;
}
Liens externes :
Deux cas de figure :
- Le lien renvoie vers une autre page du site, sur le même serveur. En général l'url définie dans
hrefa un chemin relatif, c'est-à-dire sans préciser l'adresse complète depuis le serveur (par exemple https://https://01000000.dsaadesign-lyon.fr/bio.html). On se contentera donc debio.htmlpuisqu'il est situé sur le même serveur. - Le lien renvoie vers un site externe. Le chemin est donc absolu, c'est-à-dire qu'il part de l'url
httpouhttpsdu serveur. Dans ce cas il peut être utile d'ajouter un attributtargetpour préciser si un nouvel onglet de navigateur doit être ouvert.
<!-- page située sur le même serveur/site -->
<a href="bio.html" target="_blank">Lien vers une page du site</a>
<!-- page située sur un autre serveur -->
<a href="https://dsaadesign-lyon.fr/" target="_blank">Lien externe</a>
— Le langage CSS : mettre en forme le contenu
« CSS j'adore, j'suis amoureuse de CSS, j'adore ce langage »
Julie Blanc, Podcast Graphic Matter, 21/01/2025 (07:01). Écouter le podcast.
— Lier la feuille de style à votre document
CSS (Cascading Style Sheets) permet d'ajouter une feuille de styles au document HTML, afin de contrôler la mise en forme des éléments, leur apparence. Pour que ces styles s'appliquent bien aux éléments HTML de la page, il faut lier le document HTML à la feuille de styles CSS styles.css. Cela se passe dans l'en-tête du document HTML :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Titre de la page</title>
<!-- ici -->
<link href="css/styles.css" rel="stylesheet" />
</head>
<body>
</body>
</html>
Ici le fichier styles.css est situé dans le dossier css/ :
index.html
css
|_ styles.css
assets
|_ images
|_ min-image-1.png
|_ min-image-2.png
|_ min-image-3.png
— Les sélecteurs pour associer les règles CSS aux éléments HTML
Une feuille de style est constituée de règles. Ces règles respectent cette syntaxe :
selecteur{
propriete1:valeur;
propriete2:valeur valeur;
}
Si vous voulez définir une règle pour la balise <h1> de votre document HTML vous devez la sélectionner avec un sélecteur, et définir une et souvent plusieurs propriété(s) ainsi qu'une valeur. Par exemple, changer sa couleur :
h1{
color: red;
}
Il existe de nombreux types de sélecteurs (voir la doc de Mozilla), mais voici les principaux :
/* Sélecteur d'élément */
h1{
color:red;
}
/* Sélecteur de classe : s'applique aux éléments dont l'attribut class
a pour valeur "rouge", comme : <span class="rouge">.
À utiliser si plusieurs éléments sont à cibler */
.rouge{
color:red;
}
/* Sélecteur d'identifiant : ne s'applique qu'à un seul élément
du document qui aura un attribut id avec la valeur
menu-principal <nav id="menu-principal"> */
#menu-principal{
color:red;
}
Les sélecteurs fonctionnent en suivant le chemin des éléments, c'est-à-dire en passant de parents en enfants. Par exemple si vous voulez sélectionner tous les éléments <li> situés dans un <ul> lui-même situé dans un <nav> dont l'ID est menu-principal, voilà le sélecteur qu'il est possible d'utiliser :
<nav id="menu-principal">
<ul>
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
#menu-principal ul li{
color:red;
}
— Le modèle de la boîte en CSS
Les éléments sont pour la plupart des boîtes, avec une largeur et une hauteur, une couleur de fond (ou une image), une bordure, des marges intérieures et extérieures, et d'autres propriétés. Si vous ouvrez les outils de développement de votre navigateur, cette boîte est représentée de cette manière :
Dans ce schéma nous voyons certaines des propriétés les plus importantes :
margin: marges extérieurespadding: marges intérieuresborder: contour, tracés, bordure
A compléter avec :width: largeurheight: hauteurbackground-color(oubackground) : couleur ou image d'arrière-plan
Certaines propriétés sont dédiées à la typo :
font-family: pour définir la police utiliséefont-size: taille du textefont-style: variantes comme italiquefont-weight: graisse du texteline-height: hauteur de ligne
D'autres sont intéressantes (consultez la doc pour connaître leurs valeurs) :
mix-blend-modeopacityfiltertransform
Toutes les propriétés existantes sont présentées dans la référence CSS de Mozilla : https://developer.mozilla.org/fr/docs/Web/CSS/Reference
— Le positionnement des éléments
Comme dans Figma le positionnement des éléments peut répondre à 2 logiques : automatique ou manuelle.
À la différence de Figma, le HTML a une logique par défaut qui est automatique : on appelle ça le flux des éléments. Comme vu plus haut ce flux est lié au type d'élémzent, soit block, soit inline.
La règle est que :
- les éléments
blockoccupent tout l'espace de leur conteneur (la page ou une autre balise dite parente) - les éléments
inlineont la taille du contenu qu'ils contiennent (texte, image), et se juxtaposent horizontalement
Il est possible de sortir les éléments du flux, de plusieurs manières, en utilisant CSS.
- avec la propriété
float(valeurs :leftouright) - avec la propriété
position(valeurs :absolute,fixed,relative,sticky)
Le plus simple est d'utiliseer position comme dans l'exemple ci-dessous. Alors que l'élement <nav> devrait se positionner dans le flux en-dessous de <p>, une règle CSS lui attribue la propriété position:fixed :
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
<nav>☰</nav>
nav{
position:fixed;
top:20px;
right:20px;
}
Une fois la propriété position activée, il suffit de définir les coordonnées de l'élément avec top, left, bottom ou right.
— Positionner les éléments avec flexbox (= auto layout de Figma)
CSS a une propriété très utile pour mettre en page des éléments de manière automatique, ou fluide : la propriété display, et plus précisément les valeurs flex et grid. Ces 2 valeurs permettent de positionner les éléments à la manière de l'auto layout de Figma : flux vertical et horizontal, ou en grille, gouttières, alignements, marges, etc.
Dans l'exemple ci-dessous, nous souhaitons positionner les éléments d'une liste en flux Flexbox. Les propriétés seront ici affectées à l'élément parent, au conteneur (comme dans Figma).
<nav>
<ul id="list-flex">
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
#list-flex{
display:flex;
flex-direction: row;
gap:30px;
}
#list-flex li{
border-bottom: 1px solid #000;
}
Et si on met flex-direction: column; :
Si on souhaite ajouter un titre et des icônes pour faire un header, il va falloir basculer le header en display:flex pour mieux contrôler le positionnement des éléments :
<header>
<h1>dsaa.studio</h1>
<nav>
<ul id="list-flex">
<li>Home</li>
<li>Bio</li>
<li>Projets</li>
<li>Contact</li>
</ul>
</nav>
<a>
<img src="assets/ui/instagram.svg" />
</a>
</header>
Il faut ajouter display:flex au header, et utiliser 2 propriétés complémentaires : justify-content qui définit les marges automatiques (comme dans Figma), et align-items qui est la propriété d'alignement qui fonctionne comme dans Figma également.
header{
display: flex;
justify-content: space-between;
align-items: center;
}
#list-flex{
display:flex;
flex-direction: row;
gap:30px
}
#list-flex li{
border-bottom: 1px solid #000;
}
Voici un schéma de correspondance entre le fonctionnement de l'auto layout Figma et la Flexbox CSS :
D'autres propriétés de la Flexbox s'appliquent aux éléments enfants du conteneur :
orderflex-grow: intéressante pour définir la taille des élémentsflex-basisflex-shrinkalign-self
Appuyez-vous sur cette page pour manipuler les nombreuses propriétés de la flexbox : https://flexbox.malven.co/
— Ressources
Références web
- https://www.hoverstat.es/
- https://brutalistwebsites.com/
- https://www.siteinspire.com/
- https://emreed.net/LowTech_Directory
Langages
- HTML : https://developer.mozilla.org/fr/docs/Web/HTML
- CSS : https://developer.mozilla.org/fr/docs/Web/CSS
Outils
- Flexbox : https://flexbox.malven.co/
- Générateur de règles CSS : https://htmlcheatsheet.com/css/
- Contrastes de couleur : https://randoma11y.com/
- Guide éco-conception web : https://designersethiques.org/fr/thematiques/ecoconception/guide-d-ecoconception
- Audit accessibilité https://ara.numerique.gouv.fr/audits/nouveau
Cours / ressources
- Les excellentes ressources de Radical Web Design : https://radicalweb.design/ressources/
- Un autre cours : https://jenseign.com/