Quick tip: using modulo to re-start loops without the need of an if statement
Thursday, September 29th, 2016A few days ago Jake Archibald posted a JSBin example of five ways to center vertically in CSS to stop the meme of “CSS is too hard and useless”. What I found really interesting in this example is how he animated showing the different examples (this being a CSS demo, I’d probably would’ve done a CSS animation and delays, but he wanted to support OldIE, hence the use of className
instead of classList
):
var els = document.querySelectorAll('p'); var showing = 0; setInterval(function() { // this is easier with classlist, but meh: els[showing].className = els[showing].className.replace(' active', ''); showing = (showing + 1) % 5; els[showing].className += ' active'; }, 4000); |
The interesting part to me here is the showing = (showing + 1) % 5;
line. This means that if showing is 4 showing becomes 0, thus starting the looping demo back from the first example. This is the remainder operator of JavaScript, giving you the remaining value of dividing the first value with the second. So, in the case of 4 + 1 % 5
, this is zero.
Whenever I used to write something like this, I’d do an if statement, like:
showing++; if (showing === 5) { showing = 0; } |
Using the remainder seems cleaner, especially when instead of the hard-coded 5, you’d just use the length
of the element collection.
var els = document.querySelectorAll('p'); var all = els.length; var c = 'active'; var showing = 0; setInterval(function() { els[showing].classList.remove(c); showing = (showing + 1) % all; els[showing].classList.add(c); }, 4000); |
A neat little trick to keep in mind.