無料公開中
公開翌日4時まで

隙間に線を引くcolumn-rule/row-rule 第1回 column-ruleの基本とborderとの違い

段組みの段間に線を引くcolumn-ruleが、CSS GridやFlexboxでも使えるようになりました。第1回は従来のcolumn-ruleを題材に、「隙間に線を引く」考え方とborderとの違いを押さえます。

発行

著者 坂巻 翔大郎 フロントエンド・エンジニア
隙間に線を引くcolumn-rule/row-rule シリーズの記事一覧

はじめに

リストやナビゲーションの項目のあいだに区切り線を引くために、li + liのような隣接セレクターとborderを組み合わせてきた経験はあるのではないでしょうか。

CSSには、column-ruleという「段組みの段と段のあいだに線を引く」ためのプロパティが古くからあります。区切り線を引くという目的は同じですが、線の描かれ方はborderとまったく違います。なお、段組みそのものについては「CSS Multi-column Layoutを試す」シリーズで解説しているので、併せて参照してください。

そして2026年、このcolumn-ruleが段組み専用のプロパティではなくなりました。CSS Gaps Module Level 1という仕様でGap Decorationsと呼ばれる仕組みが定義され、CSS GridやFlexboxでgapが空ける隙間にも線を引けるようになったのです。

本シリーズでは、この「隙間に線を引く」仕組みを3回に分けて解説します。第1回は、従来のcolumn-ruleを題材に、その考え方とborderとの違いを押さえていきましょう。

column-ruleの基本

まずは、column-ruleを使って段間に線を引いたデモを見てみましょう。

3段組みにして、段と段のあいだに太さ2px・色#c00の線を引いています。コードは次のとおりです。

3段組みの段間に線を引く

.article {
  column-count: 3;
  column-gap: 2rem;
  column-rule: 2px solid #c00;
}

column-countで段数を、column-gapで段と段のあいだの隙間を決めます。そして、その隙間に線を引くのがcolumn-ruleです。

column-ruleは、次の3つのプロパティをまとめて指定するショートハンドです。

  • column-rule-width:線の太さ。初期値はmedium
  • column-rule-style:線の種類。初期値はnone
  • column-rule-color:線の色。初期値はcurrentcolorで、指定しなければ文字色と同じ色になる

border-width / border-style / border-colorと同じように、soliddashedといった線の種類の値もborderと共通です。

個別のプロパティで指定するときの注意

個別のプロパティで書く場合は、column-rule-styleの指定を忘れないようにしてください。次のコードでは線は描かれません。

太さと色だけでは線は描かれない

.article {
  column-rule-width: 2px;
  column-rule-color: #c00;
  /* column-rule-styleがnoneのままなので線は描かれない */
}

太さと色は指定してあるのに、線の種類を指定していないからです。column-rule-styleの初期値はnone、つまり「線を描かない」という指定が残ったままなのです。styleが線の有無のスイッチになっているのはborderと同じです。

この指定は忘れやすいので、特別な理由がなければショートハンドのcolumn-ruleを使うほうが安全です。

borderとの違い

ここまで見るとborderと似ていますが、「線がどこに描かれるか」という点が違います。デモで確認してみましょう。

column-gap32pxに固定して、column-rule-widthだけをスライダーで変えられるデモです。段の幅と、テキストが折り返す位置に注目しながら動かしてみてください。

線をどれだけ太くしても、段の幅も位置も、テキストの折り返しもまったく動きません。borderなら、線の太さのぶんだけレイアウト上の場所を取るので、要素や中身の幅・位置に影響します。対してcolumn-ruleの線は、隙間の中央に描かれ、レイアウト上の幅を一切取りません。段の幅も位置も、線がないときと変わらないのです。

段間に線を引く際の注意点

borderと違って線を太くしてもレイアウトを押し広げない点は扱いやすい性質ですが、裏を返せば注意点にもなります。線が隙間より太いと、レイアウトが押し広げられない代わりに、はみ出した部分がそのままコンテンツに重なるのです。次のデモで確認してみましょう。

今度はcolumn-rule: 16px solid #c00と太い線を指定して、column-gapだけをスライダーで変えられるようにしています。column-gapを狭くしていくと、線の太さである16pxを下回ったあたりから、線がテキストに食い込んでいきます。

