Ce que je veux faire, c'est quand un certain div
survole, cela affecterait les propriétés d'un autre div
.
Par exemple, dans cette démo JSFiddle , lorsque vous survolez , #cube
cela change le background-color
mais ce que je veux, c'est que lorsque je survole #container
, #cube
est affecté.
div {
outline: 1px solid red;
}
#container {
width: 200px;
height: 30px;
}
#cube {
width: 30px;
height: 100%;
background-color: red;
}
#cube:hover {
width: 30px;
height: 100%;
background-color: blue;
}
<div id="container">
<div id="cube">
</div>
</div>
~
pour «le cube est quelque part après le conteneur dans le DOM et partage un parent»#container
est à côté#cube
, c'est- à -dire#container
suit#cube
?Dans cet exemple particulier, vous pouvez utiliser:
Cet exemple ne fonctionne que depuis qu'il
cube
est un enfant decontainer
. Pour des scénarios plus compliqués, vous devez utiliser un CSS différent ou utiliser JavaScript.la source
L'utilisation du sélecteur frère est la solution générale pour styliser d'autres éléments lorsque vous survolez un élément donné, mais cela ne fonctionne que si les autres éléments suivent l'élément donné dans le DOM . Que pouvons-nous faire alors que les autres éléments devraient être réellement avant celui plané? Supposons que nous souhaitons implémenter un widget d'évaluation de la barre de signal comme celui ci-dessous:
Cela peut en fait être fait facilement en utilisant le modèle CSS flexbox, en définissant
flex-direction
surreverse
, de sorte que les éléments soient affichés dans l'ordre inverse de celui dans lequel ils se trouvent dans le DOM. La capture d'écran ci-dessus provient d'un tel widget, implémenté avec du CSS pur.Flexbox est très bien supporté par 95% des navigateurs modernes.
Afficher l'extrait de code
la source
.rating div
, supprimez la marge et ajoutezborder-right: 4px solid white;
Un grand merci à Mike et Robertc pour leurs messages utiles!
Si vous avez deux éléments dans votre code HTML et que vous souhaitez en
:hover
superposer un et cibler un changement de style dans l'autre, les deux éléments doivent être directement liés - parents, enfants ou frères et sœurs. Cela signifie que les deux éléments doivent être l'un dans l'autre ou doivent tous deux être contenus dans le même élément plus grand.Je voulais afficher les définitions dans une boîte sur le côté droit du navigateur pendant que mes utilisateurs lisent mon site et les
:hover
termes en surbrillance; par conséquent, je ne voulais pas que l'élément 'definition' soit affiché à l'intérieur de l'élément 'text'.J'ai presque abandonné et j'ai juste ajouté du javascript à ma page, mais c'est le futur, dang it! Nous ne devrions pas avoir à supporter le dos sass de CSS et HTML nous disant où nous devons placer nos éléments pour obtenir les effets que nous voulons! En fin de compte, nous avons compromis.
Bien que les éléments HTML réels du fichier doivent être imbriqués ou contenus dans un seul élément pour être des
:hover
cibles valides les uns aux autres, l'position
attribut css peut être utilisé pour afficher n'importe quel élément où vous le souhaitez. J'ai utilisé position: fixed pour placer la cible de mon:hover
action là où je la voulais sur l'écran de l'utilisateur quel que soit son emplacement dans le document HTML.Le html:
Le css:
Dans cet exemple, la cible d'une
:hover
commande à partir d'un élément à l'intérieur#explainBox
doit être#explainBox
ou également à l'intérieur#explainBox
. Les attributs de position attribués à #definitions le forcent à apparaître à l'emplacement souhaité (extérieur#explainBox
) même s'il est techniquement situé dans une position indésirable dans le document HTML.Je comprends qu'il est considéré comme une mauvaise forme d'utiliser le même
#id
pour plus d'un élément HTML; cependant, dans ce cas, les instances de#light
peuvent être décrites indépendamment en raison de leurs positions respectives dans#id
des éléments uniques . Y a-t-il une raison de ne pas répéter leid
#light
dans ce cas?la source
ID
plusieurs fois. Utilisez simplement unclass
.Seulement cela a fonctionné pour moi:
Où se
.cube
trouve CssClass du#cube
.Testé dans Firefox , Chrome et Edge .
la source
Voici une autre idée qui vous permet d'affecter d'autres éléments sans considérer de sélecteur spécifique et en utilisant uniquement l'
:hover
état de l'élément principal.Pour cela, je m'appuierai sur l'utilisation de propriétés personnalisées (variables CSS). Comme nous pouvons le lire dans la spécification :
L'idée est de définir des propriétés personnalisées au sein de l'élément principal et de les utiliser pour styliser les éléments enfants et puisque ces propriétés sont héritées, nous devons simplement les modifier dans l'élément principal en survol.
Voici un exemple:
Pourquoi cela peut-il être mieux que d'utiliser un sélecteur spécifique combiné avec le vol stationnaire?
Je peux fournir au moins 2 raisons qui font de cette méthode une bonne chose à considérer:
border
,linear-gradient
,background-color
,box-shadow
etc. Cela nous évitera reseting toutes ces propriétés sur le vol stationnaire.Voici un exemple plus complexe:
Comme nous pouvons le voir ci-dessus, nous n'avons besoin que d' une seule déclaration CSS pour changer de nombreuses propriétés de différents éléments.
la source