Create Podcast Episode Page using HTML & CSS

Faraz

By Faraz -

Learn how to create a responsive podcast episode page using HTML and CSS. Step-by-step guide for beginners to get started with podcast web pages.


create-podcast-episode-page-using-html-and-css.webp

Table of Contents

  1. Project Introduction
  2. HTML Code
  3. CSS Code
  4. JavaScript Code
  5. Conclusion
  6. Preview

If you want to share your podcast episodes online with a clean and simple webpage, HTML and CSS can help you do it easily β€” even if you're just starting out.

Creating a podcast episode page allows you to showcase the episode title, player, description, and share links, all in one place. This helps your audience listen to your show directly from your website.

Let’s walk you through how to create a podcast episode page using just HTML and CSS. No complex coding or JavaScript is needed β€” just a basic understanding of HTML and CSS is enough.

Prerequisites:

Before you start, make sure you have:

  • A basic knowledge of HTML and CSS
  • Any code editor like VS Code, Sublime Text, or Notepad++
  • A browser to preview your page (like Chrome or Firefox)
  • An audio file URL or podcast embed link (optional for demo)

Source Code

Step 1 (HTML Code):

We’ll start with HTML, which builds the basic layout of your webpage. It helps us show the title, audio player, description, and links.

Open your code editor and create a new file called index.html.

Paste the below HTML code into that file:

Step 2 (CSS Code):

Now that the layout is ready, let’s move to CSS to make your page look modern and clean.

Create a new file called styles.css.

Paste the below CSS code into that file:

:root {
    /* Soft Color Palette */
    --primary-50: #f8f9ff;
    --primary-100: #f0f2ff;
    --primary-200: #e6eaff;
    --primary-300: #d1d9ff;
    --primary-400: #b8c7ff;
    --primary-500: #9fb5ff;
    --primary-600: #607dd7;
    --primary-700: #7591e6;
    --primary-800: #607dd7;
    --primary-900: #4b69c8;

    /* Soft Secondary Colors */
    --secondary-50: #fdf8ff;
    --secondary-100: #faf0ff;
    --secondary-200: #f5e6ff;
    --secondary-300: #edd1ff;
    --secondary-400: #e2b3ff;
    --secondary-500: #d794ff;
    --secondary-600: #cb75f0;
    --secondary-700: #be56e0;
    --secondary-800: #b137d1;
    --secondary-900: #a418c2;

    /* Soft Accent Colors */
    --accent-green: #16A34A;
    --accent-blue: #b3d9ff;
    --accent-purple: #d4b3ff;
    --accent-pink: #ffb3d9;
    --accent-yellow: #fff2b3;
    --accent-orange: #ffd4b3;

    /* Neutral Soft Colors */
    --gray-50: #fafbfc;
    --gray-100: #f2f4f7;
    --gray-200: #e8ecf0;
    --gray-300: #d1d8e0;
    --gray-400: #b8c4d0;
    --gray-500: #6B7280;
    --gray-600: #869db0;
    --gray-700: #6d8aa0;
    --gray-800: #547790;
    --gray-900: #3b6480;

    /* Light Theme */
    --bg-primary: #ffffff;
    --bg-secondary: var(--gray-50);
    --bg-accent: var(--primary-50);
    --text-primary: #111827;
    --text-secondary: #4B5563;
    --text-muted: var(--gray-500);
    --border: #D1D5DB;
    --shadow: rgba(159, 181, 255, 0.1);
    --shadow-lg: rgba(159, 181, 255, 0.15);

    /* Typography */
    --font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
    --font-size-xs: 0.75rem;
    --font-size-sm: 0.875rem;
    --font-size-base: 1rem;
    --font-size-lg: 1.125rem;
    --font-size-xl: 1.25rem;
    --font-size-2xl: 1.5rem;
    --font-size-3xl: 1.875rem;
    --font-size-4xl: 2.25rem;
    --font-size-5xl: 3rem;

    /* Spacing */
    --spacing-1: 0.25rem;
    --spacing-2: 0.5rem;
    --spacing-3: 0.75rem;
    --spacing-4: 1rem;
    --spacing-5: 1.25rem;
    --spacing-6: 1.5rem;
    --spacing-8: 2rem;
    --spacing-10: 2.5rem;
    --spacing-12: 3rem;
    --spacing-16: 4rem;
    --spacing-20: 5rem;
    --spacing-24: 6rem;

    /* Border Radius */
    --radius-sm: 0.375rem;
    --radius-md: 0.5rem;
    --radius-lg: 0.75rem;
    --radius-xl: 1rem;
    --radius-2xl: 1.5rem;
    --radius-full: 9999px;

    /* Transitions */
    --transition: all 0.3s ease;
    --transition-fast: all 0.15s ease;
    --transition-slow: all 0.5s ease;
}

