Welcome to yet another exciting tutorial by Coding Artist. Building projects is one of the best ways to learn Javascript. So in today’s tutorial let us expand our javascript knowledge with a fun and easy-to-build project called ‘Gif search app’. To build this project we need HTML, CSS, Javascript, and the Giphy API.
Video Tutorial:
For a better understanding of how we built the functionality of this project, I would advise you to watch the video below. If you find the video helpful give it a like and subscribe to my YouTube channel where I post new tips, tricks, and tutorials related to HTML, CSS, and Javascript.
Project Folder Structure:
Let’s build the project folder structure before we begin writing the code. We create a project folder called ‘Gif search app’. Inside this folder, we have index.html, style.css, script.js, and API-key.js.
HTML:
We begin with the HTML Code. First, create a file called – ‘index.html’. Copy the code below and paste it into your HTML file.
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Gif Search App</title>
<!-- Google Font -->
<link
href="https://fonts.googleapis.com/css2?family=Poppins:wght@500&display=swap"
rel="stylesheet"
/>
<!-- Stylesheet -->
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="box">
<div class="search-container">
<input type="text" id="search-box" value="laugh" />
<button id="submit-btn">Submit</button>
</div>
<div class="loader"></div>
<div class="wrapper"></div>
</div>
<!-- API Key -->
<script src="api-key.js"></script>
<!-- Script -->
<script src="script.js"></script>
</body>
</html>
CSS:
Next, we style our list using CSS. For this copy, the code provided to you below and paste it into your stylesheet.
* {
padding: 0;
margin: 0;
box-sizing: border-box;
font-family: "Poppins", sans-serif;
}
body {
background-color: #151d2f;
}
button {
border: none;
outline: none;
cursor: pointer;
background-color: #13fc97;
color: #151d2f;
border-radius: 0.5em;
font-weight: 500;
}
.search-container {
display: grid;
grid-template-columns: 9fr 3fr;
gap: 1em;
width: 100%;
max-width: 50em;
margin: 1em auto;
padding: 0.5em;
}
.search-container input {
padding: 1em;
border-radius: 0.5em;
font-weight: 400;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.container {
background-color: #2b304d;
display: flex;
padding: 1em;
flex-direction: column;
justify-content: space-between;
margin: 1.5em;
border-radius: 0.5em;
}
.container img {
width: 100%;
}
.container button {
margin-top: 1em;
padding: 1em 0;
}
.loader {
display: none;
height: 15em;
width: 15em;
border: 3em solid #2b304d;
border-radius: 50%;
border-top-color: #13fc97;
position: absolute;
transform: translate(-50%, -50%);
left: 50%;
top: 50%;
animation: spin 3s infinite;
}
@keyframes spin {
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
@media screen and (max-width: 768px) {
.wrapper {
grid-template-columns: repeat(2, 1fr);
}
.container {
margin: 0.7em;
}
}
@media screen and (max-width: 576px) {
.wrapper {
grid-template-columns: 1fr;
}
}
Javascript:
Finally, we add functionality using Javascript. Once again copy the code below and paste it into your script file.
Before moving to actual implementation we store the API key in the file ‘api-key.js’.
Then let’s move on to the implementation steps:
- Create initial HTML references and store the API URL in a variable
- Call the “generateGif()” function when the user clicks on the submit button or when the window loads
- The “generateGif()” function displays a loader until all the GIFs have loaded and makes a call to the Giphy API based on the search value or default value.
- After that, we create a card for each gif we get in response. The card displays the gif and a copy link button that allows the user to copy a link to the GIF to their clipboard.
- If the user’s browser does not support the clipboard API, we create a temporary input field to copy the GIF link to the clipboard.
//Paste the generated API Key here let apiKey = "";
let submitBtn = document.getElementById("submit-btn");
let generateGif = () => {
//display loader until gif load
let loader = document.querySelector(".loader");
loader.style.display = "block";
document.querySelector(".wrapper").style.display = "none";
//Get search value (default => laugh)
let q = document.getElementById("search-box").value;
//We need 10 gifs to be displayed in result
let gifCount = 10;
//API URL =
let finalURL = `https://api.giphy.com/v1/gifs/search?api_key=${apiKey}&q=${q}&limit=${gifCount}&offset=0&rating=g&lang=en`;
document.querySelector(".wrapper").innerHTML = "";
//Make a call to API
fetch(finalURL)
.then((resp) => resp.json())
.then((info) => {
console.log(info.data);
//All gifs
let gifsData = info.data;
gifsData.forEach((gif) => {
//Generate cards for every gif
let container = document.createElement("div");
container.classList.add("container");
let iframe = document.createElement("img");
console.log(gif);
iframe.setAttribute("src", gif.images.downsized_medium.url);
iframe.onload = () => {
//if iframes has loaded correctly reduce the count when each gif loads
gifCount--;
if (gifCount == 0) {
//If all gifs have loaded then hide loader and display gifs UI
loader.style.display = "none";
document.querySelector(".wrapper").style.display = "grid";
}
};
container.append(iframe);
//Copy link button
let copyBtn = document.createElement("button");
copyBtn.innerText = "Copy Link";
copyBtn.onclick = () => {
//Append the obtained ID to default URL
let copyLink = `https://media4.giphy.com/media/${gif.id}/giphy.mp4`;
//Copy text inside the text field
navigator.clipboard
.writeText(copyLink)
.then(() => {
alert("GIF copied to clipboard");
})
.catch(() => {
//if navigator is not supported
alert("GIF copied to clipboard");
//create temporary input
let hiddenInput = document.createElement("input");
hiddenInput.setAttribute("type", "text");
document.body.appendChild(hiddenInput);
hiddenInput.value = copyLink;
//Select input
hiddenInput.select();
//Copy the value
document.execCommand("copy");
//remove the input
document.body.removeChild(hiddenInput);
});
};
container.append(copyBtn);
document.querySelector(".wrapper").append(container);
});
});
};
//Generate Gifs on screen load or when user clicks on submit
submitBtn.addEventListener("click", generateGif);
window.addEventListener("load", generateGif);
Go ahead and customize the project the way you like. If you have any queries, suggestions, or feedback comment below. Download the source code by clicking the ‘Download Code’ button below.


The download code button does not work, ms.
This is an amazing… Thanks a lot for your efforts.