【入門編】 :dir() 方向疑似クラス – CSS実践ガイド

皆さん、こんにちは!世界中を飛び回り、あらゆるCSSの難問を解決してきた、あなたのフロントエンドの先生です。今日もCSSの奥深い世界へ、一緒にワクワクする旅に出かけましょう!

CSSって、本当に面白いですよね。ちょっとした記述で、ウェブページがガラリと表情を変える。まるで魔法使いになった気分です。でも、中には「あれ?これは一体何に使うんだろう?」と、普段あまり出番がないように見えるけれど、実はとっても賢い、隠れた名選手のような機能もたくさんあるんです。

今日スポットライトを当てるのは、そんな隠れた名選手の一人、`:dir()`方向疑似クラスです。

`:dir()`って、一体何者?〜ウェブページの「道路の向き」を教えてくれるセレクタ〜

「`:dir()`?初めて聞いたな」「なんか難しそう…」って思った方も、大丈夫ですよ!心配いりません。これを理解すると、あなたのCSS設計がグッとスマートになる、とっておきの秘密兵器なんです。

まず、いきなり「書字方向」なんて難しい言葉が出てきて戸惑うかもしれませんね。でも、ご安心ください。これは要するに、「文字を読んだり書いたりする方向」のことなんです。

想像してみてください。
私たちは普段、日本語や英語を読むとき、「左から右へ」と文字を読んでいきますよね?これがCSSの世界では「`ltr` (Left-To-Right)」と呼ばれます。まるで日本の道路で車が右側通行するようなイメージです。

でも、世界にはアラビア語やヘブライ語のように、「右から左へ」と文字を読んでいく言語もあります。これが「`rtl` (Right-To-Left)」と呼ばれます。イギリスの道路で車が左側通行するような、全く逆の方向ですね。

`:dir()`方向疑似クラスは、まさにこの「ウェブページや要素が、今どっちの方向で文字を読んでいるのか?」を教えてくれる、賢い目を持つセレクタなんです。

なぜ、そんな情報が必要なの?

「でも、私が作ってるサイトは日本語だけだし…」そう思いましたか?ええ、確かに普段はあまり意識しないかもしれません。でも、もしあなたのウェブサイトが、いつか世界中の人々に使われるようになったらどうでしょう?

例えば、サイトのロゴやアイコン、フォームの入力欄などが、`ltr`の言語では左揃えが自然なのに、`rtl`の言語では右揃えが自然、なんてことが頻繁に起こります。そんな時、`:dir()`を使えば、言語ごとにCSSを書き分けることなく、「方向」だけを見てスタイルを適用できるという、とてつもないメリットがあるんです。

まるで、「この道路は右側通行だから、こっち側に標識を立てよう」「あっちの道路は左側通行だから、標識は逆側に立てよう」と、道路の向きに合わせて自動で判断してくれるカーナビのようなものですね。

どうやって書字方向が決まるの?〜HTMLのお約束と、親子の関係〜

じゃあ、その「書字方向」って、一体どうやってウェブページに伝わるんでしょうか?主な方法はいくつかありますが、一番直接的で強力なのは、HTMLの`dir`属性です。

1. HTMLの`dir`属性が最優先!

HTMLのタグの中に、`dir=”ltr”`とか`dir=”rtl”`と書くことで、その要素の書字方向を明示的に指定できます。





:dir() 方向疑似クラスの例

これは日本語のタイトルです。

この段落は通常通り、左から右へ読みます。


これはアラビア語のような、右から左へ読むテキストのブロックです。
تتجه هذه الكتلة النصية من اليمين إلى اليسار، مثل اللغة العربية.

また元の書字方向に戻りました。



この例だと、``タグでページ全体は`ltr`と指定していますが、途中の`

`タグに`dir=”rtl”`と書くことで、その部分だけ書字方向をひっくり返しています。

2. 親から子へのお下がり(継承)

CSSの世界ではよくある話ですが、書字方向も親要素の設定が子要素に「継承」されます。つまり、親が`dir=”rtl”`なら、特に指定がなければその中の子要素もみんな`rtl`になる、というわけです。まるで「この家では、食事の時はこう座る」という家訓が、子供たちにも受け継がれていくようなイメージですね。

