Build A Weather App Using JavaScript [For Beginners] ☀️🌤️
I started JS practice to get more knowledge about JS. so I searched for some projects on YouTube and I found the weather app in JavaScript. So I watched it, built the project, and did some modifications.
To get weather data we used Openweathermap’s weather API. Just sign-up yourself and create an account then go to this page: https://home.openweathermap.org/api_keys.
Enter any API key name and Generate key.
Now let’s code.
Code
First, we design UI, so open your favorite code editor and make index.html and make look like following,
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no" />
<title>Wather App</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="app-wrap">
<header>
<input type="text" class="search-box" placeholder="Search for a city..." autocomplete="off">
</header>
<main>
<section class="location">
<div class="city">
City, Country
</div>
<div class="date">
Day, Month Date, Year
</div>
</section>
<div class="current">
<div class="temp">Temp<span>°c</span></div>
<div class="weather-icon">
<img alt="weather_icon">
</div>
<div class="weather">Weather</div>
<div class="description">Weather_description</div>
<div class="hi-low">min_temp°c/ max_temp°c</div>
</div>
</main>
</div>
<script src="main.js"></script>
</body>
</html>
Now create style.css and write the following code.
style.css
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700;900&display=swap");
*{
margin:0;
padding:0;
box-sizing: border-box;
}
body{
font-family: 'montserrat',sans-serif;
background-image: url('bg.jpg');
background-size: cover;
background-position: top center;
}
.app-wrap{
display: flex;
flex-direction: column;
min-height: 100vh;
background-image: linear-gradient(to bottom, rgba(0,0,0,0.3),rgba(0,0,0,0.6));
}
header{
display:flex;
justify-content: center;
align-items: center;
padding: 50px 15px 15px;
}
header input{
width: 100%;
max-width: 280px;
padding: 10px 15px;
border:none;
outline: none;
background-color: rgba(255, 255, 255, 0.3);
border-radius: 8px;
color: #fff;
border-bottom: 3px solid #df8e00;
font-size: 20px;
font-weight: 300;
transition: 0.2s ease-out;
}
header input:focus{
background-color: rgba(255, 255, 255,0.6);
}
header input::placeholder{
color:rgba(255, 255, 255,0.6);
}
main{
flex: 1 1 100%;
padding: 25px 25px 50px;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.location .city{
color: #fff;
font-size:32px;
font-weight: 500;
margin-bottom: 5px;
}
.location .date{
color:#fff;
font-size: 16px;
}
.current .temp{
color:#fff;
font-size: 102px;
font-weight: 900;
margin: 10px 0px;
text-shadow: 2px 10px rgba(0,0,0,0.6);
}
.current .temp span{
font-weight: 500;
}
.current .weather{
color:#fff;
font-size: 32px;
font-weight: 700;
font-style: italic;
margin-bottom: 5px;
text-shadow: 0px 3px rgba(0,0,0,0.4);
}
.current .description{
color:#fff;
font-size: 16px;
margin-bottom: 15px;
text-transform: capitalize;
}
.current .hi-low{
color:#fff;
font-size: 24px;
font-weight: 500;
text-shadow: 0px 4px rgba(0, 0, 0, 0.4);
}
Let’s write JavaScript code.
main.js
// paste your secret key
const api = {
key: "9f****************************", // your secrete key here
base_url: "https://api.openweathermap.org/data/2.5/",
}
// selecting the inputbox
const searchbox = document.querySelector(".search-box");
//adding keypress event listener to inputbox
searchbox.addEventListener("keypress", setQuery);
// when user enter city and and click the enter key then getResults function will invoked
function setQuery(e) {
// 13 is key code for enter key
if (e.keyCode == 13) {
// calling getResults function and passing city name when click enter key
getResults(searchbox.value);
// console.log(searchbox.value);
}
}
// fetching the data from weather api
function getResults(query) {
// qeury carries city name and we passes to the Api url so final url be looks like this
// https://api.openweathermap.org/data/2.5/weather?q=London&unit=metric&APPID=9f9189f3ea73cf55b8cc02b2d5091f72
//so query passes to this URL to get data for the user-entered city name
fetch(`${api.base_url}weather?q=${query}&units=metric&APPID=${api.key}`)
.then(weather => {
return weather.json();
}).then(displayResults); // passing response (weather) object
}
function displayResults(weather) {
// console.log(typeof weather);
// accessing weather object and getting data
// selecting the element and setting the city and country name from api
let city = document.querySelector('.location .city');
city.innerText = `${weather.name}, ${weather.sys.country}`;
// setting current date, see the dateBuilder() function bellow
let now = new Date();
let date = document.querySelector('.location .date');
date.innerText = dateBuilder(now);
// selecting the element and setting the current temperature of city
let temp = document.querySelector('.current .temp');
temp.innerHTML = `${Math.round(weather.main.temp)}<span>°c</span>`;
// selecting the element and setting the current weather of city like, 'sunny', 'cloudy'
let weather_el = document.querySelector('.current .weather');
weather_el.innerText = weather.weather[0].main;
// selecting the element and setting the current weather description of city
let weather_description = document.querySelector('.current .description');
weather_description.innerText = weather.weather[0].description;
// selecting the element and setting the current weather image/icon of city
let weather_icon = document.querySelector('.current .weather-icon img');
//console.log(weather.weather[0].icon);
weather_icon.src = `http://openweathermap.org/img/wn/${weather.weather[0].icon}@4x.png`;
// selecting the element and setting the current min and max temperature of city
let hilow = document.querySelector('.current .hi-low');
hilow.innerText = `${Math.round(weather.main.temp_min)}°c / ${Math.round(weather.main.temp_max)}°c`;
}
// returns today's date
function dateBuilder(d) {
let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
let days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
let day = days[d.getDay()];
let date = d.getDate();
let month = months[d.getMonth()];
let year = d.getFullYear();
return `${day}, ${date} ${month} ${year}`;
}
Output
Reference: https://youtu.be/n4dtwWgRueI
GitHub repo: https://github.com/SoniArpit/weather-app-js
Hope you like this simple weather app in JavaScript. Share it with your friends. Thank you.
Also check,