Bulma CSS Framework
The modern CSS framework that just works. Flexbox-based, responsive, and completely free.
Why Choose Bulma?
Bulma is a free, open-source CSS framework based on Flexbox that provides ready-to-use frontend components that you can easily combine to build responsive web interfaces.
Flexbox-Based
Built with modern CSS Flexbox for easy layouts
Mobile-First
Responsive design with mobile-first approach
Modular
Import only what you need, keep CSS lightweight
Grid System
Key Features:
- Flexbox-Based Grid - Modern CSS Grid with Flexbox power
- 12-Column System - Familiar 12-column responsive grid
- Auto-Layout Columns - Equal width distribution automatically
- Responsive Modifiers - Mobile, tablet, desktop, widescreen breakpoints
- Nesting Support - Complex layouts with nested columns
Grid System Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bulma Grid System</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
<style>
.column-demo {
background: #00d1b2;
color: white;
padding: 1rem;
border: 2px solid white;
text-align: center;
}
</style>
</head>
<body>
<section class="section">
<div class="container">
<h1 class="title has-text-centered">Bulma Grid System</h1>
<!-- Basic Columns -->
<div class="box">
<h2 class="subtitle">Basic Columns - Equal Width</h2>
<div class="columns">
<div class="column column-demo">Auto Column</div>
<div class="column column-demo">Auto Column</div>
<div class="column column-demo">Auto Column</div>
</div>
</div>
<!-- Responsive Columns -->
<div class="box">
<h2 class="subtitle">Responsive Columns</h2>
<div class="columns">
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop column-demo">
is-half-mobile<br>is-one-third-tablet<br>is-one-quarter-desktop
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop column-demo">
Responsive sizing
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop column-demo">
Adapts to screen size
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop column-demo">
Mobile-first approach
</div>
</div>
</div>
<!-- Column Sizes -->
<div class="box">
<h2 class="subtitle">Column Sizes</h2>
<div class="columns">
<div class="column is-two-thirds column-demo">is-two-thirds (66%)</div>
<div class="column column-demo">Auto (34%)</div>
</div>
<div class="columns">
<div class="column is-three-quarters column-demo">is-three-quarters (75%)</div>
<div class="column column-demo">Auto (25%)</div>
</div>
</div>
<!-- Nested Columns -->
<div class="box">
<h2 class="subtitle">Nested Columns</h2>
<div class="columns">
<div class="column is-8 column-demo">
Parent is-8
<div class="columns">
<div class="column is-6 column-demo" style="background: #009e86;">Nested is-6</div>
<div class="column is-6 column-demo" style="background: #009e86;">Nested is-6</div>
</div>
</div>
<div class="column is-4 column-demo">Parent is-4</div>
</div>
</div>
</div>
</section>
</body>
</html>Components
Component Library:
ButtonsCardsFormsNavbarNotificationsMenuModalPanel
Components Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bulma Components</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
</head>
<body>
<section class="section">
<div class="container">
<h1 class="title has-text-centered">Bulma Components</h1>
<!-- Buttons -->
<div class="box">
<h2 class="subtitle">Button Components</h2>
<div class="buttons">
<button class="button is-primary">Primary</button>
<button class="button is-link">Link</button>
<button class="button is-info">Info</button>
<button class="button is-success">Success</button>
<button class="button is-warning">Warning</button>
<button class="button is-danger">Danger</button>
<button class="button is-dark">Dark</button>
</div>
<div class="buttons">
<button class="button is-primary is-outlined">Outlined</button>
<button class="button is-link is-rounded">Rounded</button>
<button class="button is-info is-loading">Loading</button>
<button class="button is-success" disabled>Disabled</button>
</div>
</div>
<!-- Cards -->
<div class="box">
<h2 class="subtitle">Card Components</h2>
<div class="columns">
<div class="column is-6">
<div class="card">
<div class="card-content">
<p class="title">"There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors."</p>
<p class="subtitle">Jeff Atwood</p>
</div>
<footer class="card-footer">
<p class="card-footer-item">
<span>View on <a href="https://twitter.com/codinghorror/status/506010907021828096">Twitter</a></span>
</p>
<p class="card-footer-item">
<span>Share on <a href="#">Facebook</a></span>
</p>
</footer>
</div>
</div>
<div class="column is-6">
<div class="card">
<header class="card-header">
<p class="card-header-title">Component</p>
<button class="card-header-icon" aria-label="more options">
<span class="icon">
<i class="fas fa-angle-down" aria-hidden="true"></i>
</span>
</button>
</header>
<div class="card-content">
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus nec iaculis mauris.
<a href="#">@bulmaio</a>. <a href="#">#css</a> <a href="#">#responsive</a>
<br>
<time datetime="2016-1-1">11:09 PM - 1 Jan 2016</time>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Notifications -->
<div class="box">
<h2 class="subtitle">Notification Components</h2>
<div class="notification is-primary">
<button class="delete"></button>
Primar lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum dolor.
</div>
<div class="notification is-link">
<button class="delete"></button>
Primar lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum dolor.
</div>
<div class="notification is-info">
<button class="delete"></button>
Primar lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum dolor.
</div>
<div class="notification is-success">
<button class="delete"></button>
Primar lorem ipsum dolor sit amet, consectetur adipiscing elit lorem ipsum dolor.
</div>
</div>
<!-- Navigation -->
<div class="box">
<h2 class="subtitle">Navigation Components</h2>
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="https://bulma.io">
<strong>Bulma Navigation</strong>
</a>
</div>
<div class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item">Home</a>
<a class="navbar-item">Documentation</a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons">
<a class="button is-primary"><strong>Sign up</strong></a>
<a class="button is-light">Log in</a>
</div>
</div>
</div>
</div>
</nav>
</div>
</div>
</section>
</body>
</html>Forms
Form Features:
- Field Structure - Organized form field components
- Validation States - Success, warning, and error states
- Form Addons - Input groups with buttons and icons
- Horizontal Forms - Label and input side-by-side layouts
- Custom Controls - Checkboxes, radios, and file inputs
Forms Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bulma Forms</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
</head>
<body>
<section class="section">
<div class="container">
<h1 class="title has-text-centered">Bulma Forms</h1>
<!-- Basic Form -->
<div class="box">
<h2 class="subtitle">Contact Form</h2>
<form>
<div class="field">
<label class="label">Name</label>
<div class="control">
<input class="input" type="text" placeholder="Text input">
</div>
</div>
<div class="field">
<label class="label">Username</label>
<div class="control has-icons-left has-icons-right">
<input class="input is-success" type="text" placeholder="Text input" value="bulma">
<span class="icon is-small is-left">
<i class="fas fa-user"></i>
</span>
<span class="icon is-small is-right">
<i class="fas fa-check"></i>
</span>
</div>
<p class="help is-success">This username is available</p>
</div>
<div class="field">
<label class="label">Email</label>
<div class="control">
<input class="input is-danger" type="email" placeholder="Email input" value="hello@">
</div>
<p class="help is-danger">This email is invalid</p>
</div>
<div class="field">
<label class="label">Subject</label>
<div class="control">
<div class="select">
<select>
<option>Select dropdown</option>
<option>With options</option>
</select>
</div>
</div>
</div>
<div class="field">
<label class="label">Message</label>
<div class="control">
<textarea class="textarea" placeholder="Textarea"></textarea>
</div>
</div>
<div class="field">
<div class="control">
<label class="checkbox">
<input type="checkbox">
I agree to the <a href="#">terms and conditions</a>
</label>
</div>
</div>
<div class="field">
<div class="control">
<label class="radio">
<input type="radio" name="question">
Yes
</label>
<label class="radio">
<input type="radio" name="question">
No
</label>
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-link">Submit</button>
</div>
<div class="control">
<button class="button is-link is-light">Cancel</button>
</div>
</div>
</form>
</div>
<!-- Form Addons -->
<div class="box">
<h2 class="subtitle">Form Addons</h2>
<div class="field has-addons">
<div class="control">
<input class="input" type="text" placeholder="Find a repository">
</div>
<div class="control">
<a class="button is-info">Search</a>
</div>
</div>
<div class="field has-addons">
<div class="control">
<div class="select">
<select>
<option>$</option>
<option>£</option>
<option>€</option>
</select>
</div>
</div>
<div class="control">
<input class="input" type="text" placeholder="Amount of money">
</div>
<div class="control">
<a class="button is-success">Transfer</a>
</div>
</div>
</div>
<!-- Horizontal Form -->
<div class="box">
<h2 class="subtitle">Horizontal Form</h2>
<div class="field is-horizontal">
<div class="field-label is-normal">
<label class="label">From</label>
</div>
<div class="field-body">
<div class="field">
<p class="control is-expanded">
<input class="input" type="text" placeholder="Name">
</p>
</div>
<div class="field">
<p class="control is-expanded">
<input class="input is-success" type="email" placeholder="Email">
</p>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label"></div>
<div class="field-body">
<div class="field is-expanded">
<div class="field has-addons">
<div class="control">
<a class="button is-static">+44</a>
</div>
<div class="control is-expanded">
<input class="input" type="tel" placeholder="Your phone number">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</body>
</html>Responsive Features
Responsive Capabilities:
- Breakpoint System - Mobile, tablet, desktop, widescreen, fullhd
- Responsive Helpers - Show/hide elements per breakpoint
- Mobile-First Grid - Columns adapt from mobile up
- Responsive Typography - Text sizes that scale with screen
- Touch-Friendly - Mobile-optimized interactions
Responsive Features Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bulma Responsive</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
</head>
<body>
<section class="section">
<div class="container">
<h1 class="title has-text-centered">Bulma Responsive Features</h1>
<!-- Responsive Typography -->
<div class="box">
<h2 class="subtitle">Responsive Typography</h2>
<h1 class="title is-1-mobile is-3-tablet is-1-desktop">Responsive Title</h1>
<p class="subtitle is-5-mobile is-6-tablet is-4-desktop">
This text scales based on screen size using Bulma's responsive typography helpers.
</p>
</div>
<!-- Responsive Helpers -->
<div class="box">
<h2 class="subtitle">Responsive Helpers</h2>
<div class="is-flex-mobile is-block-tablet">
<div class="notification is-primary is-hidden-mobile">
Hidden on mobile, visible on tablet+
</div>
<div class="notification is-success is-hidden-tablet">
Hidden on tablet+, visible on mobile
</div>
<div class="notification is-info is-hidden-desktop">
Hidden on desktop, visible on mobile/tablet
</div>
</div>
</div>
<!-- Responsive Grid -->
<div class="box">
<h2 class="subtitle">Responsive Grid Layout</h2>
<div class="columns is-mobile is-multiline">
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop">
<div class="notification is-primary has-text-centered">
is-half-mobile<br>is-one-third-tablet<br>is-one-quarter-desktop
</div>
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop">
<div class="notification is-link has-text-centered">
Responsive column
</div>
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop">
<div class="notification is-info has-text-centered">
Adapts to screen
</div>
</div>
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop">
<div class="notification is-success has-text-centered">
Mobile first
</div>
</div>
</div>
</div>
<!-- Responsive Navigation -->
<div class="box">
<h2 class="subtitle">Responsive Navigation</h2>
<nav class="navbar is-spaced" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="#">
<strong>Responsive Nav</strong>
</a>
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item">Home</a>
<a class="navbar-item">Features</a>
<a class="navbar-item">Pricing</a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons">
<a class="button is-primary"><strong>Sign up</strong></a>
<a class="button is-light">Log in</a>
</div>
</div>
</div>
</div>
</nav>
</div>
<!-- Responsive Spacing -->
<div class="box">
<h2 class="subtitle">Responsive Spacing</h2>
<div class="m-0-mobile m-3-tablet m-6-desktop p-2-mobile p-4-tablet p-6-desktop notification is-warning">
Responsive margin and padding utilities that adapt to different screen sizes.
</div>
</div>
</div>
</section>
<script>
document.addEventListener('DOMContentLoaded', () => {
// Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
// Add a click event on each of them
$navbarBurgers.forEach( el => {
el.addEventListener('click', () => {
// Get the target from the "data-target" attribute
const target = el.dataset.target;
const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle('is-active');
$target.classList.toggle('is-active');
});
});
});
</script>
</body>
</html>Quick Start Guide
CDN Method (Easiest)
<!-- Bulma CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css"> <!-- Optional Font Awesome Icons --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
Package Manager (npm)
# Install via npm npm install bulma # Import in your CSS @import 'bulma/css/bulma.css'; # Or import SASS version @import 'bulma/bulma.sass'; # Install with yarn yarn add bulma
Best Practices
✅ Do This
- Use semantic HTML - Bulma works with proper HTML structure
- Follow mobile-first - Design for mobile then enhance
- Use modifier classes - Leverage is- and has- helpers
- Customize with SASS - Use variables for theming
- Keep it simple - Bulma is designed to be straightforward
❌ Avoid This
- Overriding core styles - Use SASS customization instead
- Ignoring breakpoints - Always consider responsive design
- Complex nesting - Keep HTML structure clean and simple
- Forgetting Font Awesome - Icons enhance the experience
- Mixing frameworks - Stick to Bulma's methodology
Ready to Build with Bulma?
Start creating beautiful, responsive websites with the modern CSS framework that's easy to learn and use.