【问题标题】:How to properly set the 100% DIV height to match document/window height?如何正确设置 100% DIV 高度以匹配文档/窗口高度?
【发布时间】:2012-03-02 02:40:12
【问题描述】:

我有一个以 y 重复背景图像居中放置的包装器:

<body>
    <div id="wrapper">
        ...some content
    </div>
</body>

#wrapper{
width: 900px;
margin: 0 auto 0 auto;
background-image: url(image.jpg) 250px 0px repeat-y;
}

问题:当窗口大小高于从其内容继承的包装器高度时,图像显然不会在 y 轴上一直重复到窗口底部。

我已经使用 jQuery 根据实际文档高度动态地将内联 CSS 样式应用于包装器(当 DOM 准备好并且在窗口调整大小事件时):

$(function(){
    $('#wrapper').css({'height':($(document).height())+'px'});
    $(window).resize(function(){
        $('#wrapper').css({'height':($(document).height())+'px'});
    });
});

这种方法的问题在于,每次将窗口高度扩展为大于之前调整大小的最大尺寸时,文档高度都会扩展此差异,如果您不断调整窗口大小并且拥有无限的垂直显示空间。

在典型的 30" 英寸显示器上,高度为 1600px,当用户打开窗口高度为 1000px 且包装器高度为 800px 的网站时,上面的 jQuery 将高度设置为 1000px 以正确平铺背景图像。此时,一旦用户将窗口大小扩展到例如 1400px,1400px 是一个新的文档大小“记住的默认值”,即使用户将窗口大小调整回原来的 1000px 高度,也不会自行更新,将 400px 添加到滚动条高度 在底部。

如何解决这个问题?

更新:(window).height 似乎不起作用,因为窗口高度是视口高度。当您的视口小于内容并且您滚动它时,包装器始终保持视口的大小并且不会延伸到当前视口位置的底部。

【问题讨论】:

  • 把背景图片放在一个单独的类中。然后在调整大小后或在调整大小期间删除并重新添加该类?
  • 尝试使用$(window).height() 而不是$(document).height()
  • $(window).height() 不正确,例如如果你的窗口大小只有 200px 高,那么 DIV 也会保持 200px 高。当您滚动时,repeat-y 背景会在 200 像素的阈值处停止,而实际内容要长得多。

标签: jquery html css height


【解决方案1】:

在某人的回答的帮助下,我自己弄清楚了。但是他出于某种原因删除了它。

解决办法如下:

  1. 删除所有 CSS 高度 hack 和 100% 高度
  2. 使用 2 个嵌套包装器,一个接一个,例如#wrapper 和 #truecontent
  3. 获取浏览器视口的高度。如果它大于#wrapper,则为#wrapper 设置内联CSS 以匹配当前浏览器视口高度(同时保持#truecontent 不变)
  4. 监听 (window).resize 事件并仅在视口大于 #truecontent 的高度时应用内联 CSS 高度,否则保持不变

    $(function(){
        var windowH = $(window).height();
        var wrapperH = $('#wrapper').height();
        if(windowH > wrapperH) {                            
            $('#wrapper').css({'height':($(window).height())+'px'});
        }                                                                               
        $(window).resize(function(){
            var windowH = $(window).height();
            var wrapperH = $('#wrapper').height();
            var differenceH = windowH - wrapperH;
            var newH = wrapperH + differenceH;
            var truecontentH = $('#truecontent').height();
            if(windowH > truecontentH) {
                $('#wrapper').css('height', (newH)+'px');
            }
    
        })          
    });
    

【讨论】:

    【解决方案2】:

    最简单的方法是添加:

    $('#ID').css("height", $(document).height());
    

    在浏览器确定正确的页面高度之后。如果文档高度再次更改,请重新运行上述代码。

    【讨论】:

    • 完美。在 Flexbox 之外,这是最简洁的方法。您可能会争辩说需要 javascript 是一个弱点,但由于这个技巧通常纯粹是装饰性的,我认为没有问题。
    • 简单易行。谢谢。
    • 是的,这应该是正确的选择
    【解决方案3】:

    您可以将其设为 absolute 并将零设为 topbottom 即:

    #fullHeightDiv {
        position: absolute;
        top: 0;
        bottom: 0;
    }
    

    【讨论】:

    • 糟糕,这将使它成为 100% 的宽度和 100% 的高度。省略 leftright CSS 属性 :)
    • 我需要将包装器居中并继承其背景图像相对位置到包装器位置。
    • 这是一个很棒的解决问题的办法。好主意!
    • 它不起作用 - 只有在您扩展窗口高度时才会扩展。但是如果你缩小窗口并滚动内容,它就不能正确平铺。
    • @JoshJones 不,不是。如果 #fullHeightDiv 的父级具有相对位置且高度或宽度为 1px,则您是 F 。 ü。 C .. 不行
    【解决方案4】:

    我发现最简单的方法是 css 中的 viewport-height ..

    div {height: 100vh;}
    

    这会获取浏览器窗口的视口高度并在调整大小时更新它。

    "can i use" for browser compatibility list

    【讨论】:

      【解决方案5】:
      html, body {
          height:100%;
      }
      #wrapper {
          min-height:100%;
      }
      

      【讨论】:

      • 不起作用 - 当您从小窗口大小开始并滚动时,DIV 高度不会扩展并保持为原始窗口大小的 100%。
      • 我已经修复它添加#wrapper { min-height:100%; } 当我测试它的工作。如果它不再适合你,请告诉我,我会调整它。
      • 我在运行 trident 和 gecko 引擎的 chrome、IE 8 和 Lunascape 中对其进行了测试,它们对我来说都适用。除非有一些我想念的怪癖。
      • height: 100% 和 min-height: 100% 使 DIV 为视口的 100% 高度。这是不正确的。视口可以小于实际文档大小。
      【解决方案6】:

      我是这样回答的

      <script type="text/javascript">
          function resizebg(){
              $('#background').css("height", $(document).height());
          }
          $(window).resize(function(){
              resizebg(); 
          });
          $(document).scroll(function(){
              resizebg(); 
          });
          //initial call
          resizebg();
      
      </script>
      

      css:

      #background{
      position:absolute;
      top:0;
      left:0;
      right:0;
      }
      

      所以基本上在每次调整大小的事件中,我都会覆盖 div 的高度,在这种情况下,我会使用一个图像作为背景的叠加层,并使其具有不透明性而不那么丰富多彩,我也可以在我的情况下使用背景颜色对其进行着色.

      但那是另一个故事

      【讨论】:

        【解决方案7】:

        使用#element{ height:100vh}

        这会将#element 的高度设置为viewport 的100%。 希望这会有所帮助。

        【讨论】:

          【解决方案8】:

          为什么不使用width: 100%height: 100%

          【讨论】:

          • 不起作用 - 当您从小窗口大小开始并滚动时,DIV 高度不会扩展并保持为原始窗口大小的 100%。
          • 在一个复杂的页面中,有很多元素都设置了样式,如果要设置高度的元素嵌套在其他元素中,这将无法正常工作,或者根本无法正常工作(确切的情况失败的情况也因浏览器而异)。
          【解决方案9】:

          这是怎么回事

          <style type="text/css">
          #wrapper{
          width: 900px;
          margin: 0 auto 0 auto;
          background: url('image.JPG') 250px 0px repeat-y;
          }
          </style>
          <script src="http://code.jquery.com/jquery.min.js"></script>
          <script type="text/javascript">
          
          function handleResize() {
          var h = $(window).height();
                  $('#wrapper').css({'height':h+'px'});
          }
          $(function(){
                  handleResize();
          
                  $(window).resize(function(){
                  handleResize();
              });
          });
          </script>
          </head>
          <body>
                  <div id="wrapper">
                          ...some content
                  </div>
          </body>
          

          【讨论】:

          • 将窗口大小调整为较小的高度然后滚动内容时无法正常工作。
          猜你喜欢
          • 1970-01-01
          • 2012-01-18
          • 2013-01-02
          • 2015-02-26
          • 1970-01-01
          • 1970-01-01
          • 2012-11-16
          • 1970-01-01
          • 2017-05-11
          相关资源
          最近更新 更多