Build a modern Podcast website using HTML, CSS, and JavaScript. Get a free Podcast template with code, easy steps, and tips for a clean, responsive design.
Table of Contents
If you want to create a beautiful and modern podcast website, you donβt always need WordPress or paid tools. In this guide, we will show you how to make a podcast website template using HTML, CSS, and JavaScript β no complex frameworks required.
This tutorial is perfect for beginners who want to learn by doing. At the end, youβll have a fully responsive, clean, and modern podcast website template that you can customize and use for your own shows.
Prerequisites
Before you start, make sure you have:
- Basic knowledge of HTML, CSS, and JavaScript
- A code editor (like VSCode or Sublime Text)
- A browser (like Chrome) to test your work
- (Optional) Basic knowledge of Flexbox or CSS Grid for layout
Source Code
Step 1 (HTML Code):
First, we will start with HTML. Here we will create the layout of the website. It will have:
- A header
- Hero section
- Featured podcasts
- Latest episodes
- Categories
- Newsletter sign-up
- Footer
What to do:
Copy the HTML code below and paste it into your index.html file.
Step 2 (CSS Code):
Next, we will move to CSS. With CSS, we will modernize and clean up the website.
What to do:
Copy the CSS code below and paste it into your styles.css 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);
}
.block {
display: block;
}
/* 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 {
font-family: var(--font-family);
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 {
font-family: var(--font-family);
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 {
font-family: var(--font-family);
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 {
font-family: var(--font-family);
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-200);
}
.btn-text {
font-family: var(--font-family);
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-200);
}
/* 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;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: var(--spacing-2);
padding: var(--spacing-2) var(--spacing-4);
background-color: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-full);
font-size: var(--font-size-sm);
font-weight: 500;
margin-bottom: var(--spacing-6);
backdrop-filter: blur(12px);
}
.status-dot {
width: 8px;
height: 8px;
background-color: var(--accent-green);
border-radius: 50%;
animation: pulse 2s infinite;
}
.hero-title {
font-size: var(--font-size-5xl);
font-weight: 700;
line-height: 1.1;
margin-bottom: var(--spacing-6);
}
.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);
}
.hero-stats {
display: flex;
gap: var(--spacing-8);
}
.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);
}
.hero-right {
padding-top: 10px;
animation: slideInRight 0.8s ease-out;
}
.featured-card {
position: relative;
background-color: var(--bg-secondary);
backdrop-filter: blur(12px);
border: 1px solid var(--border);
border-radius: var(--radius-2xl);
padding: var(--spacing-8);
box-shadow: 0 20px 40px var(--shadow-lg);
transition: var(--transition);
}
.featured-card:hover {
transform: translateY(-4px);
box-shadow: 0 25px 50px var(--shadow-lg);
}
.featured-badges {
display: flex;
gap: var(--spacing-3);
margin-bottom: var(--spacing-6);
}
.badge {
padding: var(--spacing-1) var(--spacing-3);
border-radius: var(--radius-full);
font-size: var(--font-size-xs);
font-weight: 500;
}
.badge-featured {
background: linear-gradient(135deg, var(--accent-green), #9fd89f);
color: white;
}
.badge-latest {
background-color: var(--bg-primary);
border: 1px solid var(--border);
color: var(--text-secondary);
}
.featured-image {
position: relative;
/* aspect-ratio: 1; */
border-radius: var(--radius-xl);
overflow: hidden;
margin-bottom: var(--spacing-6);
cursor: pointer;
}
.featured-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition);
}
.featured-image:hover img {
transform: scale(1.1);
}
.play-button {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
width: 64px;
height: 64px;
border: none;
border-radius: 50%;
background-color: rgba(255, 255, 255, 0.9);
font-size: var(--font-size-xl);
cursor: pointer;
transition: var(--transition);
backdrop-filter: blur(12px);
}
.featured-image:hover .play-button,
.podcast-image:hover .play-button,
.episode-image:hover .play-button {
transform: translate(-50%, -50%) scale(1);
}
.featured-content h3 {
font-size: var(--font-size-xl);
font-weight: 700;
margin-bottom: var(--spacing-3);
line-height: 1.4;
}
.featured-content p {
color: var(--text-secondary);
margin-bottom: var(--spacing-4);
line-height: 1.5;
}
.featured-meta {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: var(--spacing-4);
border-top: 1px solid var(--border);
}
.featured-meta span {
font-size: var(--font-size-sm);
color: var(--text-muted);
}
.hero-audio-visualizer {
display: flex;
align-items: end;
height: 40px;
gap: 2px;
}
.glass-effect {
background-color: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(12px);
border: 1px solid var(--border);
position: absolute;
bottom: -16px;
right: -16px;
border-radius: 16px;
padding: 16px;
}
.audio-bar {
width: 3px;
background: linear-gradient(to top, #9557ff, #667eea);
border-radius: 2px;
animation: audioBar 1.5s ease-in-out infinite;
}
.audio-bar:nth-child(2) {
animation-delay: 0.1s;
}
.audio-bar:nth-child(3) {
animation-delay: 0.2s;
}
.audio-bar:nth-child(4) {
animation-delay: 0.3s;
}
.audio-bar:nth-child(5) {
animation-delay: 0.4s;
}
@keyframes audioBar {
0%,
100% {
height: 5px;
}
50% {
height: 25px;
}
}
/* Sections */
.section {
padding: var(--spacing-16) 0;
}
.section-header {
text-align: center;
margin-bottom: var(--spacing-16);
animation: fadeInUp 0.8s ease-out;
}
.section-header-carousel {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 48px;
}
.section-badge {
display: inline-block;
padding: var(--spacing-2) var(--spacing-4);
background-color: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-full);
font-size: var(--font-size-sm);
font-weight: 500;
margin-bottom: var(--spacing-4);
}
.section-title {
font-size: var(--font-size-4xl);
font-weight: 700;
margin-bottom: var(--spacing-4);
line-height: 1.2;
}
.section-description {
font-size: var(--font-size-lg);
color: var(--text-secondary);
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
}
.section-footer {
text-align: center;
margin-top: var(--spacing-12);
}
/* Podcasts Grid */
.podcasts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: var(--spacing-8);
}
.podcast-card {
background-color: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
padding: var(--spacing-6);
transition: var(--transition);
cursor: pointer;
}
.podcast-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px var(--shadow-lg);
}
.podcast-image {
position: relative;
aspect-ratio: 1;
border-radius: var(--radius-lg);
overflow: hidden;
margin-bottom: var(--spacing-4);
}
.podcast-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition);
}
.podcast-card:hover .podcast-image img {
transform: scale(1.1);
}
.podcast-category {
position: absolute;
top: var(--spacing-3);
left: var(--spacing-3);
padding: var(--spacing-1) var(--spacing-3);
background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
color: white;
border-radius: var(--radius-full);
font-size: var(--font-size-xs);
font-weight: 500;
}
.podcast-content h3 {
font-size: var(--font-size-lg);
font-weight: 700;
margin-bottom: var(--spacing-1);
}
.podcast-author {
font-size: var(--font-size-sm);
color: var(--text-muted);
margin-bottom: var(--spacing-2);
}
.podcast-description {
font-size: var(--font-size-sm);
color: var(--text-secondary);
margin-bottom: var(--spacing-3);
line-height: 1.5;
}
.podcast-meta {
display: flex;
justify-content: space-between;
align-items: center;
font-size: var(--font-size-xs);
color: var(--text-muted);
margin-bottom: var(--spacing-4);
}
.podcast-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: var(--spacing-3);
border-top: 1px solid var(--border);
}
/* Episodes Carousel */
.episodes-section {
background: linear-gradient(to bottom, transparent, var(--bg-secondary));
}
.episodes-carousel {
overflow: hidden;
border-radius: var(--radius-xl);
}
.episodes-track {
display: flex;
transition: transform 0.5s ease;
gap: var(--spacing-6);
}
.episode-card {
flex: 0 0 calc(33.333% - var(--spacing-4));
background-color: var(--bg-primary);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
padding: var(--spacing-6);
transition: var(--transition);
}
.episode-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px var(--shadow-lg);
}
.episode-image {
position: relative;
aspect-ratio: 4/3;
border-radius: var(--radius-lg);
overflow: hidden;
margin-bottom: var(--spacing-4);
cursor: pointer;
}
.episode-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition);
}
.episode-card:hover .episode-image img {
transform: scale(1.1);
}
.episode-new {
position: absolute;
top: var(--spacing-3);
left: var(--spacing-3);
padding: var(--spacing-1) var(--spacing-3);
background: linear-gradient(135deg, var(--accent-green), #9fd89f);
color: white;
border-radius: var(--radius-full);
font-size: var(--font-size-xs);
font-weight: 500;
}
.episode-content h3 {
font-size: var(--font-size-base);
font-weight: 600;
margin-bottom: var(--spacing-2);
line-height: 1.4;
}
.episode-description {
font-size: var(--font-size-sm);
color: var(--text-secondary);
margin-bottom: var(--spacing-3);
line-height: 1.5;
}
.episode-meta {
display: flex;
justify-content: space-between;
font-size: var(--font-size-xs);
color: var(--text-muted);
margin-bottom: var(--spacing-4);
}
.carousel-controls {
display: flex;
gap: var(--spacing-2);
}
.carousel-btn {
width: 40px;
height: 40px;
border: 1px solid var(--border);
background-color: var(--bg-primary);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: var(--transition);
font-size: var(--font-size-lg);
}
.carousel-btn:hover {
background-color: var(--bg-secondary);
}
.carousel-btn:disabled {
opacity: 0.8;
cursor: not-allowed;
}
.carousel-dots {
display: flex;
justify-content: center;
gap: var(--spacing-2);
margin-top: var(--spacing-8);
}
.carousel-dot {
width: 8px;
height: 8px;
border-radius: 9999px;
background-color: var(--text-muted);
cursor: pointer;
transition: var(--transition);
border: none;
outline: none;
}
.carousel-dot.active {
background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
width: 24px;
}
/* Categories Grid */
.categories-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: var(--spacing-6);
}
.category-card {
background-color: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
padding: var(--spacing-6);
text-align: center;
transition: var(--transition);
cursor: pointer;
}
.category-card:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px var(--shadow-lg);
}
.category-icon {
width: 64px;
height: 64px;
margin: 0 auto var(--spacing-4);
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--font-size-2xl);
transition: var(--transition);
}
.category-card:hover .category-icon {
transform: scale(1.1);
}
.category-name {
font-weight: 600;
margin-bottom: var(--spacing-2);
transition: var(--transition);
}
.category-card:hover .category-name {
color: var(--primary-600);
}
.category-count {
font-size: var(--font-size-sm);
color: var(--text-muted);
margin-bottom: var(--spacing-4);
}
.category-progress {
width: 100%;
height: 4px;
background-color: var(--border);
border-radius: var(--radius-full);
overflow: hidden;
}
.category-progress-fill {
height: 100%;
transform: scaleX(0);
transform-origin: left;
transition: transform 0.5s ease;
}
.category-card:hover .category-progress-fill {
transform: scaleX(1);
}
/* Newsletter */
.newsletter-section {
background: linear-gradient(135deg,
rgba(159, 181, 255, 0.05),
rgba(215, 148, 255, 0.05));
}
.newsletter-card {
background-color: var(--bg-secondary);
backdrop-filter: blur(12px);
border: 1px solid var(--border);
border-radius: var(--radius-2xl);
padding: var(--spacing-12);
text-align: center;
box-shadow: 0 20px 40px var(--shadow-lg);
}
.newsletter-content {
max-width: 600px;
margin: 0 auto;
}
.newsletter-form {
display: flex;
gap: var(--spacing-4);
max-width: 400px;
margin: var(--spacing-8) auto;
}
.newsletter-input {
font-family: var(--font-family);
flex: 1;
padding: var(--spacing-3) var(--spacing-2);
background-color: var(--bg-primary);
border: 1px solid var(--border);
border-radius: var(--radius-full);
font-size: var(--font-size-base);
color: var(--text-primary);
transition: var(--transition);
}
.newsletter-input:focus {
outline: none;
border-color: var(--primary-400);
box-shadow: 0 0 0 3px rgba(159, 181, 255, 0.1);
}
.newsletter-features {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: var(--spacing-6);
margin-top: var(--spacing-8);
}
.feature {
display: flex;
align-items: center;
gap: var(--spacing-2);
font-size: var(--font-size-sm);
color: var(--text-secondary);
}
.feature-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.feature-dot.green {
background-color: var(--accent-green);
}
.feature-dot.blue {
background-color: var(--accent-blue);
}
.feature-dot.purple {
background-color: var(--accent-purple);
}
.feature-dot.pink {
background-color: var(--accent-pink);
}
/* 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-200);
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 {
font-size: 0.875rem;
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 {
font-size: 0.875rem;
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-title {
font-size: var(--font-size-3xl);
}
.hero-buttons {
flex-direction: column;
align-items: center;
}
.hero-stats {
justify-content: center;
}
.podcasts-grid {
grid-template-columns: 1fr;
}
.episode-card {
flex: 0 0 100%;
}
.categories-grid {
grid-template-columns: repeat(2, 1fr);
}
.newsletter-form {
flex-direction: column;
}
.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;
}
}
@media (max-width: 480px) {
.hero-title {
font-size: var(--font-size-2xl);
}
.section-title {
font-size: var(--font-size-2xl);
}
.categories-grid {
grid-template-columns: 1fr;
}
.newsletter-features {
flex-direction: column;
align-items: center;
}
}
.section-wrapper {
padding-top: 32px;
padding-bottom: 32px;
border-top: 1px solid var(--border);
}
.section-inner {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
gap: 16px;
}
@media (min-width: 768px) {
.section-inner {
flex-direction: row;
gap: 0;
}
}
.section-text p {
font-size: 0.875rem;
color: var(--text-secondary);
}
.subscribe-button {
font-family: var(--font-family);
background: linear-gradient(to right, #7C3AED, #DB2777);
color: #fff;
padding: 0.7rem 1rem;
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 500;
transition: background 0.3s ease;
}
.subscribe-button:hover {
background: linear-gradient(to right, #6D28D9, #BE185D);
} Step 3 (JavaScript Code):
In this final step, we will use JavaScript to add important functions that will make your podcast website work nicely. These functions will handle things like showing mock podcasts, episodes, and interactive features such as a toast message or an audio player.
What to do:
Copy the JavaScript code below and paste it into your script.js file.
const mockPodcasts = [
{
id: 1,
title: "Tech Innovators",
description: "Exploring the latest in technology and innovation with industry leaders.",
image: "https://images.unsplash.com/photo-1478737270239-2f02b77fc618?w=400",
category: "Technology",
episodes: 45,
subscribers: "125K",
rating: 4.8,
author: "Sarah Chen",
duration: "35 min avg"
},
{
id: 2,
title: "Mindful Moments",
description: "Daily meditation and mindfulness practices for busy professionals.",
image: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400",
category: "Health & Wellness",
episodes: 78,
subscribers: "89K",
rating: 4.9,
author: "Dr. Michael Park",
duration: "15 min avg"
},
{
id: 3,
title: "Creative Minds",
description: "Conversations with artists, designers, and creative professionals.",
image: "https://images.unsplash.com/photo-1541961017774-22349e4a1262?w=400",
category: "Arts & Culture",
episodes: 62,
subscribers: "67K",
rating: 4.7,
author: "Emma Rodriguez",
duration: "42 min avg"
},
{
id: 4,
title: "Business Breakthrough",
description: "Strategies and insights from successful entrepreneurs and business leaders.",
image: "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400",
category: "Business",
episodes: 93,
subscribers: "156K",
rating: 4.6,
author: "James Wilson",
duration: "48 min avg"
},
{
id: 5,
title: "Science Spotlight",
description: "Making complex scientific discoveries accessible to everyone.",
image: "https://images.unsplash.com/photo-1532094349884-543bc11b234d?w=400",
category: "Science",
episodes: 34,
subscribers: "78K",
rating: 4.8,
author: "Dr. Lisa Thompson",
duration: "38 min avg"
},
{
id: 6,
title: "Storyteller's Corner",
description: "Immersive storytelling experiences from around the world.",
image: "https://images.unsplash.com/photo-1544716278-ca5e3f4abd8c?w=400",
category: "Entertainment",
episodes: 51,
subscribers: "94K",
rating: 4.9,
author: "Maria Garcia",
duration: "28 min avg"
}
];
const mockEpisodes = [
{
id: 1,
podcastId: 1,
title: "The Future of AI in Everyday Life",
description: "How artificial intelligence is transforming our daily experiences.",
duration: "42:15",
publishDate: "2024-01-15",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1485827404703-89b55fcc595e?w=400",
plays: "12.5K",
isNew: true
},
{
id: 2,
podcastId: 2,
title: "5-Minute Morning Meditation",
description: "Start your day with clarity and intention through guided meditation.",
duration: "05:32",
publishDate: "2024-01-14",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1545389336-cf090694435e?w=400",
plays: "8.9K",
isNew: true
},
{
id: 3,
podcastId: 3,
title: "Digital Art Revolution",
description: "Exploring how technology is changing the art world forever.",
duration: "38:22",
publishDate: "2024-01-13",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1541961017774-22349e4a1262?w=400",
plays: "15.2K",
isNew: false
},
{
id: 4,
podcastId: 4,
title: "Building a Startup from Scratch",
description: "Real stories and practical advice from successful entrepreneurs.",
duration: "51:08",
publishDate: "2024-01-12",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1553484771-371a605b060b?w=400",
plays: "22.1K",
isNew: false
},
{
id: 5,
podcastId: 5,
title: "Climate Science Updates",
description: "Latest research and findings in climate science and environmental protection.",
duration: "33:45",
publishDate: "2024-01-11",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1532094349884-543bc11b234d?w=400",
plays: "9.8K",
isNew: false
},
{
id: 6,
podcastId: 6,
title: "Myths and Legends",
description: "Ancient stories retold for the modern world with expert analysis.",
duration: "29:17",
publishDate: "2024-01-10",
audioUrl: "https://www.soundjay.com/misc/sounds/beep-07.mp3",
image: "https://images.unsplash.com/photo-1544716278-ca5e3f4abd8c?w=400",
plays: "18.2K",
isNew: false
}
];
const categories = [
{ name: "Technology", count: 156, color: "linear-gradient(135deg, #b3d9ff, #9fb5ff)", icon: "π»" },
{ name: "Health & Wellness", count: 89, color: "linear-gradient(135deg, #b8e6b8, #9fd89f)", icon: "π§" },
{ name: "Business", count: 234, color: "linear-gradient(135deg, #ffd4b3, #ffb399)", icon: "πΌ" },
{ name: "Arts & Culture", count: 67, color: "linear-gradient(135deg, #ffb3d9, #ff99cc)", icon: "π¨" },
{ name: "Science", count: 98, color: "linear-gradient(135deg, #b3ffff, #99f2f2)", icon: "π¬" },
{ name: "Entertainment", count: 178, color: "linear-gradient(135deg, #d4b3ff, #c299ff)", icon: "π" },
{ name: "Education", count: 143, color: "linear-gradient(135deg, #fff2b3, #ffe599)", icon: "π" },
{ name: "News & Politics", count: 87, color: "linear-gradient(135deg, #d9d9d9, #cccccc)", icon: "π°" }
];
// Global variables
let currentEpisodeIndex = 0;
let isPlaying = false;
let currentAudio = null;
let episodeCarouselIndex = 0;
// DOM elements
const themeToggle = document.getElementById('themeToggle');
const mobileMenuToggle = document.getElementById('mobileMenuToggle');
const mobileMenu = document.getElementById('mobileMenu');
const scrollToTop = document.getElementById('scrollToTop');
const audioPlayer = document.getElementById('audioPlayer');
const audioElement = document.getElementById('audioElement');
const newsletterForm = document.getElementById('newsletterForm');
const toast = document.getElementById('toast');
const header = document.getElementById('header');
// Initialize the application
document.addEventListener('DOMContentLoaded', function() {
initializeTheme();
setupEventListeners();
populatePodcasts();
populateEpisodes();
populateCategories();
setupScrollAnimations();
setupCarousel();
setupAudioPlayer();
});
// Theme Management
function initializeTheme() {
const savedTheme = localStorage.getItem('theme');
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const shouldBeDark = savedTheme ? savedTheme === 'dark' : prefersDark;
if (shouldBeDark) {
document.body.classList.add('dark-theme');
themeToggle.textContent = 'βοΈ';
} else {
document.body.classList.remove('dark-theme');
themeToggle.textContent = 'π';
}
}
function toggleTheme() {
const isDark = document.body.classList.contains('dark-theme');
if (isDark) {
document.body.classList.remove('dark-theme');
themeToggle.textContent = 'π';
localStorage.setItem('theme', 'light');
} else {
document.body.classList.add('dark-theme');
themeToggle.textContent = 'βοΈ';
localStorage.setItem('theme', 'dark');
}
}
// Event Listeners
function setupEventListeners() {
// Theme toggle
themeToggle.addEventListener('click', toggleTheme);
// Mobile menu
mobileMenuToggle.addEventListener('click', toggleMobileMenu);
// Scroll to top
scrollToTop.addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// Header scroll effect
window.addEventListener('scroll', handleScroll);
// Newsletter form
newsletterForm.addEventListener('submit', handleNewsletterSubmit);
// Smooth scroll for navigation links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({ behavior: 'smooth' });
if (mobileMenu.classList.contains('show')) {
toggleMobileMenu();
}
}
});
});
}
function toggleMobileMenu() {
mobileMenu.classList.toggle('show');
}
function handleScroll() {
const scrollY = window.scrollY;
// Header scroll effect
if (scrollY > 20) {
header.classList.add('scrolled');
} else {
header.classList.remove('scrolled');
}
// Scroll to top button
if (scrollY > 300) {
scrollToTop.classList.add('show');
} else {
scrollToTop.classList.remove('show');
}
}
// Newsletter
function handleNewsletterSubmit(e) {
e.preventDefault();
const email = document.getElementById('emailInput').value;
if (!email) {
showToast('Please enter your email address', 'error');
return;
}
if (!isValidEmail(email)) {
showToast('Please enter a valid email address', 'error');
return;
}
// Simulate API call
showToast('Subscribing...', 'info');
setTimeout(() => {
showToast('Successfully subscribed! π', 'success');
document.getElementById('emailInput').value = '';
}, 1000);
}
function isValidEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
function showToast(message, type = 'info') {
const toastMessage = document.getElementById('toastMessage');
toastMessage.textContent = message;
toast.classList.add('show');
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
}
// Content Population
function populatePodcasts() {
const podcastsGrid = document.getElementById('podcastsGrid');
mockPodcasts.forEach((podcast, index) => {
const podcastCard = createPodcastCard(podcast);
podcastCard.style.animationDelay = `${index * 0.1}s`;
podcastsGrid.appendChild(podcastCard);
});
}
function createPodcastCard(podcast) {
const card = document.createElement('div');
card.className = 'podcast-card';
card.innerHTML = `
<div class="podcast-image">
<img src="${podcast.image}" alt="${podcast.title}" loading="lazy">
<div class="podcast-category">${podcast.category}</div>
<button class="play-button" data-episode="${podcast.id - 1}">βΆοΈ</button>
</div>
<div class="podcast-content">
<h3>${podcast.title}</h3>
<p class="podcast-author">by ${podcast.author}</p>
<p class="podcast-description">${podcast.description}</p>
<div class="podcast-meta">
<span>${podcast.episodes} episodes β’ ${podcast.duration}</span>
<span>β ${podcast.rating}</span>
</div>
<div class="podcast-footer">
<span>${podcast.subscribers} subscribers</span>
<button class="btn-text" data-episode="${podcast.id - 1}">Listen</button>
</div>
</div>
`;
// Add event listeners for play buttons
const playButtons = card.querySelectorAll('[data-episode]');
playButtons.forEach(button => {
button.addEventListener('click', (e) => {
e.stopPropagation();
const episodeId = parseInt(button.dataset.episode);
playEpisode(mockEpisodes[episodeId]);
});
});
return card;
}
function populateEpisodes() {
const episodesTrack = document.getElementById('episodesTrack');
mockEpisodes.forEach((episode, index) => {
const episodeCard = createEpisodeCard(episode);
episodeCard.style.animationDelay = `${index * 0.1}s`;
episodesTrack.appendChild(episodeCard);
});
setupCarouselDots();
}
function createEpisodeCard(episode) {
const card = document.createElement('div');
card.className = 'episode-card';
const publishDate = new Date(episode.publishDate).toLocaleDateString('en-US', {
month: 'short',
day: 'numeric'
});
card.innerHTML = `
<div class="episode-image">
<img src="${episode.image}" alt="${episode.title}" loading="lazy">
${episode.isNew ? '<div class="episode-new">New</div>' : ''}
<button class="play-button" data-episode-id="${episode.id}">βΆοΈ</button>
</div>
<div class="episode-content">
<h3>${episode.title}</h3>
<p class="episode-description">${episode.description}</p>
<div class="episode-meta">
<span>${publishDate} β’ ${episode.duration}</span>
<span>${episode.plays} plays</span>
</div>
<button class="btn btn-secondary" data-episode-id="${episode.id}">
βΆοΈ Play Episode
</button>
</div>
`;
// Add event listeners for play buttons
const playButtons = card.querySelectorAll('[data-episode-id]');
playButtons.forEach(button => {
button.addEventListener('click', (e) => {
e.stopPropagation();
playEpisode(episode);
});
});
return card;
}
function populateCategories() {
const categoriesGrid = document.getElementById('categoriesGrid');
categories.forEach((category, index) => {
const categoryCard = createCategoryCard(category);
categoryCard.style.animationDelay = `${index * 0.1}s`;
categoriesGrid.appendChild(categoryCard);
});
}
function createCategoryCard(category) {
const card = document.createElement('div');
card.className = 'category-card';
card.innerHTML = `
<div class="category-icon" style="background: ${category.color}">${category.icon}</div>
<h3 class="category-name">${category.name}</h3>
<p class="category-count">${category.count} podcasts</p>
<div class="category-progress">
<div class="category-progress-fill" style="background: ${category.color}"></div>
</div>
`;
return card;
}
// Episodes Carousel
function setupCarousel() {
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
prevBtn.addEventListener('click', () => moveCarousel(-1));
nextBtn.addEventListener('click', () => moveCarousel(1));
updateCarouselButtons();
}
function setupCarouselDots() {
const carouselDots = document.getElementById('carouselDots');
const maxIndex = Math.max(0, mockEpisodes.length - 3);
for (let i = 0; i <= maxIndex; i++) {
const dot = document.createElement('button');
dot.className = 'carousel-dot';
if (i === 0) dot.classList.add('active');
dot.addEventListener('click', () => {
episodeCarouselIndex = i;
updateCarousel();
updateCarouselDots();
updateCarouselButtons();
});
carouselDots.appendChild(dot);
}
}
function moveCarousel(direction) {
const maxIndex = Math.max(0, mockEpisodes.length - 3);
episodeCarouselIndex += direction;
if (episodeCarouselIndex < 0) episodeCarouselIndex = 0;
if (episodeCarouselIndex > maxIndex) episodeCarouselIndex = maxIndex;
updateCarousel();
updateCarouselDots();
updateCarouselButtons();
}
function updateCarousel() {
const episodesTrack = document.getElementById('episodesTrack');
const translateX = -(episodeCarouselIndex * (100 / 3));
episodesTrack.style.transform = `translateX(${translateX}%)`;
}
function updateCarouselDots() {
const dots = document.querySelectorAll('.carousel-dot');
dots.forEach((dot, index) => {
dot.classList.toggle('active', index === episodeCarouselIndex);
});
}
function updateCarouselButtons() {
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const maxIndex = Math.max(0, mockEpisodes.length - 3);
prevBtn.disabled = episodeCarouselIndex === 0;
nextBtn.disabled = episodeCarouselIndex >= maxIndex;
}
// Audio Player
function setupAudioPlayer() {
const playPauseBtn = document.getElementById('playPauseBtn');
const closePlayerBtn = document.getElementById('closePlayerBtn');
const progressSlider = document.getElementById('progressSlider');
const volumeSlider = document.getElementById('volumeSlider');
const volumeBtn = document.getElementById('volumeBtn');
playPauseBtn.addEventListener('click', togglePlayPause);
closePlayerBtn.addEventListener('click', closePlayer);
progressSlider.addEventListener('input', seekAudio);
volumeSlider.addEventListener('input', changeVolume);
volumeBtn.addEventListener('click', toggleMute);
audioElement.addEventListener('timeupdate', updateProgress);
audioElement.addEventListener('loadedmetadata', updateDuration);
audioElement.addEventListener('ended', () => {
isPlaying = false;
updatePlayButton();
});
// Setup audio visualizer
setupAudioVisualizer();
}
function playEpisode(episode) {
currentAudio = episode;
isPlaying = true;
// Update player UI
document.getElementById('playerImage').src = episode.image;
document.getElementById('playerTitle').textContent = episode.title;
document.getElementById('playerDescription').textContent = episode.description;
// Load and play audio
audioElement.src = episode.audioUrl;
audioElement.play();
// Show player
audioPlayer.classList.add('show');
audioPlayer.style.display = 'block';
updatePlayButton();
updateVisualizer();
}
function togglePlayPause() {
if (isPlaying) {
audioElement.pause();
isPlaying = false;
} else {
audioElement.play();
isPlaying = true;
}
updatePlayButton();
updateVisualizer();
}
function updatePlayButton() {
const playPauseBtn = document.getElementById('playPauseBtn');
playPauseBtn.textContent = isPlaying ? 'βΈοΈ' : 'βΆοΈ';
}
function closePlayer() {
audioPlayer.classList.remove('show');
setTimeout(() => {
audioPlayer.style.display = 'none';
audioElement.pause();
audioElement.src = '';
isPlaying = false;
currentAudio = null;
}, 300);
}
function seekAudio() {
const progressSlider = document.getElementById('progressSlider');
const seekTime = (progressSlider.value / 100) * audioElement.duration;
audioElement.currentTime = seekTime;
}
function changeVolume() {
const volumeSlider = document.getElementById('volumeSlider');
audioElement.volume = volumeSlider.value / 100;
const volumeBtn = document.getElementById('volumeBtn');
volumeBtn.textContent = volumeSlider.value > 0 ? 'π' : 'π';
}
function toggleMute() {
const volumeSlider = document.getElementById('volumeSlider');
const volumeBtn = document.getElementById('volumeBtn');
if (audioElement.volume > 0) {
audioElement.volume = 0;
volumeSlider.value = 0;
volumeBtn.textContent = 'π';
} else {
audioElement.volume = 0.8;
volumeSlider.value = 80;
volumeBtn.textContent = 'π';
}
}
function updateProgress() {
const progressSlider = document.getElementById('progressSlider');
const progressFill = document.getElementById('progressFill');
const currentTimeSpan = document.getElementById('currentTime');
const progress = (audioElement.currentTime / audioElement.duration) * 100;
progressSlider.value = progress || 0;
progressFill.style.width = `${progress || 0}%`;
currentTimeSpan.textContent = formatTime(audioElement.currentTime);
}
function updateDuration() {
const durationSpan = document.getElementById('duration');
durationSpan.textContent = formatTime(audioElement.duration);
}
function formatTime(seconds) {
if (isNaN(seconds)) return '0:00';
const minutes = Math.floor(seconds / 60);
const remainingSeconds = Math.floor(seconds % 60);
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
}
function setupAudioVisualizer() {
const visualizer = document.getElementById('audioVisualizer');
// Create visualizer bars
for (let i = 0; i < 20; i++) {
const bar = document.createElement('div');
bar.className = 'visualizer-bar';
bar.style.animationDelay = `${i * 0.1}s`;
visualizer.appendChild(bar);
}
}
function updateVisualizer() {
const visualizerBars = document.querySelectorAll('.visualizer-bar');
visualizerBars.forEach((bar, index) => {
if (isPlaying) {
const height = Math.random() * 20 + 5;
bar.style.height = `${height}px`;
bar.style.animationPlayState = 'running';
} else {
bar.style.height = '5px';
bar.style.animationPlayState = 'paused';
}
});
}
// Scroll Animations
function setupScrollAnimations() {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe all animated elements
const animatedElements = document.querySelectorAll('.podcast-card, .episode-card, .category-card, .section-header');
animatedElements.forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(50px)';
el.style.transition = 'opacity 0.8s ease-out, transform 0.8s ease-out';
observer.observe(el);
});
}
// Utility Functions
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// Auto-update visualizer when playing
setInterval(() => {
if (isPlaying) {
updateVisualizer();
}
}, 100);Final Output:
Conclusion:
Creating a podcast website template using HTML, CSS, and JavaScript is easier than you might think. With simple code and a bit of creativity, you can build a modern, fast, and clean site that works seamlessly on all devices.
This guide gives you the foundation β feel free to add features like social sharing buttons, episode filters, or even integrate podcast APIs as your next steps.
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 π


