は、要素上とDOMツリーまでの任意の変換を考慮せずに要素の位置を取得します:
var el = element,
offsetLeft = 0,
offsetTop = 0;
do{
offsetLeft += el.offsetLeft;
offsetTop += el.offsetTop;
el = el.offsetParent;
} while(el);
変換を考慮せずに要素の位置を取得し、それに適用されるが、DOMを任意の変換を追いつい木。
変換を元に戻すことができます。
最初にtransform-origin
を0,0,0
に設定し、変換(スケール、回転)幅をtranslate(50%,50%) ... translate(-50%, -50%)
に囲む必要があります。 は、ここでの例で、
変更することを:私たちはgetComputedStyleで返される行列は()が含まれていないためのもの変換起源で行うことを行う必要があり
transform: scale(2) rotate(45deg) translate(20px);
transform-origin: 50% 50%; //default value
transform: translate(50%, 50%) scale(2) rotate(45deg) translate(-50%,-50%) translate(20px);
transform-origin: 0 0 0;
に。本当に理由は分かりません。私はそれがこの記事の範囲を超えてだと思うので、私は数学の一部を説明しています
function parseTransform(transform){
//add sanity check
return transform.split(/\(|,|\)/).slice(1,-1).map(function(v){
return parseFloat(v);
});
}
function convertCoord(transformArr, x, y, z){
//add sanity checks and default values
if(transformArr.length == 6){
//2D matrix
//need some math to apply inverse of matrix
var t = transformArr,
det = t[0]*t[3] - t[1]*t[2];
return {
x: ( x*t[3] - y*t[2] + t[2]*t[5] - t[4]*t[3])/det,
y: (-x*t[1] + y*t[0] + t[4]*t[1] - t[0]*t[5])/det
}
}
else /*if (transformArr.length > 6)*/{
//3D matrix
//haven't done the calculation to apply inverse of 4x4 matrix
}
}
var elRect = element.getBoundingClientRect(),
st = window.getComputedStyle(element),
topLeft_pos = convertCoord(
parseTransform(st.transform),
elRect.left,
elRect.top,
st.perspective
);
:
その後、あなたはこのコードを使用することができます。それでも他の場所でそれを説明できますか(別の質問かもしれませんか?)。
変換行列を読んで、行列値と現在の境界矩形でいくつかの計算を行います。 – Teemu
スーパーハッキーhttp://jsbin.com/sivojuluvo/1/edit?js,console,output –
興味深いことに、あなたが答えとしてそれを置くと、私はそれをアップヴォートするでしょう。それは_hacky_ですが、結果が常にすべてのブラウザの 'matrix'または' matrix3d'である場合はそれほど多すぎません。 –