Prevent flickers for already loaded images. #325
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Large single-page apps, like Ember, will sometimes rerender the same element with the same image. This can cause lots of flickering with lazyload.
Also, an image reused throughout the page (say, an avatar) fades in every single time, which can make for a jumpy experience (esp. if a rerender is triggered).
Last, the start of the animation is hardwired to
hide()
, which unnecessarily causes page reflow issues even when the dimensions are known.To fix this,
settings.effect
accepts a function, which defaults to a noop (preventing flickering for folks without any effect specified), and the effects are never run if the image is already cached. Ifsettings.effect
is a string, it gets converted to a function as before, so it should be backwards compatible.For my specific use case, this lets me just use
$el.css({opacity: 0}).animate({opacity: 1});
as my effect, which doesn't cause a page reflow or flicker.Tested in Firefox and Chrome.
Easier to see relevant changes with the
?w=1
flag.