Introduction aux formulaires

Index général
Introduction au Web Page Web de base Introduction à HTML Introduction à CSS Les tableaux
Les images Les listes Les hyperliens Les couleurs Les attributs ID et CLASS
Les éléments DIV et SPAN Éléments structurants Mise en page en colonnes Éléments de types block et inline Le modèle de boîte CSS
Les unités de mesures CSS Les sélecteurs CSS Les grilles CSS Introduction aux formulaires Suppléments pour PFI

Dernière mise à jour le 28 novembre 2022

Qu'est-ce qu'un formulaire HTML?

Jusqu'ici nous avons uniquement créé des pages Web statiques, ne contenant que de l'information à l'usage de l'internaute. Par exemple, une "chronique cryptozoologique".

Naviguer parmi ces pages Web c'est un peu comme lire un livre, un magazine ou un journal, sauf qu'on le fait sur le Web.

Les sites Web les plus intéressants sont les sites transactionnels, c'est-à-dire ceux qui permettent un échange entre l'internaute et le site.

Dans ces cas, le site Web peut carrément être considéré comme un programme, une application Web.

Quelques exemples d'applications Web :

Nous n'aborderons pas directement le développement d'applications Web dans ce document. Ce type de programme sera le sujet des cours 420-KB9 en sessions 3 et 420-KBD en session 4.

Puisque ces applications sont de véritables programmes, il est généralement nécessaires de leur fournir des données pour qu'elles puissent accomplir leur tâche.

C'est là qu'entrent en jeu les formulaires HTML, car ils constituent le principal moyen de fournir les données à ces programmes côté serveur.

Par exemple, après avoir choisi des articles sur un site de commerce électronique à l'aide de formulaires, il vous faudra entrer votre adresse et votre moyen de paiement, encore à l'aide de formulaires.

Même si nous ne verrons pas tout de suite comment développer des applications Web, nous allons dès maintenant apprendre à créer les formulaires HTML nécessaires pour leur envoyer les données dont elles ont besoin.

L'élément form

Un formulaire HTML est créé à l'aide de l'élément form :

<form>
  ...
</form>

L'attribut action

L'attribut action est l'URL du programme côté serveur qui recevra les données du formulaire.

Dans l'exemple suivant, c'est le programme login.php du site prog101.com (un script écrit dans le langage PHP) qui recevra les données du formulaire.

<form action="https://prog101.com/login.php">
  ...
</form>

L'attribut method

L'attribut method est le type de requête HTTP qui sera généré par le formulaire.

L'etude du protocole HTTP n'est pas prévue ici. Sachez seulement que les méthodes les plus répandues sont GET et POST, GET étant la valeur par défaut en l'absence d'un attribut method.

Exemple :

<form action="https://prog101.com/login.php" method="POST">
  ...
</form>

L'élément input

L'image suivante montre le formulaire de connexion au site prog101.com :

Formulaire de prog101.com

Il est composé...

Ce formulaire utilise abondamment les styles CSS. Voici une version épurée sans la mise en forme :



Et voilà le code HTML :

<form action="https://prog101.com/login.php" method="POST">
  <input type="text" name="code"
      placeholder="Adresse courriel ou code utilisateur" required><br>
  <input type="password" name="mdp" placeholder="Mot de passe" required><br>
  <input type="submit">
</form>

À chaque donnée entrée dans le formulaire ou à chaque action (ex : envoyer les données) correspond un élément HTML.

Il s'agit généralement d'un élément input.

Et puisqu'il existe une variété de données pouvant être entrées dans les champs de formulaires, il existe aussi une variété de champs input.

L'attribut type d'un champ input indique le type de la donnée attendue (ex : texte, nombre, mot de passe, date, adresse courriel, etc.).

input type="text"

Examinons d'abord le champ d'entrée le plus utilisé, soit celui dont l'attribut type a la valeur text :

<input type="text" id="..." name="..." required minlength="..." maxlength="..."
    size="..." placeholder="..." value="...">

Le tableau suivant indique le rôle des autres attributs lorsqu'on a input type="text" :

