こんにちはアイレット株式会社デザイン事業部の工藤です。
今日も元気にInside UI/UXのテーマで執筆していきたいと思います!

さて2022年現在のwebはかつてなくデバイスサイズが多様化しており、フロントエンド開発者を悩ませています。
高精細な大型PCディスプレイ、レガシーなPC、iPad Proなど大型タブレット、iPad miniなど小型タブレット、iPhone XRなどの大型スマホ、iPhone SEなどの小型スマホなどかなりの多様性があります。
これだけのデバイスサイズに対応したレスポンシブwebデザインを実現するのは非常に困難なです。レスポンシブwebデザインが登場した2010年頃と同じようにCSSメディアクエリを中心に対応しようとすると、多数のブレイクポイントによる条件分岐が発生してしまい、見通しが悪いCSSコードが出来上がってしまいます。
ですから、モダンなCSSを書くにあたってはデバイスサイズを考慮しないつまりCSSメディアクエリをなるべく使わないアプローチをマスターすることが求められています。
このデバイスサイズを考慮しない思想のことを専門的には「コンテンツベース(content based CSS)」といいます。

/*レスポンシブ対応のために肥大化したCSSコードの例*/
/*SP*/
.element{
    font-size: 16px;
}
/*Tablet*/
@media (min-width: 768px) { 
    .element{
        font-size: 24px;
    }
}

/*PC*/
@media (min-width: 992px) { 
    .element{
        font-size: 32px;
    }
}

/*Large PC*/
@media (min-width: 1200px) { 
    .element{
        font-size: 36px;
    }
}

というわけでコンテンツベースなレイアウトに役立つCSSプロパティを学んでいきましょう。まずは layout: grid; です。

layout: grid;

実際のコードを見る方がわかりやすいです。Codepenのウィンドウサイズを変化させてみてください。

 <ul class="grid">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
  <li>Item 9</li>
  <li>Item 10</li>
  <li>Item 11</li>
  <li>Item 12</li>
</ul>
.grid {
  --auto-grid-min-size: 16rem;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(var(--auto-grid-min-size), 1fr));
  grid-gap: 1rem;
}

.grid li {
  padding: 5rem 1rem;
  text-align: center;
  font-size: 1.2rem;
  background: #eb4d4b;
  color: #ffffff;
}

See the Pen
content based layout using layout: grid;
by Hibiki Kudo (@h_kudo)
on CodePen.

https://cpwebassets.codepen.io/assets/embed/ei.js
このように layout: grid; はコンテンツベースレイアウトを強力に支援します。

min() / max() / clamp()

さらに新しいCSS関数プロパティである min() / max() / clamp() を使えば、フォントサイズやボックスサイズでコンテンツベースなレイアウトを実現しやすくなります。
まずはそれぞれの機能を見てみましょう。

  • clamp()は、基本となる推奨値、そして最小値と最大値と3つの数値を設定します。
  • min()clamp()に似ているが、最小の値のみを定義します。
  • max()min()とは逆に最大の値のみを定義します。

width プロパティに min() / max() / clamp() を指定すれば、 max-width min-width が不要になります。
うまく利用してブレークポイント / メディアクエリを定義せずに、レスポンシブなレイアウトが実現してみましょう!

<h2 class="clamp-title">可変する文字サイズ</h2>
<div class="css-min">CSS Min() </div>
<div class="css-max">CSS Max()</div>
<div class="css-clamp">CSS Clamp() </div>
.clamp-title {
  font-size: clamp(12px, 5vw, 32px);
}
.css-min {
  background-color: #ffea00;
  width: min(50vw, 500px);
  height: 6rem;
}

.css-max {
  background-color: #88ff00;
  width: max(50vw, 500px);
  height: 6rem;
}

.css-clamp {
  background-color: #00ffd9;
  width: clamp(400px, 60vw, 700px);
  height: 6rem;
}

See the Pen
Untitled
by Hibiki Kudo (@h_kudo)
on CodePen.

https://cpwebassets.codepen.io/assets/embed/ei.js

いかがでしたか?多くの場合は今までと同様にメディアクエリ @media を利用したCSSの実装方法で対応できるでしょう。とはいえ、多数のブレイクポイントによる条件分岐で見通しが悪いCSSコードを排除し、メディアクエリなしでコンテンツベースなレスポンシブレイアウトを実現することができれば最高にクールですよね?

P.S. アイレットではエンジニア、デザイナーを募集しています。詳しくは採用情報のページをご覧ください。