
本記事は執筆時点(2025年02月06日)の情報をベースにしております。掲載している情報が最新ではない可能性がありますので何卒ご容赦ください。
最近になって疑似要素で使うことができるCSSのattr関数の存在を知りました。コーディングの幅を広げる便利な関数だと感じましたので学んだ内容を備忘録としてまとめてみます。
attr関数とは?
CSSのattr関数は、HTML側で設定した要素の属性値をCSS内で参照し取得できる関数です(「attr」は属性を意味する「attribute」の略)。現在は疑似要素(before、after)におけるcontentプロパティでのみ利用可能となっています。

例えば下記のようなツールチップ内のテキストの取得・表示にattr関数がよく用いられます。

attr関数を使いこなすことで、表示させるコンテンツはHTML、デザインはCSSという両者の切り分けが実現できるので、コーディング時間を短縮したりソースコードの視認性向上が期待できます。
「class」や「id」、アンカー要素で使う「href」、input要素で使う「type」など、HTML要素に付加情報を与えるものを属性値と言います。独自のカスタムデータを持たせたい場合はdata属性を利用し、「data-〇〇」という形式で記述します。
CSSの疑似要素の使い方について詳しくはこちらのページにまとめています。
attr関数の使い方
attr関数は疑似要素(beforeもしくはaftre)のcontentプロパティで、下記のように記述して使用します。

使い方の例として、下図のような日本語+英語の見出しタイトルのデザインをattr関数を用いて作ってみます。

はじめにHTMLのソースコードは以下の通りです。
それぞれ英語表記のデータを「data-en」というデータ属性に持たせています。
HTML
<h2 data-en="first">見出しタイトル</h2> <h2 data-en="second">見出しタイトル</h2>
次にCSSでattr関数を使って「data-en」の属性値を取得・表示します(フォントや配置は別途設定)。
CSS
h2::before{ content:attr(data-en); /*以下、英語装飾のデザインを任意に設定*/ }
表示させるテキストはHTML側に記述しているので、一度CSSでデザインを作ればその後CSSは触らずに済みます。これがattr関数のメリットと言えますね。
attr関数でツールチップを表示する
続いては冒頭に例として載せたツールチップの作り方です。

