JSFiddle - React, Tailwind, and code Playground
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>Memory Game</title>
<meta name="description" content="">
<link rel="stylesheet prefetch" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css">
<link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Coda">
<link rel="stylesheet" href="css/app.css">
</head>
<body>
<div class="container">
<header>
<h1>Memory Game</h1>
</header>
<section class="score-panel">
<ul class="stars">
<li><i class="fa fa-star"></i></li>
<li><i class="fa fa-star"></i></li>
<li><i class="fa fa-star"></i></li>
</ul>
<span class="moves">0</span> Moves
<div id="timer">00:00:00</div>
<div class="restart">
<button type="button" class="btn btn-info btn-sm">
<i class="fa fa-repeat"></i>
</button>
</div>
</section>
<ul class="deck">
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-paper-plane-o"></i>
</li>
<li class="card">
<i class="fa fa-anchor"></i>
</li>
<li class="card">
<i class="fa fa-bolt"></i>
</li>
<li class="card">
<i class="fa fa-cube"></i>
</li>
<li class="card">
<i class="fa fa-anchor"></i>
</li>
<li class="card">
<i class="fa fa-leaf"></i>
</li>
<li class="card">
<i class="fa fa-bicycle"></i>
</li>
<li class="card">
<i class="fa fa-diamond"></i>
</li>
<li class="card">
<i class="fa fa-bomb"></i>
</li>
<li class="card">
...
CSS
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
html,
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
body {
font-family: 'Coda', cursive;
}
.container {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
h1 {
font-family: 'Open Sans', sans-serif;
font-weight: 300;
margin-bottom: 20px;
}
/*
* Styles for the deck of cards
*/
.deck {
width: 660px;
min-height: 680px;
background: linear-gradient(160deg, #ddbf4f 0%, #d33a32 100%);
padding: 32px;
border-radius: 10px;
box-shadow: 12px 15px 20px 0 rgba(46, 61, 73, 0.65);
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
margin: 0 0 3em;
z-index: 2;
pointer-events: inherit;
}
.deck .card {
height: 125px;
width: 125px;
background: #2e3d49;
font-size: 0;
color: #ffffff;
border-radius: 8px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
box-shadow: 5px 2px 20px 0 rgba(46, 61, 73, 0.65);
pointer-events: inherit;
}
.deck .card.open {
transform: rotateY(180deg);
transition: 0.3s;
background: #2f91f9;
cursor: default;
pointer-events: none;
}
.deck .card.close {
transform: rotateY(360deg);
transition: 0.2s;
transform-style: preserve-3d;
background: #2e3d49;
}
.deck .card.show {
font-size: 33px;
}
.deck .card.match {
cursor: default;
background: #1bc45f;
font-size: 33px;
}
/*
* Styles for the Score Panel
*/
.score-panel {
text-align: left;
width: 345px;
margin-bottom: 10px;
z-index: 2;
}
.score-panel .stars {
margin: 0;
padding: 0;
display: inline-block;
margin: 0 5px 0 0;
}
.score-panel .stars li {
list-style: none;
display: inline-block;
color: #3572a8;
}
.score-panel .restart {
float: right;
cursor:...
JavaScript
let card1 = ''; // The former
let card2 = ''; // The latter
let card1Parent = '';
let card2Parent = '';
let ready = true;
let stopTimer = false;
let cardCounter = 0;
document.querySelector(".restart").addEventListener("click", restart);
document.querySelector(".deck").addEventListener("click", function() {stopTimer = false; timerStart()});
document.querySelector(".deck").addEventListener("click", cardOpen);
document.querySelector(".playAgain").addEventListener("click", function() {
document.querySelector(".winPage").className = "winPage closed"; restart()});
// Unlocking clicked cards and comparing them
function cardOpen(evt) {
if (evt.target.className == "card" && cardCounter != 2) {
evt.target.className += " open show";
// Determines which card comes first in a unlocked pair of cards
if (card1 == false) {
card1 = evt.target.firstElementChild.className;
card1Parent = evt.target;
cardCounter = 1;
} else {
// Increasing the amount of moves
document.querySelector(".moves").innerText = +document.querySelector(".moves").innerText + 1;
// Rating system. Stars decrease depending on how many moves you've made
if (document.querySelector(".moves").innerText == '16' || document.querySelector(".moves").innerText == '22') {
document.querySelector(".fa-star").parentNode.removeChild(document.querySelector(".fa-star"));
}
card2 = evt.target.firstElementChild.className;
card2Parent = evt.target;
cardCounter = 2;
// Card matching
if (card1 == card2) {
card1Parent.className = "card open show match";
card2Parent.className = "card open show match";
card1 = '';
card2 = '';
cardCounter = 0;
win();
} else {
setTimeout(function () {
evt.target.className = "card close"; card1Parent.className = "card close"}, 700);
setTimeout(function () {
evt.target.className = "card";...