この「最終的にその要素の書字方向が何であるか」という判定に、`:dir()`疑似クラスが力を発揮するんです。

実際に使ってみよう!`:dir()`の魔法

さあ、理屈は分かったところで、実際にコードを書いてみましょう!
今回は、簡単なメッセージボックスを例に、`:dir()`でスタイルを切り替える様子を見てみます。

HTMLの準備

まずは、こんなHTMLファイルを用意してください。





:dir() 方向疑似クラスでスタイルを切り替えよう

メッセージボックスの例

💡

これは標準的なメッセージです。

✅

左から右に読む言語のメッセージです。

⚠️

右から左に読む言語のメッセージです。

ℹ️

親がrtlなので、このボックスもrtlとしてスタイルが適用されます。


CSSの準備(`style.css`)

そして、`style.css`という名前で以下のCSSファイルを作成し、HTMLファイルと同じフォルダに保存してください。

/ 全体的なスタイル /
body {
font-family: “Helvetica Neue”, Arial, sans-serif;
line-height: 1.6;
margin: 20px;
background-color: #f4f7f6;
color: #333;
}

h2 {
border-bottom: 2px solid #5cb85c;
padding-bottom: 5px;
margin-top: 40px;
color: #5cb85c;
}

/ メッセージボックスの基本スタイル /
.message-box {
display: flex; / アイコンとテキストを横並びにするためにFlexboxを使います /
align-items: center; / 垂直方向の中央揃え /
padding: 15px 20px;
margin-bottom: 15px;
border-radius: 8px;
background-color: #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
border: 1px solid #ddd;
}

.message-box .icon {
font-size: 24px;
margin-right: 15px; / アイコンとテキストの間にスペースを空ける /
flex-shrink: 0; / アイコンが縮まないようにする /
}

.message-box p {
margin: 0; / 段落のデフォルトのマージンをリセット /
}

/ ここからが :dir() の本領発揮! /

/ ltr(左から右)の書字方向の場合 /
/ :dir(ltr) は、最終的な書字方向がltrである要素に適用されます /
.message-box:dir(ltr) {
border-left: 5px solid #5cb85c; / 左側に緑色の強調線 /
}

.message-box:dir(ltr) .icon {
margin-right: 15px; / アイコンはテキストの左側に来るので、右側にマージン /
margin-left: 0;
}

/ rtl(右から左)の書字方向の場合 /
/ :dir(rtl) は、最終的な書字方向がrtlである要素に適用されます /
.message-box:dir(rtl) {
border-right: 5px solid #d9534f; / 右側に赤色の強調線 /
/ text-align: right; / / 必要に応じてテキストも右寄せにできます /
}

.message-box:dir(rtl) .icon {
margin-left: 15px; / アイコンはテキストの右側に来るので、左側にマージン /
margin-right: 0;
/ Flexboxのアイテムの並び順を反転させます /
/ これでアイコンが右、テキストが左という並びになります /
order: 1;
}

/ 親要素がrtlの場合のコンテナスタイル /
.message-container {
padding: 20px;
background-color: #e0f2f7;
border: 2px dashed #007bff;
margin-top: 30px;
border-radius: 10px;
}

このコードを実行すると、`dir=”ltr”`と`dir=”rtl”`が指定されたメッセージボックスで、アイコンの位置や枠線の色が自動的に切り替わるのがわかるはずです。

特に注目してほしいのは、`:dir(rtl) .icon`に書いた`order: 1;`です。`display: flex;`と組み合わせることで、アイコンとテキストの並び順まで、書字方向に応じて反転させられるんです!これはすごいでしょう?JavaScriptで要素の順番を入れ替えたりする、なんて泥臭いことをしなくても、CSSだけでスマートに解決できるんですから。

`:dir()`が役立つのはどんな時?〜現場での「なるほど!」ポイント〜

さて、この`:dir()`。実際に現場ではどんな時に「なるほど!」と膝を打つような活躍をするのでしょうか?

