Accessible Off-canvas Grid Gallery with jQuery and CSS3
File Size: | 4.12 KB |
---|---|
Views Total: | 4236 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |
A jQuery & CSS3 based accessible off-canvas grid gallery that reveals the large version of your image as you click on a thumbnail and pushes the thumbnail grid to the left.
How to use it:
1. Create a list of thumbnails for the grid gallery as follow.
<main role="main" id="main"> <section class="tiles-a"> <ul> <li> <a href="#" style="background: url('thumb-1.jpg'); background-size: cover;" aria-controls="aside" aria-expanded="false"> <div class="details visually-hidden"> <img src="large-1.jpg" alt="Image Alt"> <div class="text-copy wrapper"> <h3>Title 1</h3> <p>Descriptiont 1</p> </div> </div> </a> </li> <li> <a href="#" style="background: url('thumb-2.jpg'); background-size: cover;" aria-controls="aside" aria-expanded="false"> <div class="details visually-hidden"> <img src="large-2.jpg" alt="Image Alt"> <div class="text-copy wrapper"> <h3>Title 2</h3> <p>Descriptiont 2</p> </div> </div> </a> </li> <li> <a href="#" style="background: url('thumb-3.jpg'); background-size: cover;" aria-controls="aside" aria-expanded="false"> <div class="details visually-hidden"> <img src="large-3.jpg" alt="Image Alt"> <div class="text-copy wrapper"> <h3>Title 3</h3> <p>Descriptiont 3</p> </div> </div> </a> </li> </ul> </section> </main>
2. Create an off-canvas area to place the large images.
<aside role="complementary" id="aside" aria-hidden="true" aria-expanded="false"> <a href="#" class="close"> <img src="close.svg" alt="Close button"> <span class="visually-hidden">Return to main content </span> </a> <div class="aside--details" tabindex="0" aria-live="polite" aria-atomic="true" aria-label="Image details"> </div> </aside>
3. The primary CSS / CSS3 styles.
* { box-sizing: boder-box; } body { margin: 0; } #main { position: relative; z-index: 20; background: #fff; -webkit-transition: -webkit-transform .6s ease; transition: transform .6s ease; } @media (min-width: 640px) { #main { padding: 1em; } } .fake-section { background: #eee; height: 300px; } .tiles-a { width: 100%; position: relative; overflow: hidden; } .tiles-a ul { margin: 0; padding: 0; } .tiles-a li { list-style: none; } @media (min-width: 640px) { .tiles-a li { float: left; width: 33.33%; } } .tiles-a a { margin: 1em; display: block; background: #222; padding-top: 73%; height: 0; } #aside { position: fixed; top: 0; right: 0; width: 60%; height: 100%; background: #eee; overflow-y: scroll; z-index: 10; } #aside img { width: 100%; height: auto; vertical-align: top; } #aside .wrapper { padding: 1em; } #aside .close { width: 25px; display: block; position: absolute; top: 1em; right: 1em; background-color: rgba(0, 0, 0, 0.5); border-radius: 50%; } .show-detail { overflow: hidden; } .show-detail #main { -webkit-transform: translateX(-60%); -ms-transform: translateX(-60%); transform: translateX(-60%); } .visually-hidden { position: absolute; overflow: hidden; clip: rect(0 0 0 0); height: 1px; width: 1px; margin: -1px; padding: 0; border: 0; }
4. Include jQuery library and the toggleAria.js
script at the bottom of the web page.
<script src="jquery-2.1.4.min.js"></script> <script src="toggleAria.js"></script>
5. Active the off-canvas grid gallery.
var $parent = $("#main"), $aside = $("#aside"), $asideTarget = $aside.find(".aside--details"), $asideClose = $aside.find(".close"), $tilesParent = $(".tiles-a"), $tiles = $tilesParent.find("a"), slideClass = "show-detail"; // tile click $tiles.on("click", function(e){ e.preventDefault(); e.stopPropagation(); if(!$("html").hasClass(slideClass)){ $tiles.removeClass("active"); $(this).addClass("active"); $(this).attr("aria-expanded","true"); loadTileData($(this)); }else{ killAside(); $(this).attr("aria-expanded","false"); } }); // kill aside $asideClose.on("click", function(e){ e.preventDefault(); killAside(); }); // load data to aside function loadTileData(target){ var $this = $(target), itemHtml = $this.find(".details").html(); $asideTarget.html(itemHtml); showAside(); } // show/hide aside function showAside(){ if(!$("html").hasClass(slideClass)){ $("html").toggleClass(slideClass); $aside.attr("aria-hidden","false"); focusCloseButton(); } } // handle esc key window.addEventListener("keyup", function(e){ // grab key pressed var code = (e.keyCode ? e.keyCode : e.which); // escape if(code === 27){ killAside(); } }, false); // kill aside function killAside(){ if($("html").hasClass(slideClass)){ $("html").removeClass(slideClass); sendFocusBack(); $aside.attr("aria-hidden","true"); $tiles.attr("aria-expanded","false"); } } // send focus to close button function focusCloseButton(){ $asideClose.focus(); } // send focus back to item that triggered event function sendFocusBack(){ $(".active").focus(); } // handle body click to close off-canvas $parent.on("click",function(e){ if($("html").hasClass(slideClass)){ killAside(); } });
This awesome jQuery plugin is developed by joe-watkins. For more Advanced Usages, please check the demo page or visit the official website.