所属专题:前端专题导航:HTML、CSS、JavaScript 与 UI 框架

零基础掌握Bulma:现代响应式布局速成指南

零基础掌握Bulma:现代响应式布局速成指南 - 暂无配图,技术文章默认封面

引言

Bulma 是基于 Flexbox 的 CSS 框架,提供语义化类名、移动优先的断点和可按需引入的 Sass 模块。它不内置 JavaScript,因此菜单、下拉框等交互需要由项目自行实现。本文从基础布局开始,逐步介绍导航栏、卡片、主题定制和常见问题。

核心概念

模块化结构

框架可以按项目需要引入基础、网格和组件模块,避免把不使用的样式打包进最终文件:

@import "bulma/sass/utilities/_all";
@import "bulma/sass/base/_all";
@import "bulma/sass/grid/columns";
@import "bulma/sass/components/card";

Flexbox 网格与修饰符

columns 和 column 组成基础布局;is-multiline 允许换行,is-half-tablet、is-one-quarter-desktop 等类可根据断点调整列宽。颜色、尺寸和状态也通过 is-primary、is-small、is-loading 等修饰符表达。

<div class="columns is-multiline">
  <div class="column is-full-mobile is-half-tablet">内容区块 1</div>
  <div class="column is-full-mobile is-half-tablet">内容区块 2</div>
</div>

实际应用

响应式导航栏

<nav class="navbar is-dark" role="navigation" aria-label="主导航">
  <div class="navbar-brand">
    <a class="navbar-item" href="/">我的应用</a>
    <a role="button" class="navbar-burger" aria-label="打开菜单" aria-expanded="false" data-target="navMenu">
      <span aria-hidden="true"></span><span aria-hidden="true"></span><span aria-hidden="true"></span>
    </a>
  </div>
  <div class="navbar-menu" id="navMenu">
    <div class="navbar-start">
      <a class="navbar-item" href="/products/">产品</a>
      <a class="navbar-item" href="/docs/">文档</a>
    </div>
  </div>
</nav>

navbar-burger 只提供样式和状态类,点击后需要切换菜单的 is-active,并同步更新 aria-expanded:

const burger = document.querySelector('.navbar-burger');
const menu = document.getElementById(burger.dataset.target);
burger.addEventListener('click', () => {
  const active = burger.classList.toggle('is-active');
  menu.classList.toggle('is-active', active);
  burger.setAttribute('aria-expanded', String(active));
});

商品卡片网格

<section class="section">
  <div class="container">
    <div class="columns is-multiline is-mobile">
      <div class="column is-half-mobile is-one-quarter-tablet">
        <article class="card">
          <div class="card-image">
            <figure class="image is-4by3"><img src="/media/product.jpg" alt="商品名称"></figure>
          </div>
          <div class="card-content">
            <h2 class="title is-5">商品名称</h2>
            <button class="button is-primary" type="button">查看详情</button>
          </div>
        </article>
      </div>
    </div>
  </div>
</section>

定制与性能

在导入完整框架前覆盖 Sass 变量,可以统一品牌颜色、字体和断点:

@import "bulma/sass/utilities/initial-variables";
$primary: #4361ee;
$family-sans-serif: "Segoe UI", sans-serif;
$tablet: 768px;
$desktop: 1024px;
@import "bulma/bulma";

完成构建后,再使用按需导入、压缩和未使用 CSS 检查减少产物体积。具体收益取决于项目组件数量和构建配置,不应把固定百分比当作通用结果。

垂直居中可以配合 is-vcentered,响应式显示可以使用 is-hidden-mobile 与 is-flex-tablet:

<div class="columns is-vcentered">
  <div class="column">左侧内容</div>
  <div class="column has-text-centered">居中内容</div>
</div>
<div class="is-hidden-mobile is-flex-tablet">平板以上显示</div>

常见问题

样式覆盖冲突

先确认自定义样式加载在 Bulma 之后,再通过更具体的选择器或项目命名空间控制覆盖范围。多个框架共存时,避免重用相同的通用类名。

非标准布局

对于卡片网格,使用 columns is-multiline 配合明确的 column is-* 宽度;瀑布流等特殊布局则应使用专门的 CSS Grid 或第三方方案,不要把等高的 Flexbox 列误称为瀑布流。

组件需要交互

Bulma 只负责样式。下拉菜单、模态框和标签页可以用原生 JavaScript、Alpine.js 或项目现有组件库实现,并补充键盘操作、焦点管理和 ARIA 状态。

总结

Bulma 通过语义化类名、Flexbox 网格和 Sass 变量降低了响应式页面的开发成本。先用网格和修饰符搭出结构,再按需定制主题和实现交互,可以在保持样式一致性的同时控制前端产物复杂度。

参考资料

分享这篇文章:

评论 (0)

请 登录 后发表评论, 还没有账户?立即注册

暂无评论,快来抢沙发吧!