JavaScript 获取 IMG 图片实际高宽的多种方法解析

作者:窗边听雨时间:2026-10-30 06:47:47浏览:298

本文详细解析了JavaScript中获取IMG标签高宽的多种方法,包括obj.style、offsetWidth、clientWidth、getComputedStyle以及HTML5的naturalWidth。重点讨论了各方法在不同浏览器中的表现及padding/border的影响,并指出所有方法均依赖图片完全加载这一前提条件。

JS获取IMG图片高宽的简单实例

此前在LJW编写的touchslider.js轮播组件中添加屏幕自适应功能时,遇到一个难题:无论采用何种方式,均无法准确获取IMG标签的高度和宽度,最终只能强制设定图片的比例值。趁此机会,我编写了几个Demo进行测试以探究原因,现整理如下,若有疏漏欢迎指正。

获取高宽的常用方法

据我所知,获取元素高宽的方法主要有以下几种:

obj.style.width(height);

obj.offsetWidth(offsetHeight);

obj.clientWidth(clientHeight);

getComputedStyle 与 currentStyle;

obj.naturalWidth(naturalHeight)

为简化叙述,下文仅以width为例进行说明。

obj.style.width方法

首先介绍第一种方法:obj.style.width。该方法仅在HTML标签内通过style属性直接写入width值时才能获取到具体数值,否则返回空值。参考以下Demo:


<img style="width:400px" src="http://img.hb.aicdn.com/787bf87d05ad774522dd92151b3051b463229a11109598-9QXV9C_fw658">
<script>
var imgW = document.getElementsByTagName('img')[0].style.width;
  alert(imgW); //返回值为400px,否则返回空;
</script>

上述方法仅适用于在标签的style属性中直接添加width值的情况。若width值是在引入的外部样式表中定义(无论是通过link引入还是在HTML页面中使用style标签),该方法同样无法获取值,返回结果为空。

offsetWidth与clientWidth方法

接着讨论第二种与第三种方法:obj.offsetWidth(offsetHeight) 和 obj.clientWidth(clientHeight)。通常情况下,若标签未设置padding及border值,两者获取的值是一致的。但在多数实际场景中并非如此:offsetWidth获取的是width值加上padding值和border值的总和,而clientWidth获取的是width值加上padding值。具体可见以下Demo:


<style>
img{ padding:20px;border:1px solid red;}
</style>
<img style="width:400px" src="http://img.hb.aicdn.com/787bf87d05ad774522dd92151b3051b463229a11109598-9QXV9C_fw658">
<script>
var img = document.getElementsByTagName('img')[0], 
      imgOffsetWidth = img.offsetWidth, //442px
      imgClientWidth = img.clientWidth; //440px;
</script>

注意,当前Demo中获取到的img标签宽度,是因为在img标签内添加了style="width:400px"属性。若移除该属性,上述Demo中imgOffsetWidth与imgClientWidth返回的值将变为图片本身的原始高宽值,读者可自行尝试验证。

getComputedStyle与currentStyle方法

此外,getComputedStyle 与 currentStyle 是用于处理浏览器兼容性的两种方法,它们获取的是图片在屏幕上显示的实际高宽值,不包含img标签的padding及border值。其中,getComputedStyle适用于Firefox、IE9、Safari、Chrome及Opera浏览器;currentStyle则适用于IE6、IE7和IE8。然而,即使img标签未设置style属性且未引入样式表,只有getComputedStyle能获取到值(即图片本身高宽),而currentStyle则返回auto。参见以下Demo:


<img style="width: 400px;" src="http://img.hb.aicdn.com/787bf87d05ad774522dd92151b3051b463229a11109598-9QXV9C_fw658">

  <script>
    function getStyle(el, name) {
      if(window.getComputedStyle) {
        return window.getComputedStyle(el, null)[name];
      }else{
        return el.currentStyle[name];
      }
    }
    var div = document.getElementsByTagName('img')[0];
    alert(getStyle(div, 'width'));
  </script>

读者可将img标签中的style属性移除后再进行测试。

naturalWidth方法及加载前提

最后是obj.naturalWidth(naturalHeight)方法,这是HTML5新增的获取元素高宽的方式,但仅适用于Firefox、IE9、Safari、Chrome及Opera浏览器。以下提供一个适用于各浏览器的Demo:


<img style="width: 400px;" src="http://img.hb.aicdn.com/787bf87d05ad774522dd92151b3051b463229a11109598-9QXV9C_fw658">

  <script>
    document.addEventListener('DOMContentLoaded',function(){
      function getImgNaturalStyle(img,callback) {
        var nWidth, nHeight
        if (img.naturalWidth) { // 现代浏览器
          nWidth = img.naturalWidth
          nHeight = img.naturalHeight
        } else { // IE6/7/8
          var imgae = new Image();
          image.src = img.src;
          image.onload = function(){
            callback(image.width, image.height)
          }
        }
        return [nWidth, nHeight]
      }
      var img = document.getElementsByTagName('img')[0],
          imgNatural = getImgNaturalStyle(img);
      alert(imgNatural);
    });
  </script>

需要注意的是,在IE6/7/8浏览器中,image.src属性仅在图片完全加载后才能获取,否则将报错。

提及图片的完全加载,这便解决了之前我与LJW遇到的无法获取图片高度的问题:


document.addEventListener("DOMContentLoaded",function(){

    //原因就是当时我们的代码是在这样的环境下写的,这个时候,只是加载了img的标签,即只有DOM结构,图片还没有完全加载进来,所以获取到的值都是0,但如果在window.onloaded的环境下写,就能得到其所示高宽了

}); 

也就是说,以上所有能够获取图片高宽的方法,都必须以图片已经完全加载为前提条件。

受限于个人能力,理解至此,若有不当之处,欢迎批评指正。

以上关于JS获取IMG图片高宽的简单实例即为小编分享的全部内容,希望能对大家有所帮助,也希望大家多多支持本站。

作者最新文章