translate
будет учитывать width
/ height
внутреннего элемента , поэтому 50% - это половина ширины / высоты переведенного элемента в отличие от top
/ left
, который будетрассмотрим размерность элемента parent .
Вычисление представляет собой простое сложение обоих значений (я добавил третий делитель над #div2
, чтобы вы могли видеть результат)
var div1 = document.querySelector('#div1'); //parent element
var div2 = document.querySelector('#div2'); //translated element
var w1 = div1.offsetWidth,
h1 = div1.offsetHeight;
var w2 = div2.offsetWidth,
h2 = div2.offsetHeight;
var lw = (w1 / 100) * 50 + (-w2 / 100) * 50,
lh = (h1 / 100) * 50 + (-h2 / 100) * 50;
document.querySelector('#left').innerHTML = 'left: ' + lw + 'px;';
document.querySelector('#top').innerHTML = 'top: ' + lh + 'px;';
document.querySelector('#div3').style.left = lw + 'px';
document.querySelector('#div3').style.top = lh + 'px';
#div1 {
width: 560px;
height: 240px;
background: red;
position: relative;
}
#div1 #div2 {
width: 340px;
height: 120px;
background: yellow;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
#div1 #div3 {
width: 50px;
height: 50px;
background: blue;
position: absolute;
opacity: 0.2;
}
<div id="div1">
<div id="div2">
<span id="left"></span>
<br>
<span id="top"></span>
</div>
<div id="div3">
<!-- to compare -->
</div>
</div>