The behaviour you are experiencing is correct, and your algorithm isn’t breaking. Firstly CSS3 Transforms are designed not to interfere with the box model.
To try and explain…
When you apply a CSS3 Transform on an element. the Element assumes a kind of relative positioning. In that the surrounding elements are not effected by the transformed element.
e.g. imagine three div’s in a horizontal row. If you apply a scale transform to decrease the size of the centre div. The surrounding div’s will not move inwards to occupy the space that was once occupied the transformed element.
example: http://jsfiddle.net/AshMokhberi/bWwkC/
So in the box model, the element does not actually change size. Only it’s rendered size changes.
You also have to keep in mind that you are applying a scale Transform, so your elements “real” size is actually the same as it’s original size. You are only changing it’s perceived size.
To explain..
Imagine you create a div with a width of 1000px and scale it down to 1/2 the size. The internal size of the div is still 1000px, not 500px.
So the position of your dots are correct relative to the div’s “real” size.
I modified your example to illustrate.
Instructions
- Click the div and keep you mouse in the same position.
- Find the dot in the wrong position.
- Press Q, the div will become the correct size.
- Move your mouse to find the dot in the correct position to where you clicked.
http://jsfiddle.net/AshMokhberi/EwQLX/
So in order to make the mouse clicks co-ordinates match the visible location on the div, you need to understand that the mouse is giving back co-ordinates based on the window, and your div offsets are also based on its “real” size.
As your object size is relative to the window the only solution is to scale the offset co-ordinates by the same scale value as your div.
However this can get tricky based on where you set the Transform-origin property of your div. As that is going to effect the offsets.
See here.
http://jsfiddle.net/AshMokhberi/KmDxj/
Hope this helps.