如何计算居中 div 的顶部和左侧位置?
How to calculate top and left positions of a centered div?
这个问题比标题复杂一点,我正在尝试获取使用这些 css 属性的居中 div 的顶部和左侧值:
top:50%;
left:50%;
transform:translate(-50%, -50%);
我能够毫无问题地获得顶部和左侧的值,但我不明白 translate(-50%, -50%)
在下面的论坛中是如何表现的。
尝试 Fiddle 测试:https://jsfiddle.net/nqym3s4b/
...
<div id="div1">
<div id="div2">...</div>
</div>
var div = document.querySelector('#div2');
var w = div.offsetWidth,
h = div.offsetHeight;
// top & left
var lw = (w / 100) * 50,
lh = (h / 100) * 50;
// top & left with transform(-50%, -50%)
var tw = (lw / 100) * 50,
th = (lh / 100) * 50;
left = 'left: ' + tw + 'px;';
top = 'top: ' + th + 'px;';
有什么想法吗?
我从 MDN web docs 拍了这张照片。它显示了 CSS 翻译 属性 是如何工作的。基本上,HTML 的工作方式如下:原点保持在元素的左上角,x
轴向右,y
轴向下
属性将一个二维向量作为参数(x
和y
),并按照向量定义的方向移动整个元素。
translate
会考虑inner元素的width
/height
,所以50%是width/height的一半翻译后的元素不像 top
/left
那样会考虑 parent 元素的维度。
计算是两个值的简单相加(我在#div2
上加了第三个div所以你可以看到结果)
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>
这个问题比标题复杂一点,我正在尝试获取使用这些 css 属性的居中 div 的顶部和左侧值:
top:50%;
left:50%;
transform:translate(-50%, -50%);
我能够毫无问题地获得顶部和左侧的值,但我不明白 translate(-50%, -50%)
在下面的论坛中是如何表现的。
尝试 Fiddle 测试:https://jsfiddle.net/nqym3s4b/
...
<div id="div1">
<div id="div2">...</div>
</div>
var div = document.querySelector('#div2');
var w = div.offsetWidth,
h = div.offsetHeight;
// top & left
var lw = (w / 100) * 50,
lh = (h / 100) * 50;
// top & left with transform(-50%, -50%)
var tw = (lw / 100) * 50,
th = (lh / 100) * 50;
left = 'left: ' + tw + 'px;';
top = 'top: ' + th + 'px;';
有什么想法吗?
我从 MDN web docs 拍了这张照片。它显示了 CSS 翻译 属性 是如何工作的。基本上,HTML 的工作方式如下:原点保持在元素的左上角,x
轴向右,y
轴向下
属性将一个二维向量作为参数(x
和y
),并按照向量定义的方向移动整个元素。
translate
会考虑inner元素的width
/height
,所以50%是width/height的一半翻译后的元素不像 top
/left
那样会考虑 parent 元素的维度。
计算是两个值的简单相加(我在#div2
上加了第三个div所以你可以看到结果)
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>