/* Dark Theme */
.dark-theme {
    --bg-primary: #1a1d29;
    --bg-secondary: #242938;
    --bg-accent: #2d3348;
    --text-primary: #f0f2ff;
    --text-secondary: #b8c7ff;
    --text-muted: #869db0;
    --border: #3d4357;
    --shadow: rgba(0, 0, 0, 0.2);
    --shadow-lg: rgba(0, 0, 0, 0.3);
}

/* Reset and Base Styles */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
}

body {
  font-family: var(--font-family);
  background-color: var(--bg-primary);
  color: var(--text-primary);
  line-height: 1.6;
  transition: var(--transition);
}

/* Container */
.container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 var(--spacing-6);
}

/* Header */
.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  background-color: rgba(255, 255, 255, 0.8);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--border);
  transition: var(--transition);
}

.dark-theme .header {
  background-color: rgba(26, 29, 41, 0.8);
}

.header.scrolled {
  box-shadow: 0 4px 20px var(--shadow-lg);
}

.header-content {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 70px;
}

.logo {
  display: flex;
  align-items: center;
  gap: var(--spacing-3);
  text-decoration: none;
}

.logo-icon {
  width: 40px;
  height: 40px;
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  border-radius: var(--radius-xl);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.2rem;
}

.logo-text {
  font-size: var(--font-size-xl);
  font-weight: 700;
  background: linear-gradient(135deg, var(--primary-600), var(--secondary-600));
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.nav-desktop {
  display: flex;
  gap: var(--spacing-8);
}

.nav-link {
  text-decoration: none;
  color: var(--text-secondary);
  font-weight: 500;
  padding: var(--spacing-2) 0;
  position: relative;
  transition: var(--transition);
}

.nav-link:hover {
  color: var(--text-primary);
}

.nav-link::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 2px;
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  transition: var(--transition);
}

.nav-link:hover::after {
  width: 100%;
}

.search-container {
  position: relative;
  flex: 1;
  max-width: 400px;
  margin: 0 var(--spacing-8);
}

.search-input {
  width: 100%;
  padding: var(--spacing-3) var(--spacing-4) var(--spacing-3) var(--spacing-10);
  background-color: var(--bg-secondary);
  border: 1px solid var(--border);
  border-radius: var(--radius-full);
  font-size: var(--font-size-sm);
  color: var(--text-primary);
  transition: var(--transition);
}

.search-input:focus {
  outline: none;
  border-color: var(--primary-400);
  box-shadow: 0 0 0 3px rgba(159, 181, 255, 0.1);
}

.search-icon {
  position: absolute;
  left: var(--spacing-4);
  top: 50%;
  transform: translateY(-50%);
  color: var(--text-muted);
}

.header-actions {
  display: flex;
  align-items: center;
  gap: var(--spacing-2);
}

.btn-icon {
  width: 40px;
  height: 40px;
  border: none;
  background: none;
  border-radius: var(--radius-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: var(--transition);
  position: relative;
}

.btn-icon:hover {
  background-color: var(--bg-secondary);
}

.notification-dot {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 8px;
  height: 8px;
  background-color: #ff6b6b;
  border-radius: 50%;
}

.mobile-menu-toggle {
  display: none;
}

.mobile-menu {
  display: none;
  padding: var(--spacing-4) 0;
  border-top: 1px solid var(--border);
}

.mobile-search {
  margin-bottom: var(--spacing-4);
}

.nav-mobile {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-2);
}

/* Buttons */
.btn {
  padding: var(--spacing-3) var(--spacing-6);
  border: none;
  border-radius: var(--radius-full);
  font-weight: 600;
  font-size: var(--font-size-sm);
  cursor: pointer;
  transition: var(--transition);
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-2);
  text-decoration: none;
}

.btn-primary {
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  color: white;
  box-shadow: 0 4px 15px var(--shadow);
}

.btn-primary:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px var(--shadow-lg);
}

.btn-secondary {
  background-color: transparent;
  color: var(--text-primary);
  border: 1px solid var(--border);
  backdrop-filter: blur(12px);
}

.btn-secondary:hover {
  background-color: var(--bg-secondary);
}

.btn-outline {
  background-color: transparent;
  color: var(--primary-600);
  border: 1px solid var(--primary-300);
}

.btn-outline:hover {
  background-color: var(--primary-50);
}

.btn-text {
  background: none;
  border: none;
  color: var(--primary-600);
  font-weight: 500;
  cursor: pointer;
  padding: var(--spacing-2) var(--spacing-4);
  border-radius: var(--radius-md);
  transition: var(--transition);
}

.btn-text:hover {
  background-color: var(--primary-50);
}

/* Hero Section */
.hero {
  min-height: 100vh;
  display: flex;
  align-items: center;
  position: relative;
  overflow: hidden;
  padding-top: 70px;
}

.hero-bg {
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 50% 50%, 
    rgba(159, 181, 255, 0.1) 0%, 
    rgba(215, 148, 255, 0.05) 25%, 
    transparent 50%);
  animation: float 6s ease-in-out infinite;
}

.hero-content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-12);
  align-items: center;
  width: 100%;
}

