Open In App

Indian Republic Day 2024 | Design National Flag Tiranga

Last Updated : 26 Apr, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Create a Republic Day wishing card using HTML, CSS, and JavaScript. A Republic Day card contains the Republic Day wishing text and some animations with the Indian flag and colors.

Approach

  • Create a folder with the name of the project and three different files for HTML, CSS, and JavaScript.
  • Inside the HTML file, define the structure of the web page using HTML elements like div, headings, paragraphs, etc. with the IDs and classes.
  • Now, select the elements with their IDs and classes inside the CSS file and use the CSS styling properties to style the HTML document to make it attractive.
  • Use CSS animations and transitions to make the page look more animated and dynamic.
  • After that, create a countdown using the JavaScript from current day till the Republic Day.
  • Use the HTML Canvas element and JavaScript together to rain the flowers once the timer ends.
  • Create interactive and attractive animations using the setTimeout() and setInterval() methods inside JavaScript.

Example: The below code example implements the HTML, CSS and JavaScript to create an Republic Day wishing card with interactive animations.

HTML




<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content=
"width=device-width, initial-scale=1.0">
    <title>Republic Day Card</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="card-container">
        <div id="countdown" class="countdown-container">
            <div class="clock">
                <div id="day01" class="digit-container">
                    <div class="digit" id="day1">0</div>
                </div>
                <div id="day02" class="digit-container">
                    <div class="digit" id="day2">0</div>
                </div>
                <span id="daySpan">:</span>
                <div class="digit-container">
                    <div class="digit" id="hour1">0</div>
                </div>
                <div class="digit-container">
                    <div class="digit" id="hour2">0</div>
                </div>
                <span>:</span>
                <div class="digit-container">
                    <div class="digit" id="minute1">0</div>
                </div>
                <div class="digit-container">
                    <div class="digit" id="minute2">0</div>
                </div>
                <span>:</span>
                <div class="digit-container">
                    <div class="digit" id="second1">0</div>
                </div>
                <div class="digit-container">
                    <div class="digit" id="second2">0</div>
                </div>
            </div>
        </div>
  
        <div id="ourCard" class="text-container">
            <canvas id="rainingFlowerCanvas"></canvas>
            <div id="ourFlag" class="flag-container">
                <div class="saffron"></div>
                <div class="white">
                    <div class="ashok-chakra bigger-chakra">
                        <div class="spikes bigger-spikes">
                            <div class="spike bigger-spike" 
                                 style="--i: 1"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 2"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 3"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 4"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 5"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 6"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 7"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 8"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 9"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 10"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 11"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 12"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 13"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 14"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 15"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 16"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 17"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 18"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 19"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 20"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 21"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 22"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 23"></div>
                            <div class="spike bigger-spike" 
                                 style="--i: 24"></div>
                        </div>
                    </div>
                </div>
                <div class="green"></div>
            </div>
  
            <h2 class="heading2">GeeksforGeeks</h2>
  
            <div class="spinning-flag-container">
                <div class="spinning-flag-color greenPolygon"></div>
                <div class="spinning-flag-color whitePolygon"></div>
                <div class="spinning-flag-color saffronPolygon">
                    <div class="ashok-chakra">
                        <div class="spikes">
                            <div class="spike" style="--i: 1"></div>
                            <div class="spike" style="--i: 2"></div>
                            <div class="spike" style="--i: 3"></div>
                            <div class="spike" style="--i: 4"></div>
                            <div class="spike" style="--i: 5"></div>
                            <div class="spike" style="--i: 6"></div>
                            <div class="spike" style="--i: 7"></div>
                            <div class="spike" style="--i: 8"></div>
                            <div class="spike" style="--i: 9"></div>
                            <div class="spike" style="--i: 10"></div>
                            <div class="spike" style="--i: 11"></div>
                            <div class="spike" style="--i: 12"></div>
                            <div class="spike" style="--i: 13"></div>
                            <div class="spike" style="--i: 14"></div>
                            <div class="spike" style="--i: 15"></div>
                            <div class="spike" style="--i: 16"></div>
                            <div class="spike" style="--i: 17"></div>
                            <div class="spike" style="--i: 18"></div>
                            <div class="spike" style="--i: 19"></div>
                            <div class="spike" style="--i: 20"></div>
                            <div class="spike" style="--i: 21"></div>
                            <div class="spike" style="--i: 22"></div>
                            <div class="spike" style="--i: 23"></div>
                            <div class="spike" style="--i: 24"></div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="wish-container">
                <p class="para">Wishes you a very</p>
                <h1 class="heading1">
                    Happy 75 <sup>th</sup><br>
                    Republic Day <br
                    2024
                </h1>
            </div>
        </div>
    </div>
  
    <script src="script.js"></script>
