
revision:

<div id="mainContainer" class="spec">
<div id="thumbnails">
<img class="imgThumbnails" src="2.jpg"/>
<img class="imgThumbnails" src="3.jpg"/>
<img class="imgThumbnails" src="4.jpg" />
<img class="imgThumbnails" src="5.jpg" />
<img class="imgThumbnails" src="6.jpg" />
<img class="imgThumbnails" src="19.jpg" />
<img class="imgThumbnails" src="20.jpg" />
<img class="imgThumbnails" src="1.jpg" />
</div>
<div id="mainImage"><img src="1.jpg" /></div>
<div id="imgCaption"></div>
</div>
<style>
#mainContainer {width: 40vw; height: 40vw; top: 0;}
#mainImage {margin: 1vw; height: 20vw;}
#mainImage img {margin-left: 1vw; width: 35vw; height: 30vw; border: 1vw outset burlywood;}
#thumbnails {display: flex; flex-flow: row nowrap; padding-top: 0.2vw; width: 6vw; height: 6vw;}
.imgThumbnails {margin-left: 0.5vw;height: 5vw; width: 5vw; margin-bottom: 0vw;}
.imgThumbnails:hover {cursor: pointer;}
</style>
<script>
(function start(){
let mainImage = document.getElementById("mainImage").getElementsByTagName("img")[0],
thumbnailImages = document.getElementById("thumbnails").getElementsByTagName("img"),
j = 0;
let startTimer = function(){
stillTimer = setInterval(function(){
j = (j < 7) ? ++j : 0 ;
mainImage.src = thumbnailImages[j].src;
}, 10000);
}
startTimer();
for(i = 0 ; i < thumbnailImages.length ; i++){
thumbnailImages[i].addEventListener("click", function(evt){
clearInterval(stillTimer);
mainImage.src = evt.target.src;
++j;
startTimer();
});
};
})();
</script>








<div class="spec">
<div class="gallery-photos clearfix">
<div class="photo-thumbnails">
<div class="thumbnail current"><div class="thumbnail-inner">
<img src="../images/1.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/2.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/3.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/4.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/5.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/6.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/8.jpg" alt="" /></div></div>
<div class="thumbnail"><div class="thumbnail-inner">
<img src="../images/9.jpg" alt="" /></div></div>
</div>
<div id="big-photo" class="big-photo">
<img src="../images/1.jpg" alt="" /> </div>
</div>
</div>
<style>
.gallery-photos {padding: 1vw; width: 40vw; height:40vw; margin: 0 auto;}
.gallery-photos .big-photo {display: flex; padding: 0.3vw; border: 1vw solid burlywood; margin-right: 1vw; width: 35vw; height: 30vw;}
.gallery-photos .big-photo img {display: inline-flex; width: 35vw; height: 30vw; justify-content:left; border: inset 1vw solid burlywood;}
.gallery-photos .photo-thumbnails {display: inline-flex; flex-flow:row nowrap ; width: auto;}
.gallery-photos .photo-thumbnails .thumbnail {float: left; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; width: 5vw; height: 5vw;
cursor: pointer; padding: 0.1vw; border: 0.1vw solid skyblue; margin-left: 3.33333%; margin-bottom: 6px; opacity: 0.6; }
.gallery-photos .photo-thumbnails .thumbnail.current {opacity: 1; background-color: green;}
.gallery-photos .photo-thumbnails .thumbnail .thumbnail-inner { height: 100%; overflow: hidden;}
.gallery-photos .photo-thumbnails .thumbnail img { display: block; width: auto; max-height: 100%;
margin: 0 auto;}
</style>
<script>
$(document).ready(function(){
$(".photo-thumbnails .thumbnail").click(function() {
$('.photo-thumbnail .thumbnail').removeClass('current');
$(this).addClass('current');
var path = $(this).find('img').attr('src');
$('#big-photo img').attr('src', path);
});
})
</script>
<section class="gallery">
<h4>Gallery title here</h4>
<div>
<img src="../images/17.jpg" alt="">
<img src="../images/18.jpg" alt="">
<img src="../images/19.jpg" alt="">
<img src="../images/20.jpg" alt="">
<img src="../images/21.jpg" alt="">
<img src="../images/22.jpg" alt="">
<img src="../images/23.jpg" alt="">
<img src="../images/24.jpg" alt="">
<img src="../images/25.jpg" alt="">
</div>
</section>
<style>
.gallery > div {columns:5; gap:1vw; padding-top:1.25vw; }
.gallery img { display:block; width:100%; margin-bottom:1.25vw; }
@media (max-width:48vw) {
.gallery > div { columns:2;}
}
@media (max-width:32vw) {
.gallery > div { columns:1;}
}
</style>
Gap between images with value of 1vw
Row height with value of 10vw and column width with value of 15vw
<div class="gg-container">
<h3>Default format</h3>
<div class="gg-box">
<img src="../images/1.jpg">
<img src="../images/1a.jpg">
<img src="../images/1S.jpg">
<img src="../images/2.jpg">
<img src="../images/2a.jpg">
<img src="../images/2S.jpg">
<img src="../images/3.jpg">
<img src="../images/3a.jpg">
<img src="../images/3aa.jpg">
<img src="../images/3s.jpg">
<img src="../images/4.jpg">
<img src="../images/4a.jpg">
<img src="../images/4aa.jpg">
<img src="../images/4s.jpg">
</div>
<h3>Horizontal layout format</h3>
<div class="gg-box dark" id="horizontal">
<img src="../images/7a.jpg">
<img src="../images/7aa.jpg">
<img src="../images/8.jpg">
<img src="../images/8a.jpg">
<img src="../images/9.jpg">
<img src="../images/9a.jpg">
</div>
<h3>Square layout format</h3>
<div class="gg-box dark" id="square">
<img src="../images/9.jpg">
<img src="../images/9a.jpg">
<img src="../images/10.jpg">
<img src="../images/10a.jpg">
<img src="../images/11.jpg">
<img src="../images/11a.jpg">
<img src="../images/12.jpg">
<img src="../images/12a.jpg">
</div>
<h3>Customized Gap</h3>
<p>Gap between images with value of 1vw</p>
<div class="gg-box" id="gap">
<img src="../images/13a.jpg">
<img src="../images/14a.jpg">
<img src="../images/17.jpg">
<img src="../images/18.jpg">
<img src="../images/19.jpg">
<img src="../images/20.jpg">
</div>
<h3>Row Height and Column Width</h3>
<p>Row height with value of 10vw and column width with value of 15vw</p>
<div class="gg-box dark" id="heightWidth">
<img src="../images/21.jpg">
<img src="../images/22.jpg">
<img src="../images/23.jpg">
<img src="../images/24.jpg">
<img src="../images/25.jpg">
<img src="../images/26.jpg">
</div>
</div>
<style>
.gg-container { --main-color: #000; --secondary-color: #111; --txt-color: #fff; --img-bg-color: rgba(240, 240, 240, 0.9); --backdrop-color: rgba(240, 240, 240, 0.9); --gap-length: 2px; --row-height: 200px;
--column-width: 220px;}
.gg-container *[data-theme="dark"] { --main-color: #ddd; --secondary-color: #eee; --txt-color: #111; --img-bg-color: rgba(20, 20, 20, 0.9); --backdrop-color: rgba(30, 30, 30, 0.9); }
.gg-box {display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--column-width), 1fr)); grid-auto-rows: var(--row-height); grid-gap: var(--gap-length); margin: 1vw 0; }
.gg-box img {object-fit: cover; cursor: pointer; width: 100%; height: 100%; background: var(--img-bg-color);}
.gg-box img:hover {opacity: 0.98;}
#gap{gap: 1vw;}
.gg-box .dark{width: 15vw; height: 10vw;}
#gg-screen { position: fixed; width: 100%; height: 100%; top: 0; left: 0; background: var(--backdrop-color); z-index: 9999; text-align: center; }
#gg-screen .gg-image {height: 100%; display: inline-flex; justify-content: center; align-items: center;}
#gg-screen .gg-image img {max-width: 100%; max-height: 100%; margin: 0 auto;}
.gg-btn {width: 35px; height: 35px; background: var(--main-color); color: var(--txt-color); text-align: center; line-height: 35px; cursor: pointer; -moz-transition: all 0.4s ease; -o-transition: all 0.4s ease;
-webkit-transition: all 0.4s ease; transition: all 0.4s ease; font-size: 20px; box-sizing: border-box; padding-left: 2px; position: fixed;
bottom: 10px;}
.gg-btn:hover { background: var(--secondary-color); }
.gg-close {top: 10px;}
.gg-close, .gg-next { right: 10px;}
.gg-prev {right: 50px;}
.gg-prev,.gg-next {bottom: 10px;}
@media (min-width: 478px) {
.gg-box img:nth-child(2n):not(:last-of-type) {grid-row-end: span 2;}
[data-layout="horizontal"] img:nth-child(2n):not(:last-of-type) {grid-column-end: span 2; grid-row-end: span 1;}
[data-layout="square"] img:nth-child(2n):not(:last-of-type) {grid-row-end: span 1;grid-column-end: span 1;}
}
@media (max-width: 768px) {
.gg-box {grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); grid-auto-rows: calc(var(--row-height) - 15vh); margin: 10px 0;}
}
@media (max-width: 450px) {
.gg-box {grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));}
}
</style>
<script>
const root = document.querySelector("body, html");
const container = document.querySelector('.gg-container');
const images = document.querySelectorAll(".gg-box > img");
const l = images.length;
for(var i = 0; i < l; i++) {
images[i].addEventListener("click", function(i) {
var currentImg = this;
const parentItem = currentImg.parentElement, screenItem = document.createElement('div');
screenItem.id = "gg-screen";
container.prepend(screenItem);
if (parentItem.hasAttribute('data-theme')) screenItem.setAttribute("data-theme", "dark");
var route = currentImg.src;
root.style.overflow = 'hidden';
screenItem.innerHTML = '<div class="gg-image"></div><div class="gg-close gg-btn">×</div><div class="gg-next gg-btn">→</div><div class="gg-prev gg-btn">←</div>';
const first = images[0].src, last = images[l-1].src;
const imgItem = document.querySelector(".gg-image"), prevBtn = document.querySelector(".gg-prev"), nextBtn = document.querySelector(".gg-next"), close = document.querySelector(".gg-close");
imgItem.innerHTML = '<img src="' + route + '">';
if (l > 1) {
if (route == first) {
prevBtn.hidden = true;
var prevImg = false;
var nextImg = currentImg.nextElementSibling;
}
else if (route == last) {
nextBtn.hidden = true;
var nextImg = false;
var prevImg = currentImg.previousElementSibling;
}
else {
var prevImg = currentImg.previousElementSibling;
var nextImg = currentImg.nextElementSibling;
}
}
else {
prevBtn.hidden = true;
nextBtn.hidden = true;
}
screenItem.addEventListener("click", function(e) {
if (e.target == this || e.target == close) hide();
});
root.addEventListener("keydown", function(e) {
if (e.keyCode == 37 || e.keyCode == 38) prev();
if (e.keyCode == 39 || e.keyCode == 40) next();
if (e.keyCode == 27 ) hide();
});
prevBtn.addEventListener("click", prev);
nextBtn.addEventListener("click", next);
function prev() {
prevImg = currentImg.previousElementSibling;
imgItem.innerHTML = '<img src="' + prevImg.src + '">';
currentImg = currentImg.previousElementSibling;
var mainImg = document.querySelector(".gg-image > img").src;
nextBtn.hidden = false;
prevBtn.hidden = mainImg === first;
};
function next() {
nextImg = currentImg.nextElementSibling;
imgItem.innerHTML = '<img src="' + nextImg.src + '">';
currentImg = currentImg.nextElementSibling;
var mainImg = document.querySelector(".gg-image > img").src;
prevBtn.hidden = false;
nextBtn.hidden = mainImg === last;
};
function hide() {
root.style.overflow = 'auto';
screenItem.remove();
};
});
}
</script>
<div class="demos">
<div class="demo__help">
<a>Choose a photo</a>
</div>
<div class="demo__gallery">
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
<div class="demo__placeholder"></div>
</div>
</div>
<style>
.demos{display: flex; width: 90vw; height: 100vh; align-items: center; justify-content: center; flex-direction: column; background: linear-gradient(60deg, #5b5893, #2c2a49);}
.demo__gallery {width: 688px; height: 460px; padding: 2px; flex-shrink: 0; background: #eee; perspective: 700px; border-radius: 5px;}
.demo__placeholder { width: 110px; height: 110px; margin: 2px; float: left; background-color: lightslategrey; border-radius: 5px;}
.demo__part {position: relative; float: left; width: 110px; height: 110px; margin: 2px; transform: rotateY(180deg); transform-style: preserve-3d; transition: all 0.3s ease-in-out;}
.demo__part:hover .demo__part-front {box-shadow: 0 0 10px black; transform: scale(0.96);}
.demo__part:hover .demo__part-front:after {opacity: 0;}
.demo__part-front, .demo__part-back {position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; -webkit-backface-visibility: hidden; backface-visibility: hidden; border-radius: 5px;
cursor: pointer;}
.demo__part-front {background-color: lightslategrey; background-size: cover; background-position: center; transform: rotateX(0deg); transition: all 0.2s ease;}
.demo__part-front:after {position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: black; content: ""; opacity: 0.5; transition: all 0.2s ease; }
.demo__part-back {transform: rotateY(180deg) rotateX(0deg);}
.demo__part-back-inner {width: 680px; height: 452px; background-image: url(../images/1.jpg); background-size: cover; background-position: center;-webkit-backface-visibility: hidden;
backface-visibility: hidden;}
.demo__help { margin-bottom: 7px; font-size: 30px; font-family: "Yanone Kaffeesatz", sans-serif; color: white;}
.demo__help a {color: white;}
.demo__help a:hover {color: #e39999;}
.demo__part-1-1 .demo__part-back-inner {transform: translate(0px, 0px);}
.demo__part-1-2 .demo__part-back-inner {transform: translate(-114px, 0px);}
.demo__part-1-3 .demo__part-back-inner {transform: translate(-228px, 0px);}
.demo__part-1-4 .demo__part-back-inner {transform: translate(-342px, 0px);}
.demo__part-1-5 .demo__part-back-inner {transform: translate(-456px, 0px);}
.demo__part-1-6 .demo__part-back-inner {transform: translate(-570px, 0px);}
.demo__part-2-1 .demo__part-back-inner {transform: translate(0px, -114px);}
.demo__part-2-2 .demo__part-back-inner {transform: translate(-114px, -114px);}
.demo__part-2-3 .demo__part-back-inner {transform: translate(-228px, -114px);}
.demo__part-2-4 .demo__part-back-inner {transform: translate(-342px, -114px);}
.demo__part-2-5 .demo__part-back-inner {transform: translate(-456px, -114px);}
.demo__part-2-6 .demo__part-back-inner {transform: translate(-570px, -114px);}
.demo__part-3-1 .demo__part-back-inner {transform: translate(0px, -228px);}
.demo__part-3-2 .demo__part-back-inner {transform: translate(-114px, -228px);}
.demo__part-3-3 .demo__part-back-inner {transform: translate(-228px, -228px);}
.demo__part-3-4 .demo__part-back-inner {transform: translate(-342px, -228px);}
.demo__part-3-5 .demo__part-back-inner {transform: translate(-456px, -228px);}
.demo__part-3-6 .demo__part-back-inner {transform: translate(-570px, -228px);}
.demo__part-4-1 .demo__part-back-inner {transform: translate(0px, -342px);}
.demo__part-4-2 .demo__part-back-inner {transform: translate(-114px, -342px);}
.demo__part-4-3 .demo__part-back-inner {transform: translate(-228px, -342px);}
.demo__part-4-4 .demo__part-back-inner {transform: translate(-342px, -342px);}
.demo__part-4-5 .demo__part-back-inner {transform: translate(-456px, -342px);}
.demo__part-4-6 .demo__part-back-inner {transform: translate(-570px, -342px);}
.show-front {transform: none;}
</style>
<script>
"use strict";
$(document).ready(function() {
var rows = 4; //change this also in css
var cols = 6; //change this also in css
var staggerTime = 150;
var urls = [
"../images/1.jpg",
"../images/2.jpg",
"../images/3.jpg",
"../images/4.jpg",
"../images/5.jpg",
"../images/6.jpg",
"../images/7.jpg",
"../images/8.jpg",
"../images/9.jpg",
"../images/10.jpg",
"../images/11.jpg",
"../images/12.jpg",
"../images/13a.jpg",
"../images/14a.jpg",
"../images/8a.jpg",
"../images/9a.jpg",
"../images/17.jpg",
"../images/18.jpg",
"../images/19.jpg",
"../images/20.jpg",
"../images/21.jpg",
"../images/22.jpg",
"../images/23.jpg",
"../images/24.jpg",
];
var $gallery = $(".demo__gallery");
var $help = $(".demo__help");
var partsArray = [];
var reqAnimFr = (function() {
return window.requestAnimationFrame || function(cb) {
setTimeout(cb, 1000 / 60);
}
})();
$gallery.html('');
for (let row = 1; row <= rows; row++) {
partsArray[row - 1] = [];
for (let col = 1; col <= cols; col++) {
$gallery.append(`<div class="show-front demo__part demo__part-${row}-${col}" row="${row}" col="${col}"><div class="demo__part-back"><div class="demo__part-back-inner"></div></div><
div class="demo__part-front"></div></div>`);
partsArray[row - 1][col - 1] = new Part();
}
}
var $parts = $(".demo__part");
var $image = $(".demo__part-back-inner");
var help = true;
for (let i = 0; i < $parts.length; i++) {
$parts.find(".demo__part-front").eq(i).css("background-image", `url(${urls[i]})`);
}
$gallery.on("click", ".demo__part-front", function() {
$image.css("background-image", $(this).css("background-image"));
if (help) {
$help.html("Click any of the tiles to get back");
help = false;
}
let row = +$(this).closest(".demo__part").attr("row");
let col = +$(this).closest(".demo__part").attr("col");
waveChange(row, col);
});
$gallery.on("click", ".demo__part-back", function() {
if (!isShowingBack()) return;
for (let row = 1; row <= rows; row++) {
for (let col = 1; col <= cols; col++) {
partsArray[row - 1][col - 1].showing = "front";
}
}
}, staggerTime + $parts.length * staggerTime / 10);
showFront(0, $parts.length);
});
function showFront(i, maxI) {
if (i >= maxI) return;
$parts.eq(i).addClass("show-front");
reqAnimFr(function() {
showFront(i + 1);
});
}
function isShowingBack() {
return partsArray[0][0].showing == "back" && partsArray[0][cols - 1].showing == "back" && partsArray[rows - 1][0].showing == "back" && partsArray[rows - 1][cols - 1].showing == "back";
}
function Part() {
this.showing = "front";
}
function waveChange(rowN, colN) {
if (rowN > rows || colN > cols || rowN <= 0 || colN <= 0) return;
if (partsArray[rowN - 1][colN - 1].showing == "back") return;
$(".demo__part-" + rowN + "-" + colN).removeClass("show-front");
partsArray[rowN - 1][colN - 1].showing = "back";
setTimeout(function() {
waveChange(rowN + 1, colN);
waveChange(rowN - 1, colN);
waveChange(rowN, colN + 1);
waveChange(rowN, colN - 1);
}, staggerTime);
}
});
</script>








<div class="gallery_X">
<div class="img-w">
<img src="../images/1a.jpg" alt="" />
</div>
<div class="img-w"><img src="../images/9a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/2a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/3a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/4a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/5a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/6a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/7a.jpg" alt="" /></div>
<div class="img-w"><img src="../images/8a.jpg"alt="" /></div>
</div>
<style>
.gallery_X {width: 600px; margin: auto; border-radius: 3px; overflow: hidden;}
.img-c {width: 200px; height: 200px; float: left; position: relative; overflow: hidden;}
.img-w { position: absolute; width: 100%; height: 100%; background-size: cover; background-position: center; cursor: pointer; transition: transform ease-in-out 300ms;}
.img-w img {display: none;}
.img-c {transition: width ease 400ms, height ease 350ms, left cubic-bezier(0.4, 0, 0.2, 1) 420ms, top cubic-bezier(0.4, 0, 0.2, 1) 420ms;}
.img-c:hover .img-w {transform: scale(1.08); transition: transform cubic-bezier(0.4, 0, 0.2, 1) 450ms;}
.img-c.active { width: 100% !important; height: 100% !important; position: absolute; z-index: 2; }
.img-c.postactive { position: absolute; z-index: 2; pointer-events: none;}
.img-c.active.positioned {left: 0 !important; top: 100 !important; transition-delay: 50ms;}
</style>
<script>
$(function() {
$(".img-w").each(function() {
$(this).wrap("<div class='img-c'></div>")
let imgSrc = $(this).find("img").attr("src");
$(this).css('background-image', 'url(' + imgSrc + ')');
})
$(".img-c").click(function() {
let w = $(this).outerWidth()
let h = $(this).outerHeight()
let x = $(this).offset().left
let y = $(this).offset().top
$(".active").not($(this)).remove()
let copy = $(this).clone();
copy.insertAfter($(this)).height(h).width(w).delay(500).addClass("active")
$(".active").css('top', y - 8);
$(".active").css('left', x - 8);
setTimeout(function() {
copy.addClass("positioned")
}, 0)
})
})
$(document).on("click", ".img-c.active", function() {
let copy = $(this)
copy.removeClass("positioned active").addClass("postactive")
setTimeout(function() {
copy.remove();
}, 500)
})
</script>