【发布时间】:2020-06-22 06:55:00
【问题描述】:
我有三个div,高度相同,等于 1vh`。
我的问题是它们在屏幕上以不同的像素大小出现。有时它们看起来相等但有时不相等,特别是在调整视口大小后发生。请运行sn -p查看。
.samples {
display:flex;
}
.container{
display:flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
margin:10px 20px;
height: 20vh;
width:20vh;
}
.container div{
background: #000;
width:100%;
}
#set1 div{
height:.3vh;
}
#set2 div{
height:.7vh;
}
#set3 div{
height:.9vh;
}
#set4 div{
height:1.1vh;
}
<div class = "samples">
<div class="container" id="set1" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set2" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set3" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set4" >
<div></div>
<div></div>
<div></div>
</div>
</div>
<div>
<h4>Above are four samples, each sample includes 3 identical div.</h4>
<h4>But depends on your screen size you may not see what expected</h4>
</div>
我截取了一些屏幕截图来演示调整大小期间实际发生的情况,您可以看到 div 看起来具有不同的高度,尽管它们都有 1vh 高度。
如果我在 javascript 中手动计算 1vh 并将其作为舍入的 'px' 注入到 CSS 中,那么它可以完美运行。(在 sn-p 中,我使用 .3、.7、.9、1.1 vh 进行演示)
const set1Height = Math.round(document.documentElement.clientHeight * .3 / 100);
const set2Height = Math.round(document.documentElement.clientHeight * .7 / 100);
const set3Height = Math.round(document.documentElement.clientHeight * .9 / 100);
const set4Height = Math.round(document.documentElement.clientHeight * 1.1 / 100);
document.documentElement.style.setProperty("--set1-height", `${set1Height}px`);
document.documentElement.style.setProperty("--set2-height", `${set2Height}px`);
document.documentElement.style.setProperty("--set3-height", `${set3Height}px`);
document.documentElement.style.setProperty("--set4-height", `${set4Height}px`);
.samples {
display:flex;
}
.container{
display:flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
margin:10px 20px;
height: 20vh;
width:20vh;
}
.container div{
background: #000;
width:100%;
}
#set1 div{
height: var(--set1-height);
}
#set2 div{
height: var(--set2-height);
}
#set3 div{
height: var(--set3-height);
}
#set4 div{
height: var(--set4-height);
}
<div class = "samples">
<div class="container" id="set1" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set2" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set3" >
<div></div>
<div></div>
<div></div>
</div>
<div class="container" id="set4" >
<div></div>
<div></div>
<div></div>
</div>
</div>
<div>
<h4>Here, after calculating heights and round them to `px` they looks identical</h4>
</div>
我的第一个想法是对浮点数进行四舍五入,但如果是这种情况,为什么 CSS 会将单个浮点数四舍五入为三个不同的数字?
我的问题是为什么会发生这种情况,是否有任何纯 CSS 解决方案可以安全地使用视口大小并确保它们始终按预期显示?
【问题讨论】:
-
好问题。在
#set3中,我尝试了flex: 0 1 .9vh;而不是height: .9vh;,但它产生了相同的结果。 (flex是flex-grow、flex-shrink、flex-basis的简写属性。 -
感谢@Rounin 我也尝试不使用
flex并得到相同的结果。实际上,我使用了一些额外的 CSS,例如flex来显示发生了什么。
标签: javascript html css responsive viewport