.hero-left {
  animation: slideInLeft 0.8s ease-out;
}

.status-dot {
  width: 8px;
  height: 8px;
  background-color: var(--accent-green);
  border-radius: 50%;
  animation: pulse 2s infinite;
}

.gradient-text {
  background: linear-gradient(135deg, var(--primary-600), var(--secondary-600));
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.hero-description {
  font-size: var(--font-size-lg);
  color: var(--text-secondary);
  margin-bottom: var(--spacing-8);
  max-width: 600px;
}

.hero-buttons {
  display: flex;
  gap: var(--spacing-4);
  margin-bottom: var(--spacing-12);
}

.stat {
  text-align: center;
}

.stat-number {
  font-size: var(--font-size-2xl);
  font-weight: 700;
  color: var(--text-primary);
}

.stat-label {
  font-size: var(--font-size-sm);
  color: var(--text-muted);
}

/* Footer */
.footer {
  background: linear-gradient(to top, var(--bg-secondary), var(--bg-primary));
  border-top: 1px solid var(--border);
  padding: var(--spacing-16) 0 var(--spacing-8);
}

.footer-content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--spacing-12);
  margin-bottom: var(--spacing-16);
}

.footer-brand {
  max-width: 400px;
}

.footer-description {
  color: var(--text-secondary);
  margin: var(--spacing-6) 0;
  line-height: 1.6;
}

.social-links {
  display: flex;
  gap: var(--spacing-3);
}

.social-link {
  width: 40px;
  height: 40px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
  transition: var(--transition);
}

.social-link:hover {
  background-color: var(--primary-50);
  border-color: var(--primary-300);
}

.footer-links {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--spacing-8);
}

.footer-column h4 {
  font-weight: 600;
  margin-bottom: var(--spacing-4);
}

.footer-column a {
  display: block;
  color: var(--text-secondary);
  text-decoration: none;
  padding: var(--spacing-1) 0;
  transition: var(--transition);
}

.footer-column a:hover {
  color: var(--text-primary);
}

.footer-bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: var(--spacing-8);
  border-top: 1px solid var(--border);
  font-size: var(--font-size-sm);
  color: var(--text-muted);
}

.footer-legal {
  display: flex;
  gap: var(--spacing-6);
}

.footer-legal a {
  color: var(--text-secondary);
  text-decoration: none;
  transition: var(--transition);
}

.footer-legal a:hover {
  color: var(--text-primary);
}

/* Audio Player */
.audio-player {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  background-color: var(--bg-primary);
  backdrop-filter: blur(12px);
  border-top: 1px solid var(--border);
  box-shadow: 0 -4px 20px var(--shadow-lg);
  transform: translateY(100%);
  transition: var(--transition-slow);
}

.audio-player.show {
  transform: translateY(0);
}

.player-content {
  display: flex;
  align-items: center;
  padding: var(--spacing-4);
  gap: var(--spacing-4);
}

.player-info {
  display: flex;
  align-items: center;
  gap: var(--spacing-3);
  flex-shrink: 0;
  min-width: 0;
}

.player-image {
  width: 56px;
  height: 56px;
  border-radius: var(--radius-lg);
  object-fit: cover;
}

.player-details {
  min-width: 0;
  max-width: 200px;
}