1. 多言語対応サイトのUI調整:

  • アイコンの位置: 上の例のように、テキストの左側にアイコンを置くか、右側に置くかを書字方向に応じて自動で切り替える。
  • フォームのラベルと入力欄: ラベルが入力欄の左に来るか、右に来るか。
  • リストの箇条書きマーク: `
      `や`

        `のマーカーが左に来るか、右に来るか。
      1. ボタンの左右配置: 「戻る」と「次へ」のボタンなど、言語によって並び順が逆になる場合。

    これらを全てCSSだけで制御できるため、HTMLをゴチャゴチャ書き換えたり、JavaScriptで無理やり調整したりする手間が省けます。

    2. CSSをシンプルに保つ秘訣:
    もし`:dir()`がなかったら、`dir=”rtl”`が指定された要素には、いちいち`class=”rtl-icon”`や`class=”rtl-button”`といった専用のクラスをHTMLに付けて、CSSでもそのクラスに対してスタイルを当てる必要がありました。これではHTMLもCSSも冗長になり、保守も大変です。
    `:dir()`を使えば、HTMLには書字方向の情報だけを持たせ、CSSがその情報を見て自動でスタイルを調整するという、役割分担の美しいコードになります。これは、私が長年現場で培ってきたCSS設計の思想「HTMLは構造、CSSは見た目、JavaScriptは振る舞い」という原則に則った、非常にエレガントな解決策なんです。

    3. 未来を見据えた設計:
    今、日本語サイトしか作っていなくても、いつか多言語対応が必要になるかもしれません。その時に`:dir()`を使っていれば、後から`dir=”rtl”`の言語を追加しても、ほとんどCSSをいじらずにレイアウトが崩れない、という強固な基盤を作っておくことができます。まるで、将来的に拡張することを考えて、最初から丈夫な骨組みの家を建てておくようなものです。

    ちょっとだけ応用編、知っておくといいこと

    最後に、初学者の方には少しだけ高度な話ですが、知っておくと「おっ!」と思われるかもしれないポイントを一つ。

    `:dir(ltr)`と`[dir=”ltr”]`の違いです。

    • `[dir=”ltr”]`は、「`dir=”ltr”`という属性がその要素に直接指定されているか」だけを見ます。
    • `:dir(ltr)`は、「最終的にその要素の書字方向が`ltr`として扱われているか」を見ます。これは、`dir`属性が直接指定されていなくても、親要素から継承された場合も含まれます。

    だから、先ほどの例で親要素が`dir=”rtl”`の`message-container`の中にあった`message-box`は、`dir`属性が直接書かれていなくても、`:dir(rtl)`のスタイルが適用されていましたよね?これは`:dir()`が「継承」まで考慮して書字方向を判断してくれたからなんです。

    この違いを理解しておくと、より柔軟で堅牢なCSSを書けるようになりますよ。

    まとめ:`:dir()`で、あなたのCSSはもっと賢く、もっと優しくなる!

    今日の`:dir()`方向疑似クラスの解説、いかがでしたか?
    普段はあまり意識しないかもしれませんが、これからのグローバルなウェブ制作では、間違いなくあなたの強い味方になってくれるはずです。

    • `:dir()`は、要素の「書字方向」(左から右か、右から左か)を判定するセレクタ。
    • HTMLの`dir`属性や親からの継承によって書字方向が決まる。
    • 多言語サイトのUI調整や、CSSのシンプル化に絶大な効果を発揮する。
    • `:dir()`は継承を考慮する、賢いセレクタ。

    CSSは、ただ見た目を飾るだけでなく、このようにウェブサイトの「振る舞い」や「国際化」にまで深く関わってくる、本当に奥深く、そして楽しい技術です。

    最初は小さな一歩かもしれませんが、こういった一つ一つの知識が、あなたのCSSをよりプロフェッショナルで、よりユーザーフレンドリーなものへと進化させていきます。今日学んだことを、ぜひ皆さんのウェブ制作に活かしてみてくださいね。

    それでは、また次のCSSの秘密でお会いしましょう!応援していますよ!

コメント

タイトルとURLをコピーしました