Хорошо на самом деле предоставить трехслойный объект, потому что вы можете раскрасить задний слой, как вам нравится.Передний слой имеет ту же форму, что и задний слой, но имеет непрозрачность, равную нулю, так что вы можете видеть текст на среднем слое.Мне также не нравится использовать узел для обработки событий, но имеется встроенный механизм обработки событий Raphael.Приведенный ниже пример взят из одного из примеров на моем веб-сайте, я сократил его еще больше, чтобы его было легче понять.Также обратите внимание, что это кнопка, состоящая из круга переднего и заднего слоев с текстом, помещенным между двумя слоями.Они также могут быть прямоугольниками / прямоугольниками с закругленными углами.Функциональность включает инвертирование цветов при наведении курсора мыши / мышке ...
button = function (paper, xpos, ypos, r, labeltext)
{
this.backLayer = paper.circle(xpos, ypos, r).attr({ fill: "#FFFF00", 'fill-opacity': 0 , stroke: "#FF0000",'stroke-width':5, 'stroke-opacity':0});
/*The text automatically centres itself as this is the default text positioning for Raphael text*/
this.label = paper.text(xpos, ypos, labeltext).attr({fill:'#ff0000', 'font-size':18});
/*Now we make a copy for the front layer and we also make the back layer opaque. So that you can see it's yellow fill*/
this.frontLayer = this.backLayer.clone();
this.backLayer.attr({'fill-opacity': 1, 'stroke-opacity':1});
/*Now make the back layer and the text referencable for the mouseover, mouseout and click event of the front layer*/
this.frontLayer.backLayer= this.backLayer;
this.frontLayer.label = this.label;
/*Add a preferred cursor by referencing the underlying DOM object of the frontLayer*/
this.frontLayer.node.style.cursor = 'pointer';
/*Now you can interact with the lower layers behind the invisible covering layer ( frontLayer ) in it's event methods*/
this.frontLayer.mouseover(
function (e) {
this.backLayer.animate({ fill: "#FF0000", stroke: "#FFFF00" }, 1000);
this.label.animate({ fill: "#FFFF00" }, 1000);
}
);
this.frontLayer.mouseout(
function (e) {
this.backLayer.animate({ fill: "#FFFF00", stroke: "#FF0000" }, 1000);
this.label.animate({ fill: "#FF0000" }, 1000);
}
);
this.frontLayer.click(
function (e) {
alert("Creating loads of custom buttons is easy\n\nYou made this one with the following specification:\n"+
"Button Text : "+this.label.attr("text")+"\n"+
"Button Centre @ X: "+this.backLayer.attr("cx")+"\n"+
"Button Centre @ Y: "+this.backLayer.attr("cy")+"\n"+
"Button Radius : "+this.backLayer.attr("r"));
}
);
}
/*Create the button*/
rappyButton = new button(paper, 250, 200, 75, "Raphael");
Надеюсь, что помогло.