</body>
</html>


CSS




/* style.css */
  
/* blue color: #06038D
saffron color: #FF671F
white color: #fff
green color: #046A38 */
  
@import url
('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&display=swap');
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
  
body {
    font-family: 'Playfair Display', serif;
}
  
.card-container {
    display: flex;
    align-items: center;
    justify-content: space-around;
    flex-direction: column;
    height: 100vh;
    width: 100vw;
    position: relative;
}
  
/* countdown CSS */
.clock {
    display: flex;
    font-size: 3rem;
}
  
.digit-container {
    width: 50px;
    height: 60px;
    background-color: #333;
    color: #fff;
    text-align: center;
    margin: 0 5px;
    border-radius: 5px;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    position: relative;
}
  
.digit {
    width: 100%;
    transition: 
transform 0.3s ease-in-out, opacity 0.3s ease-in-out;
    color: #fff;
    position: absolute;
    top: -10px;
}
  
/* text container CSS */
.text-container {
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: space-around;
    height: 80%;
    width: 33%;
    background-color: #d5d4d4;
    border-radius: 10px;
    position: relative;
}
  
canvas {
    position: absolute;
    top: 0;
    left: 0;
    pointer-events: none;
}
  
/* Color spinner CSS */
.spinning-flag-container {
    position: relative;
    width: 150px;
    height: 150px;
}
  
.spinning-flag-color {
    position: absolute;
    width: 100%;
    height: 100%;
    clip-path: 
polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
    animation: spin 4s linear infinite;
}
  
.greenPolygon {
    background-color: #046A38;
    transform: rotate(0deg);
}
  
.whitePolygon {
    background-color: #fff;
    transform: rotate(120deg);
}
  
.saffronPolygon {
    background-color: #FF671F;
    transform: rotate(240deg);
    display: flex;
    align-items: center;
    justify-content: center;
}
  
/* Flag CSS */
.flag-container {
    z-index: 9;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border: 3px solid #06038D;
}
  
.saffron {
    height: 33.3%;
    width: 100%;
    background-color: #FF9933;
}
  
.white {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 33.3%;
    width: 100%;
    background-color: white;
}
  
.green {
    height: 33.3%;
    width: 100%;
    background-color: #046A38;
}
  
/* Ashoka Chakra CSS */
.ashok-chakra.bigger-chakra {
    width: 29%;
    height: 80%;
    border: 5px solid #06038D;
}
  
.ashok-chakra.bigger-chakra 
.spikes .spike::before {
    width: 10px;
    height: 10px;
    top: -5px;
    left: calc(50% - 8px);
}
  
.ashok-chakra.bigger-chakra 
.spikes .spike::after {
    width: 6px;
    height: 50%;
    top: -8px;
    left: calc(50% - 5px);
}
  
.ashok-chakra {
    position: relative;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    border: 3px solid #06038D;
    margin: auto;
}
  
