Displays image thumbnails in a centered, horizontally flowing gallery.
A Pen by Andrew Mitchell Barfield on CodePen.
Displays image thumbnails in a centered, horizontally flowing gallery.
A Pen by Andrew Mitchell Barfield on CodePen.
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <meta name="description" content=""> | |
| <meta name="author" content=""> | |
| <link rel="icon" href="favicon.ico"> | |
| <title>GalleryDemo</title> | |
| <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" /> | |
| <link href="/min/g=css" rel="stylesheet" /> | |
| <!--[if lt IE 9]> | |
| <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> | |
| <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> | |
| <![endif]--> | |
| </head> | |
| <body> | |
| <!-- Options --> | |
| <div class="modal" id="modalOptions" tabindex="-1" role="dialog" aria-labelledby="modalOptionsLabel" aria-hidden="true"> | |
| <div class="modal-dialog"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> | |
| <h4 class="modal-title" id="myModalLabel">User Options and Preferences</h4> | |
| </div> | |
| <div class="modal-body"> | |
| <div class="checkbox"> | |
| <label> | |
| <input type="checkbox" value=""> | |
| Option one is this and that—be sure to include why it's great | |
| </label> | |
| </div> | |
| <div class="checkbox disabled"> | |
| <label> | |
| <input type="checkbox" value="" disabled> | |
| Option two is disabled | |
| </label> | |
| </div> | |
| <div class="radio"> | |
| <label> | |
| <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked> | |
| Option one is this and that—be sure to include why it's great | |
| </label> | |
| </div> | |
| <div class="radio"> | |
| <label> | |
| <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2"> | |
| Option two can be something else and selecting it will deselect option one | |
| </label> | |
| </div> | |
| <div class="radio disabled"> | |
| <label> | |
| <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled> | |
| Option three is disabled | |
| </label> | |
| </div> | |
| </div> | |
| <div class="modal-footer"> | |
| <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Contact --> | |
| <div class="modal" id="modalContact" tabindex="-1" role="dialog" aria-labelledby="modalContactLabel" aria-hidden="true"> | |
| <div class="modal-dialog"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> | |
| <h4 class="modal-title" id="myModalLabel">Contact Us</h4> | |
| </div> | |
| <div class="modal-body"> | |
| <form class="form-horizontal" name="commentform" method="post" action=""> | |
| <div class="form-group"> | |
| <label class="control-label col-md-3" for="subject">Subject</label> | |
| <div class="col-md-8"> | |
| <input type="text" class="form-control" id="subject" name="subject" placeholder="Message Subject"/> | |
| </div> | |
| </div> | |
| <div class="form-group"> | |
| <label class="control-label col-md-3" for="email">Email Address</label> | |
| <div class="col-md-8"> | |
| <input type="email" class="form-control" id="email" name="email" placeholder="Email Address"/> | |
| </div> | |
| </div> | |
| <div class="form-group"> | |
| <label class="control-label col-md-3" for="comment">Message</label> | |
| <div class="col-md-8"> | |
| <textarea rows="6" class="form-control" id="Message" name="Message" placeholder="Your question or comment here"></textarea> | |
| </div> | |
| </div> | |
| </form> | |
| </div> | |
| <div class="modal-footer"> | |
| <button type="button" class="btn btn-default">Send</button> | |
| <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- About --> | |
| <div class="modal" id="modalAbout" tabindex="-1" role="dialog" aria-labelledby="modalAboutLabel" aria-hidden="true"> | |
| <div class="modal-dialog"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> | |
| <h4 class="modal-title" id="myModalLabel">About GalleryDemo</h4> | |
| </div> | |
| <div class="modal-body"> | |
| ... | |
| </div> | |
| <div class="modal-footer"> | |
| <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Categories --> | |
| <div class="modal" id="modalCategories" tabindex="-1" role="dialog" aria-labelledby="modalCategoriesLabel" aria-hidden="true"> | |
| <div class="modal-dialog modal-lg"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> | |
| <h4 class="modal-title" id="myModalLabel">Categories</h4> | |
| </div> | |
| <div class="modal-body"> | |
| ... | |
| </div> | |
| <div class="modal-footer"> | |
| <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Video --> | |
| <div class="modal" id="modalVideo" tabindex="-1" role="dialog" aria-labelledby="modalVideoLabel" aria-hidden="true"> | |
| <div class="modal-dialog"> | |
| <div id="modalVideoBody" class="modal-content"></div> | |
| </div> | |
| </div> | |
| <!-- Navbar --> | |
| <div id="navbar1" class="navbar navbar-inverse navbar-fixed-top" role="navigation"> | |
| <div class="container-fluid"> | |
| <div class="navbar-header"> | |
| <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | |
| <span class="sr-only">Toggle navigation</span> | |
| <span class="icon-bar"></span> | |
| <span class="icon-bar"></span> | |
| <span class="icon-bar"></span> | |
| </button> | |
| <span class="navbar-brand" style="color: #fff">GalleryDemo</span> | |
| </div> | |
| <div class="navbar-collapse collapse"> | |
| <ul class="nav navbar-nav"> | |
| <li><a href="#" data-toggle="modal" data-target="#modalOptions">Options</a></li> | |
| <li><a href="#" data-toggle="modal" data-target="#modalContact">Contact</a></li> | |
| <li><a href="#" data-toggle="modal" data-target="#modalAbout">About</a></li> | |
| </ul> | |
| <ul class="nav navbar-nav navbar-right"> | |
| <li><a href="#" data-toggle="modal" data-target="#modalCategories"><span class="glyphicon glyphicon-chevron-left" style="font-size: 12px;"></span> Categories</a></li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <div id="container"></div> | |
| <div id="videoPlayer"></div> | |
| <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script> | |
| <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> | |
| <script src="/min/g=js"></script> | |
| </body> | |
| </html> |
| function resizeContainer() { | |
| var navbarHeight = $('#navbar1').height() + 1; | |
| $('#container') | |
| .css('top', navbarHeight + 'px') | |
| .height($(window).height() - navbarHeight); | |
| } | |
| function centerModal() { | |
| $(this).css('display', 'block'); | |
| var $dialog = $(this).find(".modal-dialog"); | |
| var offset = ($(window).height() - $dialog.height()) / 2; | |
| $dialog.css("margin-top", offset); | |
| } | |
| function itemClick(e) { | |
| var item = $(e.target); | |
| item.css('opacity','0.35'); | |
| var id = item.attr('id'); | |
| if (!id) { | |
| item = item.parent(); | |
| id = item.attr('id'); | |
| } | |
| var videoHTML = '<img src="http://placehold.it/608x468&text='+id+'+Selected">'; | |
| $('#modalVideoBody').html(videoHTML); | |
| $('#modalVideo').on('hidden.bs.modal', function (e) { | |
| $('#modalVideoBody').html(''); | |
| }) | |
| $('#modalVideo').modal('show'); | |
| } | |
| function createThumbnail(id) { | |
| var colors = ["8EB5CF","FFD478","F89D57","D9531E"]; | |
| var bgColor = colors[Math.floor(Math.random() * colors.length)]; | |
| return "<div id='"+id+"' style='background-image: url(http://beerhold.it/320/240/?x="+id+")'><span>"+id+"</span></div>"; | |
| } | |
| function updateContainer(containerItems, prepend) { | |
| prepend ? $('#container').prepend(containerItems) : $('#container').append(containerItems); | |
| $( '#container div').click(function(e) { | |
| itemClick(e); | |
| }); | |
| $('#container div span').mouseenter(function(){ | |
| var $this = $(this); | |
| if(this.offsetWidth < this.scrollWidth && !$this.attr('title')){ | |
| $this.attr('title', $this.text()); | |
| } | |
| }); | |
| } | |
| function getData() { | |
| var newGridViewItems = ""; | |
| for(var i=1; i<54; i++) | |
| newGridViewItems += createThumbnail("Image_" + i); | |
| updateContainer(newGridViewItems, true); | |
| } | |
| $(function() { | |
| // Resize the thumbnail container | |
| resizeContainer(); | |
| // Center all dialogs on show event | |
| $('.modal').on('show.bs.modal', centerModal); | |
| // Resize the Thumbnail Container and center dialogs on Window resize event | |
| $(window).resize(function() { | |
| resizeContainer(); | |
| $('.modal:visible').each(centerModal); | |
| }); | |
| // Query the server for new videos and prepend them to the container | |
| getData(); | |
| }); |
| .navbar-brand,.navbar-nav > li > a { | |
| text-shadow:0 1px 0 rgba(255,255,255,.25) | |
| } | |
| .navbar-inverse { | |
| background-image: -webkit-linear-gradient(top,#3c3c3c 0,#222 100%); | |
| background-image: -o-linear-gradient(top,#3c3c3c 0,#222 100%); | |
| background-image: -webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222)); | |
| background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%); | |
| filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); | |
| filter:progid:DXImageTransform.Microsoft.gradient(enabled=false); | |
| background-repeat:repeat-x | |
| } | |
| .navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav > li > a { | |
| text-shadow:0 -1px 0 rgba(0,0,0,.25) | |
| } | |
| .navbar-fixed-top { | |
| border-radius:0 | |
| } | |
| * { | |
| box-sizing: border-box; | |
| } | |
| html { | |
| overflow: hidden; | |
| padding: 0; | |
| margin: 0; | |
| } | |
| body { | |
| background-color: black; | |
| padding: 0px; | |
| margin: 0 auto; | |
| overflow: hidden; | |
| } | |
| #container { | |
| background-color: black; | |
| position: absolute; | |
| left: 0; | |
| width: 100%; | |
| text-align: center; | |
| border: 0; | |
| margin: 0 auto 0 auto; | |
| padding: 0; | |
| overflow-y: scroll; | |
| overflow-x: hidden; | |
| } | |
| #container div { | |
| background-repeat: no-repeat; | |
| background-position: 50% 50%; | |
| -webkit-background-size: cover; | |
| -moz-background-size: cover; | |
| -o-background-size: cover; | |
| background-size: cover; | |
| display: inline-block; | |
| padding: 0; | |
| margin: 15px; | |
| width: 320px; | |
| height: 240px; | |
| border: 1px solid #999; | |
| border-radius: 6px; | |
| cursor: pointer; | |
| overflow: hidden; | |
| position: relative; | |
| opacity: 0.8; | |
| } | |
| #container div:hover { | |
| opacity: 1.0; | |
| } | |
| #container div span:first-child { | |
| display: inline-block; | |
| width: 100%; | |
| text-align: left; | |
| margin: 0; | |
| padding: 3px 12px 3px 6px; | |
| background: black; | |
| color: white; | |
| opacity: 0.8; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| #container div span:last-child { | |
| font-size: 12px; | |
| display: inline-block; | |
| width: 100%; | |
| text-align: left; | |
| margin: 0; | |
| padding: 3px 12px 3px 6px; | |
| background: black; | |
| color: white; | |
| opacity: 0.9; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| position: absolute; | |
| left: 0; | |
| bottom: 0; | |
| } | |
| .modal-backdrop.in { | |
| filter: alpha(opacity=90); | |
| opacity: .9; | |
| } | |
| .bs-glyphicons{margin:0;overflow:hidden} | |
| .bs-glyphicons-list{padding-left:0;list-style:none} | |
| .bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff} | |
| .bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px} | |
| .bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word} | |
| .bs-glyphicons li:hover{color:#fff;background-color:#563d7c} | |
| @media (min-width:768px){ | |
| .bs-glyphicons{margin-right:0;margin-left:0} | |
| .bs-glyphicons li{width:12.5%;font-size:12px} | |
| } | |
| .input-group[class*="col-"] { | |
| padding-right: 15px; | |
| padding-left: 15px; | |
| } | |
| #modalVideoBody { | |
| padding: 0px; | |
| width: 608px; | |
| height: 468px; | |
| } |