.player-title {
  font-weight: 600;
  font-size: var(--font-size-sm);
  margin-bottom: var(--spacing-1);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.player-description {
  font-size: var(--font-size-xs);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.player-controls {
  flex: 1;
  display: flex;
  align-items: center;
  gap: var(--spacing-3);
  min-width: 0;
}

.player-btn {
  width: 40px;
  height: 40px;
  border: none;
  background: none;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: var(--transition);
  font-size: var(--font-size-lg);
}

.player-btn:hover {
  background-color: var(--bg-secondary);
}

.progress-container {
  flex: 1;
  max-width: 400px;
}

.progress-time {
  display: flex;
  justify-content: center;
  gap: var(--spacing-2);
  font-size: var(--font-size-xs);
  color: var(--text-muted);
  margin-bottom: var(--spacing-2);
}

.progress-bar {
  position: relative;
  width: 100%;
  height: 4px;
  background-color: var(--border);
  border-radius: var(--radius-full);
  overflow: hidden;
}

.progress-fill {
  height: 100%;
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  transition: var(--transition-fast);
}

.progress-slider {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

.player-actions {
  display: flex;
  align-items: center;
  gap: var(--spacing-2);
  flex-shrink: 0;
}

.volume-slider {
  width: 80px;
  height: 4px;
  background-color: var(--border);
  border-radius: var(--radius-full);
  appearance: none;
  cursor: pointer;
}

.volume-slider::-webkit-slider-thumb {
  appearance: none;
  width: 16px;
  height: 16px;
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  border-radius: 50%;
  cursor: pointer;
}

.audio-visualizer {
  display: flex;
  justify-content: center;
  align-items: end;
  height: 40px;
  gap: 2px;
  padding: var(--spacing-4);
}

.visualizer-bar {
  width: 3px;
  background: linear-gradient(to top, var(--primary-500), var(--secondary-500));
  border-radius: var(--radius-sm);
  animation: visualizer 1.5s ease-in-out infinite;
}

/* Scroll to Top */
.scroll-to-top {
  position: fixed;
  bottom: var(--spacing-20);
  right: var(--spacing-6);
  width: 48px;
  height: 48px;
  border: none;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
  color: white;
  font-size: var(--font-size-lg);
  cursor: pointer;
  box-shadow: 0 4px 15px var(--shadow);
  transition: var(--transition);
  transform: scale(0);
  z-index: 999;
}

.scroll-to-top.show {
  transform: scale(1);
}

.scroll-to-top:hover {
  transform: scale(1.1);
  box-shadow: 0 6px 20px var(--shadow-lg);
}

/* Toast */
.toast {
  position: fixed;
  top: var(--spacing-20);
  right: var(--spacing-6);
  padding: var(--spacing-4) var(--spacing-6);
  background-color: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: 0 10px 30px var(--shadow-lg);
  transform: translateX(400px);
  transition: var(--transition-slow);
  z-index: 1001;
}

.toast.show {
  transform: translateX(0);
}

.toast-message {
  font-size: var(--font-size-sm);
  font-weight: 500;
}

/* Animations */
@keyframes float {
  0%, 100% { transform: translateY(0px) rotate(0deg); }
  33% { transform: translateY(-10px) rotate(1deg); }
  66% { transform: translateY(5px) rotate(-1deg); }
}

@keyframes slideInLeft {
  0% { opacity: 0; transform: translateX(-50px); }
  100% { opacity: 1; transform: translateX(0); }
}

@keyframes slideInRight {
  0% { opacity: 0; transform: translateX(50px); }
  100% { opacity: 1; transform: translateX(0); }
}

@keyframes fadeInUp {
  0% { opacity: 0; transform: translateY(30px); }
  100% { opacity: 1; transform: translateY(0); }
}

@keyframes pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

@keyframes visualizer {
  0%, 100% { height: 5px; }
  50% { height: 25px; }
}

/* Responsive Design */
@media (max-width: 768px) {
  .container {
    padding: 0 var(--spacing-4);
  }

  .nav-desktop {
    display: none;
  }

  .search-container {
    display: none;
  }

  .mobile-menu-toggle {
    display: flex;
  }

  .mobile-menu.show {
    display: block;
  }

  .hero-content {
    grid-template-columns: 1fr;
    text-align: center;
  }

  .hero-buttons {
    flex-direction: column;
    align-items: center;
  }

  .podcasts-grid {
    grid-template-columns: 1fr;
  }

  .episode-card {
    flex: 0 0 100%;
  }

  .categories-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .footer-content {
    grid-template-columns: 1fr;
  }

  .footer-links {
    grid-template-columns: 1fr;
  }

  .footer-bottom {
    flex-direction: column;
    gap: var(--spacing-4);
    text-align: center;
  }

  .player-content {
    flex-wrap: wrap;
  }

  .player-actions .volume-slider {
    display: none;
  }
}

/* Episode Page Styles */
.episode-main {
  padding-top: 70px;
  min-height: 100vh;
}

.breadcrumb-section {
  padding: var(--spacing-6) 0 var(--spacing-4);
  background-color: var(--bg-secondary);
  border-bottom: 1px solid var(--border);
}

.breadcrumb {
  display: flex;
  align-items: center;
  gap: var(--spacing-2);
  font-size: var(--font-size-sm);
}

.breadcrumb-link {
  color: var(--text-secondary);
  text-decoration: none;
  transition: var(--transition);
}

.breadcrumb-link:hover {
  color: var(--text-primary);
}

.breadcrumb-separator {
  color: var(--text-muted);
}

.breadcrumb-current {
  color: var(--text-primary);
  font-weight: 500;
}

.episode-hero {
  padding: var(--spacing-12) 0;
  background: linear-gradient(135deg, 
    rgba(159, 181, 255, 0.03), 
    rgba(215, 148, 255, 0.03));
}

.episode-hero-content {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: var(--spacing-12);
  align-items: center;
}

.episode-image-container {
  position: relative;
  aspect-ratio: 1;
  border-radius: var(--radius-2xl);
  overflow: hidden;
  box-shadow: 0 20px 40px var(--shadow-lg);
}

.episode-hero-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: var(--transition);
}

.episode-play-button {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80px;
  height: 80px;
  border: none;
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.95);
  font-size: var(--font-size-2xl);
  cursor: pointer;
  transition: var(--transition);
  backdrop-filter: blur(12px);
  box-shadow: 0 8px 25px var(--shadow);
}

.episode-play-button:hover {
  transform: translate(-50%, -50%) scale(1.1);
  background-color: white;
}

.episode-badges {
  display: flex;
  gap: var(--spacing-3);
  margin-bottom: var(--spacing-4);
}

.episode-badge {
  padding: var(--spacing-1) var(--spacing-3);
  border-radius: var(--radius-full);
  font-size: var(--font-size-xs);
  font-weight: 500;
}

.episode-badge.featured {
  background: linear-gradient(135deg, var(--accent-green), #9fd89f);
  color: white;
}

.episode-badge.new {
  background-color: var(--bg-secondary);
  border: 1px solid var(--border);
  color: var(--text-secondary);
}

.episode-title {
  font-size: var(--font-size-4xl);
  font-weight: 700;
  line-height: 1.2;
  margin-bottom: var(--spacing-4);
  background: linear-gradient(135deg, var(--primary-600), var(--secondary-600));
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.episode-subtitle {
  font-size: var(--font-size-lg);
  color: var(--text-secondary);
  margin-bottom: var(--spacing-8);
  line-height: 1.6;
}

.episode-meta {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--spacing-4);
  margin-bottom: var(--spacing-8);
  padding: var(--spacing-6);
  background-color: var(--bg-secondary);
  border-radius: var(--radius-xl);
  border: 1px solid var(--border);
}

.episode-meta-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.meta-label {
  font-size: var(--font-size-sm);
  color: var(--text-muted);
  font-weight: 500;
}

.meta-value {
  font-size: var(--font-size-sm);
  color: var(--text-primary);
  font-weight: 600;
}

.episode-actions {
  display: flex;
  gap: var(--spacing-4);
  flex-wrap: wrap;
}

.episode-content-section {
  padding: var(--spacing-16) 0;
}

.episode-layout {
  display: grid;
  grid-template-columns: 1fr 350px;
  gap: var(--spacing-12);
}

.episode-main-content {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-8);
}

.content-card {
  background-color: var(--bg-secondary);
  border: 1px solid var(--border);
  border-radius: var(--radius-xl);
  padding: var(--spacing-8);
}

.content-title {
  font-size: var(--font-size-xl);
  font-weight: 700;
  margin-bottom: var(--spacing-6);
  color: var(--text-primary);
}

.episode-description {
  line-height: 1.7;
  color: var(--text-secondary);
}

.episode-description p {
  margin-bottom: var(--spacing-4);
}

.episode-description h3 {
  font-size: var(--font-size-lg);
  font-weight: 600;
  color: var(--text-primary);
  margin: var(--spacing-6) 0 var(--spacing-3);
}

.episode-description ul {
  list-style: none;
  padding-left: 0;
  margin: var(--spacing-4) 0;
}

.episode-description li {
  position: relative;
  padding-left: var(--spacing-6);
  margin-bottom: var(--spacing-2);
}

.episode-description li::before {
  content: 'β€’';
  position: absolute;
  left: 0;
  color: var(--primary-500);
  font-weight: bold;
}

.guests-grid {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-6);
}

