RACCOON TECH BLOG

株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。

CSS4の疑似クラス使ってますか?

こんにちは。デザイン戦略部のtetsuyaです。
皆さまCSS4の疑似クラス使ってますか?
発表されたばかりの頃は対応ブラウザが少なく後回しにされがちですが、そろそろ対応ブラウザも多くなってきたので色々な疑似クラスを紹介していきたいと思います。
ちなみにCSS4という規格は存在せず、Level4のモジュールを総称してCSS4といわれています。

:has()

指定したセレクターがある場合、その親要素にスタイルを適用することができます。
ブラウザ対応状況

基本の書き方

p:has(span) {

}

サンプル

・pタグの次にspanタグがあるときpタグに適用される

HTML
<p class="has1"><span>spanタグ</span>ありのテキスト</p>
<p class="has1">spanタグなしのテキスト</p>
CSS
p.has1:has(span) {
    color: red;
}
結果

spanタグありのテキスト

spanタグなしのテキスト

・pタグの次にdivタグがあるときpタグに適用される

HTML
<p class="has2">pタグの次にdivタグがあるテキスト</p>
<div>divタグ</div>
<p class="has2">pタグの次にdivタグがないテキスト</p>
CSS
p:has2(+ div) {
    color: red;
}
結果

pタグの次にdivタグがあるテキスト

divタグ

pタグの次にdivタグがないテキスト

他にも色々な使い方があります。
詳しくは「基本のcss疑似クラス:has()を振り返ってみよう!」の記事をご覧ください!

:not(a,b,c)

指定したセレクターに一致しない要素にスタイルを適用することができます。複数指定時の書き方が便利になりました。
ブラウザ対応状況

基本の書き方

p:not(a,b,c) {

}

サンプル

・クラス名「.not1」「.not2」「.not3」以外のpタグに適用される

HTML
<div class="not-sample">
    <p class="not1">クラス名not1のテキスト</p>
    <p class="not2">クラス名not2のテキスト</p>
    <p class="not3">クラス名not3のテキスト</p>
    <p class="not4">クラス名not4のテキスト</p>
</div>
CSS
.not-sample p:not(.not1, .not2, .not3) {
    color: red;
}
結果

クラス名not1のテキスト

クラス名not2のテキスト

クラス名not3のテキスト

クラス名not4のテキスト

:is()と:where()

複数のセレクターをまとめて記述することができます。
:is()と:where()の違いは詳細度で、:where()は詳細度が常に0になります。
:is()ブラウザ対応状況
:where()ブラウザ対応状況

基本の書き方

:is(a,b,c) {

}
:where(a,b,c) {

}

サンプル

・クラス名をまとめて書くことができ、全てのspanタグに適用される

HTML
<div id="is-where-Sample1">
    <p class="is1">クラス名<span>is1</span>のテキスト</p>
    <p class="is2">クラス名<span>is2</span>のテキスト</p>
    <p class="is3">クラス名<span>is3</span>のテキスト</p>

    <p class="where1">クラス名<span>where1</span>のテキスト</p>
    <p class="where2">クラス名<span>where2</span>のテキスト</p>
    <p class="where3">クラス名<span>where3</span>のテキスト</p>
</div>
CSS
/* .is1 span, .is2 span, .is3 span { }をまとめて記述できる */
#is-where-Sample1 :is(.is1, .is2, .is3) span {
    color: red;
}
/* .where1 span, .where2 span, .where3 span { }をまとめて記述できる */
#is-where-Sample1 :where(.where1, .where2, .where3) span {
    color: red;
}
結果

クラス名is1のテキスト

クラス名is2のテキスト

クラス名is3のテキスト

クラス名where1のテキスト

クラス名where2のテキスト

クラス名where3のテキスト

・:where()の詳細度が0なので:where()で指定したspanだけblueになる

HTML
<div id="is-where-Sample2">
    <p class="is1">クラス名<span>is1</span>のテキスト</p>
    <p class="is2">クラス名<span>is2</span>のテキスト</p>
    <p class="is3">クラス名<span>is3</span>のテキスト</p>

    <p class="where1">クラス名<span>where1</span>のテキスト</p>
    <p class="where2">クラス名<span>where2</span>のテキスト</p>
    <p class="where3">クラス名<span>where3</span>のテキスト</p>
</div>
CSS
#is-where-Sample2 :is(.is1, .is2, .is3) span {
    color: red;
}
#is-where-Sample2 :where(.where1, .where2, .where3) span {
    color: red;
}
/* 最後に上書き */
#is-where-Sample2 span { 
    color: blue;
}
結果

クラス名is1のテキスト

クラス名is2のテキスト

クラス名is3のテキスト

クラス名where1のテキスト

クラス名where2のテキスト

クラス名where3のテキスト

:any-link

訪問の有無に関係なくリンクにスタイルを適用することができます。
これまで:link、:visitedの両方を記述していた指定を:any-link一つの記述で指定できるようになりました。
ブラウザ対応状況

基本の書き方

a:any-link {

}

サンプル

・訪問の有無に関係なくaタグに適用される

HTML
<div class="any-link-sample">
    <a href="javascript:void(0);">any-linkを指定したテキスト</a>
</div>
CSS
.any-link-sample a:any-link {
    color: red;
}
結果

:focus-within

その要素または子孫要素にフォーカスがある場合にスタイルを適用することができます。
ブラウザ対応状況

基本の書き方

form:focus-within {

}

サンプル

・formタグ内のinputタグにフォーカスをあてるとformタグに適用される

HTML
<div class="focus-within-sample">
    <form>
        <label for="sample-input">↓こちらをフォーカス</label>
        <input id="sample-input" type="text">
    </form>
</div>
CSS
.focus-within-sample form:focus-within {
    background: red;
}
.focus-within-sample form {
    border: 1px solid #333;
    color: gray;
    padding: 10px 20px;
}
結果


まとめ

いかがだったでしょうか?
今回、疑似クラスに絞りましが、他にも便利なcss4が多数あります。
対応ブラウザを確認して積極的に使ってみてはいかがでしょうか。

一緒にラクーンのサービスを作りませんか? 採用情報を詳しく見る

関連記事

運営会社:株式会社ラクーンホールディングス(c)2000 RACCOON HOLDINGS, Inc