【发布时间】:2016-03-02 01:52:57
【问题描述】:
相关信息:
页面包含两个元素:
<aside>在左侧。右边的
<main>。
(注意:在这篇文章中,为了完整起见,提到了高度,但与产生这个问题无关。)
所有高度、宽度和边距均根据var w = screen.width/100;(和var h = screen.height/100;)设置,因此页面在任何显示分辨率下看起来基本相同。并且它们被设置成<aside> 和<main> 的宽度以及它们之间的边距加起来为screen.width。
例如:
var w = screen.width/100;
document.getElementsByTagName('main')[0].style.width = 85.5*w + "px";
document.getElementsByTagName('aside')[0].style.width = 14*w + "px";
document.getElementsByTagName('aside')[0].style.marginRight = 0.5*w + "px";
(85.5 + 14 + 0.5 = 100)
问题:
<main> 被推到<aside> 下方,原因不明。我只能想出一个半明智的假设来解释这种行为。
但是,如果我将正文的字体大小设置为 0 并缩小(以便元素占用更少的空间)并重新放大,这将得到修复(我不知道为什么,也不要问我我是怎么发现的)。
这种行为的原因是什么,正确的解决方法是什么?
假设(可略过):
浏览器似乎在想“如果我显示滚动条,即使它们不需要它们会发生什么?”,然后注意到滚动条的宽度 > 0,这意味着 @987654331 @ 和
<main>占用的空间超过了可用空间(因为它们被设置为占用 100% 的屏幕宽度,现在有一个滚动条在争夺空间)。因此,浏览器决定重新定位<main>下面<aside>并破坏设计。
现在由于<main>在<aside>之下,元素不再适合屏幕现在实际上需要滚动条,因此保留,即使它们是导致他们自己的存在(就这个假设而言)。
附加信息:
-
我没有使用任何 CSS 样式表:我的所有样式都是由 JavaScript 完成的(原因很简单,我希望大小取决于
李>screen.width和screen.height)。 元素有
display = "inline-block";。当浏览器不是最大尺寸时,使用float会产生可怕的行为。
这里是重现问题的代码:
<!DOCTYPE html>
<html>
<body>
<aside></aside>
<main></main>
<script>
var h = screen.height/100;
var w = screen.width/100;
var e = document.getElementsByTagName("aside")[0].style;
e.display = "inline-block";
e.backgroundColor = "lightblue";
e.width = 14*w + "px";
e.height = 69*h + "px";
e.marginRight = 0.5*w + "px";
e = document.getElementsByTagName("main")[0].style;
e.display = "inline-block";
e.backgroundColor = "green";
e.width = 85.5*w + "px";
e.height = 69*h + "px";
e = document.getElementsByTagName("body")[0].style;
e.margin = e.padding = "0";
e.backgroundColor = "black";
</script>
</body>
</html>
【问题讨论】:
-
你设置
html, body {margin: 0; }并使用box-sizing: border-box了吗? -
另一个提示,因为您已经使用百分比来计算大小,请将设置大小设置为 px,使用 % 并且您可以跳过计算,因为浏览器会为您执行此操作,这将提高性能。
-
另一个技巧,使用vh(视口高度)和vw(视口宽度),相当于屏幕的高度和宽度。
-
@JanNahody 不,绝对不一样。它可能会给你同样的结果,如果浏览器在最大化或剧院模式下运行。
-
@LGSon 你是对的。屏幕意味着设备大小。我忘了。
标签: javascript html css responsive-design