Loading
Create a responsive landing page using only HTML and CSS — no frameworks, no dependencies, just the fundamentals.
You're going to build a complete, responsive landing page for a fictional design studio using nothing but HTML and CSS. No React. No Tailwind. No build tools. Just two files and a browser.
By the end of this tutorial, you'll understand semantic HTML structure, CSS custom properties, flexbox and grid layouts, media queries for responsive design, and how to deploy a static site to Vercel. These fundamentals underpin every framework you'll ever use — understanding them deeply makes you a better developer regardless of your stack.
The finished page includes a navigation bar, hero section, services grid, testimonials carousel (CSS-only), and a footer. It scores 100 on Lighthouse accessibility and performance.
Create a project folder and two files: index.html and styles.css.
Start with proper HTML5 structure. Every element here matters — the lang attribute enables screen readers, the viewport meta tag enables responsive behavior, and the charset ensures special characters render correctly.
Notice the semantic elements: <header>, <nav>, <main>, <footer>. Screen readers use these landmarks to help users navigate the page. The aria-label on the nav distinguishes it from other navigation regions. The role="list" on <ul> restores list semantics that some CSS resets strip away.
Before writing any visual styles, establish a clean baseline. Browser default styles are inconsistent — a reset normalizes behavior across Chrome, Firefox, and Safari.
Custom properties defined on :root act as your design tokens. Change --color-accent in one place and every button, link, and highlight updates simultaneously. This is the same principle behind design systems in larger codebases.
The nav needs to be horizontally centered, spaced between the logo and links, and sticky on scroll.
The backdrop-filter: blur() creates a frosted glass effect. Combined with a semi-transparent background, the nav feels layered without obscuring content beneath it. The sticky position keeps it visible during scroll without JavaScript.
The hero is the first thing visitors see. It needs a strong headline, supporting text, and a call to action.
The clamp() function on the heading creates fluid typography — it scales smoothly between 2.5rem on mobile and 5rem on desktop without a single media query.
A CSS Grid section showcasing what the studio offers. Three columns on desktop, stacking to one on mobile.
The repeat(auto-fit, minmax(280px, 1fr)) pattern is one of the most useful CSS Grid techniques. Cards are at least 280px wide and automatically reflow based on available space. No media query needed.
A horizontally scrollable testimonial strip using CSS scroll snap.
While clamp() and auto-fit handle most responsive behavior, the navigation needs a mobile layout.
Mobile-first means your base styles target small screens. The @media (max-width: 768px) here overrides desktop patterns that need structural changes — the nav stacks vertically, the hero centers its content. Everything else adapts automatically through fluid units.
Your site is two static files — deployment is trivial.
Vercel auto-detects a static site (no package.json or framework config needed). It assigns a URL, provisions HTTPS, and deploys to a global CDN. Your landing page loads in under 200ms from any continent.
For custom domains, run:
To set up continuous deployment, push your project to a GitHub repository and link it in the Vercel dashboard. Every push to main triggers a new deployment automatically.
Open Chrome DevTools, run a Lighthouse audit, and verify your scores. With semantic HTML, no render-blocking JavaScript, and optimized CSS, you should see 100 across Performance, Accessibility, Best Practices, and SEO. That's what building on fundamentals gets you — a perfect score with zero dependencies.
mkdir design-studio && cd design-studio
touch index.html styles.css<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Volta Studio — Digital design for ambitious brands." />
<title>Volta Studio</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<header class="site-header">
<nav class="nav" aria-label="Main navigation">
<a href="/" class="logo">Volta</a>
<ul class="nav-links" role="list">
<li><a href="#services">Services</a></li>
<li><a href="#work">Work</a></li>
<li><a href="#testimonials">Testimonials</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<!-- Sections go here -->
</main>
<footer class="site-footer">
<p>© 2026 Volta Studio. All rights reserved.</p>
</footer>
</body>
</html>*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--color-bg: #0a0a0f;
--color-surface: #12121a;
--color-text: #f0f0f0;
--color-text-muted: #8888a0;
--color-accent: #6366f1;
--color-accent-hover: #818cf8;
--font-body: "DM Sans", system-ui, sans-serif;
--max-width: 1200px;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 2rem;
--spacing-xl: 4rem;
}
html {
scroll-behavior: smooth;
}
body {
font-family: var(--font-body);
background: var(--color-bg);
color: var(--color-text);
line-height: 1.7;
font-size: 16px;
}
a {
color: inherit;
text-decoration: none;
}
img {
max-width: 100%;
display: block;
}.site-header {
position: sticky;
top: 0;
z-index: 100;
background: rgba(10, 10, 15, 0.85);
backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.nav {
max-width: var(--max-width);
margin: 0 auto;
padding: var(--spacing-md) var(--spacing-lg);
display: flex;
align-items: center;
justify-content: space-between;
}
.logo {
font-size: 1.5rem;
font-weight: 700;
letter-spacing: -0.02em;
}
.nav-links {
display: flex;
gap: var(--spacing-lg);
list-style: none;
}
.nav-links a {
font-size: 0.9rem;
color: var(--color-text-muted);
transition: color 200ms ease;
}
.nav-links a:hover {
color: var(--color-text);
}<section class="hero">
<div class="hero-content">
<h1>Design that<br /><span class="accent">drives results</span></h1>
<p>
We craft digital experiences for brands that refuse to blend in. Strategy, design, and
development — end to end.
</p>
<div class="hero-actions">
<a href="#contact" class="btn btn-primary">Start a Project</a>
<a href="#work" class="btn btn-ghost">See Our Work</a>
</div>
</div>
</section>.hero {
min-height: 80vh;
display: flex;
align-items: center;
padding: var(--spacing-xl) var(--spacing-lg);
max-width: var(--max-width);
margin: 0 auto;
}
.hero h1 {
font-size: clamp(2.5rem, 6vw, 5rem);
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.03em;
}
.accent {
color: var(--color-accent);
}
.hero p {
margin-top: var(--spacing-lg);
font-size: 1.15rem;
color: var(--color-text-muted);
max-width: 540px;
line-height: 1.8;
}
.hero-actions {
margin-top: var(--spacing-lg);
display: flex;
gap: var(--spacing-md);
}
.btn {
display: inline-flex;
align-items: center;
padding: 0.85rem 1.75rem;
border-radius: 8px;
font-size: 0.95rem;
font-weight: 500;
transition: all 200ms ease;
}
.btn-primary {
background: var(--color-accent);
color: white;
}
.btn-primary:hover {
background: var(--color-accent-hover);
}
.btn-ghost {
border: 1px solid rgba(255, 255, 255, 0.15);
color: var(--color-text-muted);
}
.btn-ghost:hover {
border-color: rgba(255, 255, 255, 0.3);
color: var(--color-text);
}<section id="services" class="services">
<h2 class="section-title">What We Do</h2>
<div class="services-grid">
<article class="service-card">
<h3>Brand Strategy</h3>
<p>
Market research, positioning, and brand architecture that gives you an unfair advantage.
</p>
</article>
<article class="service-card">
<h3>UI/UX Design</h3>
<p>
Interfaces that feel intuitive on day one. User-tested, pixel-refined, conversion-optimized.
</p>
</article>
<article class="service-card">
<h3>Development</h3>
<p>Production-grade code. Next.js, React Native, and custom backends that scale with you.</p>
</article>
</div>
</section>.services {
padding: var(--spacing-xl) var(--spacing-lg);
max-width: var(--max-width);
margin: 0 auto;
}
.section-title {
font-size: 2rem;
font-weight: 600;
margin-bottom: var(--spacing-xl);
}
.services-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: var(--spacing-lg);
}
.service-card {
background: var(--color-surface);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: var(--spacing-lg);
}
.service-card h3 {
font-size: 1.25rem;
margin-bottom: var(--spacing-sm);
}
.service-card p {
color: var(--color-text-muted);
line-height: 1.7;
}<section id="testimonials" class="testimonials">
<h2 class="section-title">What Clients Say</h2>
<div class="testimonial-track">
<blockquote class="testimonial-card">
<p>
"Volta transformed our brand from forgettable to unmistakable. Revenue up 40% in six
months."
</p>
<footer>— Sarah Chen, CEO at Luminary</footer>
</blockquote>
<blockquote class="testimonial-card">
<p>
"The best design team we've ever worked with. They don't just make things pretty — they make
things work."
</p>
<footer>— Marcus Webb, CTO at Helios</footer>
</blockquote>
<blockquote class="testimonial-card">
<p>"They delivered in 8 weeks what our internal team couldn't do in 8 months."</p>
<footer>— Priya Patel, VP Product at Canopy</footer>
</blockquote>
</div>
</section>.testimonials {
padding: var(--spacing-xl) var(--spacing-lg);
max-width: var(--max-width);
margin: 0 auto;
}
.testimonial-track {
display: flex;
gap: var(--spacing-lg);
overflow-x: auto;
scroll-snap-type: x mandatory;
scrollbar-width: none;
padding-bottom: var(--spacing-md);
}
.testimonial-card {
flex: 0 0 min(100%, 400px);
scroll-snap-align: start;
background: var(--color-surface);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: var(--spacing-lg);
}
.testimonial-card p {
font-size: 1.05rem;
font-style: italic;
line-height: 1.8;
margin-bottom: var(--spacing-md);
}
.testimonial-card footer {
color: var(--color-text-muted);
font-size: 0.9rem;
}@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: var(--spacing-md);
}
.nav-links {
gap: var(--spacing-md);
flex-wrap: wrap;
justify-content: center;
}
.hero {
min-height: 60vh;
text-align: center;
}
.hero p {
margin-left: auto;
margin-right: auto;
}
.hero-actions {
justify-content: center;
flex-wrap: wrap;
}
.section-title {
font-size: 1.5rem;
}
}npm i -g vercel
cd design-studio
vercelvercel domains add yourdomain.com