使用 JavaScript 获取图像的实际宽度和高度?(在 Safari/Chrome 中)

IT技术 javascript jquery safari google-chrome webkit
2021-02-01 13:33:42

我正在创建一个 jQuery 插件。

如何在 Safari 中使用 Javascript 获取真实图像的宽度和高度?

以下适用于 Firefox 3、IE7 和 Opera 9:

var pic = $("img")

// need to remove these in of case img-element has set width and height
pic.removeAttr("width"); 
pic.removeAttr("height");

var pic_real_width = pic.width();
var pic_real_height = pic.height();

但在 Safari 和 Google Chrome 等 Webkit 浏览器中,值为 0。

6个回答

Webkit 浏览器在加载图像后设置高度和宽度属性。我建议使用图像的 onload 事件,而不是使用超时。这是一个快速示例:

var img = $("img")[0]; // Get my img elem
var pic_real_width, pic_real_height;
$("<img/>") // Make in memory copy of image to avoid css issues
    .attr("src", $(img).attr("src"))
    .load(function() {
        pic_real_width = this.width;   // Note: $(this).width() will not
        pic_real_height = this.height; // work for in memory images.
    });

为了避免 CSS 可能对图像尺寸产生的任何影响,上面的代码在内存中创建了图像的副本。这是FDisk建议的一个非常聪明的解决方案

您还可以使用naturalHeightnaturalWidthHTML5 属性。

您在这里可能遇到的问题是load()它将异步执行,因此如果您想访问widthheight- 它们可能尚未设置。而是在load()自己身上做“魔术”
2021-03-17 13:33:42
FDisk 的解决方案非常巧妙。不幸的是,他编写的解决方案仅在图像被缓存或页面已经完成下载时才有效。如果图像未缓存或此代码在之前调用window.onload,则可能会返回高度/宽度 0。无论如何,我已经将 FDisk 的想法集成到了上面的解决方案中。
2021-03-26 13:33:42
除了widthandheight您可能还应该删除min-width, min-height,max-widthmax-height因为它们也会影响图像尺寸。
2021-03-27 13:33:42
当我尝试 console.log(pic_real_height) 时,我每次都未定义。铬,FF,IE9。
2021-03-30 13:33:42
这很聪明,不知道你可以做 $(img).load();
2021-04-08 13:33:42

使用HTML5 中naturalHeightnaturalWidth属性

例如:

var h = document.querySelector('img').naturalHeight;

适用于 IE9+、Chrome、Firefox、Safari 和 Opera ( stats )。

@DavidJohnstone 使用它们的示例可能会有所帮助。但我同意,绝对值得更高。
2021-03-10 13:33:42
请注意,您仍然需要等待图像加载
2021-03-17 13:33:42
这在最新版本的 FireFox (30.0) 中似乎不起作用,除非该图像已存在于缓存中。
2021-04-02 13:33:42
我同意大卫约翰斯通的观点。这是个好消息。
2021-04-06 13:33:42
不,clientHeight/clientWidth 明确不做问题所要求的。它需要返回图像的高度和宽度,而不是图像在页面上看起来的高度和宽度。naturalWidth 和 naturalHeight 是正确的。
2021-04-09 13:33:42


function getOriginalWidthOfImg(img_element) {
    var t = new Image();
    t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
    return t.width;
}

您不需要从图像或图像尺寸属性中删除样式。只需使用 javascript 创建一个元素并获取创建的对象宽度。

这是避免 css 问题的非常聪明的方法。不幸的是,上面写的解决方案只有在图像被缓存或已经完成下载时才有效。如果图像未缓存或此代码在之前调用过window.onload,则可能会返回宽度为 0。
2021-03-17 13:33:42
我在图片库中的手机网站中使用这种方法。更大的图像然后分辨率以 100% 的 css 和更小的原始尺寸显示。
2021-03-29 13:33:42
几个月以来,使用 jquery(使用最新的 Chrome)克隆图像并获取它的属性,总是返回 0x0 到目前为止,这是唯一有效的解决方案(已测试本页面中的所有其他解决方案)在返回之前,我设置了 t=也为空。
2021-04-03 13:33:42
正如 Xavi 所提到的,这在 IE8 中失败,有时取决于图像缓存。所以我将它与这种方法结合起来,它完美地工作:首先绑定加载事件,然后将图像对象分配给它的源stackoverflow.com/questions/4921712/...
2021-04-06 13:33:42
FDisk 不建议使用 jQuery 克隆图像。他建议创建一个新Image对象,然后查看其width属性。这是一种简单而优雅的方法。FDisk,你有我的投票权。:)
2021-04-08 13:33:42

在接受的答案中有很多关于onload如果从 WebKit 缓存加载图像时不会触发事件的问题的讨论

在我的情况下,onload缓存图像触发,但高度和宽度仍然为 0。一个简单的setTimeout解决了我的问题:

$("img").one("load", function(){
    var img = this;
    setTimeout(function(){
        // do something based on img.width and/or img.height
    }, 0);
});

我不能,为什么说onload即使在图像加载事件被解雇从缓存(jQuery的改善1.4 / 1.5) -但如果你仍然遇到此问题,也许我的回答的组合和var src = img.src; img.src = ""; img.src = src;技术将工作。

(请注意,出于我的目的,我不关心图像的属性或 CSS 样式中的预定义尺寸 - 但您可能希望根据 Xavi 的回答删除这些尺寸。或者克隆图像。)

我在 IE7 和 IE8 上遇到了这个问题。setTimeout() 对我来说适用于那些浏览器。谢谢!
2021-04-06 13:33:42

根本问题是 WebKit 浏览器(Safari 和 Chrome)并行加载 JavaScript 和 CSS 信息。因此,JavaScript 可能会在计算出 CSS 的样式效果之前执行,从而返回错误的答案。在 jQuery 中,我发现解决方案是等到 document.readyState == 'complete', .eg,

jQuery(document).ready(function(){
  if (jQuery.browser.safari && document.readyState != "complete"){
    //console.info('ready...');
    setTimeout( arguments.callee, 100 );
    return;
  } 
  ... (rest of function) 

就宽度和高度而言……取决于您在做什么,您可能需要 offsetWidth 和 offsetHeight,其中包括边框和填充等内容。

$(window).load(function(){ ... }); 在我的情况下有帮助
2021-03-10 13:33:42
是的,就是这个原因。更好的解决方法是使用 jQuery 的加载事件。
2021-03-11 13:33:42