Это старый вопрос, но я только что пробился, поэтому решил поделиться своим ответом.
Вы можете получить доступ к объекту SVG напрямую, даже внутри вызовов Рафаэля, таким образом:
this.node.getAttribute('x')
или
this.node.getAttribute('transform')
Второй - это то, что дает нам то, что нам нужно.Проблема с вращением текста с помощью Raphael состоит в том, что все, что он делает, это устанавливает преобразование в SVG:
<text x="600" y="606.240234375" text-anchor="middle" style="text-anchor: middle;
font: normal normal normal 10px/normal Arial; font-family: Arial; font-weight: 900;
font-size: 18px; " font="10px "Arial"" stroke="none" fill="#000000"
font-family="Arial" font-weight="900" font-size="18px" transform="rotate(45 600 600)">
<tspan style="-webkit-user-select: none; cursor: pointer; ">FOOBAR</tspan></text>
Несколько вызовов .rotate () перезаписывают предыдущие настройки, поэтому, наконец, в SVG-преобразовании есть только один вызов поворота,Но мы можем добавить наши собственные преобразования, напрямую обращаясь к атрибуту.Похоже, что преобразования выполняются в обратном порядке (или что-то в этом роде - я, честно говоря, не слишком об этом думал), поэтому вы добавляете свой дополнительный поворот последним, если хотите, чтобы он шел первым:
<script>
(function (raphael) {
$(function () {
var paper = raphael("raphael_div", 500, 500);
upside_down_text = paper.text(100,100,'UPSIDE DOWN')
.attr('font-family','Arial')
.attr('font-size','24px');
upside_down_text.rotate(25,250,250); // rotate using Raphael
// But first we want to rotate 180 degrees.
height = upside_down_text.getBBox().height;
upside_down_text.node.setAttribute('transform',
upside_down_text.node.getAttribute('transform')+
' rotate(180 '+
upside_down_text.node.getAttribute('x')+
' '+
(upside_down_text.node.getAttribute('y')-(height/2))+
')');
});
})(Raphael.ninja());
</script>
<div id="raphael_div"></div>