diff --git a/video-9/index.html b/video-9/index.html new file mode 100644 index 0000000..0037907 --- /dev/null +++ b/video-9/index.html @@ -0,0 +1,69 @@ + + + + + + Memory Game + + + + +
+
+ Aurelia + JS Badge +
+
+ Aurelia + JS Badge +
+ +
+ Vue + JS Badge +
+
+ Vue + JS Badge +
+ +
+ Angular + JS Badge +
+
+ Angular + JS Badge +
+ +
+ Ember + JS Badge +
+
+ Ember + JS Badge +
+ +
+ Backbone + JS Badge +
+
+ Backbone + JS Badge +
+ +
+ React + JS Badge +
+
+ React + JS Badge +
+
+ + + + diff --git a/video-9/scripts.js b/video-9/scripts.js new file mode 100644 index 0000000..e82d0e5 --- /dev/null +++ b/video-9/scripts.js @@ -0,0 +1,48 @@ +const cards = document.querySelectorAll('.memory-card'); + +let hasFlippedCard = false; +let lockBoard = false; +let firstCard, secondCard; + +function flipCard() { + if (lockBoard) return; + this.classList.add('flip'); + + if (!hasFlippedCard) { + // first click + hasFlippedCard = true; + firstCard = this; + + return; + } + + // second click + hasFlippedCard = false; + secondCard = this; + lockBoard = true; + + checkForMatch(); +} + +function checkForMatch() { + let isMatch = firstCard.dataset.framework === secondCard.dataset.framework; + isMatch ? disableCards() : unflipCards(); +} + +function disableCards() { + firstCard.removeEventListener('click', flipCard); + secondCard.removeEventListener('click', flipCard); + + lockBoard = false; +} + +function unflipCards() { + setTimeout(() => { + firstCard.classList.remove('flip'); + secondCard.classList.remove('flip'); + + lockBoard = false; + }, 1500); +} + +cards.forEach(card => card.addEventListener('click', flipCard)); diff --git a/video-9/styles.css b/video-9/styles.css new file mode 100644 index 0000000..5c73946 --- /dev/null +++ b/video-9/styles.css @@ -0,0 +1,55 @@ +* { + padding: 0; + margin: 0; + box-sizing: border-box; +} + +body { + height: 100vh; + display: flex; + background: #060AB2; +} + +.memory-game { + width: 640px; + height: 640px; + margin: auto; + display: flex; + flex-wrap: wrap; + perspective: 1000px; +} + +.memory-card { + width: calc(25% - 10px); + height: calc(33.333% - 10px); + margin: 5px; + position: relative; + transform: scale(1); + transform-style: preserve-3d; + transition: transform .5s; + box-shadow: 1px 1px 1px rgba(0,0,0,.3); +} + +.memory-card:active { + transform: scale(0.97); + transition: transform .2s; +} + +.memory-card.flip { + transform: rotateY(180deg); +} + +.front-face, +.back-face { + width: 100%; + height: 100%; + padding: 20px; + position: absolute; + border-radius: 5px; + background: #1C7CCC; + backface-visibility: hidden; +} + +.front-face { + transform: rotateY(180deg); +}