Bulma’s Flexbox Grid: Building Responsive Columns the CSS‑Only Way
Learn how Bulma’s Flexbox‑based grid lets you create responsive column layouts without JavaScript, the pros and cons of its CSS‑only approach, and a concrete example that you can drop into any project right away.
27 Jun 2026, 08:10 UTC

Problem: Making a Responsive Two‑Column Layout Without JavaScript
When building a landing page, you often need a two‑column section that stacks on mobile, shrinks on tablet, and sits side‑by‑side on desktop. Traditionally, you either write custom media queries or pull in a JavaScript‑heavy framework. With Bulma you can achieve this with pure CSS, thanks to its Flexbox‑based grid system.
Thesis: Bulma’s Grid Is a Declarative, CSS‑Only Solution for Responsive Columns
Bulma’s .columns container and .column children are nothing more than Flexbox wrappers and items. The framework supplies a set of utility classes that let you specify column widths and responsive modifiers directly in markup, eliminating the need for bespoke CSS or JS. This approach is lightweight, easy to read, and works out‑of‑the‑box across modern browsers.
Section 1 – Understanding the Core Elements
The grid starts with a .columns element, which becomes a flex container. Each direct child .column becomes a flex item. By default, the items are distributed evenly, but you can override this with size modifiers.
- Default behavior: All columns share equal width and wrap when the viewport is too narrow.
- Size modifiers:
.column-is-half,.column-is-one-third,.column-is-4(for 4 of 12), etc. - Responsive modifiers: Prefix a size with a breakpoint, e.g.,
.is-mobile,.is-tablet,.is-desktop,.is-widescreen,.is-fullhd. These are applied in the same way as the default size modifiers. - Alignment utilities:
.is-vcenteredvertically centers the content within each column.
Section 2 – A Concrete, Copy‑Paste Example
Below is a minimal HTML snippet that demonstrates a responsive two‑column layout. Copy it into a file, open it in a browser, and resize the window to see the columns adapt.
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bulma Responsive Columns Demo</title>
</head>
<body>
<section class="section">
<div class="container">
<div class="columns is-vcentered">
<div class="column is-full-mobile is-half-tablet">
<div class="box">
Left Column
<p>This column takes the full width on mobile devices and half the width on tablets and larger screens.</p>
</div>
</div>
<div class="column is-full-mobile is-half-tablet is-one-third-desktop">
<div class="box">
Right Column
<p>This column adapts to the viewport: full width on mobile, half on tablet, and a third on desktop.</p>
</div>
</div>
</div>
</div>
</section>
</body>
</html>
How it works:
is-full-mobileforces the column to span 12/12 on the smallest breakpoint.- From
tabletupwards,is-half-tabletapplies, giving the column 6/12. - On
desktopthe right column also getsis-one-third-desktop, shrinking it to 4/12. - The
is-vcenteredclass on the.columnscontainer vertically aligns the two boxes.
Section 3 – Trade‑Offs and Limitations
Bulma’s CSS‑only grid is great for quick layouts, but it has a few caveats:
- No JavaScript engine: Interactive components (dropdowns, modals, tabs) require you to toggle classes manually or use a small helper script. If your project relies heavily on such components, you’ll need to write or import additional JS.
- Global class names: Because Bulma uses a flat namespace of classes, large projects can run into specificity clashes. A common mitigation is to wrap your application in a root class and scope Bulma’s classes with it, e.g.,
.my-app .column, or use a CSS preprocessor to generate unique class names. - Not utility‑first: Unlike Tailwind, Bulma doesn’t provide single‑purpose utility classes for every spacing or sizing need. If you need fine‑grained control, you’ll still write custom CSS.
Section 4 – Practical Verification Steps
- Open the example file in a browser and use the built‑in devtools to shrink the viewport. Verify that the left column stays half‑width on tablet and larger, and that the right column becomes one‑third on desktop.
- Inspect the applied styles. The
.columnelements should haveflex: 1 0 0%by default, overridden by the breakpoint classes. - Test an interactive element. Add a
<button class="button is-primary" data-target="dropdown1">Toggle</button>and a<div id="dropdown1" class="dropdown">. Observe that clicking the button does nothing until you write a small script to toggle.is-activeon the dropdown. - Check for specificity conflicts by adding a custom class
.my-special-box { background: lightblue; }to a.boxinside a.column. If the color overrides Bulma’s default, you’re good; if not, you may need to increase specificity or scope.
Actionable Closing
Bulma’s Flexbox grid lets you build responsive layouts with minimal CSS and zero JavaScript. To get the most out of it:
- Start with the CDN link and the example above; copy‑paste into your project and adjust the breakpoint classes to match your design.
- When scaling up, wrap your application in a root class or use CSS modules to avoid global namespace conflicts.
- For interactive components, decide whether you want to write a tiny helper script or integrate a lightweight library that works with Bulma’s class names.
- Always test across devices – use Chrome DevTools device toolbar or real devices to confirm that breakpoint modifiers behave as expected.
- Document the breakpoint strategy in your style guide so that future contributors know which classes to use for each device size.
With these steps, you’ll have a robust, responsive layout foundation that stays lightweight and maintainable, even as your project grows.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.