Vincent Barrault

Animation d'écriture de texte en pure CSS

Animation d'écriture de texte en pure CSS

Table des matières

Comment changer le contenu d'un élément avec CSS ?

En HTML, pour modifier le contenu d'un élément, nous serions tenté d'insérer du texte à l'intérieur de ses balises. Comme dans cet exemple:

./example.html
<p>Voici mon contenu</p>

Et nous pourions changer le contenu de ce paragraphe en utilisant javascript pour le sélectionner parmi les éléments du DOM et de modifier son innerText.

Mais ici, nous voulons effectuer cette animation avec seulement du CSS. Nous allons donc laisser le contenu de notre élément vide, comme ceci:

./index.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <link rel="stylesheet" href="style.css">
    </head>

    <body>
        <div id="typing-text"></div>
    </body>
</html>

Et nous allons attacher un pseudo-élément after à notre élément avec la propriété CSS content.

./style.css
body {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100vh;
    width: 100vw;
}

#typing-text::after {
    content: 'développeur';
    font-size: 42px;
    font-family: monospace;
}

Nous pouvons voir que le texte développeur s'affiche bien et que nous avons réussi à afficher du texte avec notre élément.

Maintenant, nous voulons modifier ce texte avec l'aide du CSS uniquement, pour cela, nous allons rajouter une animation à notre élément.

./style.css
#typing-text::after {
    [...]
    animation: change-text 5s infinite;
}

@keyframes change-text {
    from   { content: 'développeur'; }
    25%  { content: 'enthousiaste'; }
    50%  { content: 'curieux'; }
    75%  { content: 'passionné'; }
    to { content: 'développeur'; }
}

Nous devrions obtenir le résultat suivant:

Changement de text en css

Aller plus loin, simuler l'écriture d'un texte

Si nous rajoutons des étapes à notre animation, il nous est possible, lettre par lettre, de simuler l'écriture qu'un humain ferait sur un clavier.

Nous pouvons modifier l'animation comme ceci et jouer sur les valeurs des étapes pour ajouter un côté plus réaliste et moins linéaire à l'animation.

#typing-text::after {
    [...]
    animation: write-text 10s infinite;
}
@keyframes write-text {
    0%   { content: 'e'; }
    1%   { content: 'en'; }
    2%   { content: 'ent'; }
    3%   { content: 'enth'; }
    5%   { content: 'entho'; }
    6%   { content: 'enthou'; }
    7%   { content: 'enthous'; }
    9%   { content: 'enthousi'; }
    10%  { content: 'enthousia'; }
    11%  { content: 'enthousias'; }
    12%  { content: 'enthousiast'; }
    13%  { content: 'enthousiaste'; }
    20%  { content: 'enthousiast'; }
    21%  { content: 'enthousias'; }
    22%  { content: 'enthousia'; }
    23%  { content: 'enthousi'; }
    24%  { content: 'enthous'; }
    25%  { content: 'enthou'; }
    26%  { content: 'entho'; }
    27%  { content: 'enth'; }
    28%  { content: 'ent'; }
    29%  { content: 'en'; }
    30%  { content: 'e'; }
    31%  { content: ''; }
    35%  { content: 'c'; }
    36%  { content: 'cu'; }
    36%  { content: 'cur'; }
    37%  { content: 'curi'; }
    38%  { content: 'curie'; }
    40%  { content: 'curieu'; }
    41%  { content: 'curieux'; }
    49%  { content: 'curieu'; }
    50%  { content: 'curie'; }
    51%  { content: 'curi'; }
    53%  { content: 'cur'; }
    53%  { content: 'cu'; }
    54%  { content: 'c'; }
    55%  { content: ''; }
    65%  { content: 'p'; }
    66%  { content: 'pa'; }
    67%  { content: 'pas'; }
    68%  { content: 'pass'; }
    69%  { content: 'passi'; }
    71%  { content: 'passio'; }
    72%  { content: 'passion'; }
    73%  { content: 'passionn'; }
    74%  { content: 'passionné'; }
    86%  { content: 'passionn'; }
    87%  { content: 'passion'; }
    88%  { content: 'passio'; }
    89%  { content: 'passi'; }
    90%  { content: 'pass'; }
    91%  { content: 'pas'; }
    92%  { content: 'pa'; }
    93%  { content: 'p'; }
    100% { content: ''; }
}

Et voici le résultat:

Effet d'écriture de text en css