How to Design a Simple Calendar using JavaScript ?

In this article, we will see how to Create a calendar using HTML, CSS, and JavaScript that displays the current month and year, and allows the user to navigate to previous and next months. Also, it allows the user to jump to a specific month and year. The calendar should also highlight the current date.
Prerequisite: Basic knowledge of some front-end technologies like HTML, CSS, and JavaScript.
The task at hand is to create a webpage that displays a calendar. The calendar should have the functionality to navigate to the previous and next months. The calendar should also be able to display the current date in a different color.
Approach:
- Create an HTML structure for the calendar using a table and appropriate list elements.
- Create JavaScript variables to keep track of the current month and year, as well as elements to display the current month and year on the page.
- Use JavaScript to create a function to display the current month’s calendar. This function should take in the current month and year as arguments and use them to determine the number of days in the current month, and the first day of the month, and fill in the appropriate number of days in the calendar.
- Create JavaScript functions to navigate to the next and previous months.
- Use JavaScript to add event listeners to the appropriate elements (next and previous buttons) to call the appropriate navigation functions when clicked.
Implementation: Below is the implementation of the above approach:
- index.html: This file contains the skeleton of calendar
- style.css: This file contains CSS to improve the look of the calendar
- script.js: This file contains the code to make the calendar dynamic
Example: Here is the implementation of the above-explained steps.
HTML
| <!DOCTYPE html><htmllang="en"dir="ltr"><head>    <metacharset="utf-8">    <title>Calendar</title>    <metaname="viewport"          content="width=device-width, initial-scale=1.0">    <linkrel="stylesheet"        href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"></head><body>    <divclass="calendar-container">        <headerclass="calendar-header">            <pclass="calendar-current-date"></p>            <divclass="calendar-navigation">                <spanid="calendar-prev"                      class="material-symbols-rounded">                    chevron_left                </span>                <spanid="calendar-next"                      class="material-symbols-rounded">                    chevron_right                </span>            </div>        </header>        <divclass="calendar-body">            <ulclass="calendar-weekdays">                <li>Sun</li>                <li>Mon</li>                <li>Tue</li>                <li>Wed</li>                <li>Thu</li>                <li>Fri</li>                <li>Sat</li>            </ul>            <ulclass="calendar-dates"></ul>        </div>    </div></body></html> | 
CSS
| * {    margin: 0;    padding: 0;    font-family: 'Poppins', sans-serif;}body {    display: flex;    background: #ef62da;    min-height: 100vh;    padding: 010px;    align-items: center;    justify-content: center;}.calendar-container {    background: #fff;    width: 450px;    border-radius: 10px;    box-shadow: 015px40pxrgba(0, 0, 0, 0.12);}.calendar-container header {    display: flex;    align-items: center;    padding: 25px30px10px;    justify-content: space-between;}header .calendar-navigation {    display: flex;}header .calendar-navigation span {    height: 38px;    width: 38px;    margin: 01px;    cursor: pointer;    text-align: center;    line-height: 38px;    border-radius: 50%;    user-select: none;    color: #aeabab;    font-size: 1.9rem;}.calendar-navigation span:last-child {    margin-right: -10px;}header .calendar-navigation span:hover {    background: #f2f2f2;}header .calendar-current-date {    font-weight: 500;    font-size: 1.45rem;}.calendar-body {    padding: 20px;}.calendar-body ul {    list-style: none;    flex-wrap: wrap;    display: flex;    text-align: center;}.calendar-body .calendar-dates {    margin-bottom: 20px;}.calendar-body li {    width: calc(100%/ 7);    font-size: 1.07rem;    color: #414141;}.calendar-body .calendar-weekdays li {    cursor: default;    font-weight: 500;}.calendar-body .calendar-dates li {    margin-top: 30px;    position: relative;    z-index: 1;    cursor: pointer;}.calendar-dates li.inactive {    color: #aaa;}.calendar-dates li.active {    color: #fff;}.calendar-dates li::before {    position: absolute;    content: "";    z-index: -1;    top: 50%;    left: 50%;    width: 40px;    height: 40px;    border-radius: 50%;    transform: translate(-50%, -50%);}.calendar-dates li.active::before {    background: #6332c5;}.calendar-dates li:not(.active):hover::before {    background: #e4e1e1;} | 
Javascript
| let date = newDate();let year = date.getFullYear();let month = date.getMonth();const day = document.querySelector(".calendar-dates");const currdate = document    .querySelector(".calendar-current-date");const prenexIcons = document    .querySelectorAll(".calendar-navigation span");// Array of month namesconst months = [    "January",    "February",    "March",    "April",    "May",    "June",    "July",    "August",    "September",    "October",    "November",    "December"];// Function to generate the calendarconst manipulate = () => {    // Get the first day of the month    let dayone = newDate(year, month, 1).getDay();    // Get the last date of the month    let lastdate = newDate(year, month + 1, 0).getDate();    // Get the day of the last date of the month    let dayend = newDate(year, month, lastdate).getDay();    // Get the last date of the previous month    let monthlastdate = newDate(year, month, 0).getDate();    // Variable to store the generated calendar HTML    let lit = "";    // Loop to add the last dates of the previous month    for(let i = dayone; i > 0; i--) {        lit +=            `<li class="inactive">${monthlastdate - i + 1}</li>`;    }    // Loop to add the dates of the current month    for(let i = 1; i <= lastdate; i++) {        // Check if the current date is today        let isToday = i === date.getDate()            && month === newDate().getMonth()            && year === newDate().getFullYear()            ? "active"            : "";        lit += `<li class="${isToday}">${i}</li>`;    }    // Loop to add the first dates of the next month    for(let i = dayend; i < 6; i++) {        lit += `<li class="inactive">${i - dayend + 1}</li>`    }    // Update the text of the current date element     // with the formatted current month and year    currdate.innerText = `${months[month]} ${year}`;    // update the HTML of the dates element     // with the generated calendar    day.innerHTML = lit;}manipulate();// Attach a click event listener to each iconprenexIcons.forEach(icon => {    // When an icon is clicked    icon.addEventListener("click", () => {        // Check if the icon is "calendar-prev"        // or "calendar-next"        month = icon.id === "calendar-prev"? month - 1 : month + 1;        // Check if the month is out of range        if(month < 0 || month > 11) {            // Set the date to the first day of the             // month with the new year            date = newDate(year, month, newDate().getDate());            // Set the year to the new year            year = date.getFullYear();            // Set the month to the new month            month = date.getMonth();        }        else{            // Set the date to the current date            date = newDate();        }        // Call the manipulate function to         // update the calendar display        manipulate();    });}); | 
Output:
 
 
				 
					


