:has() (Selectors Level 4)
Selectors Level 4 規定の :has()
で実現可能ですが、実装しているブラウザがありません(2016/05/10現在)。
CSS
1div:has(#test:hover)~#target
代替案
既にあげられているように次の2択しかないと思います。
- CSSセレクタで
#test:hover~#target
を指定できるように HTML の構造を変える
- 構造を変えず、JavaScript で実装する
HTML
1<style>
2#test:hover {
3 background-color: #ddf;
4}
5#parent.child-hover~#target {
6 background-color: #fdd;
7}
8</style>
9<body>
10<div id="parent">
11 <div id="test">テスト1</div>
12</div>
13<div>テスト2</div>
14<div id="target">テスト3</div>
15<script>
16'use strict';
17(function () {
18 function handleHover (event) {
19 event.currentTarget.parentNode.classList.toggle('child-hover'); // 簡易コード (#test に子要素が存在するなら、判定条件を厳しくする必要があります)
20 }
21
22 function main () {
23 var element = document.getElementById('test');
24
25 element.addEventListener('mouseover', handleHover, false);
26 element.addEventListener('mouseout', handleHover, false);
27 }
28
29 main();
30}());
31</script>
以前、IE8.js で未対応のCSSプロパティをJavaScriptでCSSをパースして同じ動作をJavaScriptで再現する試みがありましたが、技術的には可能かもしれないですね。
パフォーマンス的な問題はあると思いますが…。
Re: raguel さん