Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent a background image flickering on change

I'm applying a repeated background image from a canvas to a div via javascript like this:

var img_canvas = document.createElement('canvas');  img_canvas.width = 16;  img_canvas.height = 16;  img_canvas.getContext('2d').drawImage(canvas, 0, 0, 16, 16);  var img = img_canvas.toDataURL("image/png");  document.querySelector('#div').style.backgroundImage = 'url(' + img + ')'; 

I have to update it quite frequently. The problem is it flickers upon change, it doesn't appear to happen in Chrome but it's really bad in Firefox and Safari. Is it possible to stop this? I didn't think it would happen since it's a dataurl and therefore doesn't need to be downloaded.

Solution:

// create a new Image object var img_tag = new Image();  // when preload is complete, apply the image to the div img_tag.onload = function() {      document.querySelector('#div').style.backgroundImage = 'url(' + img + ')'; }  // setting 'src' actually starts the preload img_tag.src = img; 
like image 458
Suffick Avatar asked Mar 08 '14 13:03

Suffick


1 Answers

Try to preload the image resource to the device storage by including the image in DOM like in the following HTML-Code. Maybe the error comes up because the image resource need to be loaded which takes some time (flickering).

<img src="imageToPreload.png" style="display:none;" alt="" /> 

You may prefer to use sprites-images. By using sprites your application will need less HTTP-Requests to load all ressources into your page. Also add the following CSS styles if you are using css animations. It will prevent background flickering on mobile devices:

-webkit-backface-visibility: hidden; -moz-backface-visibility:    hidden; -ms-backface-visibility:     hidden; 
like image 149
lin Avatar answered Sep 22 '22 12:09

lin