【问题标题】:Gradient smoothing in a long SVG object长 SVG 对象中的渐变平滑
【发布时间】:2012-11-17 03:37:25
【问题描述】:

我正在使用 D3 创建一个填充有渐变的大对象,但是对象越大,渐变变得越不平滑。以下是创建此类工件的代码示例:

 <script type="text/javascript" src="http://mbostock.github.com/d3/d3.js?1.27.1">
 <script type="text/javascript">

var w = 4000,
    h = 100,
    m = 50;

var svg = d3.select("body").append("svg:svg")
    .attr("width", w)
    .attr("height", h);

var gradient = svg.append("svg:defs")
  .append("svg:linearGradient")
    .attr("id", "gradient")
    .attr("x1", "0%")
    .attr("y1", "0%")
    .attr("x2", "100%")
    .attr("y2", "0%")
    .attr("spreadMethod", "pad");

for (i=0; i<m; i++) {
    gradient.append("svg:stop")
        .attr("offset", (i*100.0)/(m-1.0) + "%")
        .attr("stop-color", "hsl(240,0%,"+(i%2)*100+"%)")
        .attr("stop-opacity", 1);
}

svg.append("svg:rect")
    .attr("width", w)
    .attr("height", h)
    .style("fill", "url(#gradient)");

  </script>

是否可以通过某些 SVG 属性来增加渐变平滑度?

【问题讨论】:

    标签: svg d3.js gradient


    【解决方案1】:

    这是 Chrome 渐变实现的一个错误,它也发生在 CSS 渐变中。 http://code.google.com/p/chromium/issues/detail?id=41756。它适用于除 Chrome 之外的所有浏览器。

    幸运的是,在您的情况下,有一个解决方法:使用spreadMethod: reflect;,这将允许您在较小的区域内声明渐变并让浏览器重复它:

    var gradient = svg.append("svg:defs")
      .append("svg:linearGradient")
        .attr("id", "gradient")
        .attr("x1", "0%")
        .attr("y1", "0%")
        .attr("x2", "2%")
        .attr("y2", "0%")
        .attr("spreadMethod", "reflect");
    
    gradient.append("svg:stop")
      .attr("offset", 0)
      .attr("stop-color", "black")
      .attr("stop-opacity", 1);
    
    gradient.append("svg:stop")
      .attr("offset", 1)
      .attr("stop-color", "white")
      .attr("stop-opacity", 1);
    

    这也有更好的性能。希望您的实际 viz 看起来有些相似!

    您可以在此处查看演示: http://jsfiddle.net/uKH4j/

    【讨论】:

    • 感谢您指出 Chrome 错误。在 Firefox 中效果很好。但是,在我的情况下,解决方法并不实用,因为不同的停止颜色应该有不同的值 - 该数字应该代表测量中的不同密度(这就是我使用 hsl 的原因)。也不能将大数字分成多个数字。
    • 好吧,解决它的困难方法是将rect 分解成多个它们,多个渐变会产生一个长渐变。不过,您可能会在两个矩形相交的地方得到渲染伪影。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多