Как создать градиентный объект с Рафаэлем
Я пытался использовать графическую библиотеку Raphael JS. Я хотел бы использовать градиент атрибута, который должен принимать объект. Документация говорит, что они относятся к спецификациям SVG. Я нашел объект градиента в SVG, например
<linearGradient id="myFillGrad" x1="0%" y1="100%" x2="100%" y2="0%">
<stop offset="5%" stop-color="red" />
<stop offset="95%" stop-color="blue" stop-opacity="0.5" />
</linearGradient>
но как я могу ссылаться на это из моего javascript?
circle.attr("gradient", "myFillGrad");
не работает:)
Спасибо заранее
Ответы
Ответ 1
UPDATE: Переписано для последнего API Raphael:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Linear Gradient</title>
<script src="http://raphaeljs.com/raphael.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<script type="text/javascript" charset="utf-8">
var paper = Raphael(10, 10, 800, 600);
var circle = paper.circle(150, 150, 150);
circle.attr({
"fill": "90-#f00:5-#00f:95",
"fill-opacity": 0.5
});
</script>
</body>
</html>
Документация для нового API attr()
находится здесь здесь.
Ответ 2
Я не считаю, что текущий API-интерфейс raphael позволяет вам устанавливать отдельные остаточные непрозрачности, отличные от последнего, которому присваивается значение, переданное в "непрозрачность" attr, например:
this.ellipse(x, y, r, r).attr({stroke: "none", fill: "r(.5,.1)#ccc-#ccc", opacity: 0})
... будет иметь стоп-непрозрачность 0 на последней остановке. Для более тонкого управления я добавил этот "случай" к элементу синтаксического анализа атрибута в моем файле raphael.js:
case "opacityStops":
if (attrs.gradient) {
var gradient = doc.getElementById(node.getAttribute(fillString)[rp](/^url\(#|\)$/g, E));
if (gradient) {
var stops = gradient.getElementsByTagName("stop");
var opacs=value.split("-");
for(var ii=0;ii<stops.length;ii++){
stops[ii][setAttribute]("stop-opacity", opacs[ii]||"1");
}
}
break;
}
Вы также должны добавить соответствующую запись в объект "availableAttrs", например:
availableAttrs = {<other attrs here>..., opacityStops:"1"}
Призыв к созданию круга с радиальным градиентом с разными остановками непрозрачности будет выглядеть следующим образом:
this.ellipse(x, y, r, r).attr({stroke: "none", fill: "r(.5,.5)#fff-#fff:70-#000", "opacityStops": "1-0-0.6"}