如何在jQuery中获取背景图片大小?

时间:2011-02-24 14:52:34

标签: jquery css

问题很简单。如何在jQuery中获取div的背景图像大小(宽度和高度)。它甚至可能吗?我认为这样可行:

jQuery('#myDiv').css('background-image').height();

我得到的错误信息是这不是一个函数。

17 个答案:

答案 0 :(得分:85)

还有一个版本。无需DOM操作,支持图像文件名中的所有字符。

更新请参阅下面的替代版本。

var image_url = $('#something').css('background-image'),
    image;

// Remove url() or in case of Chrome url("")
image_url = image_url.match(/^url\("?(.+?)"?\)$/);

if (image_url[1]) {
    image_url = image_url[1];
    image = new Image();

    // just in case it is not already loaded
    $(image).load(function () {
        alert(image.width + 'x' + image.height);
    });

    image.src = image_url;
}

2018解决方案

这个答案在5年之后仍然得到了回报。我想我会分享一个更完整的解决方案。它构建于原始代码之上,并将其包装到函数中。它使用jQuery Deferred Object,添加错误处理并更新RegExp以匹配3种可能的情况:url()url("")url('')。它也适用于jQuery 1到3。

var getBackgroundImageSize = function(el) {
    var imageUrl = $(el).css('background-image').match(/^url\(["']?(.+?)["']?\)$/);
    var dfd = new $.Deferred();

    if (imageUrl) {
        var image = new Image();
        image.onload = dfd.resolve;
        image.onerror = dfd.reject;
        image.src = imageUrl[1];
    } else {
        dfd.reject();
    }

    return dfd.then(function() {
        return { width: this.width, height: this.height };
    });
};

//
// Usage
//
getBackgroundImageSize(jQuery('#mydiv'))
    .then(function(size) {
        console.log('Image size is', size.width, size.height);
    })
    .fail(function() {
        console.log('Could not get size because could not load image');
    });

答案 1 :(得分:33)

你必须做这样的事情:

var url = $('#myDiv').css('background-image').replace('url(', '').replace(')', '').replace("'", '').replace('"', '');
var bgImg = $('<img />');
bgImg.hide();
bgImg.bind('load', function()
{
    var height = $(this).height();
    alert(height);
});
$('#myDiv').append(bgImg);
bgImg.attr('src', url);

由于代码简单,您不能在背景图像的URL中使用括号或引号。但是,可以扩展代码以获得更大的支持。我只是想传达一般的想法。

答案 2 :(得分:26)

迟到的答案,但你也可以这样做:

var img = new Image;
img.src = $('#myDiv').css('background-image').replace(/url\(|\)$/ig, "");
var bgImgWidth = img.width;
var bgImgHeight = img.height;

然后你不必操纵dom对象;

答案 3 :(得分:4)

另一个简短的方法:

function bgSize($el, cb){
    $('<img />')
        .load(function(){ cb(this.width, this.height); })
        .attr('src', $el.css('background-image').match(/^url\("?(.+?)"?\)$/)[1]);
}

使用

bgSize($('#element-with-background'), function(width, height){
    console.log('width : ' + width + ' height : ' + height);
});

https://jsfiddle.net/x4u2ndha/58/

答案 4 :(得分:3)

我将John的答案和Stryder的插件样式合并在一起。此插件等待加载图像:

$.fn.getBgImage = function(callback) {
    var height = 0;
    var path = $(this).css('background-image').replace('url', '').replace('(', '').replace(')', '').replace('"', '').replace('"', '');
    var tempImg = $('<img />');
    tempImg.hide(); //hide image
    tempImg.bind('load', callback);
    $('body').append(tempImg); // add to DOM before </body>
    tempImg.attr('src', path);
    $('#tempImg').remove(); //remove from DOM
};


// usage
$("#background").getBgImage(function() {
    console.log($(this).height());
});

随时扩展此代码:https://gist.github.com/1276118

答案 5 :(得分:2)

已经有一段时间了,但我也需要这个解决方案,基于一些建议的解决方案,这是我的完整解决方案。

$.fn.getBgHeight = function () {
        var height = 0;
        var path = $(this).css('background-image').replace('url', '').replace('(', '').replace(')', '').replace('"', '').replace('"', '');
        var tempImg = '<img id="tempImg" src="' + path + '"/>';
        $('body').append(tempImg); // add to DOM before </body>
        $('#tempImg').hide(); //hide image
        height = $('#tempImg').height(); //get height
        $('#tempImg').remove(); //remove from DOM
        return height;
    };

答案 6 :(得分:2)

我为宽度做了同样的事情:)

$.fn.getBgWidth = function () {
    var width = 0;
    var path = $(this).css('background-image').replace('url', '').replace('(', '').replace(')', '').replace('"', '').replace('"', '');
    var tempImg = '<img id="tempImg" src="' + path + '"/>';
    $('body').append(tempImg); // add to DOM before </body>
    $('#tempImg').hide(); //hide image
    width = $('#tempImg').width(); //get width
    $('#tempImg').remove(); //remove from DOM
    return width;
};

答案 7 :(得分:1)

与上面相同,但使用regexp而不是replace()

$.fn.extend({
    /**
     * gets background image
     * @param callback function (inside - this = HTMLElement image)
     */
    get_bg_image: function(callback) {
        if (typeof callback != 'function') return;
        var regexp = /url\((.+)\)/i,
            regexp2 = /["']/gi,
            res = regexp.exec($(this).css('background-image')),
            img_src = res[1].replace(regexp2, ''),
            $tempImg = $('<img />');
        $tempImg.hide();
        $tempImg.bind('load', function(e) {
            callback.call(this, e);
            $tempImg.remove();
        });
        $('body').append($tempImg);
        $tempImg.attr('src', img_src);
    }
});

// usage
$('div').get_bg_image(function() {
    var bg_img_width = $(this).width();
});

答案 8 :(得分:1)

css('background-image')将返回“url(.....)”,你不能用它来测试图像的高度,因为它不是DOM对象。

答案 9 :(得分:1)

以下是我的改编:

$.fn.getBgDim = function (callback) {
    var width  = 0,
        height = 0,
        path   = $(this).css("background-image").replace("url(", "").replace(")", "").replace("\"", "").replace("\"", ""),
        tmp    = $("<img />");
    tmp.hide();
    tmp.bind("load", function() {
        width = $(this).width(); 
        height = $(this).height();
        callback({"width": width, "height": height});
        $(this).remove();
    });
    $("body").append(tmp);
    tmp.attr('src', path);
};

用法:

$("#image").getBgDim(function(dim) {
    console.log("Height: " + dim.height + " Width: " + dim.width);
});

答案 10 :(得分:1)

也许很少有可能,我已尽力简化,最终这对我有用

var img = new Image ;
img.src = $('#dom').css('background-image').replace("url(", "").replace(")", "").replace("\"", "").replace("\"", "");
$(img).load(function() {
    var bgImgWidth = img.width;
    var bgImgHeight = img.height;
    console.log("w::"+bgImgWidth+",h::"+bgImgHeight) ;
}) ;

答案 11 :(得分:1)

这是我的演绎。

$.fn.getBgImage = function (callback) {
    var path = $(this).css('background-image').match(/^url\("?(.+?)"?\)$/)[1];
    var tempImg = $('<img />').hide().bind('load', function () {
        callback($(this).width(), $(this).height());
        $(this).remove();
    }).appendTo('body').attr('src', path);
};

用法:

imgDiv.getBgImage(function (imgW, imgH) {
    //use the imgW and imgH here!   
});

答案 12 :(得分:0)

这是关于此主题的最受欢迎的问题,因此我不得不说我不理解为什么人们试图使事情变得过于复杂。我还必须承认,我不知道如何仅通过一个参数since the method takes 3 parameters调用COPY ... FROM STDIN JQuery函数。据我所知,这将导致load()异常。我不知道我是否错过了这些东西,或者这些年来API发生了很大变化。无论如何,这是截至2020年的可行解决方案:

'IndexOf()' is not defined

致电:

jQuery.fn.extend({
    backgroundImageSizeAsync: async function() {
        const imageUrl = this.css("background-image").match(/^url\("?(.+?)"?\)$/)[1];
        const image = new Image();

        await $.Deferred(function (task) {
            image.onload = () => task.resolve(image);
            image.onerror = () => task.reject();
            image.src = imageUrl;
        }).promise();

        return {
            width: image.width,
            height: image.height
        }
    },
});

答案 13 :(得分:0)

在我的特定情况下,我需要可以与background-image: linear-gradient(rgba(0, 0, 0, 0.4),rgba(0, 0, 0, 0.4)), url(...)一起使用的功能。我还需要一个代码,该代码将能够检查特定类中的多个图像,而无需复制每个图像的代码。

也许对某人有用! (我绝对不是Jquery专家,因为我一个月前开始为个人网站编写代码。因此,如有需要,请随时进行纠正!)

该作品也是最新的jQuery 3和IE11。为了实现向后的JQuery兼容性,我认为您只能将.on("load", function()替换为.load(function()

//will check all div with this class or id
var $image = $('#myDiv');
//will extract url only by splitting property on comas (takes care of comas on rgba(x, x, x, x))
var imageUrl = $image.css('background-image').split(",")[8].replace('url(','').replace(')','').replace('"','').replace('"','');
var img = new Image ;
img.src = imageUrl;

$(img).on("load", function() {
  var image_width = img.width;
  var image_height = img.height;
  console.log(image_width + " x " + image_height) ;
}) ;

答案 14 :(得分:0)

// The above all solutions may work in all browsers except IE11 so below is the modified solution for IE11 browser
//The height calculated for IE11 wasn't correct as per above code

$.fn.getBgImage = function(callback) {
  if (typeof callback != 'function') return;
  var regexp = /url\((.+)\)/i,
      regexp2 = /["']/gi,
      res = regexp.exec($(this).css('background-image')),
      img_src = res[1].replace(regexp2, ''),
      $tempImg = $('<img />');
  $tempImg.hide();
  $tempImg.bind('load', function(e) {
      callback.call(this, e);
      $tempImg.remove();
  });
  $('body').css({ 'width': 100 + '%' });
  $tempImg.css({ 'width': 100 + '%' });
  $('body').append($tempImg);
  $tempImg.attr('src', img_src);
}

答案 15 :(得分:0)

如果你的css有双引号或浏览器操作,请执行以下操作。

var url = $('#myDiv').css('background-image').replace('url(','').replace(')','').replace('"','').replace('"','');
var bgImg = $('<img />');
bgImg.hide();
bgImg.bind('load', function()
{
    var height = $(this).height();
    alert(height);
});
$('#myDiv').append(bgImg);
bgImg.attr('src', url);

答案 16 :(得分:0)

上述解决方案的组合版本

var width,
    height;

$(image).load(function () {
    width  = image.width;
    height = image.height;
});

image.src = $('#id').css('background-image').replace(/url\(|\)$/ig, "");