ember-skeleton is built and maintained by DockYard, contact us for expert Ember.js consulting.
Show fast-loading temporary images in place of an eventual slow-loading image.
This library relies on addEventListener
and removeEventListener
which is
IE9+
npm install && bower install
ember build
The builds will be in the dist/
directory.
ember install ember-skeleton
If it is a bug please open an issue on GitHub.
Use the component in your templates:
The workflow is thus:
- The
tmpSrc
image will be loaded first - Once complete the
src
image will attempt to load - If the
src
completes successfully it will be displayed - If the
src
does not complete successfully thetmpSrc
will stay - If an optional
errorSrc
is provided that image will be displayed in the even ofsrc
not completing successfully.
If you'd like to set defaults instead of having to manually set tmpSrc
and errorSrc
for each use of {{skeleton-img}}
you can overwrite the
component in app/components/skeleton-img.js
import SkeletonImg from 'ember-skeleton/components/skeleton-img';
export default SkeletonImg.extend({
tmpSrc: "/default/path/to/placeholder.png",
errorSrc: "/default/path/to/error/placeholder.png"
});
Now you can do:
You can still override the defaults by passing those values into the component from within the template.
The component itself produced an img
tag with a skeleton-img
class.
The follow state-based classes are also available:
loading
used when thesrc
image is still loadingloaded
used whensrc
has successfully completedload-error
used ifsrc
has not succesfully completed
Because the slow-loading images will likely be a different size than the
placeholders it is recommended that you normalize the img
tag's
dimensions:
.skeleton-img {
width: 300px;
height: 300px;
}
This example will ensure that the when src
swaps our with tmpSrc
that there isn't any chnages in dimensions. This of course is optional
and the values should change based upon your needs.
If you'd like to defer rendering you can override the renderSrc
value
on the component. For example, you might want to change over to only
rendering the src
once the element is in the viewport. This is easily
accomplished in combination with
ember-in-viewport.
Override app/components/skeleton-img.js
import SkeletonImg from 'ember-skeleton/components/skeleton-img';
import InViewportMixin from 'ember-in-viewport';
const {
set
} = Ember;
export default SkeletonImg.extend(InViewportMixin, {
renderSrc: false,
didEnterViewport() {
set(this, 'renderSrc', true);
}
});
This is a great performance optimization for mobile applications.
We are very thankful for the many contributors
This library follows Semantic Versioning
Please do! We are always looking to improve this library. Please see our Contribution Guidelines on how to properly submit issues and pull requests.
DockYard, Inc © 2015