1 . Why I Chose No Frameworks
2 . Project Requirements and Goals
3 . Setting Up the HTML5 Structure
4 . Responsive Layouts with CSS Grid and Flexbox
5 . JavaScript for Interactivity
6 . Building a Responsive Navigation Menu
7 . Image Handling and Responsive Media
8 . Accessibility: Not Just a Checkbox
9 . SEO Best Practices
10 . Performance Optimization
11 . File Organization & Maintainability
12 . Deployment and Hosting
13 . Final Thoughts
Conclusion
In an era of React, Vue, Tailwind, and countless other JavaScript frameworks and CSS libraries, choosing to build a website using pure HTML, CSS, and JavaScript might seem unconventional, maybe even inefficient.
But sometimes, the simplest tools give you the most power.
In this blog, I want to walk you through the entire process of how I designed and developed a responsive, mobile-first, lightning-fast website from scratch, without a single framework. This journey helped me rediscover the foundational beauty of the web, improve my skills in browser behavior, and gave me full control over performance and responsiveness.
Let’s dive deep into the philosophy, architecture, and the practical code that powered the project.
Modern frameworks are fantastic, but they also come with:
a personal portfolio, I wanted:
This made it the perfect opportunity to build without React, Angular, Bootstrap, or Tailwind.
The goal was to create a responsive, modern website that:
The HTML foundation used semantic elements for clarity and accessibility:
<!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="A responsive portfolio site built without frameworks." />
<link rel="stylesheet" href="styles.css" />
<title>My Portfolio</title>
</head>
<body>
<header>
<nav>
<ul id="nav-links">
<li><a href="#home">Home</a></li>
<li><a href="#projects">Projects</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<button id="toggle-menu">☰</button>
</nav>
</header>
<main>
<section id="home"></section>
<section id="projects"></section>
<section id="contact"></section>
</main>
<footer>
<p>© 2025 My Portfolio</p>
</footer>
<script src="script.js"></script>
</body>
</html>
Key Decisions:
The layout needed to be fluid. I used a mobile-first approach and media queries to scale up:
body {
font-family: sans-serif;
margin: 0;
padding: 0;
}
nav ul {
display: flex;
flex-direction: column;
list-style: none;
padding: 0;
}
@media (min-width: 768px) {
nav ul {
flex-direction: row;
justify-content: space-around;
}
}
For more complex layouts, I used CSS Grid:
.grid-container {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
@media (min-width: 768px) {
.grid-container {
grid-template-columns: 1fr 1fr;
}
}
Why not Bootstrap?
I kept JS minimal and unobtrusive. No jQuery, no Vue.
One feature was a mobile nav menu toggle:
const toggleBtn = document.getElementById('toggle-menu');
const navLinks = document.getElementById('nav-links');
toggleBtn.addEventListener('click', () => {
navLinks.classList.toggle('visible');
});
CSS handled the transition:
#nav-links {
display: none;
}
#nav-links.visible {
display: flex;
}
Another example: Smooth scroll behavior.
html {
scroll-behavior: smooth;
}
No need for JavaScript libraries to handle this!
Mobile navs often require JavaScript for toggling and transitions. I used a combination of media queries and simple class toggling.
Images can tank performance. I optimized them by:
Example:
<picture>
<source srcset="img/photo.webp" type="image/webp">
<img src="img/photo.jpg" alt="Project screenshot" loading="lazy">
</picture>
CSS ensured responsiveness:
img {
max-width: 100%;
height: auto;
}
I ensured:
Example:
<button aria-label="Toggle navigation menu">☰</button>
Since I wasn’t using a framework like Next.js for SSR, I focused on these:
Example:
<a href="#projects">View My Projects</a>
Framework-free sites load faster, but I went further:
Result: PageSpeed score 98/100
Simple structure:
All code was modular and clean. Each section had comments and consistent formatting.
This made updates easy and minimized cognitive overhead.
I deployed the site on Netlify. Why?
Alternative options: GitHub Pages, Vercel, Cloudflare Pages
Building a responsive website without any frameworks is:
By going framework-free, I improved performance, accessibility, and my own confidence as a front-end developer.
You don’t always need a complex toolchain to make something beautiful.
My Advice: Start small. Build a simple site without frameworks. You’ll walk away a stronger, more capable web developer.
Building a responsive website without relying on any frameworks or libraries is not just possible, it’s empowering. By focusing on native web technologies like HTML5, CSS3, and vanilla JavaScript, I was able to create a fully functional, accessible, and high-performance site tailored to my specific needs. This process reminded me that you don’t always need complex tools or modern libraries to build something powerful and beautiful.
Frameworks can be great accelerators, but understanding the fundamentals allows you to make better decisions, debug faster, and create lighter, more maintainable codebases. In an age where over-engineering is common, this approach offered clarity, control, and performance.
This project wasn’t just about building a portfolio site, it was about proving that with the right knowledge, anyone can create professional, responsive websites with just the core web technologies.
So whether you're a beginner looking to strengthen your foundation or an experienced developer wanting a break from heavy frameworks, I highly recommend going back to basics. You’ll gain confidence, improve your skills, and produce something you truly understand, line by line.
Ready to build yours? Start small. Code clean. Stay responsive.
Software Engineer
Senior Software Engineer