Here is a useful js Fiddle solution that does exactly what you want, adapted from http://www.irunmywebsite.com/raphael/additionalhelp.php?v=2#pagetop
http://jsfiddle.net/q4vUx/102/
var paper = Raphael('stage', 300, 300); var r = paper.rect(50,100,30,50).attr({fill:"#FFF"}), c = paper.circle(90,150,10).attr({fill:"#FFF"}), t = paper.text(50, 140, "Hello"); var rr = paper.rect(200,100,30,50).attr({fill:"#FFF"}), cc = paper.circle(240,150,10).attr({fill:"#FFF"}), tt = paper.text(200, 140, "Hello"); var pp = paper.set(rr, cc, tt); var p = paper.set(r, c, t); r.set = p, c.set = p, t.set = p; rr.set = pp, cc.set = pp, tt.set = pp; p.newTX=0,p.newTY=0,p.fDx=0,p.fDy=0,p.tAddX,p.tAddY,p.reInitialize=false, pp.newTX=0,pp.newTY=0,pp.fDx=0,pp.fDy=0,pp.tAddX,pp.tAddY,pp.reInitialize=false, start = function () { }, move = function (dx, dy) { var a = this.set; a.tAddX=dx-a.fDx,a.tAddY=dy-a.fDy,a.fDx=dx,a.fDy=dy; if(a.reInitialize) { a.tAddX=0,a.fDx=0,a.tAddY=0;a.fDy=0,a.reInitialize=false; } else { a.newTX+=a.tAddX,a.newTY+=a.tAddY; a.attr({transform: "t"+a.newTX+","+a.newTY}); } }, up = function () { this.set.reInitialize=true; }; p.drag(move, start, up); pp.drag(move, start, up);