使用 CSS 的 SVG 渐变

我试图得到一个应用到 SVG rect元素的梯度。

目前,我正在使用 fill属性:

rect {
cursor: pointer;
shape-rendering: crispEdges;
fill: #a71a2e;
}

在浏览器中查看时,rect元素具有正确的填充颜色。

然而,我想知道我是否可以应用一个线性渐变到这个元素?

209062 次浏览

只要在 CSS 中使用您想在 fill属性中使用的任何内容。 当然,这要求您已经在 SVG 中定义了线性渐变。

下面是一个完整的例子:

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>

下面是如何在目标元素上设置 线性梯度:

<style type="text/css">
path{fill:url('#MyGradient')}
</style>
<defs>
<linearGradient id="MyGradient">
<stop offset="0%" stop-color="#e4e4e3" ></stop>
<stop offset="80%" stop-color="#fff" ></stop>
</linearGradient>
</defs>

这里有一个解决方案,你可以添加一个渐变,并改变它的颜色只使用 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>

在 Finesse 所写的基础上,这里有一个更简单的方法来定位 svg 并改变它的渐变。

这是你需要做的:

  1. 为渐变元素中定义的每个颜色停止分配类。
  2. 以 css 为目标,使用普通类更改每个停止的停止颜色。
  3. 赢了!

使用类而不是 :nth-child的一些好处是,如果您重新排列停止时,它不会受到影响。此外,它使每个类的意图明确-你会留下疑惑是否你需要一个蓝色的第一个孩子或第二个孩子。

我已经在所有的 Chrome,Firefox 和 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>

这里有一个可编辑的例子: Https://jsbin.com/gabuvisuhe/edit?html,css,output

2019年答案

有了全新的 css 属性,你可以有更多的灵活性与变量又名 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>

只需在渐变中为每个 stop设置一个命名变量,然后在 css 中根据自己的喜好进行定制。您甚至可以使用 javascript 动态更改它们的值,比如:

document.querySelector('#header-shape-gradient').style.setProperty('--color-stop', "#f5f7f9");

谢谢大家, 谢谢你的精确回答。

在阴影区域中使用 svg,我在 svg 中添加了我需要的3个线性渐变。 我将 css 填充规则放在 web 组件上,继承 odfill 完成这项工作。

    <svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path
d="m258 0c-45 0-83 38-83 83 0 45 37 83 83 83 45 0 83-39 83-84 0-45-38-82-83-82zm-85 204c-13 0-24 10-24 23v48c0 13 11 23 24 23h23v119h-23c-13 0-24 11-24 24l-0 47c0 13 11 24 24 24h168c13 0 24-11 24-24l0-47c0-13-11-24-24-24h-21v-190c0-13-11-23-24-23h-123z"></path>
</svg>
    

<svg height="0" width="0">
<defs>
<linearGradient id="lgrad-p" gradientTransform="rotate(75)"><stop offset="45%" stop-color="#4169e1"></stop><stop offset="99%" stop-color="#c44764"></stop></linearGradient>
<linearGradient id="lgrad-s" gradientTransform="rotate(75)"><stop offset="45%" stop-color="#ef3c3a"></stop><stop offset="99%" stop-color="#6d5eb7"></stop></linearGradient>
<linearGradient id="lgrad-g" gradientTransform="rotate(75)"><stop offset="45%" stop-color="#585f74"></stop><stop offset="99%" stop-color="#b6bbc8"></stop></linearGradient>
</defs>
</svg>
    

<div></div>


<style>
:first-child {
height:150px;
width:150px;
fill:url(#lgrad-p) blue;
}
div{
position:relative;
width:150px;
height:150px;
fill:url(#lgrad-s) red;
}
</style>
<script>
const shadow = document.querySelector('div').attachShadow({mode: 'open'});
shadow.innerHTML="<svg viewbox=\"0 0 512 512\">\
<path d=\"m258 0c-45 0-83 38-83 83 0 45 37 83 83 83 45 0 83-39 83-84 0-45-38-82-83-82zm-85 204c-13 0-24 10-24 23v48c0 13 11 23 24 23h23v119h-23c-13 0-24 11-24 24l-0 47c0 13 11 24 24 24h168c13 0 24-11 24-24l0-47c0-13-11-24-24-24h-21v-190c0-13-11-23-24-23h-123z\"></path>\
</svg>\
<svg height=\"0\">\
<defs>\
<linearGradient id=\"lgrad-s\" gradientTransform=\"rotate(75)\"><stop offset=\"45%\" stop-color=\"#ef3c3a\"></stop><stop offset=\"99%\" stop-color=\"#6d5eb7\"></stop></linearGradient>\
<linearGradient id=\"lgrad-g\" gradientTransform=\"rotate(75)\"><stop offset=\"45%\" stop-color=\"#585f74\"></stop><stop offset=\"99%\" stop-color=\"#b6bbc8\"></stop></linearGradient>\
</defs>\
</svg>\
";
</script>

第一个是正常的 SVG, 第二个在影子世界里。