From bd61c6726b2674b7bdc97a92620a7f560fe2376a Mon Sep 17 00:00:00 2001 From: rzen Date: Mon, 7 Sep 2020 12:49:16 -0400 Subject: [PATCH] finalize gallery feature --- _includes/gallery.html | 2 +- _sass/_isabelline.scss | 28 +++++++++-------------- assets/js/gallery.js | 51 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/_includes/gallery.html b/_includes/gallery.html index 6c87492..ad35bad 100644 --- a/_includes/gallery.html +++ b/_includes/gallery.html @@ -22,7 +22,7 @@ diff --git a/_sass/_isabelline.scss b/_sass/_isabelline.scss index 0fe38fa..f9e9de8 100644 --- a/_sass/_isabelline.scss +++ b/_sass/_isabelline.scss @@ -159,15 +159,6 @@ header { } } -// div.column { -// width: 30%; -// float: left; -// padding: .5rem; -// margin: .5rem; -// border: 1px solid #ccc; -// } - -// link styling a { color: darken($link-color,15%); &:hover, &:active, &:visited { @@ -253,6 +244,7 @@ main { border-radius: 6px; display: none; transition: all 300ms ease; + will-change: display; } img:first-child { @@ -272,37 +264,37 @@ main { height: 1rem; border-radius: .5rem; transition: all 300ms ease; + background-color: hsl($hue,10,80); &.selected { background-color: hsl($hue,50,40); } } + .play { + float: left; + label { margin: .5rem; - display: inline-block; - box-sizing: border-box; - width: 0; - height: .5rem; - + height: 1rem; cursor: pointer; + border-color: transparent transparent transparent hsl($hue,50,40); // same color as i.selected - border-color: transparent transparent transparent #202020; transition: 300ms all ease; will-change: border-width; // paused state border-style: double; - border-width: 0 0 0 .5rem; + border-width: 0 0 0 1rem; } input[type='checkbox'] { - visibility: hidden; + display: none; &:checked + label { border-style: solid; - border-width: .3rem 0 .3rem .5rem; + border-width: .5rem 0 .5rem 1rem; } } } diff --git a/assets/js/gallery.js b/assets/js/gallery.js index 13bce08..e7bf9a6 100644 --- a/assets/js/gallery.js +++ b/assets/js/gallery.js @@ -1,12 +1,33 @@ (function () { - var galleries = document.getElementsByClassName('gallery'); - + // "hydrate" div.gallery with play/pause and nav behaviors var process_gallery = function (g) { - var images = g.querySelectorAll('.images img'); - var navs = []; // computed below - var gallery_nav = g.querySelector('nav'); - var selected_index = 0; + var + // milliseconds to wait before switch to next slide + NEXT_SLIDE_TIMEOUT = 5000; + var + // images in this gallery + images = g.querySelectorAll('.images img'), + + // container for nav buttons + gallery_nav = g.querySelector('nav'), + + // clickable buttons, one per image + // computed below + navs = [], + + // index of the currently selected image + selected_index = 0, + + // play control consists of a label and a checkbox + // defer computing because nav innerHTML gets clobbered + play_checkbox, + + // handle to setInterval + play_interval; + + // show image at index + // update nav controls accordingly var select_image = function (index) { // var image = images[index]; if (selected_index !== index) { @@ -18,6 +39,7 @@ } } + // show next image var next_image = function () { if (selected_index >= images.length-1) { select_image(0); @@ -26,10 +48,21 @@ } } + // handler for nav buttons + // selects an image corresponding to the clicked nav button var nav_to_image = function () { select_image(Array.from(navs).indexOf(this)); } + // play/pause slideshow + var toggle_play = function () { + if (play_checkbox.checked===true) { + clearInterval(play_interval); + } else { + play_interval = setInterval(next_image, NEXT_SLIDE_TIMEOUT); + } + } + var navHtml = ''; for (var i=0; i