Automatiser des dégradés de transition entre éléments

Une couleur "de base" et d'autres couleurs, pas nécessairement à la suite ni dans un ordre de succession défini

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis en pleine réflexion sur des histoires de chronologies. Dans l’idée, je souhaiterais pouvoir mettre des éléments les uns à la suite des autres, avec des couleurs de fond différentes, et avoir une forme de transition en dégradé quand il y a un changement de couleur.

Il ne m’a pas été trop difficile de faire ce qui suit.

Une idée de rendu souhaité
<!DOCTYPE html>
<head>
    <meta charset="UTF-8" />
    <title>Tests dégradés sur éléments qui s'ensuivent</title>
    <style>
:root {
    --current: darkgrey;
    --previous: darkgrey;
}

li:first-of-type {
    width: 45px;
    --previous: var(--current);
}
li:last-of-type{
    width: 75px;
    background: linear-gradient(to right, var(--previous), var(--current) 25%);
}

li {
    display: inline-block;
    width: 60px;
    height: 60px;
    background: linear-gradient(to right, var(--previous), var(--current) 33%);
}
    </style>
</head>

<body>
    <ul>
        <li style="--current: #00cc00;"></li><li style="--previous: #00cc00; --current: #a9a9a9;"></li><li style="--previous: #a9a9a9;; --current: #00cc00;"></li><li style="--previous: #00cc00; --current: #00cc00;"></li><li style="--previous: #00cc00; --current: #a9a9a9;"></li><li style="--previous: #a9a9a9;; --current: #ffa500;"></li>
    </ul>
</body>

Néanmoins, cela ne me paraît pas très propre. Je me suis demandé s’il n’y avait pas moyen de jouer avec les variables directement dans le CSS afin de simplement appliquer une classe pour une couleur (dans le genre de celles des frameworks CSS) et avoir ainsi les "transitions" qui s’appliqueraient plus facilement.

Du coup, j’ai essayé ainsi, en remplaçant les styles explicites dans le HTML par les classes.


.green {
    --current: #00cc00;
}

.orange {
    --current: orange;
}

li+li {
    --temp: var(--previous);
    background: linear-gradient(to right, var(--temp), var(--current) 33%);
    --previous: var(--current);
}

La partie li + li me semblait pratique, mais je n’avais pas mis les "échanges de valeurs" (lignes 11 et 13), du coup, avec deux cases colorées de suite, je me retrouvais avec un dégradé "abrupt" entre deux. Alors j’ai tenté d’ajouter de quoi changer cela. Seulement j’ai bien l’impression que, quel que soit l’ordre des lignes 12 et 13, les variables ont de toute manière la même valeur et du coup, je perds le dégradé.

Est-ce qu’il existe une astuce pour pallier cela, et quelle est-elle ?

Merci d’avance  :)

+0 -0

Hello !

J’ai tenté de reproduire sur un Codepen, et j’arrive au même résultat en ajoutant juste --previous: darkgrey; dans le bloc .orange {}.

Eventuellement tu pourrais jouer avec des sélecteurs du genre .grey + .orange {} ou, en plus générique .grey + li {} pour redéfinir --previous comme il faut pour gérer tes transitions au cas par cas.

Résultat : https://codepen.io/viki53/pen/eYaePVL

Merci. Apparemment, on n’évite pas de lister les possibilités, comme .green+li, ni de spécifier une classe pour la couleur par défaut, c’étaient les deux points pour lesquels je me demandais s’il était possible de s’en passer ou de le définir de manière générique. Une des toutes premières versions listait effectivement explicitement toutes les combinaisons… Avec le nombre de couleurs qui augmente, ça devenait pénible à mon sens.

En même temps, on liste de toute manière les couleurs, donc ajouter le comportement "pour la suite" avec .couleur + li n’est pas si lourd à faire, c’est juste un sélecteur de plus par couleur au final.

+0 -0

Pour l’instant on ne peut pas, mais je crois qu’il y a des choses en cours de travail pour ajouter un peu de logique en CSS. Mais pour l’instant on peut pas vraiment définir de styles… en fonction d’autres styles.

Si tu veux te faciliter le boulot, tu peux toujours ajouter un pré-processeur pour générer la liste de sélecteurs en fonction des couleurs à ta place, mais ça changera pas le code final.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte