【问题标题】:Calculate div height given a known width?在给定宽度的情况下计算 div 高度?
【发布时间】:2019-11-27 17:59:22
【问题描述】:

我有一个 div,其中包含一张图片和一些文本(图像的大小可变,文本的长度可变)。
鉴于预先定义了确切的宽度,有没有办法计算适合所有 div 内容所需的高度?

UPD 在使用$(document).ready() 时得到同样的错误结果

document.addEventListener("DOMContentLoaded", function ()
{
		var div = document.getElementById("Content");
		var res = document.getElementById("Result");

		res.innerHTML = div.offsetHeight; // incorrect - returns 252 while the real height is 360 (Firefox, Chrome)
});
div
	{
		width: 400px;
	}

	img
	{
		float: left;
		margin: 0.5em;
}
<div id="Content">

	<img src="https://picsum.photos/id/82/200/150" />

	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.

</div>
<br/>
<span id="Result"></span>

【问题讨论】:

  • @Rob 这不是一个合法的问题,是什么使它脱离主题?
  • 你想要javascript方式还是纯css?
  • @Bobtroopo JS 会很好。
  • AFAIK 在图像加载之前您无法获得正确的高度,因为您不知道图像大小。所以我认为你只能在图像加载后获得正确的值,使用 onload 然后在回调中获取高度
  • Jquery 好吗?

标签: javascript css


【解决方案1】:

准确判断div和图片的高度。 这是因为图像可能会最后完成加载 - 如果在加载图像之前检查容器的高度,它将返回高度而不考虑图像高度。

应该向图像添加一个侦听器,以便在图像加载后检查高度。

img.addEventListener('load', onLoad);

因为样式很简单,offsetHeightclientHeight 应该可以工作,但要包含整个元素(带边框和边距),请使用 scrollHeight,如 Element.scrollHeight on MDN web docs 所述

生成的代码:

<div id="Content">
    <img id="Image" src="https://picsum.photos/id/82/200/150" />
    ...
</div>
<br/>
<span id="Result"></span>
<script>
    var img = document.getElementById("Image");

    function onLoad() {
        var div = document.getElementById("Content");
        var res = document.getElementById("Result");

        res.innerHTML = div.scrollHeight;
    }

    img.addEventListener('load', onLoad);
</script>

整个示例都在 CodeSnadbox 中:

【讨论】:

    【解决方案2】:

    您必须改用window.onload

    加载整个页面时触发 load 事件,我包括所有依赖资源,例如样式表和图像。这与 DOMContentLoaded 不同,后者 在页面 DOM 加载后立即触发,无需等待资源完成加载。 ref

    在您的情况下,您需要等待图像,而不仅仅是 DOM。

    window.onload = function() {
      var div = document.getElementById("Content");
      var res = document.getElementById("Result");
    
      res.innerHTML = div.offsetHeight; 
    };
    div {
      width: 400px;
    }
    
    img {
      float: left;
      margin: 0.5em;
    }
    <div id="Content">
    
      <img src="https://picsum.photos/id/82/200/150" /> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce.
      Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus
      vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et
      malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.
    
    </div>
    <br/>
    <span id="Result"></span>

    【讨论】:

      【解决方案3】:

      我不确定我是否完全理解您的问题,但您可以使用 javascript 计算 div 的高度。

      var height = document.getElementsByTagName('div').offsetHeight;
      

      【讨论】:

      • 看起来这个测量值不正确,因为我得到了 252,而实际的 div 看起来更像是 350 像素高。此外,在打开文档和刷新文档 (Firefox) 后,我会立即获得不同的测量结果。
      • 还有另一种方法:document.getElementsByTagName('div').getBoundingClientRect().height。试试这个,让我知道它是否有效。
      • 这个问题也一样。也许是关于不同的渲染阶段?
      【解决方案4】:

      我知道您要求在图像加载后调整 div 的大小以使 div 更高,但作为旁注,您知道/是否尝试过 background-size: contains?

      由 MDN 指定:

      contain 值指定,无论包含框的大小如何,都应缩放背景图像,使每一边尽可能大,同时不超过容器对应边的长度。

      封面值:

      cover值指定背景图片的大小应该尽可能的小,同时保证两个维度都大于等于容器的对应大小。尝试调整以下示例的大小以查看实际效果。

      当与背景位置结合时,我认为它真的很有用

      【讨论】:

        【解决方案5】:

        如果你想使用jquery,那么这就是方式

        $(document).ready(function(){
          $("#Result").html($("#Content").height());
        })
        div
        	{
        		width: 400px;
        	}
        
        	img
        	{
        		float: left;
        		margin: 0.5em;
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <div id="Content">
        
        	<img src="https://picsum.photos/id/82/200/150" />
        
        	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.
        
        </div>
        <br/>
        <span id="Result"></span>

        【讨论】:

        • 你是认真的吗? jquery现在被认为是恶魔的转世,纯js让他们疯狂。
        【解决方案6】:

        不是动态的,因为你已经设置了宽度,所以计算它并不难,因为它不会在不同的屏幕上改变。 但唯一的方法是使用开发工具手动完成。

        如果图像和字体会改变,你可以有一个javascript脚本,在onlaod之后它会看到div的高度。 (如果您需要以下评论)

        【讨论】:

          【解决方案7】:

          在js中你可以得到任意元素的高度。 计算高度根本不需要宽度。

          由于 div 是一些通用标签,添加一些 id 以确保正确的标签是针对计算高度的

          var element_height = document.getElementById("ElToCalHeight").offsetHeight;
          alert('Element height ' + element_height);
          <div id="ElToCalHeight">
          
          	<img src="https://picsum.photos/id/82/200/150" />
          
          	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labo...
          
          </div>

          【讨论】:

            【解决方案8】:

            您可以使用.scrollHeight 属性。

            document.addEventListener("DOMContentLoaded", function() {
              var div = document.getElementById("Content");
              var res = document.getElementById("Result");
            
              res.innerHTML = div.scrollHeight; 
            });
            div {
              width: 400px;
            }
            
            img {
              float: left;
              margin: 0.5em;
            }
            <div id="Content">
            
              <img src="https://picsum.photos/id/82/200/150" /> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce.
              Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus
              vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et
              malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.
            
            </div>
            <br/>
            <span id="Result"></span>

            【讨论】:

              【解决方案9】:

              DOMContentLoaded 事件在浏览器完全加载 HTML 并构建 DOM 树时触发,但尚未加载图片和样式表等外部资源。 而 window.onload 事件在整个页面被加载时触发,包括样式、图像和其他资源。

              你得到的高度是 252 而不是 360,因为没有你的图像的 div 的高度是 252。作为参考,你可以运行下面的 sn-p。

              这段代码sn-p对应div没有图片,使用 window.onload (所以高度是252)

              window.onload = function() {
                var div = document.getElementById("Content");
                var res = document.getElementById("Result");
              
                res.innerHTML = div.offsetHeight; 
              };
              div
              	{
              		width: 400px;
              	}
              
              /**	img
              	{
              		float: left;
              		margin: 0.5em;
              }**/
              <div id="Content">
                <!-- Image tag is not present -->
              	<!--<img src="https://picsum.photos/id/82/200/150" />-->
              
              	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.
              
              </div>
              <br/>
              <span id="Result"></span>

              以下代码 sn-p 对应于带有图像的 div 并使用 window.onload 现在高度将达到预期的 360。

              window.onload = function() {
                var div = document.getElementById("Content");
                var res = document.getElementById("Result");
              
                res.innerHTML = div.offsetHeight; 
              };
              div
              	{
              		width: 400px;
              	}
              
              	img
              	{
              		float: left;
              		margin: 0.5em;
              }
              <div id="Content">
              
              	<img src="https://picsum.photos/id/82/200/150" />
              
              	Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Orci phasellus egestas tellus rutrum. Tempor nec feugiat nisl pretium fusce. Cras pulvinar mattis nunc sed blandit libero volutpat sed cras. Purus sit amet luctus venenatis lectus magna fringilla urna. Ut tristique et egestas quis. Mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing. Iaculis eu non diam phasellus vestibulum lorem sed risus ultricies. Semper quis lectus nulla at. Augue interdum velit euismod in. Amet aliquam id diam maecenas ultricies mi eget. Scelerisque viverra mauris in aliquam sem fringilla ut morbi. Et egestas quis ipsum suspendisse. Et malesuada fames ac turpis. Fermentum iaculis eu non diam phasellus vestibulum lorem sed.
              
              </div>
              <br/>
              <span id="Result"></span>

              【讨论】:

                【解决方案10】:

                100% 工作!使用 Window.onload 函数代替 DOMContentLoaded

                  <script>
                      window.onload = function() {
                      var div = document.getElementById("Content");
                      var res = document.getElementById("Result");
                
                      res.innerHTML = div.offsetHeight; 
                    };
                    </script>
                

                会给你的结果!

                【讨论】:

                  【解决方案11】:

                  您应该在加载后检查方法element.getBoundingClientRect()。它将返回一组属性,例如宽度和高度。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-10-15
                    • 2019-10-13
                    • 2019-06-13
                    • 1970-01-01
                    • 2022-10-18
                    • 1970-01-01
                    • 2023-03-03
                    • 1970-01-01
                    相关资源
                    最近更新 更多