J'essaie d'obtenir un dégradé appliqué à un élément SVG rect
.
Actuellement, j'utilise l'attribut fill
. Dans mon fichier CSS:
rect {
cursor: pointer;
shape-rendering: crispEdges;
fill: #a71a2e;
}
Et l'élément rect
a la couleur de remplissage correcte lorsqu'il est affiché dans le navigateur.
Cependant, j'aimerais savoir si je peux appliquer un dégradé linéaire à cet élément?
Utilisez simplement dans le CSS tout ce que vous utiliseriez dans un attribut fill
. Bien entendu, cela nécessite que vous ayez défini le dégradé linéaire quelque part dans votre SVG.
Voici un exemple complet:
rect {
cursor: pointer;
shape-rendering: crispEdges;
fill: url(#MyGradient);
}
<svg width="100" height="50" version="1.1" xmlns="http://www.w3.org/2000/svg">
<style type="text/css">
rect{fill:url(#MyGradient)}
</style>
<defs>
<linearGradient id="MyGradient">
<stop offset="5%" stop-color="#F60" />
<stop offset="95%" stop-color="#FF6" />
</linearGradient>
</defs>
<rect width="100" height="50"/>
</svg>
Avec les nouvelles propriétés CSS, vous pouvez avoir encore plus de flexibilité avec les variables aka custom properties
.shape {
width:500px;
height:200px;
}
.shape .gradient-bg {
fill: url(#header-shape-gradient) #fff;
}
#header-shape-gradient {
--color-stop: #f12c06;
--color-bot: #faed34;
}
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" class="shape">
<defs>
<linearGradient id="header-shape-gradient" x2="0.35" y2="1">
<stop offset="0%" stop-color="var(--color-stop)" />
<stop offset="30%" stop-color="var(--color-stop)" />
<stop offset="100%" stop-color="var(--color-bot)" />
</linearGradient>
</defs>
<g>
<polygon class="gradient-bg" points="0,0 100,0 0,66" />
</g>
</svg>
Définissez simplement une variable nommée pour chaque stop
dans un dégradé, puis personnalisez-la à votre guise dans css. Vous pouvez même changer leurs valeurs dynamiquement avec JavaScript, comme:
document.querySelector('#header-shape-gradient').style.setProperty('--color-stop', "#f5f7f9");
Voici une solution où vous pouvez ajouter un dégradé et changer ses couleurs en utilisant uniquement du CSS:
// JS is not required for the solution. It's used only for the interactive demo.
const svg = document.querySelector('svg');
document.querySelector('#greenButton').addEventListener('click', () => svg.setAttribute('class', 'green'));
document.querySelector('#redButton').addEventListener('click', () => svg.setAttribute('class', 'red'));
svg.green stop:nth-child(1) {
stop-color: #60c50b;
}
svg.green stop:nth-child(2) {
stop-color: #139a26;
}
svg.red stop:nth-child(1) {
stop-color: #c84f31;
}
svg.red stop:nth-child(2) {
stop-color: #dA3448;
}
<svg class="green" width="100" height="50" version="1.1" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="gradient">
<stop offset="0%" />
<stop offset="100%" />
</linearGradient>
<rect width="100" height="50" fill="url(#gradient)" />
</svg>
<br/>
<button id="greenButton">Green</button>
<button id="redButton">Red</button>
S'appuyant sur ce que Finesse a écrit, voici un moyen plus simple de cibler le svg et de modifier son dégradé.
Voici ce que vous devez faire:
Quelques avantages à utiliser des classes au lieu de :nth-child
est que cela ne sera pas affecté si vous réorganisez vos arrêts. En outre, cela clarifie l'intention de chaque classe - vous vous demanderez si vous avez besoin d'une couleur bleue pour le premier enfant ou le second.
Je l'ai testé sur tous les Chrome, Firefox et IE11:
.main-stop {
stop-color: red;
}
.alt-stop {
stop-color: green;
}
<svg class="green" width="100" height="50" version="1.1" xmlns="http://www.w3.org/2000/svg">
<linearGradient id="gradient">
<stop class="main-stop" offset="0%" />
<stop class="alt-stop" offset="100%" />
</linearGradient>
<rect width="100" height="50" fill="url(#gradient)" />
</svg>
Voir un exemple éditable ici: https://jsbin.com/gabuvisuhe/edit?html,css,output