Get the Size of a CSS Background Image Using JavaScript?

前端 未结 5 1170
时光说笑
时光说笑 2020-11-30 04:31

Is it possible to use JavaScript to get the actual size (width and height in pixels) of a CSS referenced background image?

相关标签:
5条回答
  • 2020-11-30 04:59

    Here it is in jQuery:

    var actualImage = new Image();
    actualImage.src = $('YOUR SELECTOR HERE').css('background-image').replace(/"/g,"").replace(/url\(|\)$/ig, "");
    
    actualImage.width // The actual image width
    actualImage.height // The actual image height
    

    Thanks for the sweet regex alex.

    0 讨论(0)
  • 2020-11-30 05:08

    Yes, and I'd do it like this...

      window.onload = function() {
    
        var imageSrc = document
                        .getElementById('hello')
                         .style
                          .backgroundImage
                           .replace(/url\((['"])?(.*?)\1\)/gi, '$2')
                            .split(',')[0];
    
        // I just broke it up on newlines for readability        
    
        var image = new Image();
        image.src = imageSrc;
    
        var width = image.width,
            height = image.height;
    
        alert('width =' + width + ', height = ' + height)    
    
    }
    

    Some notes...

    • We need to remove the url() part that JavaScript returns to get the proper image source. We need to split on , in case the element has multiple background images.
    • We make a new Image object and set its src to the new image.
    • We can then read the width & height.

    jQuery would probably a lot less of a headache to get going.

    0 讨论(0)
  • 2020-11-30 05:08

    Can't comment under answers, so here is jQuery version including background-size (posted because this question is first one in google search and may be useful to someone else than me):

    function getBackgroundSize(selector, callback) {
      var img = new Image(),
          // here we will place image's width and height
          width, height,
          // here we get the size of the background and split it to array
          backgroundSize = $(selector).css('background-size').split(' ');
    
      // checking if width was set to pixel value
      if (/px/.test(backgroundSize[0])) width = parseInt(backgroundSize[0]);
      // checking if width was set to percent value
      if (/%/.test(backgroundSize[0])) width = $(selector).parent().width() * (parseInt(backgroundSize[0]) / 100);
      // checking if height was set to pixel value
      if (/px/.test(backgroundSize[1])) height = parseInt(backgroundSize[1]);
      // checking if height was set to percent value
      if (/%/.test(backgroundSize[1])) height = $(selector).parent().height() * (parseInt(backgroundSize[0]) / 100);
    
      img.onload = function () {
        // check if width was set earlier, if not then set it now
        if (typeof width == 'undefined') width = this.width;
        // do the same with height
        if (typeof height == 'undefined') height = this.height;
        // call the callback
        callback({ width: width, height: height });
      }
      // extract image source from css using one, simple regex
      // src should be set AFTER onload handler
      img.src = $(selector).css('background-image').replace(/url\(['"]*(.*?)['"]*\)/g, '$1');
    }
    

    or as jQuery plugin:

    (function ($) {
    // for better performance, define regexes once, before the code
    var pxRegex = /px/, percentRegex = /%/, urlRegex = /url\(['"]*(.*?)['"]*\)/g;
    $.fn.getBackgroundSize = function (callback) {
      var img = new Image(), width, height, backgroundSize = this.css('background-size').split(' ');
    
      if (pxRegex.test(backgroundSize[0])) width = parseInt(backgroundSize[0]);
      if (percentRegex.test(backgroundSize[0])) width = this.parent().width() * (parseInt(backgroundSize[0]) / 100);
      if (pxRegex.test(backgroundSize[1])) height = parseInt(backgroundSize[1]);
      if (percentRegex.test(backgroundSize[1])) height = this.parent().height() * (parseInt(backgroundSize[0]) / 100);
      // additional performance boost, if width and height was set just call the callback and return
      if ((typeof width != 'undefined') && (typeof height != 'undefined')) {
        callback({ width: width, height: height });
        return this;
      }
      img.onload = function () {
        if (typeof width == 'undefined') width = this.width;
        if (typeof height == 'undefined') height = this.height;
        callback({ width: width, height: height });
      }
      img.src = this.css('background-image').replace(urlRegex, '$1');
      return this;
    }
    })(jQuery);
    
    0 讨论(0)
  • 2020-11-30 05:11
    var dimension, image;
    
    image = new Image();
    image.src = {url/data}
    image.onload = function() {
        dimension = {
            width: image.naturalWidth,
            height: image.naturalHeight
        };
        console.log(dimension); // Actual image dimension
    };
    
    0 讨论(0)
  • 2020-11-30 05:22
    var actualImage = new Image();
    actualImage.src = $('YOUR SELECTOR HERE').css('background-image').replace(/"/g,"").replace(/url\(|\)$/ig, "");
    
    actualImage.onload = function() {
        width = this.width;
        height = this.height;
    }
    
    0 讨论(0)
提交回复
热议问题