CSSで左上から下に向かって配置するカラムレイアウトを作れる「columns」プロパティ
CSSで左上から下に向かって要素を配置していき、2カラムや3カラムなどを作れる「columns」プロパティ。
カラムレイアウトと言えば「FlexboxやGrid、floatなどを使うしかない」と思っていたのですが
この「左上から下に向かって配置」をするためには「columns」が便利です。
そんな「columns」の使い方や、関連プロパティについてご紹介します。
何がしたいか
例えばこのようなHTMLがあったとして
<ul class="columns">
<li>リスト1</li>
<li>リスト2</li>
<li>リスト3</li>
<li>リスト4</li>
<li>リスト5</li>
<li>リスト6</li>
<li>リスト7</li>
<li>リスト8</li>
</ul>
このように配置したいとき「columns」プロパティが使えます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
(FlexboxやGridでこれをやるには工夫が必要ですし、柔軟性にも欠けますよね)
ここで指定しているCSSはたったこれだけ。
ul.columns {
columns: 3;
}
親コンテナの高さや、折返し位置などを指定する必要はなく、 左上から下に向かって自動で配置してくれます。
ブラウザも概ね対応しているようです。 Can I use
目次
親コンテナに指定できるプロパティ
column
まずは「columns」プロパティについて。
columnsは、後述する「column-count (カラム数)」と「column-width (カラム幅)」をまとめて指定できるプロパティです。
例①
冒頭と同じ例ですが、こうすると
ul.columns {
columns: 3; /* column-count: 3; と同義 */
}
3カラムで配置されます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
例②
次に、例えばこのように書くと
ul.columns {
columns: auto 100px; /* column-count: auto; column-width: 100px; と同義 */
}
幅100pxで配置されていき、カラム数は自動で決定されます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
間違った例
ここで、間違った例を2つ。
例えばこのように指定すると
/* 間違った例 */
ul.css_columns {
columns: 3 100px; /* column-count: 3; column-width: 100px; と同義 */
}
3カラムですが、幅が100pxではありません。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
これは「column-count」が優先されるからです。
column-count: 3; なので、3カラムになるよういっぱいに引き伸ばされています。
「column-width」を指定したい場合は「column-count」をautoとしなければなりません。
column-width - CSS: カスケーディングスタイルシート | MDN
他にも、例えばこのように指定すると
/* 間違った例 */
ul.css_columns {
columns: auto 20%; /* column-count: auto; column-width: 20%;(?) と同義 */
}
エラーとなります。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
「column-width」はパーセント値は無効です。
pxやem、rem、vwなどが使えます。
column-count
前項でほとんど紹介してしまいましたが、column-countはカラム数を指定するプロパティです。
こうすると
ul.columns {
column-count: 5;
}
5カラムで配置されます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
- リスト9
このようにすればレスポンシブにも対応できます。
ul.columns {
column-count: 5;
}
@media screen and (max-width: 767px) {
ul.css_columns {
column-count: 2; /* スマホでは2カラム */
}
}
column-width
こちらも前項でほとんど紹介してしまいましたが、column-widthはカラム幅を指定するプロパティです。
パーセント値は使えないというのと、column-countが指定されてる場合はそっちが優先される点に注意が必要です。
例えばこのように書くと
ul.columns {
column-width: 200px;
}
幅200pxで配置されていき、カラム数は自動で決定されます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
パーセント値は使えませんが、vwは使えます。
ul.columns {
column-width: 20vw;
}
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
column-rule
column-ruleはカラムの区切り線の幅(column-rule-width)・スタイル(column-rule-style)・色(column-rule-color)をまとめて指定できるプロパティです。
書き方は「border」プロパティと一緒で このように書くと
ul.columns {
columns: 3;
column-rule: 2px solid #333;
}
このように線で区切られます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
column-gap
column-gapはFlexboxやGridでも使えるプロパティで、アイテム間の横方向の余白を指定できるプロパティです。
カラムレイアウトの場合、初期値は1emとなっています。
このようにすると
ul.columns {
columns: 3;
column-gap: 40px;
}
左右方向の余白が40pxとなります。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
初期値が1emなので、完全にくっつけたい場合は「0」と指定する必要があります。
ul.columns {
columns: 3;
column-gap: 0;
}
完全にくっつきました。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
column-fill
「使うことは無いかな~」というプロパティです。
column-fillは、子要素をどのようなバランスで配置するか指定するプロパティで「auto」「balance」「balance-all」の3つの値を指定することができます。 初期値は「balance」です。
「auto」を指定すると、子要素を左に詰めることが優先されます。
ul.columns {
columns: 3;
column-fill: auto;
}
すべての子要素が左のカラムに入ってしまいます。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
「balance-all」は調べてもよくわかりませんでした。
子要素に指定できるプロパティ
column-span
column-spanは、特定の子要素を複数のカラムにまたがって配置できるプロパティで「none」「all」の2つの値があります。 初期値は「none」です。
例えばこういうHTMLで
<ul class="columns">
<li>リスト1</li>
<li>リスト2</li>
<li>リスト3</li>
<li>リスト4</li>
<li class="column-span">リスト5</li>
<li>リスト6</li>
<li>リスト7</li>
<li>リスト8</li>
</ul>
CSSをこうすると
ul.columns {
columns: 3;
}
ul.columns .column-span {
column-span: all;
}
このように「リスト5」が横いっぱいにまたがって配置されました。
- リスト1
- リスト2
- リスト3
- リスト4
- リスト5
- リスト6
- リスト7
- リスト8
使い所が難しそうですね、 ここまでやるならGridを使ったほうがいい気もします。
以上、カラムレイアウトで要素を左上から下向きに配置できる「columns」プロパティの紹介でした。
簡単なリストの作成なら便利な場面もあると思いますが、本格的なカラムレイアウトを作るならFlexboxやGridのほうが良さそうではありますね。