From our sponsor: Ready to show your plugin skills? Enter the Penpot Plugins Contest (Nov 15-Dec 15) to win cash prizes!
This Blueprint is a responsive grid gallery based on the gallery by Google for the Chromebook Getting Started guide. In this Blueprint we use Masonry for the grid and 3D transforms for navigating the items. For smaller screens we have some example media queries that adjust the grid layout and also the gallery view.
In the gallery view, the arrow keys can be used to navigate and the view can be closed using the “Esc” key.
Please note that we are using CSS 3D Transforms which are only supported in modern browsers.
The images used in the demo were created using the grafitti shapes by Luke Roberts.
The HTML
<div id="grid-gallery" class="grid-gallery"> <section class="grid-wrap"> <ul class="grid"> <li class="grid-sizer"></li><!-- for Masonry column width --> <li> <figure> <img src="img/thumb/1.png" alt="img01"/> <figcaption><h3>Letterpress asymmetrical</h3><p>Chillwave hoodie ea gentrify aute sriracha consequat.</p></figcaption> </figure> </li> <li> <figure> <img src="img/thumb/2.png" alt="img02"/> <figcaption><h3>Vice velit chia</h3><p>Laborum tattooed iPhone, Schlitz irure nulla Tonx retro 90's chia cardigan quis asymmetrical paleo. </p></figcaption> </figure> </li> <li> <figure> <img src="img/thumb/3.png" alt="img03"/> <figcaption><h3>Brunch semiotics</h3><p>Ex disrupt cray yr, butcher pour-over magna umami kitsch before they sold out commodo.</p></figcaption> </figure> </li> <li> <figure> <img src="img/thumb/4.png" alt="img04"/> <figcaption><h3>Chillwave nihil occupy</h3><p>In post-ironic gluten-free deserunt, PBR&B non pork belly cupidatat polaroid. </p></figcaption> </figure> </li> <li> <figure> <img src="img/thumb/5.png" alt="img05"/> <figcaption><h3>Kale chips lomo biodiesel</h3><p>Pariatur food truck street art consequat sustainable, et kogi beard qui paleo. </p></figcaption> </figure> </li> <li> <figure> <img src="img/thumb/6.png" alt="img06"/> <figcaption><h3>Exercitation occaecat</h3><p>Street chillwave hoodie ea gentrify.</p></figcaption> </figure> </li> </ul> </section><!-- // grid-wrap --> <section class="slideshow"> <ul> <li> <figure> <figcaption> <h3>Letterpress asymmetrical</h3> <p>Kale chips lomo biodiesel stumptown Godard Tumblr, mustache sriracha tattooed cray aute slow-carb placeat delectus. Letterpress asymmetrical fanny pack art party est pour-over skateboard anim quis, ullamco craft beer.</p> </figcaption> <img src="img/large/1.png" alt="img01"/> </figure> </li> <li> <figure> <figcaption> <h3>Vice velit chia</h3> <p>Chillwave Echo Park Etsy organic Cosby sweater seitan authentic pour-over. Occupy wolf selvage bespoke tattooed, cred sustainable Odd Future hashtag butcher.</p> </figcaption> <img src="img/large/2.png" alt="img02"/> </figure> </li> <li> <figure> <figcaption> <h3>Brunch semiotics</h3> <p>IPhone PBR polaroid before they sold out meh you probably haven't heard of them leggings tattooed tote bag, butcher paleo next level single-origin coffee photo booth.</p> </figcaption> <img src="img/large/3.png" alt="img03"/> </figure> </li> <li> <figure> <figcaption> <h3>Chillwave nihil occupy</h3> <p>Vice cliche locavore mumblecore vegan wayfarers asymmetrical letterpress hoodie mustache. Shabby chic lomo polaroid, scenester 8-bit Portland Pitchfork VHS tote bag.</p> </figcaption> <img src="img/large/4.png" alt="img04"/> </figure> </li> <li> <figure> <figcaption> <h3>Kale chips lomo biodiesel</h3> <p>Chambray Schlitz pug YOLO, PBR Tumblr semiotics. Flexitarian YOLO ennui Blue Bottle, forage dreamcatcher chillwave put a bird on it craft beer Etsy.</p> </figcaption> <img src="img/large/5.png" alt="img05"/> </figure> </li> <li> <figure> <figcaption> <h3>Exercitation occaecat</h3> <p>Cosby sweater hella lomo Thundercats VHS occupy High Life. Synth pop-up readymade single-origin coffee, fanny pack tousled retro. Fingerstache mlkshk ugh hashtag, church-key ethnic street art pug yr.</p> </figcaption> <img src="img/large/6.png" alt="img06"/> </figure> </li> </ul> <nav> <span class="icon nav-prev"></span> <span class="icon nav-next"></span> <span class="icon nav-close"></span> </nav> <div class="info-keys icon">Navigate with arrow keys</div> </section><!-- // slideshow --> </div><!-- // grid-gallery --> <script src="js/imagesloaded.pkgd.min.js"></script> <script src="js/masonry.pkgd.min.js"></script> <script src="js/classie.js"></script> <script src="js/cbpGridGallery.js"></script> <script> new CBPGridGallery( document.getElementById( 'grid-gallery' ) ); </script>
The CSS
@font-face { font-family: 'fontawesome'; src:url('../fonts/fontawesome/fontawesome.eot?-e43dk9'); src:url('../fonts/fontawesome/fontawesome.eot?#iefix-e43dk9') format('embedded-opentype'), url('../fonts/fontawesome/fontawesome.woff?-e43dk9') format('woff'), url('../fonts/fontawesome/fontawesome.ttf?-e43dk9') format('truetype'), url('../fonts/fontawesome/fontawesome.svg?-e43dk9#fontawesome') format('svg'); font-weight: normal; font-style: normal; } /* Made with http://icomoon.io/app */ /* General style */ .grid-gallery ul { list-style: none; margin: 0; padding: 0; } .grid-gallery figure { margin: 0; } .grid-gallery figure img { display: block; width: 100%; } .grid-gallery figcaption h3 { margin: 0; padding: 0 0 0.5em; } .grid-gallery figcaption p { margin: 0; } /* Grid style */ .grid-wrap { max-width: 69em; margin: 0 auto; padding: 0 1em 1.875em; } .grid { margin: 0 auto; } .grid li { width: 25%; float: left; cursor: pointer; } .grid figure { padding: 15px; -webkit-transition: opacity 0.2s; transition: opacity 0.2s; } .grid li:hover figure { opacity: 0.7; } .grid figcaption { background: #e4e4e4; padding: 25px; } /* Slideshow style */ .slideshow { position: fixed; background: rgba(0,0,0,0.6); width: 100%; height: 100%; top: 0; left: 0; z-index: 500; opacity: 0; visibility: hidden; overflow: hidden; -webkit-perspective: 1000px; perspective: 1000px; -webkit-transition: opacity 0.5s, visibility 0s 0.5s; transition: opacity 0.5s, visibility 0s 0.5s; } .slideshow-open .slideshow { opacity: 1; visibility: visible; -webkit-transition: opacity 0.5s; transition: opacity 0.5s; } .slideshow ul { width: 100%; height: 100%; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; -webkit-transform: translate3d(0,0,150px); transform: translate3d(0,0,150px); -webkit-transition: -webkit-transform 0.5s; transition: transform 0.5s; } .slideshow ul.animatable li { -webkit-transition: -webkit-transform 0.5s; transition: transform 0.5s; } .slideshow-open .slideshow ul { -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); } .slideshow li { width: 660px; height: 560px; position: absolute; top: 50%; left: 50%; margin: -280px 0 0 -330px; visibility: hidden; } .slideshow li.show { visibility: visible; } .slideshow li:after { content: ''; position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: rgba(255,255,255,0.8); -webkit-transition: opacity 0.3s; transition: opacity 0.3s; } .slideshow li.current:after { visibility: hidden; opacity: 0; -webkit-transition: opacity 0.3s, visibility 0s 0.3s; transition: opacity 0.3s, visibility 0s 0.3s; } .slideshow figure { width: 100%; height: 100%; background: #fff; border: 50px solid #fff; overflow: hidden; } .slideshow figcaption { padding-bottom: 20px; } .slideshow figcaption h3 { font-weight: 300; font-size: 200%; } /* Navigation */ .slideshow nav span { position: fixed; z-index: 1000; color: #59656c; text-align: center; padding: 3%; cursor: pointer; font-size: 2.2em; } .slideshow nav span.nav-prev, .slideshow nav span.nav-next { top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } .slideshow nav span.nav-next { right: 0; } .slideshow nav span.nav-close { top: 0; right: 0; padding: 0.5em 1em; color: #31373a; } .icon:before, .icon:after { font-family: 'fontawesome'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } span.nav-prev:before { content: "e601"; } span.nav-next:before { content: "e600"; } span.nav-close:before { content: "e602"; } /* Info on arrow key navigation */ .info-keys { position: fixed; top: 10px; left: 10px; width: 60px; font-size: 8px; padding-top: 20px; text-transform: uppercase; color: #fff; letter-spacing: 1px; text-align: center; } .info-keys:before, .info-keys:after { position: absolute; top: 0; width: 16px; height: 16px; border: 1px solid #fff; text-align: center; line-height: 14px; font-size: 12px; } .info-keys:before { left: 10px; content: "e603"; } .info-keys:after { right: 10px; content: "e604"; } /* Example media queries (reduce number of columns and change slideshow layout) */ @media screen and (max-width: 60em) { /* responsive columns; see "Element sizing" on http://masonry.desandro.com/options.html */ .grid li { width: 33.3%; } .slideshow li { width: 100%; height: 100%; top: 0; left: 0; margin: 0; } .slideshow li figure img { width: auto; margin: 0 auto; max-width: 100%; } .slideshow nav span, .slideshow nav span.nav-close { font-size: 1.8em; padding: 0.3em; } .info-keys { display: none; } } @media screen and (max-width: 35em) { .grid li { width: 50%; } } @media screen and (max-width: 24em) { .grid li { width: 100%; } }
Tiny break: 📬 Want to stay up to date with frontend and trends in web design? Subscribe and get our Collective newsletter twice a tweek.
The JavaScript
/** * cbpGridGallery.js v1.0.0 * http://www.codrops.com * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php * * Copyright 2014, Codrops * http://www.codrops.com */ ;( function( window ) { 'use strict'; var docElem = window.document.documentElement, transEndEventNames = { 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'oTransitionEnd', 'msTransition': 'MSTransitionEnd', 'transition': 'transitionend' }, transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ], support = { transitions : Modernizr.csstransitions, support3d : Modernizr.csstransforms3d }; function setTransform( el, transformStr ) { el.style.WebkitTransform = transformStr; el.style.msTransform = transformStr; el.style.transform = transformStr; } // from http://responsejs.com/labs/dimensions/ function getViewportW() { var client = docElem['clientWidth'], inner = window['innerWidth']; if( client < inner ) return inner; else return client; } function extend( a, b ) { for( var key in b ) { if( b.hasOwnProperty( key ) ) { a[key] = b[key]; } } return a; } function CBPGridGallery( el, options ) { this.el = el; this.options = extend( {}, this.options ); extend( this.options, options ); this._init(); } CBPGridGallery.prototype.options = { }; CBPGridGallery.prototype._init = function() { // main grid this.grid = this.el.querySelector( 'section.grid-wrap > ul.grid' ); // main grid items this.gridItems = [].slice.call( this.grid.querySelectorAll( 'li:not(.grid-sizer)' ) ); // items total this.itemsCount = this.gridItems.length; // slideshow grid this.slideshow = this.el.querySelector( 'section.slideshow > ul' ); // slideshow grid items this.slideshowItems = [].slice.call( this.slideshow.children ); // index of current slideshow item this.current = -1; // slideshow control buttons this.ctrlPrev = this.el.querySelector( 'section.slideshow > nav > span.nav-prev' ); this.ctrlNext = this.el.querySelector( 'section.slideshow > nav > span.nav-next' ); this.ctrlClose = this.el.querySelector( 'section.slideshow > nav > span.nav-close' ); // init masonry grid this._initMasonry(); // init events this._initEvents(); }; CBPGridGallery.prototype._initMasonry = function() { var grid = this.grid; imagesLoaded( grid, function() { new Masonry( grid, { itemSelector: 'li', columnWidth: grid.querySelector( '.grid-sizer' ) }); }); }; CBPGridGallery.prototype._initEvents = function() { var self = this; // open the slideshow when clicking on the main grid items this.gridItems.forEach( function( item, idx ) { item.addEventListener( 'click', function() { self._openSlideshow( idx ); } ); } ); // slideshow controls this.ctrlPrev.addEventListener( 'click', function() { self._navigate( 'prev' ); } ); this.ctrlNext.addEventListener( 'click', function() { self._navigate( 'next' ); } ); this.ctrlClose.addEventListener( 'click', function() { self._closeSlideshow(); } ); // window resize window.addEventListener( 'resize', function() { self._resizeHandler(); } ); // keyboard navigation events document.addEventListener( 'keydown', function( ev ) { if ( self.isSlideshowVisible ) { var keyCode = ev.keyCode || ev.which; switch (keyCode) { case 37: self._navigate( 'prev' ); break; case 39: self._navigate( 'next' ); break; case 27: self._closeSlideshow(); break; } } } ); // trick to prevent scrolling when slideshow is visible window.addEventListener( 'scroll', function() { if ( self.isSlideshowVisible ) { window.scrollTo( self.scrollPosition ? self.scrollPosition.x : 0, self.scrollPosition ? self.scrollPosition.y : 0 ); } else { self.scrollPosition = { x : window.pageXOffset || docElem.scrollLeft, y : window.pageYOffset || docElem.scrollTop }; } }); }; CBPGridGallery.prototype._openSlideshow = function( pos ) { this.isSlideshowVisible = true; this.current = pos; classie.addClass( this.el, 'slideshow-open' ); /* position slideshow items */ // set viewport items (current, next and previous) this._setViewportItems(); // add class "current" and "show" to currentItem classie.addClass( this.currentItem, 'current' ); classie.addClass( this.currentItem, 'show' ); // add class show to next and previous items // position previous item on the left side and the next item on the right side if( this.prevItem ) { classie.addClass( this.prevItem, 'show' ); var translateVal = Number( -1 * ( getViewportW() / 2 + this.prevItem.offsetWidth / 2 ) ); setTransform( this.prevItem, support.support3d ? 'translate3d(' + translateVal + 'px, 0, -150px)' : 'translate(' + translateVal + 'px)' ); } if( this.nextItem ) { classie.addClass( this.nextItem, 'show' ); var translateVal = Number( getViewportW() / 2 + this.nextItem.offsetWidth / 2 ); setTransform( this.nextItem, support.support3d ? 'translate3d(' + translateVal + 'px, 0, -150px)' : 'translate(' + translateVal + 'px)' ); } }; CBPGridGallery.prototype._navigate = function( dir ) { if( this.isAnimating ) return; if( dir === 'next' && this.current === this.itemsCount - 1 || dir === 'prev' && this.current === 0 ) { this._closeSlideshow(); return; } this.isAnimating = true; // reset viewport items this._setViewportItems(); var self = this, itemWidth = this.currentItem.offsetWidth, // positions for the centered/current item, both the side items and the incoming ones transformLeftStr = support.support3d ? 'translate3d(-' + Number( getViewportW() / 2 + itemWidth / 2 ) + 'px, 0, -150px)' : 'translate(-' + Number( getViewportW() / 2 + itemWidth / 2 ) + 'px)', transformRightStr = support.support3d ? 'translate3d(' + Number( getViewportW() / 2 + itemWidth / 2 ) + 'px, 0, -150px)' : 'translate(' + Number( getViewportW() / 2 + itemWidth / 2 ) + 'px)', transformCenterStr = '', transformOutStr, transformIncomingStr, // incoming item incomingItem; if( dir === 'next' ) { transformOutStr = support.support3d ? 'translate3d( -' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px, 0, -150px )' : 'translate(-' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px)'; transformIncomingStr = support.support3d ? 'translate3d( ' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px, 0, -150px )' : 'translate(' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px)'; } else { transformOutStr = support.support3d ? 'translate3d( ' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px, 0, -150px )' : 'translate(' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px)'; transformIncomingStr = support.support3d ? 'translate3d( -' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px, 0, -150px )' : 'translate(-' + Number( (getViewportW() * 2) / 2 + itemWidth / 2 ) + 'px)'; } // remove class animatable from the slideshow grid (if it has already) classie.removeClass( self.slideshow, 'animatable' ); if( dir === 'next' && this.current < this.itemsCount - 2 || dir === 'prev' && this.current > 1 ) { // we have an incoming item! incomingItem = this.slideshowItems[ dir === 'next' ? this.current + 2 : this.current - 2 ]; setTransform( incomingItem, transformIncomingStr ); classie.addClass( incomingItem, 'show' ); } var slide = function() { // add class animatable to the slideshow grid classie.addClass( self.slideshow, 'animatable' ); // overlays: classie.removeClass( self.currentItem, 'current' ); var nextCurrent = dir === 'next' ? self.nextItem : self.prevItem; classie.addClass( nextCurrent, 'current' ); setTransform( self.currentItem, dir === 'next' ? transformLeftStr : transformRightStr ); if( self.nextItem ) { setTransform( self.nextItem, dir === 'next' ? transformCenterStr : transformOutStr ); } if( self.prevItem ) { setTransform( self.prevItem, dir === 'next' ? transformOutStr : transformCenterStr ); } if( incomingItem ) { setTransform( incomingItem, dir === 'next' ? transformRightStr : transformLeftStr ); } var onEndTransitionFn = function( ev ) { if( support.transitions ) { if( ev.propertyName.indexOf( 'transform' ) === -1 ) return false; this.removeEventListener( transEndEventName, onEndTransitionFn ); } if( self.prevItem && dir === 'next' ) { classie.removeClass( self.prevItem, 'show' ); } else if( self.nextItem && dir === 'prev' ) { classie.removeClass( self.nextItem, 'show' ); } if( dir === 'next' ) { self.prevItem = self.currentItem; self.currentItem = self.nextItem; if( incomingItem ) { self.nextItem = incomingItem; } } else { self.nextItem = self.currentItem; self.currentItem = self.prevItem; if( incomingItem ) { self.prevItem = incomingItem; } } self.current = dir === 'next' ? self.current + 1 : self.current - 1; self.isAnimating = false; }; if( support.transitions ) { self.currentItem.addEventListener( transEndEventName, onEndTransitionFn ); } else { onEndTransitionFn(); } }; setTimeout( slide, 25 ); } CBPGridGallery.prototype._closeSlideshow = function( pos ) { // remove class slideshow-open from the grid gallery elem classie.removeClass( this.el, 'slideshow-open' ); // remove class animatable from the slideshow grid classie.removeClass( this.slideshow, 'animatable' ); var self = this, onEndTransitionFn = function( ev ) { if( support.transitions ) { if( ev.target.tagName.toLowerCase() !== 'ul' ) return; this.removeEventListener( transEndEventName, onEndTransitionFn ); } // remove classes show and current from the slideshow items classie.removeClass( self.currentItem, 'current' ); classie.removeClass( self.currentItem, 'show' ); if( self.prevItem ) { classie.removeClass( self.prevItem, 'show' ); } if( self.nextItem ) { classie.removeClass( self.nextItem, 'show' ); } // also reset any transforms for all the items self.slideshowItems.forEach( function( item ) { setTransform( item, '' ); } ); self.isSlideshowVisible = false; }; if( support.transitions ) { this.el.addEventListener( transEndEventName, onEndTransitionFn ); } else { onEndTransitionFn(); } }; CBPGridGallery.prototype._setViewportItems = function() { this.currentItem = null; this.prevItem = null; this.nextItem = null; if( this.current > 0 ) { this.prevItem = this.slideshowItems[ this.current - 1 ]; } if( this.current < this.itemsCount - 1 ) { this.nextItem = this.slideshowItems[ this.current + 1 ]; } this.currentItem = this.slideshowItems[ this.current ]; } // taken from https://github.com/desandro/vanilla-masonry/blob/master/masonry.js by David DeSandro // original debounce by John Hann // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ CBPGridGallery.prototype._resizeHandler = function() { var self = this; function delayed() { self._resize(); self._resizeTimeout = null; } if ( this._resizeTimeout ) { clearTimeout( this._resizeTimeout ); } this._resizeTimeout = setTimeout( delayed, 50 ); } CBPGridGallery.prototype._resize = function() { if ( this.isSlideshowVisible ) { // update width value if( this.prevItem ) { var translateVal = Number( -1 * ( getViewportW() / 2 + this.prevItem.offsetWidth / 2 ) ); setTransform( this.prevItem, support.support3d ? 'translate3d(' + translateVal + 'px, 0, -150px)' : 'translate(' + translateVal + 'px)' ); } if( this.nextItem ) { var translateVal = Number( getViewportW() / 2 + this.nextItem.offsetWidth / 2 ); setTransform( this.nextItem, support.support3d ? 'translate3d(' + translateVal + 'px, 0, -150px)' : 'translate(' + translateVal + 'px)' ); } } } // add to global namespace window.CBPGridGallery = CBPGridGallery; })( window );
Wow!! What a great stuff, right when it needed most. Thank you so much for this one 🙂
thank you for this. would it be better if the close button would be on each window instead on the top right corner? its difficult to spot.
You change:
.slideshow nav span.nav-close {
top: 0;
right: 0;
padding: 0.5em 1em;
color: #fff;
}
That’s pretty neat. Usability problem with clicking outside of the picture it should close the gallery overlay. Other than that it’s pretty rad.
Nice demo.
Consider also adding mouse scroll keys support.
IT will be perfect if there is touch option
Is it possible to have an iframe video instead of an image?
Great work, tnx!
how can I add more than 1 gallery in the same file?
They are just awesome, Thanks countless for such a great work to assist newbies like me in a so effective way.
It is all the way wonderful just feel lake/shortage/missing of IE <=7 hacks(supports) or alternative css in some cases, or at-least hints for what to do or how to do in case of countering IEs, they are really sleep hunter for newbies like me!!!
Wish you all the happiness and fitness in life.
Regards,
Imran Ahmed
Dhaka, Bangladesh.
The request above is a common request not for any specific ones (help or hints regarding IEs<=7 versions). Would be great! 🙂
Perfect, just needs to include some sort of default “close” option. =)
great tutorial, nice gallery !
when clicking a picture, it “zoom’s in” on that picture, but if I use a ‘.jpg’ picture it doesn’t show the full picture.. is there a workaround ?
i’m having the same issue. any solution?
Same issue, also the nav buttons are not showing on iOS mobile and therefor going to the next slide is not working either. Anyone solved it?
Nice work Thx !
How it is possible to close the slideshow ‘self._closeSlideshow();’ just by click outside the ‘.slideshow li’ ?
Thank u for your return 🙂
Thank you , But Tag isn’t working , how it possible to fix it ?
This is really great! I have a lone image on the last row ; is there a way to have a fixed number of images per row?
Hi!
Does anybody know how can you make a filter / sort categories select option for this?
Thanks!
Love your work! I was trying to combine the ‘Responsive Full Width Tabs’ with the ‘Google Grid Gallery’ but didn’t succeed 🙁
I have two tabs. I have copied the code (of the Google Grid Gallery index.html file, starting with ” until the ) into the sections tab section: . I have also combined the css files and copied all .js files in the js directory. But unfortunately The Google Grid section doesn’t show.
It think it has something to do with the ‘display: none’ statement of ‘.content section’ in the ‘component.css’ file or maybe something with the selectors of the javascript, but i’m no hero in js or css.
Do you have an idea of what could be wrong. If I delete the ‘dispay: none’ statement the grid is shown. But its shown on both tabs.
Thank you very much for your examples. I hope you can help me.
Best regards, Willem Thoonen
Thanks for the inspiration. I have adopted it into a Jekyll theme. Enjoy! https://github.com/nadjetey/GridGallery
I loved this gallery! Anyone know how to put an image on the grid li:. Hover {figure instead of a translucent hover? That is, when the cursor on the thumbs of the gallery that this call to a specific image for each thumb is placed. Thank you all.
I have some glitches switching the images on IE10. Any clue on how to make it work nice?
Lovely! The list duplication isn’t ideal though – it makes it hard to scale to large result sets.
Hi, I’m new in all this, I think it’s great! But the slideshow doesn’t work in smart phones. How can I fix it?
I got the same problem. works fine until the close button is clicked.
On chrome mobile its working fine.
Maybe You guys know how to loop the pages in the open galery to avoid exit while we are close to the end or front? I’ll be glad for any help. cheers
Did you ever find out how to achieve this?
Awesome slideshow! I was wondering how I could make bigger images automaticly resize itself / let them show full?
When I upload a file of 1000x500px for example I can only view a little part of the image because it ‘zooms’ in.
Could anybody tell me how I can make any image size work please?
I have not seen the image is cut to the top of 1000 x 500 px for example. Perfectly resizes in the demo that I have. Now if you want to resize the popup window for the image will look in 1000 px-size, you should go to component.css and modify the line 116 . {Li slideshow
width: 660px;
height: 560px;
position: absolute;
top: 50%;
left: 50%;
margin:-280px 0 0-330px;
You must modify the margin when supersize window.
Does anyone know how this application can be adapted to the IE8? For me does not work. Does anyone have the debug for that “beautiful” browser?
Hi, thank you for this.
Please, help, how add a link (
<a href>
) in li block, and after click in this link not opened slide-window?Thank you for this great inspiration.
But how to close the slideshow when clicked outside the “slideshow li” items? Is it possible?
How can i use it with IE and Firefox ?
Has anyone tried adding a lazy load to this?
Hi,
It’s very very nice gallery but I have one may be simple problem but still can’t figured it out. When I test it on localhost I have arrows for next and prev image. But when I upload it to the host I don’t have? There is just one square. What can be the problem?
Thanks
Very nicely done! Does anyone know how to add swipe capabilities to this? So when you are on your phone, instead of using arrows, you can swipe from left to right? Thank you!
hi Ryan
please help me what me should to do this is not working for me
plz help
Ryan, to get the swipe working I leverage the jquery mobile library (http://jquerymobile.com/download/ – FYI I did a custom build to only grab the touch elements)
Them added the code below:
<script src="js/jquery.mobile-1.4.2.min.js"></script> <script> $(document).ready(function() { $("#grid-gallery").swiperight(function() { $( ".nav-prev" ).click(); }); $("#grid-gallery").swipeleft(function() { $( ".nav-next" ).click(); }); }); </script>
Ryan and Andrew,
I tried to follow Andrews but could not get the swipe capability to work.
I download jquery.mobile-1.4.2.min.js and add the script…but still no luck.
Can anybody please helo me?
Did you solve it ? how did you ?
this is net working for me
any one can help me please ?
Great slideshow!
I’ve implemented it on my site but ideally would like the slideshow to loop rather than close when you get to the last image.
Does anyone know a way of doing this?
hi chris,
did you get answer? i have same problem .please help.
I was wondering how do I get the Javascript to work in Dreamweaver? I get all the HTML and CSS in, then I link to the .JS in the head tags, and it still does not work…
Step 1, don’t use Dreamweaver.
Great jumping point! I’m working on implementing a category filter @ https://github.com/Nuwen/GridGallery // http://sandbox.leighjohnson.me/gridgallery/
Any ideas about how to reload the masonry grid after a .hidden class is applied to groups of figures? I’ve tried calling the masonry(‘reload’) method on the container grid, but that wasn’t successful. I’ve also tried adding a generic click event to the entire document that calls CBPGridGallery.prototype._resizehandler, but that doesn’t work either.
You should use Isotope instead of Masonry.
Hi,
Thanks for this great inspiration.
I wonder that how can we give transition to all grid and opened slide show ? Do you have any idea?
Thanks for sharing!!
hi, do you have any ideea on hoe to use two grid-gallery on the same page, one its working but when i put two of the, the second one will not popup, thanks
How do I get to create grids with double size? As shown on page of Google for the Chromebook getting started guide. Thanks you all.
I was looking for something like this. It’s great, thank you so much 🙂
I can get overflow-y to scroll on desktop (for larger overlay sections), but the overlay will not scroll on mobile. Does anyone know how to make scroll happen for smaller screens?
I have also same problem. Do you have any idea? Can you please look at this problem?
Is not working with spanish font 🙁 please help!!!
Hi im trying to use this code on a personal project. But i get stuck with a little issue. On the first slideshow i have a lot of content and i am enable the overflow for it. Works fine on standard browsers for PC and MAC but doesn’t work on iPad and iPhone (scrolls the body instead of the slideshow). Anyone knows why? I also used the jquery-mobile1.4.2.js to enable other functions like swipe.
I have also same problem. Anyone knows why this problem occurs? Please help!!!
How can I close the slideshow with a click in empty zone (and not by push exit or click X buttons) ?
You have been able to close on an empty area?
Does it support dynamic Content? For instance, content updates thru AJAX.
yes. but u must edit the src,u can see my answer downstairs
Hello, I try this plugin in my website but it didn’t work properly.
I am get images by making ajax call to the database and then I set it in ajax success block.
The grid is created properly but on click the slider is not working.
It’s having same hierarchy as define in demo code.
How can I solve this?
Thanks.
================ I send my html code after ajax success response =========================
abc
98
i had find a way to solve your problem,u can edit the ‘cbpGridGallery.js’ src , add the event listner which u need in the ” CBPGridGallery.prototype._initEvents” function’scontent , and copy the ” CBPGridGallery.prototype._init” function’s content into your event listner, remember to replace the “this” with “self” , this will be reload u page’s elements,and u will find the plugin will work again ^ ^,if u still don’t know how to do it , send e-mail to 313212272@qq.com, i am glad to answer ur question!
After clicking the image a popup arrives which displays the brief about the image. when i try to add custom text in that text in the form of
Text 1
Text 2
for example
Letterpress asymmetrical
Kale chips lomo biodiesel
Text 1
Text 2
stumptown Godard Tumblr, mustache sriracha tattooed cray aute slow-carb placeat delectus. Letterpress asymmetrical fanny pack art party est pour-over skateboard anim quis, ullamco craft beer.
The list is not being displayed in the output. Help me out please
i have a same problem with them…I am get images by making ajax call to the database and then i use the jquery “append” method to put them in my jsp,it didn’t work…
Has anyone tried using this with something like Isotope? I’m curious about adding filters to the grid for sorting.
how to disable slideshow popup?
This code is working properly
but i am having problem when i put this grid gallery in a update panel and set trigger on tick event of timer in this case the popup view is not working
it worked when i recalled my jquery after trigger is fired