フリーのブルマ

# Free Course: Level Up With Bulma CSS
![01.png](https://qiita-image-store.s3.amazonaws.com/0/26088/c9b8cffe-4f6e-6a7a-c3de-25730c72503f.png)

## Meet Bulma CSS! Free course [here](https://scrimba.com/g/gbulma)

ドラゴンボールZで2番目に息の長いキャラクター、、、とは特に関係なく、[Bulma](https://bulma.io/)は[Jeremy Thomas @jgthms](https://jgthms.com/)によって開発されたFlexboxベースのCSSフレームワークです。
そして現在では[GitHub](https://github.com/jgthms/bulma/)で月間15万以上のダウンロード、26000以上の☆を得るまでに成長しています。

Bulmaを使うとレスポンシブで美しいWebサイトを簡単に作ることができます。
Jeremyは新規プロジェクトで[Sass](http://placeholder/)のテンプレートを使い回すための基本セットとしてBulmaを作成しました。
その後[Flexbox](https://en.wikipedia.org/wiki/CSS_flex-box_layout)が標準化されたときに、JeremyはBulmaをFlexbox用に書き換えました。
え？Sassを知らない？SassはCSSのすごいやつだよ。

この記事では、Bulmaがどのように動作し、そしてどうやって使うのかを解説します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/26088/dc3c9c14-8690-df64-4433-14bd2b7de58b.png)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/113091e8-2379-693d-19b3-9290c4c3db8f.png)
![04.png](https://qiita-image-store.s3.amazonaws.com/0/26088/a7fe1e81-cfa5-26ef-a723-7b0e70df5893.png)

これらの[3D画像](https://silly-albattani-c5fd1a.netlify.com/subscribe.html)をどうやって作ったか知りたいですか？
これらを構築する方法を学ぶフリーのコースをScrimbaに投稿しました。[クリックして登録してね！](https://scrimba.com/g/gbulma)
[Scrimba.com](https://scrimba.com/g/gbulma)は、フロントエンド開発の様子を、動画ではなくイベントとして確認することが、そしてエディットすることができるプラットフォームです。

## How does Bulma work?

Bulmaは[4500行のSass](https://github.com/jgthms/bulma/tree/master/sass)からできていて、コンパイルすると[9500行のCSS](https://github.com/jgthms/bulma/blob/master/css/bulma.css)になります。
このコードは何をしているのでしょう？
Bulmaは[columns](https://bulma.io/documentation/columns/)、[form](https://bulma.io/documentation/form/)、[component](https://bulma.io/documentation/components/)、[modifiers](https://bulma.io/documentation/modifiers/)、[layout](https://bulma.io/documentation/layout/)、[elements](https://bulma.io/documentation/elements/)など、一般的なWebサイトが使用するデザインパターンの90%を網羅しています。
コードはもちろんレスポンシブで、さらにテーマごとのカスタマイズをすることもできます。

Bulmaは全てを解決するわけではありませんが、SassやCSSを手作業で書いていくよりは遙かに生産的です。
またBulmaはCSSにコンパイルされるため、AngularやReact、VueといったJavaScriptフレームワークとも共存可能です。
まとめると、Bulmaは[JavaScript](https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript)を使わないBootstrap、のようなものです。

Bootstrapとは異なり、BulmaはJavaScriptではなく、CSSに依存しています。
しかしBootstrapと同じく、[独自のCSSリセット](https://github.com/jgthms/bulma/blob/master/sass/base/minireset.sass)も持っています。
さて、これからBulmaがどのような原則に従って動作するかを見ていきましょう。
あなたはHTMLとCSSに慣れ親しんでいると仮定します。
何故ならBulmaは古典的CSSのようなものだからです。

注意：以下のコードはBulmaではありませんが、Bulmaがどのように動作するかを実演しています。

```html
<!DOCTYPE html>
<html>
  <head>
    …
    <style>
p {
  line-height: 2;
}
    </style>
  </head>
  <body>
    <p>
      A long time ago in a galaxy far far away…
    </p>
  </body>
</html>
```

HTML内のCSSで、pタグは行間を1行空けるために`line-height:2`を指定しました。
ちょっと待って、これ、もし1行空けたくないときはどうするの？
あるいは、全てではなく一部のpタグだけ行間を1行空けたい場合は？
そういう場合は、タグのかわりに`class`で指定することができます。

```html
<!DOCTYPE html>
<html>
  <head>
    …
    <style>
.double-spaced {
  line-height: 2;
}
    </style>
  </head>
  <body>
    <p class="double-spaced">
      A long time ago in a galaxy far far away…
    </p>
  </body>
</html>
```

ここでタグのかわりに`double-spaced`という`class`を定義しました。
最初の例よりは賢明な作りになりました。
さらに条件を狭めるために、`class`を条件付きにすることができます。

```html
<!DOCTYPE html>
<html>
  <head>
    …
    <style>
p.double-spaced {
  line-height: 2;
}
    </style>
  </head>
  <body>
    <p class="double-spaced">
      A long time ago in a galaxy far far away…
    </p>
  </body>
</html>
```

`double-spaced`はpタグであることが必須になりました。
これは条件付きCSSで、そしてさらに深い連鎖も作ることができます。
classでも同様に、`.class-1.class-2`のように条件付きクラスを作ることができます。
これは、BulmaがHTML/CSSの適用絞り込みに使用しているテクニックのひとつです。

> *AHEM* Are we just writing CSS in our HTML now…?
> (ง •̀_•́)ง

違いは、Bulmaは1対1のCSSルールではなく、セマンティクスに基づいたパターンを用いていることです。
つまり、ルールではなく関係性を記述するためにBulmaを使うことができるということであり、従ってより強力です。
その[ドキュメント](https://bulma.io/documentation/)を読めばその使い方に迷うことはありません。

Bulmaは条件付きクラスに加え、豊富なHTML/CSS定数を定義してあり、より柔軟なCSSとより一貫性のあるコードを記述できるようになります。
これはチーム間でコードを共有するのに最適です。
定数はクラス同士の関係性を表します。
以下にHTML/CSS定数の簡単な例を示します。

```html
<section class="section">
  <div class="container">
    ...
  </div>
</section>
```

充分に設計されたBulmaのクラスと定数を使って、あらゆる種類の美しくレスポンシブなWebサイトを作成することが可能です。
[事例](https://bulma.io/expo/)を見てください。

さて、ここでは以下に示す"Hello World"のスライドから始めましょう。
実際は[スライドではなくWebサイト](https://www.youtube.com/watch?v=EVekNsgUqn4)です。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/26088/98ff2038-3b7c-b7a1-b3e9-146e41e309d8.png)
![07.png](https://qiita-image-store.s3.amazonaws.com/0/26088/7842042c-ba54-6ae8-39cd-f01a87737312.png)

Scrimbaでソースを確認できます。[左](https://scrimba.com/c/cNWR6UZ)・[右](https://scrimba.com/c/cyr3dT3)

[美しいブログを構築する](https://twitter.com/username_ZAYDEK/status/994209963558944769)記事と、[Teslaのロンチページ](https://twitter.com/username_ZAYDEK/status/994209997373423617)を作る記事を、近いうちに公開する予定です。
更新の確認には[Medium](https://medium.com/@ZAYDEK)と[Twitter](https://twitter.com/username_ZAYDEK)をフォローしてください。
また私は[Scrimba](https://scrimba.com/g/gbulma)でこれらのコースをフリーで教えています。

## "Hello World"

![08.png](https://qiita-image-store.s3.amazonaws.com/0/26088/f5014de3-d8b1-d21c-a89e-20c769ae15f8.png)

Bulmaの概要を理解したので、さっそく[Hello World](https://scrimba.com/c/cNWR6UZ)の作り方を学びましょう。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta
        name="viewport" content="width=device-width,
        initial-scale=1">
    <title>Hello Bulma!</title>
    <link rel="stylesheet" href="https://…/bulma.min.css">
    <script defer src="https://…/all.js"></script>
  </head>
  <body>
    <section class="section">
      <div class="container">
        <h1 class="title">
          Hello World
        </h1>
        <p class="subtitle">
          My first website with <strong>Bulma</strong>!
        </p>
      </div>
    </section>
  </body>
</html>
```

怖がる必要はありません。
全てのBulmaのWebサイトは[このテンプレート](https://bulma.io/documentation/overview/start/)から始まります。
最初にhead要素に注目してみましょう。
`bulma.min.css`でBulmaの本体をロードし、`all.js`は[Font Awesome](https://fontawesome.com/)のアイコンをロードします。
Bulmaは全てのアイコンフォントライブラリをサポートしています。

BulmaではsectionやdivのようにHTML5要素を使用することを勧めます。
より読みやすく、一貫的な記述ができるようになります。
もしクライアントのブラウザが古く、HTML5要素を認識しない場合はどうなるでしょうか？
Bulmaはそんなブラウザにも対応します。

```html
/* bulma.css#L312 */
article,
aside,
figure,
footer,
header,
hgroup,
section {
  display: block;
}
```

ありがとうありがとう。
この設定によって、クライアントブラウザに関わらずHTML5要素がブロック要素としてレンダリングされるようになります。
それではbodyを見てみましょう。

```html
<section class="section">
  <div class="container">
    <h1 class="title">
      Hello World
    </h1>
    <p class="subtitle">
      My first website with <strong>Bulma</strong>!
    </p>
  </div>
</section>
```

私が初めてBulmaを使ったときの感想は、`(╯°□°）╯︵ ┻━┻`
例があまりにも単純すぎたのです。
ひとしきり落ち着いてから自分のWebサイトの構造を見てみたところ、実際に考えていたよりもずっと単純でした。

```
   .section
       |
  .container
     /   \
.title  .subtitle
   /       \
 ...       ...
```

`.section`は新しいコンテンツの開始地点を示し、`.container`で内部コンテンツをひとまとまりにします。
このような構造でレスポンシブを実現しています。
`.title`と`.subtitle`は表示上のものです。
Bulmaは多くのベストプラクティスとレスポンシブデザインを処理してきました。

## Beyond "Hello World"

![09.png](https://qiita-image-store.s3.amazonaws.com/0/26088/142c7856-968a-0434-2a0f-7cbf8c4003bb.png)

画像の中身を[Scrimba](https://scrimba.com/c/cNWR6UZ)で確認できます。

Bulmaは色など多くの修飾子を持ったレゴのようなものです。
画像のようなWebサイトを作るには、`.columns`、`.media`、`.icon `などいくつかの修飾子が必要です。
そしてそれだけで十分です。
実際のコードはもう少し複雑になりますが、Webサイトの構造自体は単純なものです。

```
         .column
            |
         .media
          /   \
.media-left  .media-content
        /       \
    .icon      .content
      /           \
    ...           ...
```

単純なツリーがあるだけです。
実際のコードは以下のようになります。

```html
…
<div class="column">
  <article class="media notification is-info">
    <figure class="media-left">
      <span class="icon is-medium">
        <i class="fab fa-2x fa-css3-alt"></i>
      </span>
    </figure>
    <div class="media-content">
      <div class="content">
        <h1 class="title is-size-4">
          Bulma
        </h1>
        <p class="is-size-5">
          <strong>Bulma</strong> is a modern CSS framework...
        </p>
      </div>
    </div>
  </article>
</div>
…
```

`.notification`、`.is-info`、`.is-medium`などの修飾子は、Webサイトをパーソナライズするのに役立ちます。
別のクラスが必要な条件付き修飾子もあれば、汎用的なものもあります。
修飾子の詳細は[こちら](https://bulma.io/documentation/modifiers/)でもっと知ることができます。
さらに[インタラクティブなプレイグラウンド](https://scrimba.com/c/cyr3dT3)で動作を確認することもできます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/26088/1acf511d-e122-9881-2f68-da110c00b257.png)

BulmaはCSSを書くことなく、美しくレスポンシブなWebサイトを作ることができる、魅力的なコンテンツです。

## Final thoughts

Bulmaについて私が一番気に入っていることは、それらがどういう意図を持っているかをわざわざ制作者に訊かなくても理解することができるところです。
○○はどうすればいいですか？調べろ！
これはよいアイデアです。
私達はよくわからないCSSをこねくり回すかわりに、CSSの達人の考えを直接見ることができるのです。

ここまで読んでくれてありがとう。
私は最初こそBulmaを学ぶことを躊躇いましたが、使うにつれてそれが如何に強力で一貫的な設計であるかを理解できるようになりました。
Webサイトを設計して開発することは、しばしば想定以上に困難になるものです。
従って私は、Bulmaがもっと大々的に広がるべきだと考えています。
Bulmaをもっと学びたいのであれば、[Responsive Blog Design](https://medium.freecodecamp.org/how-to-build-a-responsive-blog-design-with-bulma-css-c2257a17c16b)や[Responsive Tesla Launch Page](https://medium.freecodecamp.org/how-to-build-a-responsive-tesla-launch-page-with-bulma-css-2bf484057349)も見てください。

------------------------

あなたは私をサポートすることができます。
[コーヒーください](https://www.buymeacoffee.com/zaydek)。
特にチャイと緑茶ラテが好みです。

そして[Patreon](https://www.patreon.com/jgthms)で[jgthms](https://jgthms.com/)をサポートすることも検討してあげてください。
彼は生計とフルタイム雇用をBulmaに捧げると決意したようです。

# コメント欄

「Foundationはいいぞ。SASSで書かれていて、全コンポーネントはオプショナルで、エンタープライズでの使用に適してる。」
「Foundationのgridでなんでもかんでもやるのが好きだったのだが、こいつは良さそうだ。コースやってみる。」
「技術記事で絵文字使うのやめれ、voidが発狂するぞ」
「私Bulma大好き！サンプルでFWのことをよりわかりやすくなった。あとScrimba知らなかった、これは凄い！」

# 感想

何故Z限定なのだろうか。海外はZから始まるのか？

この記事は[Free Course: Level Up With Bulma CSS](https://medium.freecodecamp.org/free-course-level-up-with-bulma-css-d82dcb4b980a)の日本語訳です。

元記事のある[freeCodeCamp](https://medium.freecodecamp.org/)は記事毎にサムネイル画像が表示される仕様であるため、サムネ一本釣りができたのですが、Qiitaにはサムネイルの仕組みがないので何がなんだかわかりませんね。

なお、本文中「後で公開する」と言っていた記事は、最後にあるように[Responsive Blog Design](https://medium.freecodecamp.org/how-to-build-a-responsive-blog-design-with-bulma-css-c2257a17c16b)と[Responsive Tesla Launch Page](https://medium.freecodecamp.org/how-to-build-a-responsive-tesla-launch-page-with-bulma-css-2bf484057349)で既に公開されています。

Bulmaはcssが1ファイルだけというコンパクトなCSSフレームワークで、導入が非常に簡単です。
BootstrapとかSemantic UIとかは大規模すぎてわざわざ導入するには役不足、でも一から書くのも辛い、という中小規模サイトにとっては有力な選択肢のひとつになるでしょう。
上司や同僚に「次のプロジェクトはぜひBulmaでいきましょう！」と伝えてみてはいかがでしょうか。