CSSデザインの可能性を広げる:アットルール関数と代替方法の使い分け


calc()関数

calc() 関数は、数学演算を使用して値を計算します。加算、減算、乗算、除算、およびモジュロ演算子をサポートしています。構文は以下の通りです。

calc(<value> [operator <value>]*)


width: calc(50% + 20px); /* 要素の幅を親要素の 50% + 20 ピクセルに設定します */
margin: calc(10px - 5%); /* 要素の余白を 10 ピクセル - 親要素の幅の 5% に設定します */

env()関数

env() 関数は、ブラウザ環境に関する情報を取得するために使用されます。使用可能な環境変数は、ブラウザによって異なります。構文は以下の通りです。

env(<variable-name>)


color: env(COLOR_SCHEME); /* システムのカラー スキームに基づいてテキストの色を設定します */
font-size: env(FONT_SIZE); /* システムのフォント サイズに基づいてフォント サイズを設定します */

url()関数

url(<url>)


background-image: url('image.png'); /* 要素の背景に画像を設定します */
content: url('icon.svg'); /* before 擬似要素にアイコンを設定します */

attr()関数

attr() 関数は、要素の属性値を取得するために使用されます。構文は以下の通りです。

attr(<attribute-name>)


content: attr(data-text); /* 要素の data-text 属性の値をコンテンツとして設定します */
background-color: attr(data-color); /* 要素の data-color 属性の値を背景色に設定します */

counter()関数

counter() 関数は、リスト項目などの要素にカウンタを生成するために使用されます。構文は以下の通りです。

counter(<name>, <style>?)
list-item::before {
  content: counter(item); /* リスト項目の前にカウンタを追加します */
}

list-item::after {
  content: counter(item, decimal); /* リスト項目の後に小数カウンタを追加します */
}
  • rgba() 関数: RGBA カラー値を生成します
  • hsla() 関数: HSL カラー値を生成します
  • color-mix() 関数: 2 つの色の混合
  • cross-fade() 関数: 2 つの値の間をクロスフェードします
  • gradient() 関数: グラデーションを作成します


calc() 関数を使用したレスポンシブレイアウトの作成

body {
  font-size: calc(16px + 0.5vw); /* ビューポート幅に基づいてフォント サイズを調整します */
}

h1 {
  font-size: calc(2.5em + 1rem); /* 単位を混在させて柔軟なサイズ設定 */
}

env() 関数を使用したシステム設定の採用

body {
  background-color: env(COLOR_SCHEME); /* システムのカラー スキームに基づいて背景色を設定します */
  color: contrast(env(COLOR_SCHEME), white, black); /* カラー スキームに合わせてテキストの色を調整します */
}

url() 関数を使用した画像とアイコンの使用

.banner {
  background-image: url('hero.jpg'); /* 要素の背景に画像を設定します */
  background-size: cover; /* 画像を要素にフィットさせます */
}

.icon {
  content: url('checkmark.svg'); /* before 擬似要素にアイコンを設定します */
  display: inline-block;
  width: 20px;
  height: 20px;
}

attr() 関数を使用した動的なコンテンツの生成

article {
  display: flex;
  align-items: center;
}

article img {
  width: 100px;
  height: auto;
  margin-right: 20px;
}

article h2 {
  font-size: 1.2em;
  margin: 0;
}

article p {
  color: gray;
}
<article>
  <img src="image.jpg" alt="記事の画像">
  <h2>記事のタイトル</h2>
  <p>記事の説明文</p>
</article>

<article>
  <img src="image2.jpg" alt="別の記事の画像">
  <h2>別の記事のタイトル</h2>
  <p>別の記事の説明文</p>
</article>

上記の HTML コードは、attr() 関数を使用して、各記事の img 要素の alt 属性値と h2 要素のテキストコンテンツを動的に表示します。

counter() 関数を使用したリストの装飾

ol {
  list-style-type: none;
  counter-reset: item;
}

ol li {
  counter-increment: item;
  padding-left: 20px;
  position: relative;
}

ol li::before {
  content: counter(item) "."; /* 各リスト項目の前にカウンタとドットを追加します */
  position: absolute;
  left: 0;
  top: 5px;
}

この CSS コードは、counter() 関数を使用して、番号付きリストの各項目の前にカウンタとドットを追加します。

  • 最新の情報については、MDN Web Docs の CSS アットルール関数に関するリファレンスを参照してください。
  • 複雑なデザインを作成する場合は、ブラウザの互換性を考慮する必要があります。


代替方法を検討すべきケース

  • パフォーマンス
    複雑なアットルール関数は、レンダリングのパフォーマンスに影響を与える可能性があります。パフォーマンスが重要な場合は、代替方法を検討する必要があります。
  • シンプルな要件
    アットルール関数は複雑な構文を持つ場合があり、シンプルな要件には過剰な可能性があります。そのような場合は、よりシンプルな CSS プロパティやセレクタを使用することを検討してください。
  • 古いブラウザのサポート
    一部の新しい CSS アットルール関数は、古いブラウザではサポートされていない場合があります。古いブラウザとの互換性が重要な場合は、代替方法を使用する必要があります。

代替方法の例

calc() 関数の代替方法

  • 変数を使用する場合は、CSS カスタムプロパティを使用できます。
  • シンプルな数学演算の場合は、直接計算式を記述できます。
/* calc() 関数の代替例 */
width: 50% + 20px; /* 代わりに、以下の式を使用できます */
width: calc(50vw + 20px);

margin: 10px - 5%; /* 代わりに、以下の式を使用できます */
margin: 10px - calc(5% * vw);

env() 関数の代替方法

  • デフォルト値を設定する場合は、CSS カスタムプロパティを使用できます。
  • ブラウザがサポートしていない環境変数を使用する場合は、JavaScript を使用して値を取得できます。
/* env() 関数の代替例 */
color: env(COLOR_SCHEME); /* 代わりに、JavaScript を使用して値を取得できます */
const colorScheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
document.body.style.color = colorScheme;

background-color: attr(data-color); /* 代わりに、CSS カスタムプロパティを使用できます */
:root {
  --data-color: #f00; /* デフォルトの色を設定します */
}

url() 関数の代替方法

  • Base64 エンコーディングを使用して、画像データを直接 CSS に含めることができます。
  • データ URI を使用して、小さな画像やアイコンを埋め込むことができます。
/* url() 関数の代替例 */
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C9IAAAAASUVORK5CYII='); /* Base64 エンコーディングされた画像データを使用します */

attr() 関数の代替方法

  • データ属性を使用して、要素にデータを格納できます。
  • JavaScript を使用して、要素の属性値を取得できます。
/* attr() 関数の代替例 */
content: attr(data-text); /* 代わりに、JavaScript を使用して値を取得できます */
const element = document.querySelector('[data-text]');
const text = element.getAttribute('data-text');
content: text;

background-color: attr(data-color); /* 代わりに、データ属性を使用できます */
<div data-color="#f00"></div>
  • 擬似要素と ::before および ::after 疑似クラスを使用して、カウンタを手動で生成できます。
/* counter() 関数の代替例 */
ol {
  list-style-type: none;
  counter-reset: item;
}

ol li {
  position: relative;
  padding-left: 20px;
}

ol li::before {
  content: counter(item) ".";
  position: absolute;
  left: 0;
  top: 5px;
}