HTML的基本形式如下:
<div class="home">
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<!-- blah, blah, blah! -->
</main>
</div>
</div>
W.r.t HTML,我试图让元素#main
使用JavaScript / jQuery填充浏览器视口的整个高度,如下所示:
jQuery(document).ready(function($){
// get height of browser viewport
var window_h = $(window).height();
// get height of the jumbotron, i.e. element #main
var jumbotron_h = $('.home #main').outerHeight(true);
// calculate necessary padding (top/bottom) to apply on #main so that the
// element's height is equal to that of the browser's viewport,
// and its contents are centered vertically
if (window_h > (jumbotron_h + 60)) {
var jumbotron_padding = (window_h - jumbotron_h)/2
} else {
var jumbotron_padding = 30
}
// apply calculated padding on the element dynamically
$('.home #main').attr('style', 'padding-top:'+jumbotron_padding+'px;padding-bottom:'+jumbotron_padding+'px;');
});
正如上面代码中的注释所清楚解释的那样,代码会自动计算要在#main
上应用的必要填充,以使其高度等于浏览器视口的高度。
效果很好,除了计算出的填充(因此得到的高度)在我能够识别的一种情况下是错误的。
在 Windows 7,Google Chrome浏览器(最新)上轻松重现至少,当您将浏览器窗口调整为567x724像素时,这意味着551x611像素视口大小,(您可以使用像Window Resizer这样的扩展名,您会注意到元素的计算填充导致其高度大于浏览器视口的高度。
为什么会这样?我无法在任何其他分辨率下重现相同的内容。我可能会在这里失踪什么?
答案 0 :(得分:1)
首先,Jquery的.outerheight()
函数包含填充,这意味着当您在第一次运行此函数后测量#Main
元素的高度时,它将等于window.height
。换句话说 - 当您调整浏览器大小时,它看起来很糟糕。当您以传统方式调整浏览器窗口大小时,您可以在this fiddle上看到此操作。你可以使用边距,但是你必须调整你的CSS。即便如此,调整窗口的大小仍然看起来很糟糕,并且在浏览器中的结果不一致。您可以在this fiddle上看到。
您所指的具体错误可能是由于在调整窗口大小时数学不一致 - 使用填充(如上所述.outerheight()
中包含的)和视口大小不一致的组合可以被2整除(不可能有半个像素,不同的浏览器会以不同的方式渲染半个像素)。
我还应该指出这行代码:
if (window_h > (jumbotron_h + 60)) {
var jumbotron_padding = (window_h - jumbotron_h)/2
} else {
var jumbotron_padding = 30
}
这会强制您的页面始终为#main.height() + 60
,这可能比您的可见窗口大,具体取决于您的窗口大小。 #main.height()
出现在200.5px左右(我们还有另外一半像素)。
假设您的目标是垂直居中#Main
元素,最好的办法是使用众多直接CSS方法中的一种。 The table method似乎最适用于此,因为它完全是动态的(因此可以响应) - 只需创建一个单元格CSS表,使用CSS valign,并在该单元格内构建整个页面。对于旧版本的IE,您需要使用一个小小的黑客(display:Inline-block;
)才能使其正常工作。
HTML:
<div id="parent">
<div id="child">Content here</div>
</div>
CSS:
#parent {display: table;}
#child {
display: table-cell;
vertical-align: middle;
}
IE修复:
#child {
display: inline-block;
}
答案 1 :(得分:0)
基于@Thomas的回答,我发现了两种可能的解决方案。考虑到更好的浏览器支持,我将使用#2 解决方案。
1。使用单位vh
(视口高度)。 Browser support:IE9及以上版本。
<强> CSS:强>
.home #primary { /* Parent */
display: table;
width: 100%;
}
.home #main { /* Child */
display: table-cell;
height: 100vh; /* 100% viewport height */
vertical-align: middle;
}
2. 动态设置父级(.home #primary
)的高度等于浏览器视口的高度。
<强> JS:强>
jQuery(document).ready(function($){
var window_h = $(window).height();
var jumbotron_h = $('.home #main').height();
if (window_h <= (jumbotron_h + 60)) {
var window_h = jumbotron_h + 60
}
$('.home #primary').attr('style', 'height:'+window_h+'px;');
});
<强> CSS:强>
.home #primary { /* Parent */
display: table;
width: 100%;
}
.home #main { /* Child */
display: table-cell;
height: 100%; /* 100% height of parent */
vertical-align: middle;
}
答案 2 :(得分:0)
body {
height:100vh;
}
.element-to-be-centered {
font-size:1em;
text-align:center;
top: 49%;
-webkit-transform: translateY(-49%);
-ms-transform: translateY(-49%);
transform: translateY(-49%);
}
我最近一直在尝试集中内容。这种技术无需在任何元素上设置高度即可工作。
这将在ie9及以上工作。
答案 3 :(得分:-1)
在你的CSS中
html, body {
height: 100%;
}
div, #main {
height: 100%;
}