2010-12-30 7 views
20

Non ero sicuro se fosse possibile o no. Sto lavorando alle animazioni CSS3 in questo momento e ho bisogno di passare il mouse su un collegamento che avrà effetto su altri elementi div (non-child) nella pagina. Non ero sicuro se ci fosse un lavoro in giro o no.Puoi applicare un effetto hover CSS a un elemento che non è figlio dell'elemento al passaggio del mouse?

<style type="text/css"> 

#header { 
background-color:red; 
} 

#header:hover .element { 
background-color:blue; 
} 

.element { 
background-color:green; 
} 

</style> 

-

<header id="header"> 
    <li><a href="#">Hover</a></li> 
</header> 

<div class="element" > 
<p>hello world </p> 
</div> 
+0

questo dovrebbe funzionare ... – sethvargo

+0

puoi verificare l'ho provato su chrome e firefox. e non è così.:/ – WilliamB

+1

Questo non funzionerà perché la tua seconda regola dice quando trovo un elemento con la classe 'element' all'interno di un elemento con la classe di' bgchange' che è attualmente al centro di un elemento all'interno dell'elemento con l'ID 'header' applica questa regola ad esso. E questo non riflette l'HTML che fornisci. –

risposta

-1

non penso così. Questa costruzione: #header .bgchange: hover .element indica che .element è all'interno di .bgchange. Immagino che questo abbia bisogno di JS

1

Sfortunatamente questo non funzionerà a meno che la tua classe .element non sia all'interno dell'elemento .bgchange. Questa è la natura della cascata: non è possibile (tramite il solo CSS) influenzare gli elementi DOM strutturalmente/gerarchicamente rimossi gli uni dagli altri.

13

C'è lo general sibling selector (~) che seleziona elementi di pari livello.

Quindi con l'HTML che hai postato, #header:hover ~ .element selezionare <div class="element"> quando è un fratello successivo dell'intestazione nascosta.

Even IE 7 supports it, quindi sei su un terreno relativamente solido.

+2

il "~" funziona in -moz- ma non -webkit- – WilliamB

+0

Indagherò i selettori di pari livello per il webkit. – WilliamB

+2

Sembra un bug del webkit. http://demo.marcofolio.net/webkit_bug/ – WilliamB

21

Poiché si tratta di fratelli adiacenti, è possibile utilizzare adjacent sibling selector: +.

#header:hover + .element { 
background-color:blue; 
} 

Questo è ben supportato nella maggior parte dei browser moderni *. IE7 può essere bacato. IE6 e seguenti non lo supportano.

* Una delle altre risposte menziona il selettore di pari livello generale, che non funziona in Webkit se utilizzato con una pseudo-classe dinamica come :hover a causa di this bug. Prendi nota che questo stesso bug causerà problemi in Webkit se tenti di impilare selettori di fratelli adiacenti con una pseudo-classe dinamica. Ad esempio, #this:hover + sibling + sibling non funzionerà in Webkit.

+0

+1 dolce! @WilliamB Testato e funziona in Webkit – Kai

+0

Molto bello! Sì, "+" funziona. Questa domanda ha prodotto due buone soluzioni. Il '+' risponde a questa domanda, ma il '~' sarà utile per riferimenti futuri una volta che il team di webkit risolve il problema. – WilliamB

+3

Inoltre, questo non ha funzionato per me fino a quando non ho capito che il fratello in questione deve essere dopo (nel codice HTML) l'elemento al passaggio del tempo. – captDaylight

2

Re il webkit bug selettore di pari livello, questo articolo ha un css unica soluzione:

http://css-tricks.com/webkit-sibling-bug/

Citando:

body { -webkit-animation: bugfix infinite 1s; } 
@-webkit-keyframes bugfix { from { padding: 0; } to { padding: 0; } } 

Sopra crea un'animazione sulla pagina, e questo sembra magicamente risolvere il problema. Quanto sopra può essere aggiunto direttamente al css principale o creare un solo foglio di stile per il webkit da usare con il tuo ie hacks.

Consigliamo il webkit foglio di stile solo qualcosa di simile:

<link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio:0)" href="webkit.css"/> 

come si nasconde da altri browser e può essere più facilmente rimossa in futuro una volta che il bug è stato risolto.

Problemi correlati