めんどくなったので画像は適当である。
まずはColumnsの例。理解しやすいのでHTMLにJSX構文で表記するが説明も入れるので知らなくても安心してほしい
まずはBULMAのコードのおさらいから
<div class="columns">
<div class="column">
{test_card_short()}
</div>
</div>
columns
の中にcolumn
を入れることによって左から右に並べていくことができる。
JSX構文で説明するのはこの { } 鉤括弧でくくられてる部分だけ覚えておいてほしい。この中にカードのタグが変数的に引っ張ってくるだけなので今回は完全に無視して良い(つまりカードのHTMLタグはこの外にtest_card_short
として記述してある)
縦とか横とかわかりにくいので更に説明しておくと、例えばHTMLなら<h1>
や<p>
タグを書けば<br>
を入れることなく次々に下側の段へと表示が積まれていく。
columnは英語で「柱」なので縦を印象付けるかもしれないがレイアウト的には下にいくのではなく、横側に積む印象で覚えても良いかと思う。
<div class="columns">
<div class="column">
{test_card_short()}
</div>
<div class="column">
{test_card_short()}
</div>
<div class="column">
{test_card_short()}
</div>
</div>
3つ並べてみた。実行結果は次のようになる。
説明通り左から右にカードが3枚積まれた。これはこれで美しい。
しかし、コレは問題がある。カード下部の文字列の長さをカードごとに変更してみると次のようになる。
カードの長さが変わってしまった。スペースが出来てしまいこれでは美しいとは言えない。
この問題に直面した人は多いのではないだろうか。特にCardやBoxを使ってBLOG記事の一覧をレイアウトする場合は少し見にくい印象を受ける。
Tileの詳しい説明はこちら(https://bulma.io/documentation/layout/tiles/)にある
英語が難しいとかそれ以前にtile
が入れ子になっていて非常に分かりづらい。今回はこれを少しわかりやすくするのが目標だ。
<div class="tile">
<div class="tile">
{test_card_short()}
</div>
<div class="tile">
{test_card_middle()}
</div>
<div class="tile">
{test_card_long()}
</div>
</div>
test_card_short
, test_card_middle
, test_card_long
は単純に下部の文章が長いか短いかで3種類に分けた。先程のcolumnで長さがズレた例そのままだ。
今回はcolumns
をtile
に置き換えただけだ。公式の解説には色々書かれてあるが、とりあえず入れ子にしてみたらどうなるのか。
おや、すでにこれでも十分機能している。よく見ると文章の長さが違うにも関わらず下が揃っている。
しかし問題がある。マージンが無く窮屈だ。
ここで重要になってくるのが
is-ancestor
is-parent
is-child
まずは入れ子の一番上のtileにis-ancestor
をつけるらしい。これによりカードの外側のマージンが詰まって更にカードが大きくなる。
とりあえず一番上のtileにつけておけば良い程度に覚えておけばよいだろう。
次にカードの最初の1枚めだけにis-parent
を付けてみよう。
![is-parentを付けてみよう。](img/2020-03-10_21h26_55.jpg "is-parent
を付けてみよう。")
最初のカードに上手いことpaddingが入ったように見える。これなら3枚ともis-parent
にしておけばスペースが確保されて見やすくなるだろう。
完成である。
ここまでのコードは
<div class="tile is-ancestor">
<div class="tile is-parent">
{test_card_short()}
</div>
<div class="tile is-parent">
{test_card_middle()}
</div>
<div class="tile is-parent">
{test_card_long()}
</div>
</div>
入れ子(Nesting)にする場合このようにancestor > parent > child の順で付けていくと概ね上手くスタイリングされるように出来ているようだ。
さて、御存知の通り通常レイアウトは12というマスを持っていてis-数字
というコードを付けてやれば合計12になるまで横に積まれ、 オーバーしたら改行されて次の行に行くはずだ。
しかし、残念ながらBULMAのtile
はこのコーディングが入っていないようで自前で改行しなければそのままカードはひたすら右に積まれていく。合計12を超えるがスクロールバーも表示されない。
<div class="tile is-parent is-6">
{test_card_short()}
</div>
<div class="tile is-parent is-6">
{test_card_middle()}
</div>
<div class="tile is-parent is-6">
{test_card_long()}
</div>
<div class="tile is-parent is-6">
{test_card_short()}
</div>
<div class="tile is-parent is-6">
{test_card_middle()}
</div>
<div class="tile is-parent is-6">
{test_card_long()}
</div>
こうすると
こうなってしまうので注意
次の行に行くにはどうしたらいいのだろうか。
色々試行錯誤たが、ancestor
を1行としてどんどん次のancestor
を置いていくのが一番楽でコードも短かった。
<div class="tile is-ancestor">
<div class="tile is-parent">
{test_card_short()}
</div>
<div class="tile is-parent">
{test_card_middle()}
</div>
<div class="tile is-parent">
{test_card_long()}
</div>
</div>
<div class="tile is-ancestor">
<div class="tile is-parent">
{test_card_short()}
</div>
<div class="tile is-parent">
{test_card_middle()}
</div>
<div class="tile is-parent">
{test_card_long()}
</div>
</div>
これが2行の例
きれいに揃うデザインなので概ねこれで解決だと思う。しかしまだ少し気になるコードが残っている。
is-vertical
とは何かis-vertical
の場合それより内側のtile
が縦に積まれるようになる。これを使えばより正しいコードになるのだろうかと考えた。今回はこの落とし穴に注意が必要だ。
<div class="tile is-ancestor">
<div class="tile is-parent is-vertical">
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
</div>
<div class="tile is-parent">
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
</div>
</div>
parentを2つ用意し、一つをis-vertical
にした。
ご覧の通り片方が縦に積まれた。
この縦に積まれる方式を利用して先程のように3x2の美しいカード並びを再現してみようと試みる
<div class="tile is-ancestor">
<div class="tile is-parent is-vertical">
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
</div>
<div class="tile is-parent is-vertical">
<div class="tile is-child">
{test_card_long()}
</div>
<div class="tile is-child">
{test_card_short()}
</div>
</div>
<div class="tile is-parent is-vertical">
<div class="tile is-child">
{test_card_short()}
</div>
<div class="tile is-child">
{test_card_middle()}
</div>
</div>
</div>
非常にコードが煩雑になってきた。長くて入れ子のコードはあまりよろしくない。
左から右へ3段なのでis-vertical
のtile
が3個必要だ。 その中に2個のtile
を収めればそれぞれ上側のカード、下側のカードとなり3x2となる。
実践を考慮してカードの文章の長さを変えてレンダリングしてみる。
ご覧の通りズレている。 これは上から下にかけての箱の内側においてはそれぞれのtile
の長さが自由であるから発生する。
つまり結論としてis-vertical
は公式のtile
説明にあるようにより複雑なレイアウト設計にのみ使用し、シンプルなレイアウトの場合は使わないほうがよさそうである。
使用例としてはPinterestのような画像のサイズに応じてフレキシブルにスペースを詰めていくデザインには極めて有効なのではないだろうか。
この先はコードが沼になるため今回はここまでにしておく。
今回は非常に単純にカードの長さを揃えることに注目して解説したが、シンプルに揃えて改行するレイアウトはtile
のancestor
で続ければ良いと考えている。
正直tile
の利用方法はこれより更に複雑なレイアウトを表現するために存在するのだろう。
今回は詳しくやらなかったがis-vertical
やその他を絡めたより複雑なレイアウトが自由自在に表現できたらそれはオシャレだろう。だが、 今回はここまでだ。
また必要になれば記事を追加しようと思う。