我如何使用一个函数返回的svg梯度
How do I use an svg gradient returned by a function?
我正试图根据json中包含的数据计算梯度。在这种情况下,D是json中的一个对象,它没有其他子节点(网络的叶子)。我试图使用calculateGradient(d)的返回来为"叶圈"上色,但它似乎不起作用。
function calculateGradient(d){
var total = d.totalVulnCount;
var low = (d.vulnCountLow/total * 100);
var med = (d.vulnCountMed/total * 100);
var high = (d.vulnCountHigh/total * 100);
var critical = (d.vulnCountCritical/total * 100)
var grad = svg.append("defs").append("linearGradient").attr("id", "grad")
.attr("x1", "0%").attr("x2", "100%").attr("y1", "0%").attr("y2", "0%");
grad.append("stop").attr("offset", low).style("stop-color", "#fdc500");
grad.append("stop").attr("offset", low).style("stop-color", "#fd8c00");
grad.append("stop").attr("offset", med).style("stop-color", "#fd8c00");
grad.append("stop").attr("offset", med).style("stop-color", "#dc0000");
grad.append("stop").attr("offset", high).style("stop-color", "#dc0000");
grad.append("stop").attr("offset", med).style("stop-color", "#780000");
grad.append("stop").attr("offset", high).style("stop-color", "#780000");
//Gradient colors of circles
return grad;
}
var circle = plotWrapper.append("circle")
.attr("id", "nodeCircle")
.attr("class", function(d,i) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; })
.style("fill", function(d) { return d.children ? colorCircle(d.depth) : "url(#calculateGradient(d))" }) // for the gradient use "url(#grad)" instead of color
.attr("r", function(d) {
if(d.ID === "1.1.1.1") scaleFactor = d.value/(d.r*d.r);
return d.r;
})
.on("click", function(d) { if (focus !== d) zoomTo(d); else zoomTo(root); });
我最困惑的是,如果我是分配变量'grad以下:
var low = 10%;
var med = 30%;
var high = 60%;
var critical = 100%
var grad = svg.append("defs").append("linearGradient").attr("id", "grad")
.attr("x1", "0%").attr("x2", "100%").attr("y1", "0%").attr("y2", "0%");
grad.append("stop").attr("offset", low).style("stop-color", "#fdc500");
grad.append("stop").attr("offset", low).style("stop-color", "#fd8c00");
grad.append("stop").attr("offset", med).style("stop-color", "#fd8c00");
grad.append("stop").attr("offset", med).style("stop-color", "#dc0000");
grad.append("stop").attr("offset", high).style("stop-color", "#dc0000");
grad.append("stop").attr("offset", med).style("stop-color", "#780000");
grad.append("stop").attr("offset", high).style("stop-color", "#780000");
那么使用下面的代码就可以了:
var circle = plotWrapper.append("circle")
.attr("id", "nodeCircle")
.attr("class", function(d,i) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; })
.style("fill", function(d) { return d.children ? colorCircle(d.depth) : "url(grad)" }) // for the gradient use "url(#grad)" instead of color
.attr("r", function(d) {
if(d.ID === "1.1.1.1") scaleFactor = d.value/(d.r*d.r);
return d.r;
})
.on("click", function(d) { if (focus !== d) zoomTo(d); else zoomTo(root); });
但是当我要求变量d传递给函数时,我无法做到这一点。
我真正需要知道的是是否有可能将一个函数的返回值赋值给"url(#…)"吗?
我尝试了"url(#calculateGradient(d))"answers"url(#calculateGradient(d);)",绝望地尝试了"url(#"+ calculateGradient(d);"+")",但什么也动不了:(请帮帮我!
这一行:
"url(#calculateGradient(d))"
就是将渐变设置为那个字符串。它对调用函数不做任何事。
修复方法是调用该函数并将填充设置为url(#grad)
。所以:
.style("fill", function(d) {
if (d.childen){
return colorCircle(d.depth);
}else{
calculateGradient(d); //<-- invoke the function
return "url(#grad)";
}
});
顺便说一句,你的梯度函数不需要返回任何东西,你真的不会使用那个值。你的渐变和圆圈由渐变的id
连接。
相关文章:
- 使用返回函数sinde.attr()jquery元素
- 从自执行函数返回函数的Javascript性能命中率
- Node Express Handlebars帮助程序未返回函数的结果
- 未在Firefox中执行PageMethod的返回函数
- 对返回函数的函数感到困惑
- 从承诺返回不返回函数会导致警告
- 从函数返回函数而不调用返回的函数
- Javascript,闭包中的返回函数如何与外部函数连接
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 对象函数返回函数而不是值
- 从外部函数(数组)了解返回函数(x)
- 从Javascript类对象返回函数
- 调用Typescript setter don't返回函数,尽管关联的getter可以工作
- 使用依赖注入在 JavaScript 中返回函数
- 通过单击JSP和javascript加载两个返回函数
- 需要说明:无法理解返回函数的javascript
- 简单的onClick返回函数不起作用
- 为什么这个闭包返回函数
- JS函数返回函数供以后使用-未定义参数
- Coffeescription类中的方法返回函数而不是字符串