HTMLでは要素にデータ属性「data-tt」を用意し、それぞれツールチップに表示させたいテキストを埋め込みます。
HTML
<p>詳しくは<a href="###" data-tt="別のページを開きます">こちら</a>をご覧ください。</p> <p>詳しくは<a href="###" data-tt="外部サイトを開きます">こちら</a>をご覧ください。</p>
次に、マウスホバーされたらツールチップが表示されるようCSSを記述していきます。
CSS
a[data-tt]{ font-weight:bold; position: relative; } a[data-tt]:hover::before{/*テキスト*/ content:attr(data-tt); display: block; width:150px; background-color: #e9e9e9; color:#111; font-size:12px; padding:.25em .5em; border-radius:2px; position: absolute; top:calc(-100% - .5em); left:0; } a[data-tt]:hover::after{/*矢印*/ content: ""; width: 10px; height: 10px; background: #e9e9e9; clip-path: polygon(0 0, 100% 0, 50% 100%); position: absolute; top: -10px; left: 10px; }
1行目a[data-tt]と書くことで、データ属性「data-tt」を持つ要素のみにツールチップのスタイルが適用されるようにしています。
5行目~要素がマウスホバーされたら、attr関数を使って「data-tt」を取得し、ツールチップとして表示させています。
18行目~ツールチップの矢印の部分です。
接頭語接尾語を付け加える
attr関数では属性値を表示する際に、接頭語接尾語を付け加えることが可能です。
ここでは先ほどのツールチップを例に、テキストの「を開きます」の部分を接尾語として表示させるように修正します。
HTML
<p>詳しくは<a href="###" data-tt="別のページ">こちら</a>をご覧ください。</p> <p>詳しくは<a href="###" data-tt="外部サイト">こちら</a>をご覧ください。</p>
HTMLの方ではリンク先が「別ページ」なのか「外部サイト」なのかだけを記述すれば済むので、ソースコードはより簡潔になります。
CSS
a[data-tt]:hover::before{ content:attr(data-tt) "を開きます"; /*以下省略*/ }
2行目attr関数「attr(data-tt)」の後に半角スペースを空けて接尾語として加えたいテキストを記述します(接頭語の場合はattr関数の前に記述)。
その他attr関数の活用例
疑似要素自体が装飾を目的としているのでattr関数の用途も必然的に限定されますが、それ以外の活用方法としては以下が挙げられます。
attr関数でhref属性を取得する
下記のようなURLを書いたハイパーリンクを設置する場合、

従来であれば同じURLをテキストとして表示する部分とhref属性の部分との2回記述が必要になります。

もしリンクを大量に掲載するページだとすれば、コーディングの手間も増え、コードの視認性も悪くなります。訂正が発生すれば2つとも直さなければいけません。
この時attr関数を使ってhref属性値を表示させれば、HTML側でのURLの記述は1回で済ませることが可能です。
HTML
<ul> <li><a href="https://hogehoge.com/news/20XX/01/helloworld.html">ブログ記事A</a></li> <li><a href="https://hogehoge.com/news/20XX/03/hogehoge.html">ブログ記事B</a></li> </ul>
HTMLにはhref属性にだけURLを記述すればOKです。
CSS
a:after{ content:"(" attr(href) ")"; }
2行目attr関数でhref属性を取得し、括弧をつけて表示させます。
tableのレスポンシブ化にattr関数を用いる
最後はtable要素をスマホなどで表示する際にattr関数を使って見出しを表示させる方法です。
表のレスポンシブ化として、スマホで表示する時に縦並びにレイアウトを変更するという手段を用いる場合、下図のような1行目に項目名があるタイプだと、項目名と表のコンテンツが離れてしまうので、分かりづらくなってしまいます。

そこで、スマホ時だけattr関数を利用して行見出しを表示するようにしてみます。
HTML
<table class="myTbl"> <thead> <tr> <th>会社名</th> <th>都道府県</th> <th>電話番号</th> <th>メールアドレス</th> </tr> </thead> <tbody> <tr> <th data-label="会社名">(株)サンプル</th> <td data-label="都道府県">東京都</td> <td data-label="電話番号">03-1234-5678</td> <td data-label="メールアドレス">info@example.com</td> </tr> <tr> <th data-label="会社名">(株)hogehoge</th> <td data-label="都道府県">埼玉県</td> <td data-label="電話番号">04-2345-6789</td> <td data-label="メールアドレス">info@hogehoge.com</td> </tr> </tbody> </table>
データ属性「data-label」にスマホ用の項目名を記述しています。
CSS
.myTbl{ border:none; border-collapse: collapse; margin:1em auto; padding:.5em; background-color:#f9f9f9; } .myTbl th,.myTbl td{ border:solid 1px #333; padding:.5em 1.5em; font-size:14px; text-align: center; font-weight: 400; } .myTbl th{ background-color: #a0a0a0; } @media only screen and (max-width:600px){ .myTbl,.myTbl thead,.myTbl tbody,.myTbl,.myTbl tr,.myTbl,.myTbl th,.myTbl,.myTbl td{ display: block; width:100%; } .myTbl thead{ display: none; } .myTbl tr{ margin-bottom: .5em; } .myTbl th,.myTbl td{ text-align: left; padding:0; } .myTbl th:before,.myTbl td:before{ content:attr(data-label); display: inline-block; width:25%; color:#333; font-size:12px; font-weight: bold; text-align: left; padding: 1em; border-right: solid 1px #666; margin-right:1em; } }
19行目表を縦並びにします。
24行目theadは非表示にします。
33行目attr関数を使って項目名を表示、borderなどでデザインを調整しています。

行数が多いとデータ属性の記述も膨大になるので、ループでHTMLを生成するケースを除き、あまりスマートな方法とは言えないかもしれません(項目名を修正が発生したら、全て訂正しなければいけないので…)。
まとめ
以上が、CSSのattr関数を使って要素の属性値を取得・表示する方法です。
アイデア次第でいろいろと活用できそうなので、覚えておいて損はないと思います。