This Gist was generated by Contrived.
Do not modify the metadata file if you want to open in Contrived again. Otherwise, it is safe to delete.
Happy Hacking!
{"user":"5f0c542a4a2ce5e528e01fdf","templateVersion":"1","templateId":"vanillajs","resources":["<meta charset=\"UTF-8\" />","<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">"],"dependencies":[],"files":[{"id":1,"parentId":0,"name":"src","path":"/src","type":"folder","isRoot":true,"selected":false,"expanded":true,"children":[{"id":3,"name":"index.js"},{"id":4,"name":"styles.css"}]},{"id":2,"parentId":0,"name":"index.html","path":"/index.html","type":"file","mimeType":"html","isRoot":true,"open":true,"selected":false,"content":""},{"id":3,"parentId":1,"name":"index.js","path":"/src/index.js","type":"file","mimeType":"js","isRoot":false,"open":true,"selected":true,"content":""},{"id":4,"parentId":1,"name":"styles.css","path":"/src/styles.css","type":"file","mimeType":"css","isRoot":false,"open":true,"selected":false,"content":""}],"experimentId":"5f6c3ba0923a2900174e971c"} |
* { | |
box-sizing: border-box; | |
} | |
body { | |
background-color: #34495e; | |
color: #fff; | |
font-family: Arial, Helvetica, sans-serif; | |
display: flex; | |
flex-direction: column; | |
align-items: center; | |
height: 80vh; | |
margin: 0; | |
overflow: hidden; | |
} | |
h1 { | |
margin: 20px 0 0; | |
} | |
.container { | |
padding: 20px 30px; | |
position: relative; | |
margin: auto; | |
height: 350px; | |
width: 450px; | |
} | |
.figure-container { | |
fill: transparent; | |
stroke: #fff; | |
stroke-width: 4px; | |
stroke-linecap: round; | |
} | |
.figure-part { | |
display: none; | |
} | |
.wrong-letters-container { | |
position: absolute; | |
top: 20px; | |
right: 20px; | |
display: flex; | |
flex-direction: column; | |
text-align: right; | |
} | |
.wrong-letters-container span { | |
font-size: 24px; | |
} | |
.word { | |
display: flex; | |
position: absolute; | |
bottom: 10px; | |
left: 50%; | |
transform: translateX(-50%); | |
} | |
.letter { | |
border-bottom: 3px solid #2980b9; | |
display: inline-flex; | |
font-size: 30px; | |
align-items: center; | |
justify-content: center; | |
margin: 0 3px; | |
height: 50px; | |
width: 20px; | |
} | |
.popup-container { | |
background-color: rgba(0, 0, 0, 0.3); | |
position: fixed; | |
top: 0; | |
bottom: 0; | |
left: 0; | |
right: 0; | |
display: none; | |
align-items: center; | |
justify-content: center; | |
} | |
.popup { | |
background: #2980b9; | |
border-radius: 5px; | |
box-shadow: 0 15px 10px 3px rgba(0, 0, 0, 0.1); | |
padding: 20px; | |
text-align: center; | |
} | |
.popup button { | |
cursor: pointer; | |
background-color: #fff; | |
color: #2980b9; | |
border: 0; | |
margin-top: 20px; | |
padding: 12px 20px; | |
font-size: 16px; | |
} | |
.popup button:active { | |
transform: scale(0.98); | |
} | |
.popup button:focus { | |
outline: 0; | |
} | |
.notification-container { | |
background-color: rgba(0, 0, 0, 0.3); | |
border-radius: 10px 10px 0 0; | |
padding: 15px 20px; | |
position: absolute; | |
bottom: -50px; | |
transition: transform 0.3s ease-in-out; | |
} | |
.notification-container p { | |
margin: 0; | |
} | |
.notification-container.show{ | |
transform: translateY(-50px); | |
} |
<h1>Hangman</h1> | |
<p>Find the hidden word - Enter a letter</p> | |
<div class="container"> | |
<svg height="250" width="200" class="figure-container"> | |
<line x1="60" y1="20" x2="140" y2="20" /> | |
<line x1="140" y1="20" x2="140" y2="50" /> | |
<line x1="60" y1="20" x2="60" y2="230" /> | |
<line x1="20" y1="230" x2="100" y2="230" /> | |
<!-- head --> | |
<circle cx="140" cy="70" r="20" class="figure-part"/> | |
<!-- body --> | |
<line x1="140" y1="90" x2="140" y2="150" class="figure-part"/> | |
<!-- arms --> | |
<line x1="140" y1="120" x2="120" y2="100" class="figure-part"/> | |
<line x1="140" y1="120" x2="160" y2="100" class="figure-part"/> | |
<!-- legs --> | |
<line x1="140" y1="150" x2="120" y2="180" class="figure-part"/> | |
<line x1="140" y1="150" x2="160" y2="180" class="figure-part"/> | |
</svg> | |
<div class="wrong-letters-container"> | |
<div id="wrong-letters"></div> | |
</div> | |
<div class="word" id="word"></div> | |
</div> | |
<div class="popup-container" id="popup-container"> | |
<div class="popup"> | |
<h2 id="final-message"></h2> | |
<button id="play-button">Play Again</button> | |
</div> | |
</div> | |
<div class="notification-container" id="notification-container"> | |
<p>You have already entered this letter</p> | |
</div> |
const wordEl = document.getElementById('word'); | |
const wrongLettersEl = document.getElementById('wrong-letters'); | |
const playAgainBtn = document.getElementById('play-button'); | |
const popup = document.getElementById('popup-container'); | |
const notification = document.getElementById('notification-container'); | |
const finalMessage = document.getElementById('final-message'); | |
const figureParts = document.querySelectorAll('.figure-part'); | |
const words = ['application', 'programming', 'interface', 'wizard']; | |
let selectedWord = words[Math.floor(Math.random() * words.length)]; | |
const correctLetters = []; | |
const wrongLetters = []; | |
function displayWord() { | |
wordEl.innerHTML = ` | |
${selectedWord.split('').map(letter => `<span class="letter"> | |
${correctLetters.includes(letter) ? letter : ''} | |
</span>`).join('')} | |
`; | |
const innerWord = wordEl.innerText.replace(/\n/g, ''); | |
if (innerWord === selectedWord) { | |
finalMessage.innerText = 'Congratulations!! You Won 🥳'; | |
popup.style.display = 'flex'; | |
} | |
} | |
const showNotification = () => { | |
notification.classList.add('show'); | |
setTimeout(() => { | |
notification.classList.remove('show'); | |
}, 2000); | |
}; | |
const updateWrongLettersEl = () => { | |
wrongLettersEl.innerHTML = ` | |
${wrongLetters.length > 0 ? '<p>Wrong</p>' : ''} | |
${wrongLetters.map(letter => `<span>${letter}</span>`)} | |
`; | |
figureParts.forEach((part, index) => { | |
const errors = wrongLetters.length; | |
if (index < errors) { | |
part.style.display = 'block'; | |
} else { | |
part.style.display = 'none'; | |
} | |
}); | |
if (wrongLetters.length === figureParts.length) { | |
finalMessage.innerText = 'Sorry you lost 😂'; | |
popup.style.display = 'flex'; | |
} | |
}; | |
window.addEventListener('keydown', e => { | |
if (e.keyCode >= 65 && e.keyCode <= 90) { | |
const letter = e.key; | |
if (selectedWord.includes(letter)) { | |
if (!correctLetters.includes(letter)) { | |
correctLetters.push(letter); | |
displayWord(); | |
} else { | |
showNotification(); | |
} | |
} else { | |
if (!wrongLetters.includes(letter)) { | |
wrongLetters.push(letter); | |
updateWrongLettersEl(); | |
} else { | |
showNotification(); | |
} | |
} | |
} | |
}); | |
playAgainBtn.addEventListener('click', () => { | |
correctLetters.splice(0); | |
wrongLetters.splice(0); | |
selectedWord = words[Math.floor(Math.random() * words.length)]; | |
displayWord(); | |
updateWrongLettersEl(); | |
popup.style.display = 'none'; | |
}); | |
displayWord(); |