.guest-card {
  display: flex;
  gap: var(--spacing-4);
  padding: var(--spacing-4);
  background-color: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  transition: var(--transition);
}

.guest-card:hover {
  box-shadow: 0 4px 15px var(--shadow);
}

.guest-avatar {
  width: 80px;
  height: 80px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
}

.guest-info {
  flex: 1;
}

.guest-name {
  font-size: var(--font-size-lg);
  font-weight: 600;
  margin-bottom: var(--spacing-1);
}

.guest-role {
  font-size: var(--font-size-sm);
  color: var(--primary-600);
  font-weight: 500;
  margin-bottom: var(--spacing-2);
}

.guest-bio {
  font-size: var(--font-size-sm);
  color: var(--text-secondary);
  line-height: 1.5;
}

.timestamps-list {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-3);
}

.timestamp-item {
  display: flex;
  align-items: center;
  gap: var(--spacing-4);
  padding: var(--spacing-3);
  background-color: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  transition: var(--transition);
}

.timestamp-item:hover {
  background-color: var(--bg-accent);
}

.timestamp-link {
  background: none;
  border: none;
  color: var(--primary-600);
  font-weight: 600;
  font-size: var(--font-size-sm);
  cursor: pointer;
  padding: var(--spacing-1) var(--spacing-3);
  border-radius: var(--radius-md);
  transition: var(--transition);
  min-width: 60px;
  text-align: left;
}

.timestamp-link:hover {
  background-color: var(--primary-50);
}

.timestamp-description {
  font-size: var(--font-size-sm);
  color: var(--text-secondary);
  flex: 1;
}

.episode-sidebar {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-6);
  height: fit-content;
  position: sticky;
  top: calc(70px + var(--spacing-6));
}

.sidebar-card {
  background-color: var(--bg-secondary);
  border: 1px solid var(--border);
  border-radius: var(--radius-xl);
  padding: var(--spacing-6);
}

.sidebar-title {
  font-size: var(--font-size-lg);
  font-weight: 600;
  margin-bottom: var(--spacing-4);
  color: var(--text-primary);
}

.podcast-info {
  text-align: center;
}