AttributUtilisation
id Idententifie l'élément de manière unique. Utilisé par l'élément label et comme sélecteur CSS.
name Permet de donner un nom à la donnée transmise (essentiel pour la récupérer côté serveur).
required Rend le champ obligatoire (le formulaire ne pourra être soumis si le champ n'est pas rempli).
minlength Nombre minimum de caractères.
maxlength Nombre maximum de caractères.
size Longueur de la boîte de texte (sans rapport avec les deux attributs précédents).
placeholder Description du champ ou exemple de donnée saisie. N'est pas la même chose que value.
value Valeur courante (pré-remplie). N'est pas la même chose que placeholder.

Exemple :

<input type="text" id="pseudo" name="pseudo" required minlength="4" maxlength="12"
    size="16" placeholder="Choisissez un pseudonyme">

Sortie :

L'élément label

Le champ texte que nous venons de créer est intéressant, mais il serait encore mieux si on ajoutait un libellé qui renseigne l’usager sur ce qui doit être entré dans ce champ.

Exemple :

<label for="pseudo">Choisissez un pseudonyme</label>
<input type="text" id="pseudo" name="pseudo" required minlength="4" maxlength="12"
    size="6" placeholder="bob">

Sortie :

On peut évidemment, comme dans le formulaire vu plus haut, se passer de l'élément label et écrire nos libellés directement en texte, mais l'utilisation de cet élément a deux avantages lorsqu'il est bien utilisé :

  1. Au niveau sémantique, il établit un lien entre le texte et le champ de saisie. Ceci ne change pas grand chose pour l'utilisateur, mais peut être important pour les programmes qui analysent les pages Web.
  2. Au niveau pratique, il rend plus facile l'utilisation d'un formulaire. Dans l'exemple ci-haut, l'attribut for permet de cliquer sur le texte “Choisissez un pseudonyme” et de faire en sorte que la boîte d’édition aura l'attention (focus). Si l’attribut for n’est pas présent, l’usager ne pourra pas cliquer sur le texte. Vous allez apprécier encore plus son utilité avec les boîtes à cocher et les boutons radio.

Attention! La valeur de l’attribut for doit absolument correspondre à la valeur que l’on donne à l’attribut id (pas à name)!

type="password"

Les éléments input de type password permettent à l’utilisateur de saisir un mot de passe sans que celui-ci ne soit lisible à l'écran.

Un tel élément se présente comme un contrôle de saisie de texte sur une ligne et dans lequel chaque caractère est remplacé par un symbole particulier afin que le texte saisi ne puisse être lu. Ce symbole est généralement un astérisque (*) et parfois un point ().

Code HTML :

<label for="passe">Choisissez votre mot de passe :</label>
<input type="password" id="passe" name="motdepasse" placeholder="8 caractères minimum"
    minlength="8" required>

Sortie dans le navigateur :

type="email"

Les éléments input de type email permettent à l’utilisateur de saisir une adresse courriel.

À partir du moment où le champ contient un caractère, une validation sera effectuée avant l'envoi des données.

Le contenu du champ devra être constitué d'au moins un caractère, suivi du symbole @ et d'un autre caractère (validation sommaire).

type="number"

Les éléments input de type number permettent à l'utilisateur de saisir des nombres dans un formulaires. Ce contrôle est très pratique car il inclut des mécanismes de validation natifs pour rejeter les valeurs non-numériques.

Le navigateur peut agrémenter le contrôle avec des flèches afin d'incrémenter / décrémenter la valeur grâce à la souris (ou encore avec le doigt).

Les attributs les plus utilisés sont min et max qui permette de fixer l'étendue des valeurs acceptables.

Code HTML :

<p>
  Entrez un nombre de 1 à 10 : <input type="number" min="1" max="10">
</p>

Sortie dans le navigateur :

Entrez un nombre de 1 à 10 :

Entrez une valeur numérique et utilisez les petites flèches à droite de la boîte pour la faire varier.

type="checkbox"

Les éléments input de type checkbox sont affichés sous la forme de boîtes à cocher qui sont cochées lorsqu'elles sont activées. Elle permettent de sélectionner une ou plusieurs valeurs dans un formulaire.

L’attribut name permet de distinguer ou de grouper les boîtes ensemble (nous verrons l'utilité plus tard).

Notez que, contrairement aux boutons radio et même s’ils sont visuellement groupés, il est possible de cocher une ou plusieurs valeurs.

Code HTML :

<p>Choisissez un ou plusieurs jours de la fin de semaine :</p>
<div>
  <input type="checkbox" id=“Samedi" name="samedi" checked>
  <label for=“Samedi">Samedi</label>
</div>
<div>
  <input type="checkbox" id=“Dimanche" name="dimanche">
  <label for=“Dimanche">Dimanche</label>
</div>

Sortie dans le navigateur :

Choisissez un ou plusieurs jours de la fin de semaine :

type="radio"

Les éléments input de type radio sont utilisés pour construire des groupes d'options parmi lesquelles on ne peut choisir qu'une seule valeur.

Le nom de ce composant tire son origine des anciens appareils radio qu'on trouvait autrefois dans les automobiles. Ces appareils étaient pourvus de boutons mécaniques et d'un système de ressorts pour qu'un seul de ces boutons (ou aucun) puissent être sélectionné à la fois.

autoradio
Un autoradio des années 1960

Les "boutons radio" sont représentés par des cercles remplis lorsqu'ils sont sélectionnés.

Exemple :

<legend>Menu principal</legend>
  
<input type="radio" id="soupe" name="mets" value="soupe" checked>
<label for="soupe">Soupe</label><br>
  
<input type="radio" id="sandwich" name="mets" value="sandwich">
<label for="sandwich">Sandwich</label><br>
  
<input type="radio" id="pizza" name="mets" value="pizza">
<label for="pizza">Pizza</label>

Ce qui donne :

Menu principal

Remarques importantes :

type="range"

Les éléments input dont l'attribut type vaut range permettent à l'utilisateur d'indiquer une valeur numérique comprise entre deux bornes. La valeur précise n'est pas considérée comme importante.

Ces éléments sont généralement représentés par un curseur qui peut se déplacer de gauche à droite. Ce genre de contrôle n'étant pas précis, ce type ne devrait pas être utilisé lorsque la valeur exacte fournie par l'utilisateur est importante.

Exemple :

<input type="range" id="volume" name="volume" min="0" max="100">
<br>
<label for="volume">Réglage du volume</label>

Ce qui donne (essayez-le!) :


type="date"

L'élément input dont l'attribut type vaut date permet la saisie des dates à l'aide d'un champ texte dont la valeur est validée grâce à un sélecteur de date (genre de calendrier interactif). Ce sélecteur offre l'année, le mois et le jour.

Exemple :

<form action="...">
  <label for="reservation">Vous voulez réserver pour le</label>
  <input type="date" id="reservation" name="date_reserv">
  <br>
  <input type="submit">
</form>

Ce qui donne :

Comme pour les autres champs d'entrée, on peut offrir à l'utilisateur une date par défaut avec l'attribut value. Il est même possible de fixer un intervalle de validité avec les attributs min et max :

  <input type="date" id="reservation" name="date_reserv" value="2022-04-20"
      min="2022-04-15" max="2022-06-15">

Ce qui donne :

Créer des boutons

Bouton de soumission des données

Il existe plusieurs façons de créer un bouton de formulaire, mais la façon classique est d'utiliser un élément input de type submit.

Exemple :

<input type="submit">

Sortie :

Le message écrit sur le bouton peut varier d'un navigateur à l'autre, mais ressemble toujours à "Envoyer".

On peut choisir le texte écrit sur le bouton à l'aide de l'attribut value.

Exemple :

<input type="submit" value="Envoyer les données">

Sortie :

Bouton de suppression des données

Il est possible de mettre à la disposition de l'utilisateur un bouton pour effacer d'un seul coup toutes les données entrées dans le formulaire.

Il s'agit tout simplement d'un élément input de type reset.

Exemple :

<input type="reset">

Sortie :

Le message écrit sur le bouton peut varier d'un navigateur à l'autre, mais ressemble toujours à "Effacer".

On peut choisir le texte écrit sur le bouton à l'aide de l'attribut value.

Exemple :

<input type="reset" value="Tout recommencer">

Sortie :



Liste déroulante

La liste déroulante (aussi appelée boîte de sélection) est créée avec l'élément select complétée d'un ou plusieurs éléments enfants option qui définissant les valeurs possibles.

Exemple :

<select name="fruit">
  <option>Banane</option>
  <option selected>Citron</option> <!-- option sélectionnée par défaut -->
  <option>Orange</option>
  <option>Pamplemousse</option>
</select>

Sortie :

Dans l'exemple précédent, la valeur sélectionnée dans la liste sera transmise au programme côté serveur dans la variable fruit. Cette valeur correspond au texte entre les balises <option> et </option>.

Si on veut transmettre une valeur différente de celle affichée, on doit alors utiliser l'attribut value.

Par exemple, dans le formulaire suivant, si l'utilisateur sélectionne "Frodon", la valeur transmise dans la variable hobbit sera "Frodon Sacquet".

<select name="hobbit">
  <option value="Frodon Sacquet">Frodon</option>
  <option value="Sam Gamegie">Sam</option>
  <option value="Meriadoc Brandebouc">Merry</option>
  <option value="Peregin Touque">Pippin</option>
</select>

Sortie :

Même si cela n'est pas très fréquent, les éléments option peuvent être imbriqués dans des éléments optGroup pour créer des groupes de valeurs associées.

Exemple :

<select>
  <optGroup label="Fruits">
    <option>Banane</option>
    <option>Citron</option>
    <option>Orange</option>
    <option>Pamplemousse</option>
  </optGroup>
  <optGroup label="Légumes">
    <option>Aubergin</option>
    <option>Carotte</option>
    <option>Pomme de terre</option>
    <option>Navet</option>
  </optGroup>
</select>

Sortie :

Tester un formulaire

Puisque nous ne programmerons pas côté serveur dans ce cours, il nous faut trouver un moyen de vérifier si nos formulaires sont bien construits et permettent au navigateur d'envoyer les données correctement.

J'ai dans ce but écrit un script PHP pour afficher les données envoyées via un formulaire. L'URL de ce programme est https://prog101.com/outils/testform/.

Pour l'utiliser, vous n'avez qu'à utiliser cet URL comme valeur de l'attribut action de votre formulaire.

Exemple :

<form action="https://prog101.com/outils/testform/" method="POST">
  <label for="pseudo">Choisissez un pseudonyme</label><br>
  <input type="text" id="pseudo" name="pseudo" required minlength="4" maxlength="12"
    size="6" placeholder="Ex : bob">
  <input type="submit">
</form>

Sortie (essayez pour voir) :


Donner du style à un formulaire

Enfin, pour donner du style à un formulaire, rien de mieux que les éléments fieldset et legend!

Exemple :

<fieldset style="width: fit-content;">
  <legend>Veuillez remplir S.V.P.</legend>
  
  <form action="https://prog101.com/outils/testform/" method="POST">
    <label for="pseudo">Choisissez un pseudonyme</label><br>
    <input type="text" id="pseudo" name="pseudo" required minlength="4" maxlength="12"
      size="6" placeholder="Ex : bob">
    <input type="submit">
  </form>
  
</fieldset>

Sortie :

Veuillez remplir S.V.P.

CSS et validation des données

On peut rendre plus visible l'état valide ou invalide d'un champ se saisie en construisant des sélecteurs qui utilisent les pseudo-classes :valid et :invalid.

Dans l'exemple suivant, on utilise cette astuce pour indiquer à l'utilisateur qu'il n'a pas entré assez de caractères. Dès qu'il commence à entrer des caractères, le champ de saisie prend un aspect différent tant qu'il n'a pas atteint le minimum requis.

Remarquez qu'il ne peut entrer trop de caractères puisqu'il est limité par la valeur de l'attribit maxlength.

Code HTML :

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Exemple</title>
  <style>
    #mot:invalid {
      background-color: #fee;
      color: #f00;
    }
  </style>
</head>
<body>
  <form action="https://prog101.com/outils/testform/" method="POST">
    <label for="mot">Entrez un mot de 5 à 10 lettres</label>
    <input id="mot" name="mot" type="text" minlength="5" maxlength="10">
    <input type="submit">
  </form>
</body>
</html>

Ajoutez l'attribut required et voyez comment le champ devient invalide dès le départ étant donné qu'il ne contient rien.