とある要素の直前の要素をCSSセレクタで指定したくなった。
<div>hoge</div> ←これを選択したい <div class="fuga">fuga</div> ←ここから見て <div>moge</div>
結論から言うとCSSセレクタではこれは無理っぽい。
兄弟要素(階層が同じ要素)の弟(後に出てくる要素)は選択できるんだけど、
兄(前に出てくる要素)を選択するセレクタはないらしい。。。
DOMの構造見直すか、JavaScript使ってどうにかするしかあるまい。
jQueryなら「.prev()」とかでいけるかな?jQuery使ってないけど。
で、ここから調べてる中で「コレ間違ってるんじゃないかな?」って思った話。
「CSS 直前の要素」でググって出てくるサイトは一杯あるのですが、
疑似要素のbeforeとafterでちょいちょいヒットしてる。
見てみると、beforeの説明でこんな内容になってる。
:before 要素の直前
とか
before / afterでそれぞれ要素の前後に[擬似要素]を追加することができます。
ん?って感じ。
↑の説明だと、構造的に下記をイメージしますよね?
<::before /> <div /> <::after />
要素の直前だからね。実際↑書いてるサイトの構造のイメージはそうなってた。
でも、MDNにはこう書いてある。
In CSS, ::before creates a pseudo-element that is the first child of the selected element.
CSS における ::before は、選択した要素の最初の子要素として擬似要素を作成します。
子要素として 擬似要素を作成します
ですよね。
chromeあたりの開発ツールで見ると分かるのですが、どう見ても指定してる要素の
子要素として作ってるよね?
構造的には下記。
<div class="hoge"> <.hoge::before /> <something.... /> <.hoge::after /> </div>
直前の要素って説明は間違ってると思うのです。
書くなら「before:直下の最初の子要素」とか「after:直下の最後の子要素」が正確な表現かしら?