.podcast-cover {
  width: 120px;
  height: 120px;
  border-radius: var(--radius-xl);
  object-fit: cover;
  margin: 0 auto var(--spacing-4);
}

.podcast-name {
  font-size: var(--font-size-lg);
  font-weight: 600;
  margin-bottom: var(--spacing-2);
}

.podcast-description {
  font-size: var(--font-size-sm);
  color: var(--text-secondary);
  margin-bottom: var(--spacing-4);
  line-height: 1.5;
}

.podcast-stats {
  display: flex;
  justify-content: center;
  gap: var(--spacing-8);
  margin-bottom: var(--spacing-6);
}

.btn-small {
  padding: var(--spacing-2) var(--spacing-4);
  font-size: var(--font-size-sm);
}

.btn-full {
  width: 100%;
}

.related-episodes {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-4);
}

.related-episode {
  display: flex;
  gap: var(--spacing-3);
  padding: var(--spacing-3);
  background-color: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  transition: var(--transition);
}

.related-episode:hover {
  box-shadow: 0 4px 15px var(--shadow);
}

.related-episode-image {
  width: 60px;
  height: 60px;
  border-radius: var(--radius-lg);
  object-fit: cover;
  flex-shrink: 0;
}

.related-episode-content {
  flex: 1;
  min-width: 0;
}

.related-episode-title {
  font-size: var(--font-size-sm);
  font-weight: 600;
  margin-bottom: var(--spacing-1);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.related-episode-meta {
  font-size: var(--font-size-xs);
  color: var(--text-muted);
  margin-bottom: var(--spacing-2);
}

.sidebar-description {
  font-size: var(--font-size-sm);
  color: var(--text-secondary);
  margin-bottom: var(--spacing-4);
  line-height: 1.5;
}

.sidebar-form {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-3);
}

.sidebar-input {
  width: 100%;
  padding: var(--spacing-3) var(--spacing-4);
  background-color: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  font-size: var(--font-size-sm);
  color: var(--text-primary);
  transition: var(--transition);
}

.sidebar-input:focus {
  outline: none;
  border-color: var(--primary-400);
  box-shadow: 0 0 0 3px rgba(159, 181, 255, 0.1);
}

/* Episode Page Responsive */
@media (max-width: 1024px) {
  .episode-layout {
    grid-template-columns: 1fr;
    gap: var(--spacing-8);
  }
  
  .episode-sidebar {
    position: static;
    top: auto;
  }
}

@media (max-width: 768px) {
  .episode-hero-content {
    grid-template-columns: 1fr;
    text-align: center;
    gap: var(--spacing-8);
  }
  
  .episode-title {
    font-size: var(--font-size-2xl);
  }
  
  .episode-meta {
    grid-template-columns: 1fr;
  }
  
  .episode-actions {
    justify-content: center;
  }
  
  .guests-grid {
    gap: var(--spacing-4);
  }
  
  .guest-card {
    flex-direction: column;
    text-align: center;
  }
  
  .guest-avatar {
    align-self: center;
  }
}

@media (max-width: 480px) {
  .episode-hero {
    padding: var(--spacing-8) 0;
  }
  
  .episode-title {
    font-size: var(--font-size-xl);
  }
  
  .episode-actions {
    flex-direction: column;
  }
  
  .episode-play-button {
    width: 60px;
    height: 60px;
    font-size: var(--font-size-lg);
  }
} 

Step 3 (JavaScript Code):

Now it’s time for the final step. We’ll use JavaScript to add extra functions like showing a message when the episode plays.

Create a new file called script.js.

Paste the below JavaScript code into that file:

document.addEventListener('DOMContentLoaded', function() {
    // Theme Toggle
    const themeToggle = document.getElementById('themeToggle');
    const body = document.body;
    const currentTheme = localStorage.getItem('theme') || 'light-theme';

    body.classList.add(currentTheme);
    themeToggle.textContent = currentTheme === 'light-theme' ? 'β˜€οΈ' : 'πŸŒ™';

    themeToggle.addEventListener('click', () => {
        if (body.classList.contains('light-theme')) {
            body.classList.replace('light-theme', 'dark-theme');
            themeToggle.textContent = 'πŸŒ™';
            localStorage.setItem('theme', 'dark-theme');
        } else {
            body.classList.replace('dark-theme', 'light-theme');
            themeToggle.textContent = 'β˜€οΈ';
            localStorage.setItem('theme', 'light-theme');
        }
    });

    // Header Scroll Effect
    const header = document.getElementById('header');
    window.addEventListener('scroll', () => {
        if (window.scrollY > 50) {
            header.classList.add('scrolled');
        } else {
            header.classList.remove('scrolled');
        }
    });

    // Mobile Menu
    const mobileMenuToggle = document.getElementById('mobileMenuToggle');
    const mobileMenu = document.getElementById('mobileMenu');

    mobileMenuToggle.addEventListener('click', () => {
        mobileMenu.classList.toggle('show');
    });

    // Scroll to Top Button
    const scrollToTop = document.getElementById('scrollToTop');

    window.addEventListener('scroll', () => {
        if (window.scrollY > 300) {
            scrollToTop.classList.add('show');
        } else {
            scrollToTop.classList.remove('show');
        }
    });

    scrollToTop.addEventListener('click', () => {
        window.scrollTo({
            top: 0,
            behavior: 'smooth'
        });
    });

    // Toast Notification
    function showToast(message) {
        const toast = document.getElementById('toast');
        const toastMessage = document.getElementById('toastMessage');

        toastMessage.textContent = message;
        toast.classList.add('show');

        setTimeout(() => {
            toast.classList.remove('show');
        }, 3000);
    }

    // Newsletter Form
    const newsletterForm = document.getElementById('newsletterForm');

    newsletterForm.addEventListener('submit', function(event) {
        event.preventDefault();
        const emailInput = document.getElementById('emailInput');
        const email = emailInput.value;

        if (email) {
            showToast('Thank you for subscribing!');
            newsletterForm.reset();
        } else {
            showToast('Please enter a valid email address.');
        }
    });

    // Audio Player
    const audioElement = document.getElementById('audioElement');
    const playPauseBtn = document.getElementById('playPauseBtn');
    const progressContainer = document.querySelector('.progress-container');
    const progressFill = document.getElementById('progressFill');
    const progressSlider = document.getElementById('progressSlider');
    const currentTimeDisplay = document.getElementById('currentTime');
    const durationDisplay = document.getElementById('duration');
    const volumeBtn = document.getElementById('volumeBtn');
    const volumeSlider = document.getElementById('volumeSlider');
    const audioVisualizer = document.getElementById('audioVisualizer');

    // Sample audio source
    audioElement.src = 'https://www.computerhope.com/jargon/m/example.mp3';

    // Play/Pause functionality
    playPauseBtn.addEventListener('click', () => {
        if (audioElement.paused) {
            audioElement.play();
            playPauseBtn.textContent = '⏸️';
            playPauseBtn.dataset.playing = 'true';
        } else {
            audioElement.pause();
            playPauseBtn.textContent = '▢️';
            playPauseBtn.dataset.playing = 'false';
        }
    });

    // Update progress bar
    function updateProgress() {
        const { currentTime, duration } = audioElement;
        const progressPercent = (currentTime / duration) * 100;
        progressFill.style.width = `${progressPercent}%`;
        currentTimeDisplay.textContent = formatTime(currentTime);
    }

    audioElement.addEventListener('timeupdate', updateProgress);

    // Set progress on click
    progressContainer.addEventListener('click', (e) => {
        const width = progressContainer.clientWidth;
        const clickX = e.offsetX;
        const duration = audioElement.duration;
        audioElement.currentTime = (clickX / width) * duration;
        updateProgress();
    });

    // Drag progress slider
    progressSlider.addEventListener('input', () => {
        const seekTime = (progressSlider.value / 100) * audioElement.duration;
        audioElement.currentTime = seekTime;
        updateProgress();
    });

    // Format time
    function formatTime(time) {
        const minutes = Math.floor(time / 60);
        const seconds = Math.floor(time % 60);
        return `${minutes}:${seconds < 10 ? '0' + seconds : seconds}`;
    }

    // Get audio duration on load
    audioElement.addEventListener('loadedmetadata', () => {
        durationDisplay.textContent = formatTime(audioElement.duration);
    });

    // Volume control
    volumeBtn.addEventListener('click', () => {
        if (audioElement.muted) {
            audioElement.muted = false;
            volumeBtn.textContent = 'πŸ”Š';
            volumeSlider.value = audioElement.volume * 100;
        } else {
            audioElement.muted = true;
            volumeBtn.textContent = 'πŸ”‡';
            volumeSlider.value = 0;
        }
    });

    volumeSlider.addEventListener('input', () => {
        audioElement.volume = volumeSlider.value / 100;
        if (audioElement.volume === 0) {
            volumeBtn.textContent = 'πŸ”‡';
        } else {
            volumeBtn.textContent = 'πŸ”Š';
        }
    });

    // Audio Visualizer (Placeholder)
    function createVisualizerBars() {
        const numberOfBars = 32;
        for (let i = 0; i < numberOfBars; i++) {
            const bar = document.createElement('div');
            bar.classList.add('visualizer-bar');
            audioVisualizer.appendChild(bar);
        }
    }

    createVisualizerBars();

    function simulateAudioPlayback() {
        // Simulate audio analysis and visualizer updates
        const visualizerBars = document.querySelectorAll('.visualizer-bar');
        visualizerBars.forEach((bar, index) => {
            const randomHeight = Math.random() * 30; // Random height for simulation
            bar.style.height = `${randomHeight}px`;
        });
    }

    // Featured Card Play Button
    const featuredPlayButton = document.querySelector('.featured-card .play-button');
    if (featuredPlayButton) {
        featuredPlayButton.addEventListener('click', function() {
            const episodeIndex = this.dataset.episode || '0';
            playEpisode(parseInt(episodeIndex));
        });
    }
    // Episode-specific functionality
    initializeEpisodePage();
});