線とテキストのあいだの間隔は、実質(column-gap - column-rule-width) / 2になります。column-gapから線の太さを引いた残りが、線の左右に均等に分かれると考えればよいでしょう。column-gap32px、線が2pxなら、片側15pxずつの間隔が空きます。

ですので、column-gapcolumn-rule-widthはセットで管理するとわかりやすいかもしれません。筆者としては、次のようにカスタムプロパティで一元化しておくとよいと考えています。

線の太さと間隔からcolumn-gapを計算する

.article {
  --rule-width: 2px;
  --rule-space: 16px; /* 線とテキストのあいだの間隔 */
  column-count: 3;
  column-gap: calc(var(--rule-width) + var(--rule-space) * 2);
  column-rule: var(--rule-width) solid #c00;
}

線の太さと間隔を先に決めて、そこから必要なcolumn-gapcalc()で計算しています。間隔は線の左右に1つずつ必要なので、線の太さに間隔の2つぶんを足した値がcolumn-gapになるわけです。デモで動かしてみましょう。

--rule-widthを大きくしても、線とテキストのあいだの間隔は--rule-spaceのまま保たれます。対してcolumn-gapを固定値にしていると、レイアウトこそ動かないものの、線を太くしたぶんだけ間隔が狭くなってしまうのです。

2026年の変化:CSS Gap Decorations

ここまでは段組みの話でしたが、「隙間の中央に、レイアウトに影響を与えずに線を引く」という仕組みは、段組みだけのものである必要はありません。CSS GridやFlexboxのgapが空けるのも、同じくアイテムのあいだの隙間です。

そう考えて仕様が拡張されたのがCSS Gap Decorationsです。変わったのは大きく次の3つです。

  • column-ruleが、段組みだけでなくCSS Grid / Flexboxのコンテナーの隙間にも適用されるようになった
  • 横方向の隙間に線を引くrow-ruleが加わった
  • 縦横両方の線をまとめて指定するruleショートハンドが加わった

row-rulerow-rule-width / row-rule-style / row-rule-colorという構成で、初期値もcolumn-ruleと同じです。

これらのプロパティは特定のレイアウト専用のものではなく、段組み・CSS Grid・Flexboxのいずれにも共通して適用されます。ただし段組みには横方向の隙間が基本的にないため、row-ruleが活躍するのはCSS GridとFlexboxということになります。

サポート状況は次のとおりです(2026年8月現在)。

ブラウザ CSS Grid / Flexboxでのcolumn-rulerow-ruleなどの新機能
Chrome 149以降
Edge 149以降
Firefox 未対応
Safari 未対応

この表はあくまで、CSS GridやFlexboxの隙間に線を引くという新しい部分についてのものです。段組みでのcolumn-ruleは全ブラウザで長年サポートされていて、CSS Gap Decorationsで挙動が変わることもありません。今回学んだ内容は、そのまますべてのブラウザで使えます。

なお、新機能に対応しているかを@supportsで判定する場合には落とし穴があります。これは次回、フォールバックの書き方と併せて解説します。

ここまでのまとめ

今回は、段組みのcolumn-ruleを題材に、CSS Gap Decorationsの土台となる考え方を解説しました。要点は次のとおりです。

  • column-rulewidth / style / colorをまとめたショートハンドで、値の書き方はborderと共通
  • 個別のプロパティで書くときはcolumn-rule-styleの指定を忘れない(初期値はnone
  • borderが要素に付く線なのに対して、column-ruleの線は隙間の中央に描かれ、レイアウト上の幅を取らない
  • そのため、線が隙間より太いとコンテンツに重なる。column-gapcolumn-rule-widthはセットで管理する

borderは要素に付ける線、column-ruleは隙間に引く線です。書き方が似ているぶん混同しやすいのですが、「要素に線をつける」のではなく「隙間に線を引く」という発想がわかっていれば、次回以降の話も理解しやすくなるはずです。

冒頭に挙げた「li + liborderで区切り線」も、要素に線を付ける発想でした。次回は、CSS GridやFlexboxでcolumn-rulerow-ruleを使っていきます。折り返すリストの区切り線をborderで作ると行頭に線が残ってしまう問題が、CSS Gap Decorationsではどう解決されるのかを見ていきましょう。