关于 javascript:使用 jQuery 使元素填充浏览器视口的整个高度 | 珊瑚贝

Making an element fill the entire height of browser viewport using jQuery


代码
演示

HTML 的基本形式如下所示:

1
2
3
4
5
        <main id=“main” class=“site-main” role=“main”>

            <!– blah, blah, blah! –>

        </main>

W.r.t HTML,我正在尝试使用 JavaScript/jQuery 使元素 #main 填充浏览器视口的整个高度,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 的必要填充,使其高度等于浏览器视口的高度。

它工作得很好,除了在我能够识别的一种情况下计算的填充(以及由此产生的高度)是错误的。

当您将浏览器窗口大小调整为 567×724 px(这意味着 551×611 px 视口大小)时,至少在 Windows 7、Google Chrome 浏览器(最新)上很容易重现(您可以使用 Window Resizer 之类的扩展程序),您会注意到元素的计算填充导致其高度大于浏览器视口的高度。

为什么会这样?我无法在任何其他分辨率下重现相同的内容。我可能会在这里遗漏什么?

  • 当您可以使用纯 css 时,为什么要使用 jQuery 呢?
  • 因此,查看您的代码,您似乎主要是试图保持#main 元素垂直居中。使用 CSS 有更简单的方法来做到这一点。还是我错过了什么?
  • @KarimAG 我试过了。 (1) 绝对定位导致 #main 元素崩溃,从而破坏其内容的格式。 (2) 即使在绝对定位 #main 之后,垂直居中也是一种痛苦(从顶部和底部的百分比)并且需要一两个 hack (3) 在 #main 上没有设置网页的高度是设计的响应式,这只会让事情变得更加困难
  • @its_me 可以向 jsfiddle.net/F5dxk 添加更多元素吗?似乎没有附加 resize event ?没有 resize 或 scroll 无法重现问题。谢谢
  • 这个页面有几个都使用 CSS 的建议,其中一些是响应式的。我过去自己使用过一对(很高兴知道我不是唯一一个想出这些解决方案的人)。 vanseodesign.com/css/vertical-centering
  • @its_me 见 stackoverflow.com/questions/22746887/…
  • @its_me 是否会在页面中添加其他内容,或者是上面帖子中的全部内容(html)?谢谢
  • @its_me 不确定,是否需要在页面的”中心”维护 #main ?谢谢
  • @guest271314 不,其他内容不会添加到页面中。 JS Fiddle 包含全部内容。是的,需要在页面中心维护 #main – 您的答案没有这样做。 (昨天网络连接问题;所以我不能早点回复。)
  • @Thomas 在您发布的链接中的所有解决方案中,似乎只有一个(使用表格单元)可以满足我的要求。我会试一试。谢谢! (昨天网络连接问题;所以我不能早点回复。)
  • @its_me 只是为了让您知道,我在尝试构建垂直居中的页面时遇到了很多问题。如果视口小于您的内容,您的内容将被截断。您将获得底部被截断的内容的滚动条,但顶部截断的内容将永远丢失。我发现最好只用边距/填充来分隔内容,这样它看起来足够接近以在大多数浏览器上居中。以下是有关浏览器窗口大小的一些统计信息的链接:dunnbypaul.net/sizeview
  • @Thomas 我和你一样担心,这就是为什么 if 浏览器的视口高度小于元素部分的高度,即 if (window_h <= (jumbotron_h + 60)) { 存在于我的代码中。它解决了内容被切断的问题,并在相关情况下添加了 60px 的额外填充。
  • @its_me 请描述 #main 的 vertical 和 horizontal 位置,它们在 jsfiddle 页面上出现”偏离中心”?浏览器,屏幕分辨率?谢谢
  • @guest271314 #main 只需要垂直居中即可;我从来没有横向说。
  • @its_me 如果准确解释要求,如果 #main 位于 viewport 的 left”边”,可以吗?


首先,Jquery 的 .outerheight() 函数包含填充,这意味着当您在此函数第一次运行后测量 #Main 元素的高度时,它将等于 window.height。换句话说 – 当您调整浏览器大小时,它看起来会很糟糕。当您以老式方式调整浏览器窗口的大小时,您可以在这个小提琴上看到这一点。您可以改用边距,但是您必须对 CSS 进行相当多的调整。即便如此,调整窗口大小仍然看起来很糟糕且有问题,并且跨浏览器的结果不一致。你可以在这个小提琴上看到。

您所指的具体错误可能是由于您调整窗口大小时的数学不一致 – 您使用填充(包含在上面提到的 .outerheight() 中)和视口大小不容易分割的组合2(不可能有半个像素,不同的浏览器会以不同的方式呈现半个像素)。

我还要指出这行代码:

1
2
3
4
5
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.5 像素(我们还有半个像素)。

假设您的目标是使 #Main 元素垂直居中,您最好的选择是使用许多可用的直接 CSS 方法之一。 table 方法在这里似乎最适用,因为它是完全动态的(因此可以响应) – 只需创建一个单元格 CSS 表格,使用 CSS valign,并在该单元格内构建整个页面。对于旧版本的 IE,您需要使用一个小技巧 (display:Inline-block;) 才能使其工作。

HTML:

1
    Content here

CSS:

1
2
3
4
5
6
#parent {display: table;}

#child {
    display: tablecell;
    verticalalign: middle;
}

IE 修复:

1
2
3
#child {
    display: inlineblock;
}
  • 根据您的回答,我确定了两种可能的解决方案:<stackoverflow.com/a/22804845/1071413>。非常感谢您的宝贵时间!


1
2
3
4
5
6
7
8
9
10
11
12
       body {
        height:100vh;
       }

       .elementtobecentered {
        fontsize:1em;
        textalign:center;
        top: 49%;
        webkittransform: translateY(49%);
        mstransform: translateY(49%);
        transform: translateY(49%);
       }

我最近一直在做很多关于居中内容的实验。此技术无需在任何元素上设置高度即可工作。

这适用于 ie9 及更高版本。



根据@Thomas 的回答,我确定了两种可能的解决方案。考虑到更好的浏览器支持,我将使用#2 解决方案。

1。使用单位 vh(视口高度)。浏览器支持:IE9及以上。

CSS:

1
2
3
4
5
6
7
8
9
10
.home #primary { /* Parent */
    display: table;
    width: 100%;
}

.home #main { /* Child */
    display: tablecell;
    height: 100vh; /* 100% viewport height */
    verticalalign: middle;
}

2。动态设置父级(.home #primary)的高度等于浏览器视口的高度。

JS:

1
2
3
4
5
6
7
8
9
10
11
12
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:

1
2
3
4
5
6
7
8
9
10
.home #primary { /* Parent */
    display: table;
    width: 100%;
}

.home #main { /* Child */
    display: tablecell;
    height: 100%; /* 100% height of parent */
    verticalalign: middle;
}


在你的 CSS 中

1
2
3
4
5
6
7
html, body {
    height: 100%;
}

div, #main {
    height: 100%;
}


来源:https://www.codenong.com/22789254/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9546.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?