.ashok-chakra .spikes,
.ashok-chakra .spikes .spike {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
  
.ashok-chakra .spikes .spike {
    transform: rotate(calc(15deg * var(--i)));
}
  
.ashok-chakra .spikes .spike::before {
    content: "";
    position: absolute;
    width: 4px;
    height: 4px;
    background: #06038D;
    border-radius: 50%;
    top: -2px;
    left: calc(50% - 1px);
}
  
.ashok-chakra .spikes .spike::after {
    content: "";
    position: absolute;
    width: 3px;
    height: 50%;
    background: #06038D;
    top: -4px;
    left: calc(50% - 0px);
    transform-origin: bottom;
    transform: rotate(7.5deg);
    clip-path: 
polygon(50% 5%, 100% 50%, 50% 95%, 0% 50%);
}
  
.ashok-chakra::after {
    content: "";
    position: absolute;
    width: 16px;
    height: 16px;
    background: #06038D;
    top: calc(50% - 8px);
    left: calc(50% - 8px);
    border-radius: 50%;
}
  
/* slideFlag animation class */
.slideFlag.flag-container {
    height: 0;
    visibility: hidden;
    transition: all 2s ease-in-out;
}
  
.slideFlag.flag-container 
.white .ashok-chakra.bigger-chakra {
    visibility: hidden;
    transition: all 0.3s ease-in-out;
}
  
  
@keyframes spin {
    to {
        transform: rotate(360deg);
    }
}
  
  
.wish-container {
    text-align: center;
    color: #fff;
}
  
  
/* Utility Classes */
.heading1 {
    color: #FF671F;
    font-size: 50px;
    padding: 5px;
}
  
.heading2 {
    color: #046A38;
    font-size: 35px;
    padding: 5px;
}
  
.para {
    color: #06038D;
    font-size: 20px;
    padding: 5px;
}
  
/* Responsive CSS styles*/
  
@media screen and (min-width: 769px
and (max-width: 1024px) {
    .text-container{
        width: 75%;
    }
    .ashok-chakra.bigger-chakra {
        height: 125px;
        width: 125px;
    }
}
  
@media screen and (min-width: 1025px
and (max-width: 1440px) {
    .ashok-chakra.bigger-chakra {
        width: 160px;
        height: 161px;
    }
}
  
@media screen and (min-width: 1441px
and (max-width: 2560px) {
    .ashok-chakra.bigger-chakra {
        width: 150px;
        height: 150px;
    }
}
  
@media screen and (min-width: 431px
and (max-width: 768px) {
    .text-container{
        width: 62%;
    }
    .ashok-chakra.bigger-chakra {
        width: 125px;
        height: 125px;
    }
}
  
@media screen and (max-width: 431px) {
    .text-container{
        width: 100%;
    }
    .clock {
        font-size: 1.6rem;
    }
    .digit-container {
        width: 25px;
        height: 40px;
    }
    .digit {
        top: 0px;
    }
    .ashok-chakra.bigger-chakra {
        width: 141.5px;
        height: 140.5px;
    }
}


Javascript




// script.js
  
// Countdown timer code 
let newYearDate = new Date('25 Jan, 2024, 23:59:59');
let currentDate = new Date();
let milliDiff = newYearDate.getTime() - 
                    currentDate.getTime();
let remDays=0, remHours=0, 
remMinutes=0, remSeconds=0;
const countDown = () => {
    const newYearDate = new Date('25 Jan, 2024, 23:59:59');
    const currentDate = new Date();
    const milliDiff = newYearDate.getTime() - 
                        currentDate.getTime();
    const totalSeconds = Math.floor(milliDiff / 1000);
    const totalMinutes = Math.floor(totalSeconds / 60);
    totalHours = Math.floor(totalMinutes / 60);
    remSeconds = totalSeconds % 60;
    remMinutes = totalMinutes % 60;
    remDays = Math.floor(totalHours / 24);
    remHours = totalHours % 24;
      
    second1.innerHTML = Math.floor(remSeconds/10);
    second2.innerHTML = Math.floor(remSeconds%10);
    minute1.innerHTML = Math.floor(remMinutes/10);
    minute2.innerHTML = Math.floor(remMinutes%10);
    hour1.innerHTML = Math.floor(remHours/10);
    hour2.innerHTML = Math.floor(remHours%10);
    day1.innerHTML = Math.floor(remDays/10);
    day2.innerHTML = Math.floor(remDays%10);
}
let myInterval = setInterval(countDown, 1000);
  
// Replacing countdown time to current time
setTimeout(()=>{
    clearInterval(myInterval);
    countdown.style.display = "none";
    startRainingFlower()
    slideFlag();
}, milliDiff);
  
// Animating countdown
let lastDays = 0, lastHours = 0, 
lastMinutes = 0, lastSeconds = 0;
function updateClock() {
    slideTimerDigit
      ('day1', Math.floor(remDays/10), 
    Math.floor(lastDays/10));
    slideTimerDigit
    ('day2', Math.floor(remDays%10), 
    Math.floor(lastDays%10));
    slideTimerDigit
    ('hour1', Math.floor(remHours/10), 
    Math.floor(lastHours/10));
    slideTimerDigit
    ('hour2', Math.floor(remHours%10), 
    Math.floor(lastHours%10));
    slideTimerDigit
    ('minute1', Math.floor(remMinutes/10), 
    Math.floor(lastMinutes/10));
    slideTimerDigit
    ('minute2', Math.floor(remMinutes%10), 
    Math.floor(lastMinutes%10));
    slideTimerDigit
    ('second1', Math.floor(remSeconds/10), 
    Math.floor(lastSeconds/10));
    slideTimerDigit
    ('second2', Math.floor(remSeconds%10), 
    Math.floor(lastSeconds%10));
  
    lastDays = remDays;
    lastHours = remHours;
    lastMinutes = remMinutes;
    lastSeconds = remSeconds;
  
    setTimeout(updateClock, 1000);
}
  
// Timer digits Slider
function slideTimerDigit(id, value, lastValue) {
    const digit = document.getElementById(id);
    if (value !== lastValue) {
        digit.style.transform = 'translateY(-100%)';
        digit.style.opacity = '0';
        setTimeout(() => {
            digit.style.transform = 'translateY(0)';
            digit.textContent = value;
            digit.style.opacity = '1';
        }, 300);
    }
}
updateClock();
  
// Opening card by sliding flag animation
const slideFlag = () =>{
    ourFlag.classList.add('slideFlag');
}
  
// Flower's rain code
function startRainingFlower() {
    const canvasWidth = ourCard.offsetWidth;
    const canvasHeight = ourCard.offsetHeight;
    const canvas = 
    document.getElementById('rainingFlowerCanvas');
    canvas.width = canvasWidth;
    canvas.height = canvasHeight;
  
    const ctx = canvas.getContext('2d');
  
    const flowers = [];
    const numberOfFlowers = 100;
    const petalColors = 
    ['#FF671F', '#fff', '#046A38'];
  
    function newFlower() {
      this.x = canvas.width * Math.random();
      this.y = 
      canvas.height * Math.random() - canvas.height;
      this.rotation = Math.random() * 360;
      this.petalColor = petalColors
      [Math.floor(Math.random() * petalColors.length)];
      this.centerColor = petalColors
      [Math.floor(Math.random() * petalColors.length)];
      this.petalSize = Math.random() * 10 + 3;
      this.centerSize = this.petalSize / 3;
      this.speed = this.petalSize/2;
      this.rise = 0;
      this.angle = 0;
    }
  
    for (let i = 0; i < numberOfFlowers; i++) {
      flowers.push(new newFlower());
    }
  
    function changeFlower(flower) {
      flower.rotation += 0.5;
      flower.angle += 0.01;
      flower.rise += 0.5;
      flower.y += flower.speed;
      flower.x += 
      Math.sin(flower.angle) - 0.5 + Math.random();
  
      if (flower.y >= canvas.height + 20) {
        flower.y = -20;
        flower.x = Math.random() * canvas.width;
      }
    }
  
    function drawFlower(flower) {
      // Draw flower petals
      for (let i = 0; i < 6; i++) {
        const angle = (i * Math.PI) / 3;
        const petalX = 
        flower.x + Math.cos(angle) * flower.petalSize;
        const petalY = 
        flower.y + Math.sin(angle) * flower.petalSize;
  
        ctx.beginPath();
        ctx.lineWidth = flower.petalSize / 4;
        ctx.strokeStyle = flower.petalColor;
        ctx.moveTo(petalX + flower.petalSize / 4, petalY);
        ctx.lineTo(petalX, petalY + flower.petalSize / 4);
        ctx.stroke();
        ctx.closePath();
      }
  
      // Draw flower center
      ctx.beginPath();
      ctx.arc
      (flower.x, flower.y, flower.centerSize, 
      0, 2 * Math.PI, false);
      ctx.fillStyle = flower.centerColor;
      ctx.fill();
      ctx.closePath();
    }
  
    function animateFlowerConfetti() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
  
      flowers.forEach(flower => {
        changeFlower(flower);
        drawFlower(flower);
      });
  
      requestAnimationFrame(animateFlowerConfetti);
    }
  
    animateFlowerConfetti();
  }


Output:

republicDayCardGIF



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads