Modern UI Download Button & Progress Card

A glowing download widget with live download progress simulation, transfer speed metrics, ETA countdown, and file details.

Difficulty: Beginner Est. Time: 20 mins Vanilla JS (ES6+) Includes HTML, CSS, JS & README (.ZIP)
Live UI Runner

Modern UI Download Button & Progress Card

live-sandbox://animated-download-card

1. Project Overview & Features

The Modern UI Download Button & Progress Card is an essential frontend project designed to help you bridge the gap between learning JavaScript syntax and building interactive, responsive web applications.

Key Features Implemented:

  • File metadata card: Archive package icon, filename (Modern_UI_Template.zip), and 150 MB size
  • Interactive glowing gradient Download button: linear-gradient(90deg, #06b6d4, #2563eb)
  • Live progress bar with neon blue-to-purple gradient track (0% to 100%)
  • Real-time metrics: Remaining MB (19.5 MB), Status (Downloading...), Speed (5.40 MB/s), Time left (13 sec)
  • Completed download notification with open file / reset actions

2. Step-by-Step Code Walkthrough

A Step 1: Semantic HTML Structure

We structure the interface using clean, semantic HTML elements. This ensures maximum accessibility and provides intuitive hooks for CSS classes and JavaScript query selectors.

HTML (index.html)
<div class="download-card">
  <!-- File Header Info -->
  <div class="file-header">
    <div class="file-icon-box">
      <i class="fas fa-box-open"></i>
    </div>
    <div class="file-info">
      <h3 class="file-name">Modern_UI_Template.zip</h3>
      <span class="file-size" id="file-size-label">150 MB</span>
    </div>
  </div>

  <!-- Animated Progress Track -->
  <div class="progress-section">
    <div class="progress-bar-track">
      <div class="progress-bar-fill" id="progress-fill"></div>
    </div>
    <div class="progress-metrics-top">
      <span class="percent-label" id="percent-label">0%</span>
      <span class="speed-label" id="speed-label">0.00 MB/s</span>
    </div>
  </div>

  <!-- Metric Stats Grid -->
  <div class="metrics-grid">
    <div class="metric-box">
      <span class="m-label">Remaining</span>
      <span class="m-value" id="remaining-mb">150.0 MB</span>
    </div>
    <div class="metric-box">
      <span class="m-label">Status</span>
      <span class="m-value status-active" id="status-label">Ready</span>
    </div>
    <div class="metric-box">
      <span class="m-label">Time</span>
      <span class="m-value" id="time-remaining">-- sec</span>
    </div>
  </div>

  <!-- Action Button -->
  <button id="download-btn" class="btn-download-action">
    <i class="fas fa-arrow-down" id="btn-icon"></i>
    <span id="btn-label">Download File</span>
  </button>
</div>

B Step 2: Styling & Responsive CSS

Modern CSS flexbox and grid layouts are used to make the UI look polished, centered, and responsive across desktop, tablet, and mobile screens.

CSS (style.css)
* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
body {
  background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 50%, #0f172a 100%);
  color: #f8fafc;
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
}
.download-card {
  background: rgba(15, 23, 42, 0.85);
  backdrop-filter: blur(20px);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 28px;
  padding: 28px;
  width: 100%;
  max-width: 420px;
  box-shadow: 0 25px 50px -10px rgba(0, 0, 0, 0.5), 0 0 30px rgba(6, 182, 212, 0.15);
}

/* File Header */
.file-header {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-bottom: 24px;
}
.file-icon-box {
  width: 60px;
  height: 60px;
  background: rgba(245, 158, 11, 0.18);
  border: 1px solid rgba(245, 158, 11, 0.35);
  border-radius: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.8rem;
  color: #f59e0b;
}
.file-name {
  font-size: 1.15rem;
  font-weight: 700;
  color: #ffffff;
  margin-bottom: 2px;
}
.file-size {
  color: #94a3b8;
  font-size: 0.85rem;
  font-weight: 600;
}

/* Progress Track */
.progress-section {
  margin-bottom: 20px;
}
.progress-bar-track {
  background: rgba(255, 255, 255, 0.08);
  height: 10px;
  border-radius: 10px;
  overflow: hidden;
  margin-bottom: 10px;
}
.progress-bar-fill {
  height: 100%;
  width: 0%;
  background: linear-gradient(90deg, #10b981 0%, #06b6d4 50%, #8b5cf6 100%);
  border-radius: 10px;
  transition: width 0.15s linear;
  box-shadow: 0 0 12px rgba(6, 182, 212, 0.6);
}
.progress-metrics-top {
  display: flex;
  justify-content: space-between;
  font-size: 0.85rem;
  font-weight: 700;
}
.percent-label { color: #f8fafc; }
.speed-label { color: #38bdf8; font-family: monospace; }

/* Metrics Grid */
.metrics-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  margin-bottom: 24px;
}
.metric-box {
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: 14px;
  padding: 12px 8px;
  text-align: center;
}
.m-label {
  display: block;
  color: #94a3b8;
  font-size: 0.72rem;
  font-weight: 600;
  margin-bottom: 4px;
  text-transform: uppercase;
}
.m-value {
  font-size: 0.95rem;
  font-weight: 800;
  color: #f8fafc;
}
.m-value.status-active { color: #38bdf8; }

/* Download Action Button */
.btn-download-action {
  width: 100%;
  background: linear-gradient(90deg, #06b6d4 0%, #2563eb 100%);
  color: #ffffff;
  border: none;
  padding: 16px;
  border-radius: 50px;
  font-size: 1.05rem;
  font-weight: 700;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  transition: all 0.3s ease;
  box-shadow: 0 10px 25px -5px rgba(6, 182, 212, 0.4);
}
.btn-download-action:hover {
  transform: translateY(-2px);
  box-shadow: 0 15px 30px -5px rgba(6, 182, 212, 0.6);
}
.btn-download-action.completed {
  background: #10b981;
  box-shadow: 0 10px 25px -5px rgba(16, 185, 129, 0.4);
}

C Step 3: JavaScript Logic & Event Handling

Here is the complete JavaScript code handling the state, event listeners, mathematical logic, and dynamic DOM rendering:

JavaScript (script.js)
const totalSizeMB = 150;
let downloadedMB = 0;
let isDownloading = false;
let downloadTimer = null;

const btn = document.getElementById('download-btn');
const btnIcon = document.getElementById('btn-icon');
const btnLabel = document.getElementById('btn-label');
const progressFill = document.getElementById('progress-fill');
const percentLabel = document.getElementById('percent-label');
const speedLabel = document.getElementById('speed-label');
const remainingMB = document.getElementById('remaining-mb');
const statusLabel = document.getElementById('status-label');
const timeRemaining = document.getElementById('time-remaining');

btn.addEventListener('click', () => {
  if (isDownloading) {
    // Cancel or Pause
    clearInterval(downloadTimer);
    isDownloading = false;
    statusLabel.textContent = 'Paused';
    statusLabel.style.color = '#f59e0b';
    btnLabel.textContent = 'Resume Download';
    btnIcon.className = 'fas fa-play';
    return;
  }

  if (downloadedMB >= totalSizeMB) {
    // Reset
    downloadedMB = 0;
    progressFill.style.width = '0%';
    percentLabel.textContent = '0%';
    remainingMB.textContent = '150.0 MB';
    speedLabel.textContent = '0.00 MB/s';
    timeRemaining.textContent = '-- sec';
    statusLabel.textContent = 'Ready';
    statusLabel.style.color = '#38bdf8';
    btn.classList.remove('completed');
    btnLabel.textContent = 'Download File';
    btnIcon.className = 'fas fa-arrow-down';
    return;
  }

  // Start Download Simulation
  isDownloading = true;
  statusLabel.textContent = 'Downloading';
  statusLabel.style.color = '#38bdf8';
  btnLabel.textContent = 'Pause Download';
  btnIcon.className = 'fas fa-pause';

  downloadTimer = setInterval(() => {
    // Simulated varying transfer speed (4.8 to 6.2 MB/s)
    const speed = (Math.random() * 1.4 + 4.8);
    const step = speed * 0.2; // 200ms tick
    downloadedMB += step;

    if (downloadedMB >= totalSizeMB) {
      downloadedMB = totalSizeMB;
      clearInterval(downloadTimer);
      isDownloading = false;
      
      progressFill.style.width = '100%';
      percentLabel.textContent = '100%';
      remainingMB.textContent = '0.0 MB';
      speedLabel.textContent = '0.00 MB/s';
      timeRemaining.textContent = '0 sec';
      statusLabel.textContent = 'Completed';
      statusLabel.style.color = '#10b981';

      btn.classList.add('completed');
      btnLabel.textContent = 'Open Modern_UI_Template.zip';
      btnIcon.className = 'fas fa-check';
      return;
    }

    const pct = Math.round((downloadedMB / totalSizeMB) * 100);
    const leftMB = (totalSizeMB - downloadedMB).toFixed(1);
    const secLeft = Math.ceil((totalSizeMB - downloadedMB) / speed);

    progressFill.style.width = `${pct}%`;
    percentLabel.textContent = `${pct}%`;
    speedLabel.textContent = `${speed.toFixed(2)} MB/s`;
    remainingMB.textContent = `${leftMB} MB`;
    timeRemaining.textContent = `${secLeft} sec`;
  }, 200);
});

3. Core JavaScript Concepts You Learned

Interval Animation Physics

Crucial concept utilized to power the dynamic state, user interactions, and styling of this project.

Dynamic Linear Gradient Progress Bars

Crucial concept utilized to power the dynamic state, user interactions, and styling of this project.

Transfer Speed Math & Time Estimations

Crucial concept utilized to power the dynamic state, user interactions, and styling of this project.

State Machine (Ready, Downloading, Complete)

Crucial concept utilized to power the dynamic state, user interactions, and styling of this project.

4. How to Run Locally on Your Computer

  1. Download the project ZIP: Click the Download Project (.ZIP) button at the top or in the live runner to save animated-download-card-project.zip.
  2. Extract the archive: Unzip the downloaded file. Inside you will find separate index.html, style.css, script.js, index-standalone.html, and a comprehensive README.md.
  3. Open in any browser: Simply double-click index.html (or index-standalone.html) to open and test immediately in Chrome, Firefox, Safari, or Edge.
  4. Edit in Visual Studio Code: Open the extracted folder in VS Code. Right-click index.html and select "Open with Live Server" to enjoy instant live reloading as you modify HTML, CSS, or JS!

Bonus Challenges for Learners

Ready to level up? Try adding these extra features on your own:

  • Add sound effects or audio feedback for user button clicks.
  • Add custom theme color customizer with CSS variables.
  • Export the results to PDF or copy as a formatted text summary.

Other Beginner Projects You Might Like

AnimatedBeginner20 mins
UI & Animations

Interactive Animated Login Form

A playful animated login form with an interactive mascot avatar that tracks your typing and covers its eyes on password input.

DOM Focus & Blur EventsCSS Transform & TransitionsPassword Peek Toggle+2
AnimatedBeginner25 mins
UI & Animations

Light Switch & Lamp Turn On Login Form

A dramatic interactive login page with a 3D hanging lamp and pull cord that turns on the spotlight to illuminate the dark room.

Dynamic CSS Conical Gradients & GlowWeb Audio Synthesis (Click SFX)DOM State & Class Transitions+2
AnimatedBeginner20 mins
UI & Animations

Folding Paper Plane Subscribe Animation

A creative subscribe button animation where clicking Send folds the button into an origami paper airplane that flies away.

CSS 3D Transforms & KeyframesSVG Origami 3D Facet FoldsMulti-Stage State Machine (Input βž” Folding βž” Sending βž” Subscribed)+2