Working with toggles, cat photos, and classList
I’ve had a bit of success implementing a button that toggles the automatic switching of images, and I’ve added the ability to click on a photo to feature it. Just five days left until I hit 100 days straight of these types of posts. I’m going to try and take a bit more time to sort out what I do for the remaining five days.
View the code:
HTML and JS
<div class="code-block">
<div class="photo-grid">
<figure class="grid-photo featured">
<img class="loading-indicator no-js" src='data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 2" stroke="currentColor" stroke-dasharray="1,0.5"><path d="M1,1 5,1" /></svg>' data-src='data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 2" stroke="currentColor" stroke-dasharray="1,0.5"><path d="M1,1 5,1" /></svg>' alt="Cute kitten" >
<noscript>
<img src="https://placekitten.com/600/600?image=1" alt="Cute kittens" >
</noscript>
<figcaption>adorable</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=2" alt="Cute kittens" >
<figcaption>cute as a button</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=3" alt="Cute kitten in snow" >
<figcaption>kitten playing in snow</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=4" alt="Cute kitten by door" >
<figcaption>letting itself in</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=5" alt="Cute kitten in a hand" >
<figcaption>adorable kitten in hand</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=6" alt="Cute kitten" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=7" alt="Cute kittens" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=8" alt="Cute kitten in snow" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=9" alt="Cute kitten by door" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=10" alt="Cute kitten in a hand" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=11" alt="Cute kitten" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=2" alt="Cute kittens" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=4" alt="Cute kitten in snow" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=6" alt="Cute kitten by door" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=8" alt="Cute kitten in a hand" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=10" alt="Cute kitten with cute face" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=2" alt="Cute kitten" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=1" alt="Cute kittens" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=7" alt="Cute kitten in snow" >
<figcaption>look at the cat(s)</figcaption>
</figure>
<figure class="grid-photo">
<img src="https://placekitten.com/600/600?image=8" alt="Cute kitten in a hand" >
<figcaption>look at the cat(s)</figcaption>
</figure>
</div>
<button id="switch-controls">Turn ON automatic switching of images</button>
</div>
<script>
// ---------
// Variables
// ---------
let gridPhotos = [];
/* Functions */
function randomNum(minnum, maxnum) {
min = Math.ceil(minnum);
max = Math.floor(maxnum);
return Math.floor(Math.random() * (maxnum - minnum) + minnum);
}
// ---------
// Events
// ---------
window.onload = function () {
const slideshowButton = document.getElementById('switch-controls');
let gridPhotos = document.querySelectorAll('.grid-photo');
let updateState = false;
console.log(gridPhotos)
function initialPhoto() {
const initialFigure = document.getElementById(`grid-photo-${randomNum(1, gridPhotos.length)}`);
const figFeatured = document.querySelector('.featured');
figFeatured.innerHTML = initialFigure.innerHTML;
const imgFeatured = document.querySelector('.featured img');
imgFeatured.setAttribute('style','animation: featured 1s backwards;')
}
function updatePhoto() {
if(updateState){
const newFeaturedFigure = document.getElementById(`grid-photo-${randomNum(1, gridPhotos.length)}`);
const figFeatured = document.querySelector('.featured');
figFeatured.innerHTML = newFeaturedFigure.innerHTML;
const imgFeatured = document.querySelector('.featured img');
imgFeatured.setAttribute('style','animation: featured 1s backwards;')
}
}
for (let i = 0; i < gridPhotos.length; i++) {
gridPhotos[i].setAttribute('id',`grid-photo-${[i]}`);
document.querySelector(`#grid-photo-${[i]}`).addEventListener('click', setPhoto);
}
function setPhoto() {
let prevSelectedFigure = document.querySelector('.chosen-photo');
if(prevSelectedFigure) {
console.log('Change selection');
prevSelectedFigure.classList.remove('chosen-photo');
console.log('Did it work?' + prevSelectedFigure.outerHTML);
}
let selectedFigure = this;
console.log(selectedFigure);
let selectedFigureClasses = selectedFigure.classList;
selectedFigure.classList.add('selected-feature');
console.log(selectedFigureClasses);
selectedFigureImg = document.querySelector('.selected-feature img');
selectedFigureImg.classList.add('chosen-photo');
console.log(selectedFigureImg);
const newFeaturedFigure = this;
const figFeatured = document.querySelector('.featured');
figFeatured.innerHTML = newFeaturedFigure.innerHTML;
const imgFeatured = document.querySelector('.featured img');
imgFeatured.setAttribute('style','animation: featured 1s backwards;')
updateState = false;
}
function updateButton() {
if(updateState) {
updateState = false;
slideshowButton.textContent = "Turn ON automatic switching of images.";
} else {
updateState = true;
slideshowButton.textContent = "Turn OFF automatic switching of images.";
}
}
let featured = '';
initialPhoto();
window.setInterval(updatePhoto, 5*1000);
slideshowButton.addEventListener('click', updateButton);
}
</script>
CSS
@supports (display: grid) {
.photo-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(5, 1fr);
max-width: 800px;
max-height: 800px;
grid-gap: 1rem;
gap: 1rem;
margin: 1rem auto;
overflow: hidden;
}
.photo-grid > * {
box-shadow: inset 0 0 1px black;
}
.photo-grid figure {
margin: 0;
padding: 0;
display: grid;
grid-template-rows: 1fr;
grid-template-columns: 1fr;
place-items: center;
transition: all .125s ease-out;
}
.photo-grid figure > img {
width: 100%;
height: auto;
grid-column: 1 / 2;
grid-row: 1 / 2;
transition: transform .25s ease-out, clip-path .25s ease-out;
}
.photo-grid figure > figcaption {
grid-column: 1 / 2;
grid-row: 1 / 2;
padding: .5rem;
align-self: flex-end;
color: transparent;
transition: color 1s ease-out;
text-align: center;
}
.photo-grid figure:hover > figcaption {
color: black;
}
@keyframes featured {
from {opacity: 0;}
to {opacity: 1;}
}
@keyframes flash {
to {
opacity: 0;
}
}
.loading-indicator {
animation: flash 0.75s linear infinite;
}
.featured {
animation-name: featured;
animation-duration: .5s;
animation-iteration-count: 1;
animation-timing-function: ease-out;
grid-column: 2 / span 3;
grid-row: 2 / span 3;
}
.chosen-photo {
opacity: .75;
}
button {display: block; margin: 1rem auto; padding: 1rem;}
}