JavaScript 30

I took the JavaScript 30 Day Challenge by @wesbos.
I encourage you to grab the course at https://JavaScript30.com.
Wes writes some of the best tutorials whether you’re just learning or looking for a refresh.

Since I deviated a bit from the course material, I decided to post my solutions as alternatives.
Each of my solutions have been added in my github with file name index-ARIOS.html.
I welcome PRs or suggestions. Sharing is caring, afterall.
Enjoy and follow me on Twitter! @stpColabr8nLstn


Day One - JavaScript Drum Kit

View codepen (sans sound)

The only major deviation here is that I opted to use keyup rather than listening for the end of transform.

Original Solution:

  function removeTransition(e) {
    if (e.propertyName !== 'transform') return;
    e.target.classList.remove('playing');
  }

  const keys = Array.from(document.querySelectorAll('.key'));
  keys.forEach(key => key.addEventListener('transitionend', removeTransition));

My Solution:

  function endSound (e) {
    const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
    if(!key) return;
    key.classList.remove('playing');
  }

  window.addEventListener('keyup', endSound);

Day Two - JS + CSS Clock

View codepen

For today I played with a couple of ideas because some of the lines appear redundant, save for the time unit specified. In the end I couldn’t really come up with a solid way to minimize the code much further. Any way I see it, you gotta have three different lines for each one.

However, I did add a function to calculate the degrees based on the time unit. Memory-wise it’s less efficient but I think it looks cleaner and I LOVE clean code. In my experience it’s best to use a function in this case, mostly to minimize human error. I recognize this is a small scale project and it’d be easy to spot the error but in general I find it’s good practice, so why bend the rules, ya know?

Original Solution:

  const secondsDegrees = ((seconds / 60) * 360) + 90;
  const minsDegrees = ((mins / 60) * 360) + ((seconds/60)*6) + 90;
  const hourDegrees = ((hour / 12) * 360) + ((mins/60)*30) + 90;

My Solution:

  function calcDegree (unit, totalUnits) {
    return ((unit / totalUnits) * 360) + 90
  }

  // Then call function in setClock
  const secDeg = calcDegree(sec, 60)
  const minDeg = calcDegree(min, 60)
  const hrDeg = calcDegree(hour, 12)

Speaking of OCDs… you might also notice that I separated my files. I’m all about the separation of powers. Same goes for code functions. So you’ll see I have added a script.js file for the glorious JavaScript and style.css for the lovely style.


Day Three - CSS Variables

View codepen

I have never used CSS variables. Sad but true. So today was a fun one! I didn’t get too wacky about finding an alternate solution but I did “enhance” the page a bit. I added a new image of my gorgeous dog (because who wouldn’t want to see him?), changed the base to purple (it matches my terminal) and added some toggles for border-radius and width.

Original Solution:

  :root {
    --base: #ffc600;
    --spacing: 10px;
    --blur: 10px;
  }

  img {
    padding: var(--spacing);
    background: var(--base);
    filter: blur(var(--blur));
  }

My Solution:

  :root {
    --base: #800fff;
    --spacing: 10px;
    --blur: 10px;
    --width: 100px;
    --border: 5px;
  }

  img {
    padding: var(--spacing);
    background: var(--base);
    filter: blur(var(--blur));
    width: var(--width);
    border-radius: var(--border);
  }

As mentioned yesterday I’ve started dividing my files up so you’ll notice that today, as well.


Day Four - Array Cardio Day 1

This is a great way to flex your JavaScript muscles!

I use these methods pretty regularly and really enjoyed the format of today’s tutorial. Today I opted to approach the #7 slightly differently:

Original Solution:

    const alpha = people.sort((lastOne, nextOne) => {
      const [aLast, aFirst] = lastOne.split(', ');
      const [bLast, bFirst] = nextOne.split(', ');
      return aLast > bLast ? 1 : -1;
    });
    console.log(alpha);

My Solution:

    const alphaPple = people.sort((a, b) => {
      const aLast = a.split(', ')[0];
      const bLast = b.split(', ')[0];
      return aLast < bLast ? 1 : -1;
    })
    console.log(alphaPple);

Since we’re not using the first name I didn’t even bother pulling it out of the split array. You could even abstract it further and just do:

    const alphaPple = people.sort((a, b) => {
      return a.split(', ')[0] > b.split(', ')[0] ? 1 : -1;
    })
    console.log(alphaPple);

But this is just unreadable and would make me shake an angry fist.


Day Five - Flex Panel Gallery

This was a great intro to utilizing flex. JavaScript was super minimal today so I didn’t see room for any major additions. As a bonus I just signed up for the What the Flexbox?! class because I want to know more of the flex things!