javascriptjquerycssimageimagesloaded

Loading image delayed display after loaded


So I have this html / css / jQuery / js code that toghether shows a VERY large image in width. The base element should be invisible untill the image is loaded and set. Then the base element is made visible by a small fade.

However the behaviour is a little different. Once the image is being loaded i can see the small text fading in and it takes a few seconds before then the image just pops up in once (not loading style like from top to bottom appearing)

This is the simplified code i use:

<script>
    $(function() {

        $("#base").hide();
        var baseHeight = $(window).height();
        var backLayerSRC = $('#img').attr('data-src');
        $('#base').height(baseHeight);

        var img = new Image();
        var imgWidth, imgHeight;

        img.onload = function() {
            imgHeight = this.height;
            imgWidth = this.width;

            var factor = 1 * baseHeight / imgHeight;
            totalWidth = Math.round(factor * imgWidth);

            currentWidth = totalWidth;
            $('#base').width(totalWidth);
            $('#img').attr('src', backLayerSRC);
            $('#img').height(baseHeight);

            $('#base').fadeIn(500);



        };

        img.src = backLayerSRC;

    });
</script>

<style>
    #base {
        position:absolute;
        left:0px;
        height:100%;
    }

    #base #img {
        position:absolute;
        left:0px;
        top:0px;
    }
</style>

<div id='base'>
    some tekst
    <img src='' id='img' data-src='path_to_very_large/image.png' />
</div>

Now, how could it be that it just doesn't fade in WITH the image?

Here is an example WITH the image, please check so it becomse clear what i mean http://jsfiddle.net/uz8mvtap/3


Solution

  • It might depend on the time the browser needs to render the image after the script loaded it.

    I played a little with your fiddle and came up with this:

    $(function() {
    
        $("#base").css({opacity: 0});
        var baseHeight = $(window).height();
        var backLayerSRC = $('#img').attr('data-src');
        $('#base').height(baseHeight);
    
        var img = new Image();
        var imgWidth, imgHeight;
    
        img.onload = function() {
            imgHeight = this.height;
            imgWidth = this.width;
    
            var factor = 1 * baseHeight / imgHeight;
            totalWidth = Math.round(factor * imgWidth);
    
            currentWidth = totalWidth;
            $('#base').width(totalWidth);
            $('#img').attr('src', backLayerSRC);
            $('#img').height(baseHeight);
    
            $('#base').delay(1000).animate({opacity: 1.0},500);
    
    
    
        };
    
        img.src = backLayerSRC;
    
    });
    

    Basically using opacity for such a purpose is better because #base continues to occupy the same space, not disrupting the page. And the delay is for the browser, I figured for a big image it takes time to render, so let's give it it.