jackmoore / colorbox

A light-weight, customizable lightbox plugin for jQuery
http://www.jacklmoore.com/colorbox/
MIT License
4.75k stars 1.14k forks source link

Getting different width in chrome vs Firefox #874

Open mrSingh007 opened 5 years ago

mrSingh007 commented 5 years ago

Current State On very first click in chrome width of pop layout is small as compared to width of content in Firefox. In chrome if second time same pop-up is triggered (colorbox) then the width/height are correct and width/height is same as in Firefox

After deep analysis it is found that this part of function is inconsistent and gives different results.

$loaded.hide().appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations..css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'})
        .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
        .prependTo($content);

        $loadingBay.hide()

Here getWidth function is giving different results in chrome as compared to firefox

Chrome Browser Info:

Google Chrome   69.0.3497.100 (Official Build) (64-bit)
Revision    8920e690dd011895672947112477d10d5c8afb09-refs/branch-heads/3497@{#948}
OS  Linux
JavaScript  V8 6.9.427.23

Jquery version: 3.3.1 Colorbox version: 1.6.4

mrSingh007 commented 5 years ago

After further analysis, it was found that as $loaded was hidden when getWidth & getHeight methods were called, which somehow did not calculated correct width and height in chrome but was working fine in Firefox. So the solution of this problem is to keep showing $loaded till width and height is not calculated. Afterwards $loaded.hide(); can be called.

So here is solution for this problem:

 $loaded.appendTo($loadingBay.show()).prependTo($content);
        $loaded.show(); // keep showing so that after rendering width/height can be calculated correct
        $loaded.css({width:getWidth(),height: getHeight(),overflow: settings.get('scrolling') ? 'auto' : 'hidden'});

        $loaded.hide(); //now can be called hide
        $loadingBay.hide();
mrSingh007 commented 5 years ago

@jackmoore Please review and take this solution. Thanks