Bonjour,
Si ça peut aider, voilà où j'en suis.
En théorie, ça devrait fonctionner mais ça marche plus ou moins bien selon les navigateurs (firefox semble le moins bogué).
Edit : ça semble bien marcher avec firefox (windows et mac os) et safari récent (mac os). Ça ne marche qu'à moitié avec chrome (partout) et edge (ils font bien les transforms, mais pas les transitions).
Edit (quelques explications) : l'idée est d'utiliser des variables css. Quand on change une variable css au niveau d'une balise <use>, ce changement est vu dans son shadow-root et hérité par toutes les balises qui s'y trouvent. Du coup, si on définit les valeurs des propriétés transform et opacity avec des variables css, et qu'on modifie la valeur de ces variables lors d'un hover sur le svg, ce changement est transmis aux éléments situés dans le shadow-root du <use> et l'effet se produit ... sauf que Chrome (et Edge) sont bogués en ce qui concerne la propriété transition.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
display: flex;
min-height: 100vh;
align-items: center;
justify-content: center;
font-family: sans-serif;
}
body > * {
margin: 0 1rem;
text-align: center;
}
.d-none {
display: none;
}
p {
margin-bottom: 1rem;
font-style: italic;
}
svg {
width: 5rem;
height: 5rem;
fill: #C4C4C4;
cursor: pointer;
transition: fill .3s ease;
}
svg:hover, svg:focus {
fill: #777;
--t1:rotate(45deg);
--t2:rotate(-45deg);
--o:0;
--tr1:translateY(calc(50% + 1px));
--tr2:translateY(calc(-50% + 1px));
}
rect
{
transition:transform .3s ease,opacity .1s ease;
}
rect:nth-of-type(1)
{
transform:var(--tr1,none);
opacity:var(--o,1);
}
rect:nth-of-type(2)
{
transform:var(--t1,none);
transform-origin:center;
transition-delay:.3s;
}
rect:nth-of-type(3)
{
transform:var(--t2,none);
transform-origin:center;
transition-delay:.3s;
}
rect:nth-of-type(4)
{
transform:var(--tr2,none);
opacity:var(--o,1);
}
</style>
</head>
<body>
<div class="svg-inline">
<p>svg inline</p>
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="16" height="2" rx="1"></rect>
<rect x="0" y="7" width="16" height="2" rx="1"></rect>
<rect x="0" y="7" width="16" height="2" rx="1"></rect>
<rect x="0" y="14" width="16" height="2" rx="1"></rect>
</svg>
</div>
<div class="d-none svg-template">
<p>svg template</p>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="hamburger" viewBox="0 0 16 16">
<rect width="16" height="2" rx="1"></rect>
<rect y="7" width="16" height="2" rx="1"></rect>
<rect y="7" width="16" height="2" rx="1"></rect>
<rect y="14" width="16" height="2" rx="1"></rect>
</symbol>
</svg>
</div>
<div class="svg-use">
<p>svg use</p>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" class="icon" title="icon" data-icon-id="hamburger">
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#hamburger"></use>
</svg>
</div>
</body>
</html>
Amicalement,
Modifié par parsimonhi (17 Oct 2020 - 15:12)