Chú ý: Người ta hay sử dụng imagesLoaded kết hợp với masonry vì sau khi load ảnh xong mới áp dụng masonry để nó không vỡ giao diện :(
<!-- Made possible by the great work of David DeSandro @ https://masonry.desandro.com -->
<!-- Part 1: Add the scripts -->
<!-- Step 1: Let's start by loading jQuery. jQuery is not required for masonary to function but makes things easier -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Step 2: Then load imagesloaded. imagesloaded makes sure the images are not displayed until they are fully loaded -->
<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
<!-- Step 3: we load masonry -->
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<!-- Part 2: Create the grid -->
<!-- Step 1: Start with a the main grid wrapper-->
<div class="grid">
<!-- Step 2: Add grid items--->
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/736x/00/37/03/0037037f1590875493f413c1fdbd52b1--cool-beards-inspiring-photography.jpg" />
</div>
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/736x/cd/90/d9/cd90d9de63fa2c8e5c5e7117e27b5c18--gritty-portrait-photography-studio-photography.jpg">
</div>
<!-- Step 3: repeat...--->
<div class="grid-item">
<img src="https://1.bp.blogspot.com/-9QM7ciGXRkQ/V1hsB-wNLBI/AAAAAAAAMoA/eYbSHs00PTAjrI4QAmvYAIGCUe1AuRAnwCLcB/s1600/bryan_cranston_0095.jpg">
</div>
<div class="grid-item">
<img src="http://webneel.com/sites/default/files/images/project/best-portrait-photography-regina-pagles%20(10).jpg" />
</div>
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/736x/dd/45/96/dd4596b601062eb491ea9bb8e3a78062--two-faces-baby-faces.jpg" />
</div>
<div class="grid-item">
<img src="http://www.marklobo.com.au/news/wp-content/uploads/2013/03/Melbourne_Portrait_Photographer_Mark_Lobo-Cowboy.jpg" />
</div>
<div class="grid-item">
<img src="https://format-com-cld-res.cloudinary.com/image/private/s--PcYqe7Zw--/c_limit,g_center,h_65535,w_960/a_auto,fl_keep_iptc.progressive,q_95/145054-8576001-Rob-Green-by-Zuzana-Breznanikova_7725_b_w.jpg" />
</div>
<div class="grid-item">
<img src="http://www.iefimerida.gr/sites/default/files/janbanning11.jpg" />
</div>
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/736x/66/bb/e7/66bbe7acc0d64da627afef440a29714b--portrait-photos-female-portrait.jpg" />
</div>
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/736x/25/34/b6/2534b6c18c659546463f13b2dc62d4ce--natural-portraits-female-portraits.jpg" />
</div>
<div class="grid-item">
<img src="https://s-media-cache-ak0.pinimg.com/originals/8d/67/12/8d671230ced871df8428b571ed6ec192.jpg" />
</div>
</div>
<!-- Part 3: the script call -->
<!-- Now that everything is loaded we create a script to trigger masonary on $grid. Note that this simply says: "if the images are fully loaded, trigger masnory on $grid. -->
<script>
$(".grid").imagesLoaded(function() {
$(".grid").masonry({
itemSelector: ".grid-item"
});
});
</script>
<style type="text/css">
body {
background: #131418;
}
/* Step 1: start with resetting some defaults */
* {
margin: 0 auto;
padding: 0;
max-width: 100%;
}
/* Step 2: center things inside the grid and clear some space around it by setting a device based max-width and margin*/
.grid {
text-align: center;
max-width: 95vw;
margin: 2.5vw auto;
}
/* Step 3: how big should the gap be between grid items? remember that the total gap between two items would be double what you set here since both would have that amount set as their individual padding. Also add box-sizing:border-box to make sure the padding doesn't affect the total widh of the item */
.grid-item {
padding: 5px;
box-sizing: border-box;
display:inline;
}
/* Step 4: Add media queries (subjective) to make the whole grid resposive. */
@media (min-width: 500px) {
.grid-item {
width: 50%;
}
}
@media (min-width: 1000px) {
.grid-item {
width: 33.333%;
}
}
@media (min-width: 1700px) {
.grid-item {
width: 25%;
}
}
@media (min-width: 2100px) {
.grid-item {
width: 20%;
}
}
</style>
<scriptsrc="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script><!-- or --><scriptsrc="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js"></script>
// jQuery$('#container').imagesLoaded().always( function( instance ) {console.log('ALWAYS - all images have been loaded');});// vanilla JSimgLoad.on( 'always',function( instance ) {console.log('ALWAYS - all images have been loaded');});
Triggered after all images have been either loaded or confirmed broken.
instanceimagesLoaded - the imagesLoaded instance
done
// jQuery$('#container').imagesLoaded().done( function( instance ) {console.log('DONE - all images have been successfully loaded');});// vanilla JSimgLoad.on( 'done',function( instance ) {console.log('DONE - all images have been successfully loaded');});
Triggered after all images have successfully loaded without any broken images.
fail
$('#container').imagesLoaded().fail( function( instance ) {console.log('FAIL - all images loaded, at least one is broken');});// vanilla JSimgLoad.on( 'fail',function( instance ) {console.log('FAIL - all images loaded, at least one is broken');});
Triggered after all images have been loaded with at least one broken image.
progress
imgLoad.on( 'progress',function( instance, image ) {var result =image.isLoaded ?'loaded':'broken';console.log( 'image is '+ result +' for '+image.img.src );});
Triggered after each image has been loaded.
instanceimagesLoaded - the imagesLoaded instance
imageLoadingImage - the LoadingImage instance of the loaded image
Sponsored by Metafizzy
Development on imagesLoaded is sponsored by Metafizzy. Metafizzy makes delightful UI libraries that use imagesLoaded:
Properties
LoadingImage.img
Image - The img element
LoadingImage.isLoaded
Boolean - true when the image has successfully loaded
imagesLoaded.images
Array of LoadingImage instances for each image detected
var imgLoad =imagesLoaded('#container');imgLoad.on( 'always',function() {console.log( imgLoad.images.length+' images loaded' );// detect which image is brokenfor ( var i =0, len =imgLoad.images.length; i < len; i++ ) {var image =imgLoad.images[i];var result =image.isLoaded ?'loaded':'broken';console.log( 'image is '+ result +' for '+image.img.src ); }});
var imagesLoaded =require('imagesloaded');imagesLoaded( elem,function() {...} );
Use .makeJQueryPlugin to make to use .imagesLoaded() jQuery plugin.
var $ =require('jquery');var imagesLoaded =require('imagesloaded');// provide jQuery argumentimagesLoaded.makeJQueryPlugin( $ );// now use .imagesLoaded() jQuery plugin$('#container').imagesLoaded( function() {...});
Webpack
Install imagesLoaded with npm.
npminstallimagesloaded
You can then require('imagesloaded').
// main.jsvar imagesLoaded =require('imagesloaded');imagesLoaded( '#container',function() {// images have loaded});
Use .makeJQueryPlugin to make .imagesLoaded() jQuery plugin.
// main.jsvar imagesLoaded =require('imagesloaded');var $ =require('jquery');// provide jQuery argumentimagesLoaded.makeJQueryPlugin( $ );// now use .imagesLoaded() jQuery plugin$('#container').imagesLoaded( function() {...});