In this tutorial, I’ll teach you how to create a random pokemon generator. I will use JavaScript, HTML5, and CSS3 to build this random pokemon generator.
Random Pokemon Generator Source Code
index.html
<!DOCTYPE html> <html> <head> <title>Random Pokemon Generator - Edopedia</title> <link type="text/css" rel="stylesheet" href="./style.css" /> <script src="./script.js"></script> </head> <body> <!-- fun with the poke-api!--> <!-- more animations to come soon :)--> <!-- find me on twitter: @flangerhanger--> <!-- open in desktop, or full screen on mobile (close the editor windows) for best effect--> <div id="page"> <h1 class="title"> </h1> <div id="pokeball-container"> <div id="ball"></div><button id="submit-number" type="submit"></button> <div id="shadow"></div> </div> <div id="characters"></div> </div> </body> </html>
style.css
@import url("https://fonts.googleapis.com/css2?family=Fredoka+One&family=Raleway:wght@600&display=swap"); :root { --size: 50; --unit: calc((var(--size) / 100) * 1vmin); font-family: "Raleway", sans-serif; } :root * { margin: 0; } #page { display: flex; flex-direction: column; flex-wrap: nowrap; justify-content: center; align-items: center; height: 100vh; background: #323235; } #characters { display: flex; flex-direction: column; flex-wrap: wrap; justify-content: center; visibility: hidden; height: calc(170 * var(--unit)); width: calc(120 * var(--unit)); background: white; border-radius: 8% / 6%; border: calc(4 * var(--unit)) solid whitesmoke; box-shadow: 1em 1em 2em black; transform: rotate(8deg); transition: box-shadow 1s ease; } #characters:hover { box-shadow: 4em 4em 2em black; } #characters h2 { color: #3a3a3f; letter-spacing: calc(2 * var(--unit)); font-size: calc(10 * var(--unit)); margin: 8% 0 2% 6%; } #characters h3 { font-size: calc(9 * var(--unit)); text-align: right; margin-right: 5%; } #characters p { color: #3a3a3f; letter-spacing: calc(1 * var(--unit)); font-size: calc(5 * var(--unit)); margin: 0% 8%; } #characters #inner { color: #3a3a3f; letter-spacing: calc(0.5 * var(--unit)); font-size: calc(4 * var(--unit)); margin: 0% 8%; } #characters .mediaContainer { height: 60%; background: linear-gradient(0deg, whitesmoke 1%, transparent); clip-path: polygon(0% 7%, 100% 0%, 100% 100%, 0% 100%); } img { width: 60%; height: auto; object-fit: contain; transform: translate(30%, 20%); } #pokeball-container { animation: wobble 3s infinite both; position: absolute; } #pokeball-container #shadow { animation-play-state: paused; width: calc(50 * var(--unit)); height: calc(20 * var(--unit)); background-color: black; opacity: 0.2; box-shadow: 0 0 calc(4 * var(--unit)) calc(2 * var(--unit)) black; position: absolute; bottom: -10%; left: 10%; z-index: -1; border-radius: 50%; } #pokeball-container button { display: block; height: calc(70 * var(--unit)); width: calc(70 * var(--unit)); background: linear-gradient(100deg, #b8b8b8 0%, white); -webkit-clip-path: circle(50% at 50% 50%); clip-path: circle(50% at 50% 50%); border: none; transform: translate(0%, 50%); border-radius: 50%; -webkit-animation: wobble 2s infinite both; } #pokeball-container button::before { position: absolute; bottom: 48%; left: 0%; content: ""; border-bottom: calc(4 * var(--unit)) solid #5e5c5c; height: calc(50 * var(--unit)); width: calc(70 * var(--unit)); background: linear-gradient(100deg, red 30%, #f77); z-index: 3; } #pokeball-container button::after { position: absolute; bottom: 37%; left: 38%; content: ""; height: calc(10 * var(--unit)); border-radius: 50%; width: calc(10 * var(--unit)); border: calc(4 * var(--unit)) solid #5e5c5c; background: white; z-index: 3; } #pokeball-container button:active, #pokeball-container button:focus { border: none; outline: none; } #input { width: 100%; display: flex; flex-wrap: wrap; justify-content: center; } .title { text-align: center; font-family: Arial, Helvetica, sans-serif; font-size: calc(10 * var(--unit)); } @-webkit-keyframes wobble { 0%, 100% { -webkit-transform: translateX(0%); transform: translateX(0%); -webkit-transform-origin: 50% 50%; transform-origin: 50% 50%; } 15% { -webkit-transform: translateX(-30px) rotate(-6deg); transform: translateX(-30px) rotate(-6deg); } 30% { -webkit-transform: translateX(15px) rotate(6deg); transform: translateX(15px) rotate(6deg); } 45% { -webkit-transform: translateX(-15px) rotate(-3.6deg); transform: translateX(-15px) rotate(-3.6deg); } 60% { -webkit-transform: translateX(9px) rotate(2.4deg); transform: translateX(9px) rotate(2.4deg); } 75% { -webkit-transform: translateX(-6px) rotate(-1.2deg); transform: translateX(-6px) rotate(-1.2deg); } } @keyframes wobble { 0%, 100% { -webkit-transform: translateX(0%); transform: translateX(0%); -webkit-transform-origin: 50% 50%; transform-origin: 50% 50%; } 15% { -webkit-transform: translateX(-30px) rotate(-6deg); transform: translateX(-30px) rotate(-6deg); } 30% { -webkit-transform: translateX(15px) rotate(6deg); transform: translateX(15px) rotate(6deg); } 45% { -webkit-transform: translateX(-15px) rotate(-3.6deg); transform: translateX(-15px) rotate(-3.6deg); } 60% { -webkit-transform: translateX(9px) rotate(2.4deg); transform: translateX(9px) rotate(2.4deg); } 75% { -webkit-transform: translateX(-6px) rotate(-1.2deg); transform: translateX(-6px) rotate(-1.2deg); } }
script.js
const pokemonTypeColours = { ground: "#e7d39f", electric: "#fdd998", bug: "#cee397", dark: "#222831", dragon: "#8ac6d1", fairy: "#ffb6b9", fighting: "#ffc38b", fire: "#ff6363", flying: "#a4c5c6", ghost: "#827397", grass: "#b7efcd", ice: "#dae1e7", normal: "#eae7d9", poison: "#8566aa", psychic: "#efa8e4", rock: "#d2c6b2", steel: "#5f6769", water: "#9aceff" }; var cardDiv = document.getElementById("characters"); var pokeBall = document.getElementById("pokeball-container"); function randomIdNumber() { return Math.floor(Math.random() * Math.floor(307)); } function getCharacter(event) { event.preventDefault(); let numberInput = document.getElementById("number-input"); var pokemonId = randomIdNumber(); if (pokemonId) { getCharacters(pokemonId); } } document .getElementById("submit-number") .addEventListener("click", getCharacter); function getCharacters(pokemonId) { fetch(`https://pokeapi.co/api/v2/pokemon/${pokemonId}/`) .then((response) => response.json()) .then((data) => showCard(data)) .catch((error) => console.log(error)); } function getMoveData(url) { fetch(url) .then((response) => response.json()) .then((data) => showMoveData(data)) .catch((error) => console.log(error)); } function showCard(data) { pokeBall.style.display = "none"; cardDiv.innerHTML = null; var pokemonName = document.createElement("h2"); pokemonName.textContent = `${data.name.toUpperCase()}`; let mediaContainer = document.createElement("div"); mediaContainer.setAttribute("class", "mediaContainer"); let pokemonImage = document.createElement("img"); pokemonImage.setAttribute( "src", `https://pokeres.bastionbot.org/images/pokemon/${data.id}.png` ); pokemonImage.setAttribute("alt", data.name); cardDiv.appendChild(pokemonName); mediaContainer.appendChild(pokemonImage); cardDiv.appendChild(mediaContainer); let pokemonType = data.types[0].type.name; let pokemonTypeTitle = document.createElement("h3"); pokemonTypeTitle.textContent = pokemonType; cardDiv.appendChild(pokemonTypeTitle); getMoveData(data.moves[0].move.url); setBackgroundColour(mediaContainer, pokemonType); setTextColour([pokemonTypeTitle], pokemonType); cardDiv.style.visibility = "visible"; } function showMoveData(data) { var pokemonMoves = data.name; var cardBodyText = document.createElement("div"); var moveData = data.flavor_text_entries[2].flavor_text; cardBodyText.innerHTML = `<p>${pokemonMoves.toUpperCase()}</p><br><p id="inner">${moveData}</p>`; cardDiv.appendChild(cardBodyText); } function reset() { cardDiv.style.visibility = "hidden"; pokeBall.style.display = "block"; } cardDiv.addEventListener("click", reset); function setBackgroundColour(element, data) { element.style.background = `linear-gradient(0deg, white 10%, ${pokemonTypeColours[data]})`; } function setTextColour(element, data) { element.forEach((item) => { item.style.color = pokemonTypeColours[data]; }); }