Ciao.
Credo che a spostarli sia lo script anche se non capisco quale function lo fa.
Credi male, il problema sta nel CSS.

Poi spostando i rettangoli col mouse il primo lo sposta regolarmente, il secondo, al primo accenno di movimento si abbassa di un centinaio di pixel e il terzo si abbassa molto di più.

Perché?
Cerco di spiegarti. Stai usando position:relative, per cui gli elementi si spostano in relazione alla loro posizione originale, cioè la posizione che occuperebbero nel normale flusso del documento.

I tre div normalmente verrebbero incolonnati uno sopra l'altro, per cui tutti hanno left:0, ma, per ciascuno di loro, il valore del proprio top è influenzato dallo spazio che viene occupato dai div che lo precedono.

La posizione originale del box rosso è quindi top:0, left:0, pertanto lo script funziona come ci si aspetta.
La posizione originale del box blu, invece, ha un valore del top di 120px, cioè lo spazio occupato dal box rosso (100px di altezza, più 10px del padding-top, più 10px del padding-bottom).
Analogamente, il box verde ha un top di 240px.

Dal momento che hai applicato position:relative, variando i valori di top e left, questi saranno semplicemente sommati ai valori originali, in altre parole, lo spostamento è "relativo" alla posizione iniziale

Puoi risolvere usando position:absolute anziché relative.