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;
}