Placeholder simulé
L'attribut placeholder représente un texte de substitution pour un élément de formulaire. Supprimer l'étiquette du champ (label) et la remplacer par un placeholder n'est pas une bonne pratique d'accessibilité.
Règles d’implémentation pour l’accessibilité
Dans un formulaire, il est possible d’afficher un texte par défaut dans un champ via l’attribut placeholder
. Or, tout champ de formulaire doit avoir un label
associé. Le fait de remplacer le libellé label
par un attribut placeholder
empêche l’accessibilité du champ du formulaire puisque le libellé du placeholder
disparaît au focus.
Le motif de conception suivant propose donc de simuler un placeholder
en donnant au label
le rendu visuel du placeholder
.
Visuel
Extraits de code
Code HTML
<form id="motif-placeholder">
<div class="field">
<label for="prenom">Prénom</label>
<input type="text" id="prenom" name="prenomTextField">
</div>
<div class="field">
<label for="nom">Nom</label>
<input type="text" id="nom" name="nomTextField">
</div>
<div class="field">
<label for="email">Adresse mail</label>
<input type="text" id="email" name="emailTextField">
</div>
<button>Envoyer</button>
</form>
Code CSS
Pour adapter la couleur de la barre de navigation et des liens, modifier les codes couleurs dans la déclaration :root
.
:root {
--COULEUR-1: #a2aabd;
--COULEUR-2: #b5bdce;
--COULEUR-3: #333;
--COULEUR-4: #027dc7;
--COULEUR-5: #FFF;
}
#motif-placeholder {
width: 450px;
border: 1px dotted var(--COULEUR-1);
padding: 3em;
}
#motif-placeholder .field {
margin-bottom: 1.75em;
position: relative;
}
#motif-placeholder label {
color: var(--COULEUR-1);
font-size: 1.75em;
font-weight: 500;
left: .5em;
position: absolute;
top: .25em;
transition: all 0.1s linear;
}
#motif-placeholder input {
background-color: transparent;
border: none;
border-bottom: 1px solid var(--COULEUR-2);
color: var(--COULEUR-3);
font-size: 1.5em;
padding: .75em .5em .5em;
width: 100%;
}
#motif-placeholder input:focus {
border-color: var(--COULEUR-4);
outline: 0;
}
#motif-placeholder input:focus+label,
#motif-placeholder input+label.show {
border-radius: 4px;
color: var(--COULEUR-4);
font-size: 1em;
left: .5em;
padding: 0 .15em;
text-transform: uppercase;
top: -1em;
}
#motif-placeholder button {
background: var(--COULEUR-4);
border: none;
border-radius: 5px;
color: var(--COULEUR-5)
font-size: 1.5em;
padding: .75em;
text-transform: uppercase;
width: 100%;
}
Code javascript
var PlaceHolderInputElements = document.querySelectorAll('.field input');
const button = document.querySelector('button[type="reset"]');
for (var i = 0; i < PlaceHolderInputElements.length; i++)
{
scaleLabel(PlaceHolderInputElements[i], true);
PlaceHolderInputElements[i].addEventListener('focus', function () { scaleLabel(this, false) });
PlaceHolderInputElements[i].addEventListener('blur', function () { scaleLabel(this, true) });
button.addEventListener('click', function () { scaleLabel(this, true) });
}
function scaleLabel(element, isLikePlaceholder)
{
if (isLikePlaceholder)
{
if (element.value === '')
{
element.parentNode.querySelector('label').classList.add('like-placeholder');
}
}
else
{
element.parentNode.querySelector('label').classList.remove('like-placeholder');
}
}