Responsive media query guide & scalable CSS system
Creating a truly responsive website is not just about adding breakpoints. It’s about building a smart system where text size, spacing, and layout adjust on their own for different screen sizes, so you don’t have to keep rewriting styles again and again.
I am explaining everything in simple way. It covers the right media query ranges to use, how to make text sizes adjust smoothly on different screens, and how to set global CSS styles that automatically scale across devices.
1. Recommended Responsive Media Query Range
/* Base styles → Large desktops (≥1200px) */
/* Small desktops / large laptops */
@media (max-width: 1200px) {}
/* Landscape tablets / small laptops */
@media (max-width: 1080px) {}
/* Tablets */
@media (max-width: 992px) {}
/* Large mobiles / portrait tablets */
@media (max-width: 768px) {}
/* Small mobiles */
@media (max-width: 576px) {}
2. Use Fluid Scaling
The biggest mistake in responsive design is redefining font sizes in every breakpoint. Instead, use:
- rem for consistency
- clamp() for fluid scaling
3. Global CSS
This is your main CSS setup — write once, works everywhere.
Root Setup
:root {
--base-font-size: 16px;
--font-primary: 'Poppins', sans-serif;
--color-text: #222;
--color-heading: #111;
--line-height-base: 1.6;
--line-height-heading: 1.2;
--spacing-xs: 0.5rem;
--spacing-sm: 1rem;
--spacing-md: 1.5rem;
--spacing-lg: 2rem;
}
Base Typography
html {
font-size: 100%; /* 16px */
}
body {
font-family: var(--font-primary);
font-size: 1rem;
line-height: var(--line-height-base);
color: var(--color-text);
}
Fluid Typography (no media query is needed)
h1 {
font-size: clamp(2rem, 5vw, 3rem);
font-weight: 700;
line-height: var(--line-height-heading);
margin-bottom: var(--spacing-md);
}
h2 {
font-size: clamp(1.75rem, 4vw, 2.5rem);
font-weight: 600;
margin-bottom: var(--spacing-md);
}
h3 {
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 600;
}
h4 {
font-size: clamp(1.25rem, 2.5vw, 1.5rem);
font-weight: 500;
}
Paragraph & Content Spacing
p {
font-size: clamp(0.95rem, 1.2vw, 1.05rem);
margin-bottom: var(--spacing-md);
}
strong {
font-weight: 600;
}
small {
font-size: 0.875rem;
}
Lists (UL / OL)
ul,
ol {
margin-bottom: var(--spacing-md);
padding-left: 1.2rem;
}
li {
margin-bottom: var(--spacing-xs);
line-height: var(--line-height-base);
}
Container System (important for layout scaling)
.container {
width: 100%;
max-width: 1200px;
padding: 0 var(--spacing-sm);
margin: 0 auto;
}
4. Minimal Media Query Usage (layout Only)
Now this media queries become clean and minimal:
@media (max-width: 992px) {
.container {
max-width: 90%;
}
}
@media (max-width: 768px) {
.grid {
display: block;
}
}
@media (max-width: 576px) {
.section {
padding: var(--spacing-md) 0;
}
}
Notes:
- Use rem for spacing & fonts
- Use clamp() for responsive typography
- Define global variables in :root
- Use media queries only for layout changes
Here is a fully working simple starter template HTML, CSS code for your reference.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive Starter Template</title>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
/* ================= ROOT VARIABLES ================= */
:root {
--base-font-size: 16px;
--font-primary: 'Poppins', sans-serif;
--color-text: #222;
--color-heading: #111;
--color-primary: #2563eb;
--color-light: #f9fafb;
--line-height-base: 1.6;
--line-height-heading: 1.2;
--spacing-xs: 0.5rem;
--spacing-sm: 1rem;
--spacing-md: 1.5rem;
--spacing-lg: 2rem;
}
/* ================= GLOBAL RESET ================= */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: clamp(14px, 1vw, 16px);
}
body {
font-family: var(--font-primary);
font-size: 1rem;
line-height: var(--line-height-base);
color: var(--color-text);
background: #fff;
}
img {
max-width: 100%;
height: auto;
}
/* ================= TYPOGRAPHY ================= */
h1 {
font-size: clamp(2rem, 5vw, 3rem);
font-weight: 700;
line-height: var(--line-height-heading);
margin-bottom: var(--spacing-md);
}
h2 {
font-size: clamp(1.75rem, 4vw, 2.5rem);
font-weight: 600;
margin-bottom: var(--spacing-md);
}
h3 {
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 600;
margin-bottom: var(--spacing-sm);
}
h4 {
font-size: clamp(1.25rem, 2.5vw, 1.5rem);
font-weight: 500;
}
p {
font-size: clamp(0.95rem, 1.2vw, 1.05rem);
margin-bottom: var(--spacing-md);
}
ul, ol {
margin-bottom: var(--spacing-md);
padding-left: 1.2rem;
}
li {
margin-bottom: var(--spacing-xs);
}
/* ================= LAYOUT ================= */
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--spacing-sm);
}
.section {
padding: var(--spacing-lg) 0;
}
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--spacing-md);
}
/* ================= HEADER ================= */
.header {
background: #fff;
border-bottom: 1px solid #eee;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--spacing-sm) 0;
}
.nav a {
text-decoration: none;
color: var(--color-heading);
margin-left: var(--spacing-sm);
}
/* ================= HERO ================= */
.hero {
background: var(--color-light);
text-align: center;
}
.hero p {
max-width: 600px;
margin: 0 auto var(--spacing-md);
}
.btn {
display: inline-block;
padding: 0.75rem 1.5rem;
background: var(--color-primary);
color: #fff;
border-radius: 5px;
text-decoration: none;
}
/* ================= CARDS ================= */
.card {
padding: var(--spacing-md);
border: 1px solid #eee;
border-radius: 8px;
}
/* ================= FOOTER ================= */
.footer {
background: #111;
color: #fff;
text-align: center;
padding: var(--spacing-md) 0;
}
/* ================= MEDIA QUERIES ================= */
@media (max-width: 992px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
}
.nav {
flex-direction: column;
}
}
@media (max-width: 576px) {
.section {
padding: var(--spacing-md) 0;
}
}
</style>
</head>
<body>
<!-- HEADER -->
<header class="header">
<div class="container nav">
<div><strong>Brand</strong></div>
<nav>
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Services</a>
<a href="#">Contact</a>
</nav>
</div>
</header>
<!-- HERO -->
<section class="hero section">
<div class="container">
<h1>Responsive Design System</h1>
<p>This starter template uses fluid typography and minimal media queries for scalable design.</p>
<a href="#" class="btn">Get Started</a>
</div>
</section>
<!-- FEATURES -->
<section class="section">
<div class="container">
<h2>Features</h2>
<div class="grid">
<div class="card">
<h3>Fluid Typography</h3>
<p>Automatically scales across devices.</p>
</div>
<div class="card">
<h3>Minimal Media Queries</h3>
<p>Only used for layout adjustments.</p>
</div>
<div class="card">
<h3>Reusable System</h3>
<p>Write once, use everywhere.</p>
</div>
</div>
</div>
</section>
<!-- CONTENT -->
<section class="section">
<div class="container">
<h2>Sample Content</h2>
<p>This is a paragraph demonstrating spacing and typography consistency.</p>
<ul>
<li>Clean spacing</li>
<li>Readable typography</li>
<li>Scalable layout</li>
</ul>
</div>
</section>
<!-- FOOTER -->
<footer class="footer">
<div class="container">
<p>© 2026 Your Company</p>
</div>
</footer>
</body>
</html>