function initializeEpisodePage() {
    // Check if we're on the episode page
    if (!document.querySelector('.episode-main')) return;
    
    // Timestamp navigation
    const timestampLinks = document.querySelectorAll('.timestamp-link');
    timestampLinks.forEach(link => {
        link.addEventListener('click', function() {
            const time = parseInt(this.dataset.time);
            seekToTime(time);
            showToast('Jumped to ' + formatTime(time));
        });
    });
    
    // Episode play buttons
    const episodePlayButtons = document.querySelectorAll('.episode-play-btn, .episode-play-button');
    episodePlayButtons.forEach(button => {
        button.addEventListener('click', function() {
            const episodeIndex = this.dataset.episode || '0';
            playEpisode(parseInt(episodeIndex));
        });
    });
    
    // Sidebar form submission
    const sidebarForm = document.querySelector('.sidebar-form');
    if (sidebarForm) {
        sidebarForm.addEventListener('submit', function(e) {
            e.preventDefault();
            const email = this.querySelector('input[type="email"]').value;
            if (email) {
                showToast('Successfully subscribed to episode updates!');
                this.reset();
            }
        });
    }
    
    // Related episode play buttons
    const relatedPlayButtons = document.querySelectorAll('.related-episode .btn-text');
    relatedPlayButtons.forEach(button => {
        button.addEventListener('click', function() {
            const episodeIndex = this.dataset.episode;
            if (episodeIndex) {
                playEpisode(parseInt(episodeIndex));
            }
        });
    });
}

function seekToTime(seconds) {
    const audioElement = document.getElementById('audioElement');
    if (audioElement && !audioElement.paused) {
        audioElement.currentTime = seconds;
        updateProgress();
    }
}

function formatTime(seconds) {
    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = seconds % 60;
    return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
}

function playEpisode(index) {
    // Get episode data
    const episode = episodesData[index] || episodesData[0];
    
    // Update player UI
    const playerImage = document.getElementById('playerImage');
    const playerTitle = document.getElementById('playerTitle');
    const playerDescription = document.getElementById('playerDescription');
    
    if (playerImage) playerImage.src = episode.image;
    if (playerTitle) playerTitle.textContent = episode.title;
    if (playerDescription) playerDescription.textContent = episode.description;
    
    // Show player
    const audioPlayer = document.getElementById('audioPlayer');
    if (audioPlayer) {
        audioPlayer.style.display = 'block';
        audioPlayer.classList.add('show');
    }
    
    // Update play button state
    const playPauseBtn = document.getElementById('playPauseBtn');
    if (playPauseBtn) {
        playPauseBtn.textContent = '⏸️';
        playPauseBtn.dataset.playing = 'true';
    }
    
    // Show toast
    showToast(`Now playing: ${episode.title}`);
    
    // Start audio (simulated)
    simulateAudioPlayback();
}

// Enhanced episodes data for the episode page
const episodesData = [
    {
        title: "The Future of AI in Everyday Life",
        description: "How artificial intelligence is transforming our daily experiences",
        image: "https://images.unsplash.com/photo-1485827404703-89b55fcc595e?w=400",
        duration: "42:15",
        category: "Technology"
    },
    {
        title: "Blockchain Revolution",
        description: "Understanding the impact of blockchain technology",
        image: "https://images.unsplash.com/photo-1518709268805-4e9042af2176?w=400",
        duration: "38:42",
        category: "Technology"
    },
    {
        title: "Quantum Computing Basics",
        description: "An introduction to quantum computing principles",
        image: "https://images.unsplash.com/photo-1551808525-51a94da548ce?w=400",
        duration: "45:12",
        category: "Science"
    },
    {
        title: "Cybersecurity in 2024",
        description: "Latest trends in cybersecurity and data protection",
        image: "https://images.unsplash.com/photo-1504384308090-c894fdcc538d?w=400",
        duration: "52:30",
        category: "Technology"
    }
];

Final Output:

create-podcast-episode-page-using-html-and-css.gif

Conclusion:

Creating a podcast episode page using just HTML and CSS is a great way to start building your own podcast website. It’s beginner-friendly and doesn't require any complex code or CMS platforms.

This simple design works well for mobile and desktop, and you can customize it further with colors, fonts, or more episodes.

Now that you know how to do it, why wait? Start building your podcast web page today and share your voice with the world!

That’s a wrap!

I hope you enjoyed this post. Now, with these examples, you can create your own amazing page.

Did you like it? Let me know in the comments below πŸ”₯ and you can support me by buying me a coffee

And don’t forget to sign up to our email newsletter so you can get useful content like this sent right to your inbox!

Thanks!
Faraz 😊

End of the article

Subscribe to my Newsletter

Get the latest posts delivered right to your inbox


Latest Components

Please allow ads on our siteπŸ₯Ί