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.
Table of Contents
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:
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 π


