bootstrap, bulma, purecss, and tailwindcss represent four distinct philosophies in styling web applications. bootstrap is a comprehensive component library offering pre-built UI elements and a grid system. bulma provides a modern, flexbox-based grid and components using a class-name approach without JavaScript dependencies. purecss is a minimal collection of small, responsive CSS modules for specific needs. tailwindcss is a utility-first framework that provides low-level utility classes to build custom designs directly in markup, avoiding opinionated pre-styled components.
Choosing a CSS strategy is one of the most impactful architectural decisions in frontend development. The four packages—bootstrap, bulma, purecss, and tailwindcss—solve the same problem (styling and layout) but approach it from completely different angles. Let's break down how they handle real-world engineering challenges.
The way a framework handles layout dictates how you structure your HTML. Each package has a distinct approach to columns and responsiveness.
bootstrap uses a 12-column grid system based on flexbox (in v5). You define row containers and specify column widths using breakpoints.
<!-- bootstrap: 12-column grid -->
<div class="container">
<div class="row">
<div class="col-md-8">Main Content</div>
<div class="col-md-4">Sidebar</div>
</div>
</div>
bulma also uses a 12-column flexbox grid but relies on a simpler class naming convention without the "col-" prefix clutter. It automatically wraps columns.
<!-- bulma: Flexible columns -->
<div class="columns">
<div class="column is-two-thirds">Main Content</div>
<div class="column is-one-third">Sidebar</div>
</div>
purecss offers a very basic, responsive grid system that requires you to manually manage the sum of units (usually 24 units total) to make rows work.
<!-- purecss: Manual unit calculation -->
<div class="pure-g">
<div class="pure-u-1 pure-u-md-16-24">Main Content</div>
<div class="pure-u-1 pure-u-md-8-24">Sidebar</div>
</div>
tailwindcss does not provide a semantic grid component. Instead, it gives you raw utility classes to build any grid layout using CSS Grid or Flexbox directly.
<!-- tailwindcss: Utility-based Grid -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="md:col-span-2">Main Content</div>
<div class="md:col-span-1">Sidebar</div>
</div>
This is the biggest differentiator. Do you want ready-made widgets, or do you want to build your own from scratch?
bootstrap ships with fully styled components. You add a class, and you get a complete, themed button, card, or navbar.
<!-- bootstrap: Pre-styled Card -->
<div class="card">
<div class="card-body">
<h5 class="card-title">Card Title</h5>
<p class="card-text">Some quick example text.</p>
<button class="btn btn-primary">Go somewhere</button>
</div>
</div>
bulma similarly provides pre-styled components but with a flatter, more modern aesthetic by default. The markup is very readable.
<!-- bulma: Pre-styled Card -->
<div class="card">
<div class="card-content">
<p class="title">Card Title</p>
<p class="subtitle">Subtitle</p>
<div class="content">Some quick example text.</div>
<button class="button is-primary">Go somewhere</button>
</div>
</div>
purecss provides extremely minimal modules. You get a button class, but it looks very plain. You are expected to style the rest yourself.
<!-- purecss: Minimal Button -->
<button class="pure-button">A Pure Button</button>
<!-- You must add custom CSS for colors, hover states, etc. -->
tailwindcss has no pre-built components. You must compose every visual aspect using utility classes. This offers maximum flexibility but requires more typing.
<!-- tailwindcss: Composed Card -->
<div class="max-w-sm rounded overflow-hidden shadow-lg bg-white">
<div class="px-6 py-4">
<div class="font-bold text-xl mb-2">Card Title</div>
<p class="text-gray-700 text-base">Some quick example text.</p>
</div>
<div class="px-6 pt-4 pb-2">
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
Go somewhere
</button>
</div>
</div>
How do you change the look to match your brand?
bootstrap relies heavily on Sass variables. You override default variables (like $primary) before importing the framework to change the global theme.
// bootstrap: Sass Variable Override
$primary: #ff5733;
$font-family-base: 'Helvetica Neue', sans-serif;
@import "bootstrap";
bulma also uses Sass variables for customization. You set these before importing to control colors, fonts, and spacing globally.
// bulma: Sass Variable Override
$primary: #ff5733;
$family-primary: 'Helvetica Neue', sans-serif;
@import "bulma";
purecss has very few variables. Customization is mostly done by writing standard CSS that targets the .pure-* classes or by extending them.
/* purecss: Standard CSS Override */
.pure-button {
background-color: #ff5733;
font-family: 'Helvetica Neue', sans-serif;
border-radius: 4px;
}
tailwindcss uses a JavaScript/TypeScript configuration file (tailwind.config.js). You define your design tokens here, and the framework generates the corresponding utility classes.
// tailwindcss: Config File
module.exports = {
theme: {
extend: {
colors: {
primary: '#ff5733',
},
fontFamily: {
sans: ['Helvetica Neue', 'sans-serif'],
},
},
},
};
Does the framework handle logic like modals and dropdowns?
bootstrap includes optional JavaScript (via Popper.js) for interactive components like dropdowns, modals, and tooltips. In v5, it dropped jQuery but still requires JS for these features.
// bootstrap: JS Initialization
const myModal = new bootstrap.Modal(document.getElementById('myModal'));
myModal.show();
bulma is CSS only. It provides the styles for a modal, but you must write your own JavaScript to toggle the is-active class to open or close it.
// bulma: Manual JS Toggle
document.getElementById('openModal').addEventListener('click', () => {
document.getElementById('myModal').classList.add('is-active');
});
purecss is CSS only. It provides no interactive components. You must build all logic (menus, tabs) from scratch.
// purecss: Custom Logic Required
// No built-in API. You write vanilla JS to toggle menus.
tailwindcss is CSS only (generated via build step). It provides no interactive components. You typically pair it with a JS framework (React, Vue) or a plugin like Alpine.js for interactivity.
// tailwindcss: Framework-driven Logic
// Example with Alpine.js
<div x-data="{ open: false }">
<button @click="open = !open">Toggle</button>
<div x-show="open">Content</div>
</div>
It is critical to note the current status of these libraries before adopting them.
purecss: This project is effectively deprecated and no longer actively maintained. The repository has seen minimal activity for years, and it does not support modern CSS features or workflows out of the box. Do not use purecss for new professional projects. Consider using lightweight utility classes or modern CSS native features instead.bootstrap, bulma, and tailwindcss are all actively maintained and safe for production use.Despite their differences, these libraries share some common goals and underlying technologies.
All four libraries (historically) adopt a mobile-first approach, defining styles for small screens first and adding breakpoints for larger devices.
<!-- All frameworks support mobile-first logic -->
<!-- Bootstrap: col-12 (mobile) -> col-md-6 (tablet+) -->
<!-- Bulma: column (mobile) -> is-half-tablet (tablet+) -->
<!-- Tailwind: grid-cols-1 (mobile) -> md:grid-cols-2 (tablet+) -->
Modern versions of bootstrap (v5+) and bulma (via Sass compilation to CSS vars in some setups) leverage CSS custom properties to allow dynamic theming at runtime, similar to how tailwindcss generates classes based on config.
/* Bootstrap v5 uses CSS variables internally */
:root {
--bs-primary: #0d6efd;
}
.btn-primary {
background-color: var(--bs-primary);
}
All libraries strive to provide accessible base styles. bootstrap and bulma include focus states and semantic HTML structures in their components. tailwindcss provides utilities like focus:ring to help developers build accessible interfaces manually.
<!-- Tailwind: Explicit focus management -->
<button class="focus:ring-2 focus:ring-blue-500">Accessible Button</button>
| Feature | bootstrap | bulma | purecss | tailwindcss |
|---|---|---|---|---|
| Philosophy | Component Library | Component Library | Minimal Modules | Utility-First |
| Grid System | 12-col Flexbox | 12-col Flexbox | 24-unit Flexbox | CSS Grid / Flex Utilities |
| JS Included | Yes (Optional) | No | No | No |
| Customization | Sass Variables | Sass Variables | Manual CSS | Config File (JS/TS) |
| Bundle Size | Large (if unused) | Medium | Tiny | Small (Purged) |
| Learning Curve | Low | Low | Low | High |
| Maintenance | Active | Active | Inactive/Deprecated | Active |
bootstrap is the reliable workhorse 🏗️. It is perfect for internal tools, MVPs, and teams that need a standard, consistent UI without spending time on design decisions. It solves 90% of UI problems immediately.
bulma is the clean, modern alternative 🧹. Choose it if you like the component model of Bootstrap but hate the "look" and want a simpler, flexbox-native syntax without JavaScript baggage. It strikes a balance between structure and freedom.
purecss is a legacy artifact 🕸️. Due to its lack of maintenance, it should be avoided in new architecture. Its original goal (tiny size) is now better achieved by modern CSS resets or utility frameworks.
tailwindcss is the designer's toolkit 🎨. It is the industry standard for custom, branded applications where the design system is unique. It requires more upfront configuration and learning but pays off in scalability and performance for large, complex applications.
Final Thought: If you need to build fast with standard parts, pick bootstrap. If you need to build a unique brand with high performance and long-term maintainability, pick tailwindcss. Avoid purecss for new work.
Choose bootstrap when you need to rapidly prototype a standard admin dashboard or internal tool where consistent, pre-built components (modals, navbars, forms) are more valuable than unique branding. It is ideal for teams that prefer convention over configuration and want a single dependency that handles layout, components, and basic interactivity out of the box.
Choose bulma if your team prefers a clean, readable class syntax and a robust flexbox grid but wants to avoid the JavaScript overhead and jQuery legacy often associated with older frameworks. It is suitable for projects that need a solid structural foundation and pre-styled components but intend to heavily customize the visual theme via Sass variables without fighting specific component styles.
Choose purecss only for lightweight projects, landing pages, or embedded widgets where bundle size is the absolute highest priority and you only need a basic grid or a few specific modules like buttons or tables. It is best used when you want to hand-craft most of your design and simply need a tiny, unopinionated starting point for responsiveness without bringing in a massive framework.
Choose tailwindcss for production applications requiring a unique, custom design system where developer speed and consistency are critical. It is the optimal choice for teams comfortable with configuring a design token system (colors, spacing, typography) and who want to prevent CSS bloat by only shipping the styles actually used in the markup, rather than unused component defaults.
Sleek, intuitive, and powerful front-end framework for faster and easier web development.
Explore Bootstrap docs »
Report bug
·
Request feature
·
Blog
Our default branch is for development of our Bootstrap 5 release. Head to the v4-dev branch to view the readme, documentation, and source code for Bootstrap 4.
Several quick start options are available:
git clone https://github.com/twbs/bootstrap.gitnpm install bootstrap@v5.3.8yarn add bootstrap@v5.3.8bun add bootstrap@v5.3.8composer require twbs/bootstrap:5.3.8Install-Package bootstrap Sass: Install-Package bootstrap.sassRead the Getting started page for information on the framework contents, templates, examples, and more.
Within the download you’ll find the following directories and files, logically grouping common assets and providing both compiled and minified variations.
bootstrap/
├── css/
│ ├── bootstrap-grid.css
│ ├── bootstrap-grid.css.map
│ ├── bootstrap-grid.min.css
│ ├── bootstrap-grid.min.css.map
│ ├── bootstrap-grid.rtl.css
│ ├── bootstrap-grid.rtl.css.map
│ ├── bootstrap-grid.rtl.min.css
│ ├── bootstrap-grid.rtl.min.css.map
│ ├── bootstrap-reboot.css
│ ├── bootstrap-reboot.css.map
│ ├── bootstrap-reboot.min.css
│ ├── bootstrap-reboot.min.css.map
│ ├── bootstrap-reboot.rtl.css
│ ├── bootstrap-reboot.rtl.css.map
│ ├── bootstrap-reboot.rtl.min.css
│ ├── bootstrap-reboot.rtl.min.css.map
│ ├── bootstrap-utilities.css
│ ├── bootstrap-utilities.css.map
│ ├── bootstrap-utilities.min.css
│ ├── bootstrap-utilities.min.css.map
│ ├── bootstrap-utilities.rtl.css
│ ├── bootstrap-utilities.rtl.css.map
│ ├── bootstrap-utilities.rtl.min.css
│ ├── bootstrap-utilities.rtl.min.css.map
│ ├── bootstrap.css
│ ├── bootstrap.css.map
│ ├── bootstrap.min.css
│ ├── bootstrap.min.css.map
│ ├── bootstrap.rtl.css
│ ├── bootstrap.rtl.css.map
│ ├── bootstrap.rtl.min.css
│ └── bootstrap.rtl.min.css.map
└── js/
├── bootstrap.bundle.js
├── bootstrap.bundle.js.map
├── bootstrap.bundle.min.js
├── bootstrap.bundle.min.js.map
├── bootstrap.esm.js
├── bootstrap.esm.js.map
├── bootstrap.esm.min.js
├── bootstrap.esm.min.js.map
├── bootstrap.js
├── bootstrap.js.map
├── bootstrap.min.js
└── bootstrap.min.js.map
We provide compiled CSS and JS (bootstrap.*), as well as compiled and minified CSS and JS (bootstrap.min.*). Source maps (bootstrap.*.map) are available for use with certain browsers’ developer tools. Bundled JS files (bootstrap.bundle.js and minified bootstrap.bundle.min.js) include Popper.
Have a bug or a feature request? Please first read the issue guidelines and search for existing and closed issues. If your problem or idea is not addressed yet, please open a new issue.
Bootstrap’s documentation, included in this repo in the root directory, is built with Astro and publicly hosted on GitHub Pages at https://getbootstrap.com/. The docs may also be run locally.
Documentation search is powered by Algolia's DocSearch.
npm install to install the Node.js dependencies, including Astro (the site builder).npm run test (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets./bootstrap directory, run npm run docs-serve in the command line.Learn more about using Astro by reading its documentation.
You can find all our previous releases docs on https://getbootstrap.com/docs/versions/.
Previous releases and their documentation are also available for download.
Please read through our contributing guidelines. Included are directions for opening issues, coding standards, and notes on development.
Moreover, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the Code Guide, maintained by Mark Otto.
Editor preferences are available in the editor config for easy use in common text editors. Read more and download plugins at https://editorconfig.org/.
Get updates on Bootstrap’s development and chat with the project maintainers and community members.
irc.libera.chat server, in the #bootstrap channel.bootstrap-5).bootstrap on packages which modify or add to the functionality of Bootstrap when distributing through npm or similar delivery mechanisms for maximum discoverability.For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under the Semantic Versioning guidelines. Sometimes we screw up, but we adhere to those rules whenever possible.
See the Releases section of our GitHub project for changelogs for each release version of Bootstrap. Release announcement posts on the official Bootstrap blog contain summaries of the most noteworthy changes made in each release.
Mark Otto
Jacob Thornton
Thanks to BrowserStack for providing the infrastructure that allows us to test in real browsers!
Thanks to Netlify for providing us with Deploy Previews!
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]
Thank you to all our backers! 🙏 [Become a backer]
Code and documentation copyright 2011-2025 the Bootstrap Authors. Code released under the MIT License. Docs released under Creative Commons.