【问题标题】:RaphaelJS with rgba gradient fillRaphaelJS 与 rgba 渐变填充
【发布时间】:2013-04-26 23:11:07
【问题描述】:

我正在尝试使用使用 rgba 颜色的 RaphaelJS 创建渐变填充。换句话说,我希望起点和终点都具有一定程度的透明度。例如,20% 黑色到 0% 黑色。这是怎么做到的?

这个小提琴是我期望的,但正如你所见,底部的黑色是完全不透明的。 http://jsfiddle.net/4aPj2/

r.circle(50,50,50).attr({fill:'90-rgba(0,0,0,0)-rgba(0,0,0,0.2)',opacity:0})

【问题讨论】:

  • 这是 Raphael 的一个错误/实现。此外,由于 VML 仅支持 2 个不透明度停止点(开始和结束),这不会反映在较旧的 IE 浏览器上。

标签: javascript svg raphael


【解决方案1】:

好的,

对于任何查看此问题的人来说,上一个答案都是一个红鲱鱼。我只是花了半天时间在 raphaeljs 源代码中挖掘。不是这么简单。因此,Raphaeljs 实际上已经对此有一些内置支持,并且您尝试像上面那样修改的任何内容都将不起作用,因为内置支持稍后会覆盖它。 Raphaeljs 目前拥有的支持允许您使用 opacity 属性和 fill-opacity 设置最终色标的透明度,例如:

r.circle(50,50,50).attr({fill:'90-#000000-#0000ff',opacity:0})

将在现实世界中转换为中心的第一个色标(黑色)为 100% 不透明度,最后一个色标(蓝色)为 0% 的不透明度的圆圈。另一个例子:

r.circle(50,50,50).attr({fill:'90-#000000-#ffffff',opacity:0.5})

将产生一个真实世界的圆圈,中心为 100% 不透明度的黑色,在最后一站的圆圈外围为 50% 的白色不透明度。

Raphaeljs 目前没有方法来支持两种颜色停止上的不同不透明度,但如果您迫切需要这样做,您需要修改的源代码行将在此处:

$(stops[stops.length - 1], {"stop-opacity": value});

在当前版本的 Raphaeljs (2.1.0) 中位于 6265。 我希望这可以帮助某人避免我刚刚花费的调试 RaphealJS 源代码的时间......

【讨论】:

  • 感谢 Jeff 在这里更新。 :)
  • 上述答案已更新,以包含最初遗漏的更改。我猜,从细微的变化来看,红鲱鱼似乎是一个错位的词汇!! ;-)
【解决方案2】:

有一个解决方法,但这涉及编辑raphael.js

找到代码块:

el.appendChild($("stop", {
    offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%",
        "stop-color": dots[i].color || "#fff"
}));

并使用以下方法替换它:

el.appendChild($("stop", {
    offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%",
        "stop-color": dots[i].color || "#fff",
        "stop-opacity": R.is(dots[i].opacity, "undefined") ? 1 : dots[i].opacity
}));

更新:后来发现我不小心错过了补丁中的一行更改。

接下来,在函数R._parseDots中找到以下行

par[2] && (dot.offset = par[2] + "%");

替换成

dot.opacity = dot.color.opacity;
par[2] && (dot.offset = par[2] + "%");

通过上面的代码,您可以轻松地使用myRect.attr("fill", "90-rgba(255,0,0,0.25)-rgba(0,255,0,0.75)-rgba(0,0,255,0.25)"); 之类的东西,但请注意,该解决方案是针对 SVG 输出的,VML 不支持这一点。 VML 仅支持在 0% 位置的渐变上的单个不透明度,以及在 100% 位置的最后一个不透明度可选的第二个不透明度。还有一些 VML 的代码更改,我不包括在这里。

代码可以在fiddle http://jsfiddle.net/shamasis/SYdJW/中看到

【讨论】:

  • 谢谢萨马西斯。我的示例只有 2 个站点 - 每端一个站点 - 所以不应该取消它在 VML 中工作的资格,不是吗?如您所述,我尝试更新 Raphael 源代码,但没有进行任何更改。请看我更新的小提琴 - jsfiddle.net/4aPj2/1
  • 我尝试单步调试调试器,而dots 从来没有.opacityproperties。我尝试在dot.color = dot.color.hex; 之前将dot.opacity = dot.color.opacity; 添加到R._parseDots。现在,无论dots[] 中的值如何,<lineargradient>s 都将使用stop-opacity="0" 进行渲染。我现在已经摸不着头脑了,所以我认为我现在无法进一步挖掘。
  • 我明天会调查的。现在已经很晚了。
  • @Jeff 我已经更新了代码以包含我之前没有提到的部分。另一个功能的变化非常小。另外,我认为现在可以删除反对票。:-)
  • 这不是我的反对票,但这是一个 +1 的跟进 :) 我现在在做一个不同的项目,所以可能需要一段时间才能重新开始。跨度>
猜你喜欢
  • 2011-08-22
  • 2011-12-06
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2019-04-23
  • 2012-12-09
  • 1970-01-01
相关资源
最近更新 更多