Architecture d'un composant de saisie animé
La création d'interfaces utilisateur engageantes nécessite une orchestration précise des propriétés graphiques et structurelles. Le fragment suivant expose une implémentation optimisée d'une carte de formulaire intégrant une bordure dynamique, une organisation flexibile et des retours d'état conditionnels.
### Marquage sémantique
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interface Saisie Animée</title>
<link rel="stylesheet" href="style-composant.css">
</head>
<body>
<main class="composant-conteneur">
<form action="#traite-soumission" method="post" class="surface-input">
<div class="Bloc-Champ">
<label for="Id-courriel">Adresse électronique</label>
<input type="email" id="Id-courriel" name="val_courriel" required placeholder="nom@exemple.fr">
</div>
<div class="Bloc-Champ">
<label for="Id-zone-texte">Observations</label>
<textarea id="Id-zone-texte" name="val_message" rows="5" required placeholder="Renseignez le texte requis..."></textarea>
</div>
<button type="submit" class="Action-Soumettre">Transmettre</button>
</form>
</main>
</body>
</html>
Rendu graphique et logiquee CSS
:root {
--bg-primaire: #1a1a1a;
--txt-lisible: #f2f2f2;
--lbl-muted: #8a8a8a;
--brd-base: #3b3b3b;
--clr-accent-a: #e81cff;
--clr-accent-b: #40c9ff;
--radius-cache: 16px;
}
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
background-color: var(--bg-primaire);
font-family: ui-sans-serif, system-ui, sans-serif;
}
.composant-conteneur {
width: 390px;
padding: 30px 26px;
border-radius: var(--radius-cache);
border: 2px solid transparent;
background:
linear-gradient(var(--bg-primaire), var(--bg-primaire)) padding-box,
linear-gradient(135deg, transparent 35%, var(--clr-accent-a), var(--clr-accent-b)) border-box;
box-sizing: border-box;
color: var(--txt-lisible);
display: flex;
flex-flow: column wrap;
gap: 20px;
animation: rotation-gradient 4.5s ease-in-out infinite alternate;
background-size: 200% 100%;
}
@keyframes rotation-gradient {
0% { background-position: 0% 50%; }
100% { background-position: 100% 50%; }
}
.surface-input {
display: flex;
flex-flow: column nowrap;
gap: 16px;
}
.Bloc-Champ {
display: flex;
flex-flow: column nowrap;
gap: 4px;
}
.Bloc-Champ label {
font-size: 0.82rem;
font-weight: 700;
color: var(--lbl-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.Bloc-Champ input,
.Bloc-Champ textarea {
padding: 11px 15px;
border: 1px solid var(--brd-base);
border-radius: 8px;
background: transparent;
color: var(--txt-lisible);
font-family: inherit;
font-size: 0.98rem;
transition: border-color 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s ease;
resize: vertical;
}
.Bloc-Champ input:focus-visible,
.Bloc-Champ textarea:focus-visible {
outline: none;
border-color: var(--clr-accent-a);
box-shadow: 0 0 0 4px rgba(232, 28, 255, 0.12);
}
.Bloc-Champ input::placeholder,
.Bloc-Champ textarea::placeholder {
color: #999;
opacity: 0.7;
}
.Action-Soumettre {
align-self: flex-start;
padding: 12px 30px;
margin-top: 6px;
background-color: #252525;
color: var(--lbl-muted);
border: 1px solid var(--brd-base);
border-radius: 7px;
font-size: 0.95rem;
font-weight: 600;
cursor: pointer;
transition: transform 0.15s ease, background-color 0.2s ease, color 0.2s ease;
}
.Action-Soumettre:hover {
background-color: var(--txt-lisible);
color: #0d0d0d;
}
.Action-Soumettre:active {
transform: scale(0.94);
}
Principes d'implémentation
- Moteur d'animation par positionnement : La règle
@keyframesmodifie progressivement les coordonnées du calque de arrière-plan. L'instructionalternateinverse le flux au terme de chaque cycle, éliminant les sauts brusques. - Orchestration spatiale : Flexbox contrôle la disposition verticale et l'incrémentation des marges internes via
gap, assurant une synchronisation automatique des composants enfants indépendamment de leur hauteur intrinsèque. - État-machines interactives : Les sélecteurs
:focus-visible,:hoveret:activedéclenchent des interpolations gouvernées partransition. La propriététransform: scale()offre un feedback tactile sans perturber le flux de documents. - Fusion de calques pour contours colorés : La déclaration
backgroundempile deux surafces :padding-boxdéfinit l'opacité du fond principal, tandis queborder-boxapplique le dégradé sous-jacent. Cette approche évite les hackers de bordure ou les masques SVG. - Déclaration centralisée : Les tokens CSS personnalisés (
--classeur-*) permettent une maintneance rapide de la palette chromatique et des espacements sans modifier les sélecteurs cibles.