web-dev-qa-db-fra.com

Existe-t-il un moyen de survoler un élément et d'affecter un autre élément?

Je veux que ce soit aussi simple que cela, mais je sais que ce n'est pas le cas:

img {
  opacity: 0.4;
  filter: alpha(opacity=40);
}

img:hover {
  #thisElement {
    opacity: 0.3;
    filter: alpha(opacity=30);
  }
  opacity:1;
  filter:alpha(opacity=100);
}

Ainsi, lorsque vous survolez img, cela change l'opacité de #thisElement à 30% et change l'opacité de l'image à 100%. Existe-t-il un moyen de le faire en utilisant uniquement CSS?

Voici donc le HTML

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="C:\Users\Shikamaru\Documents\Contwined Coding\LearningToCode\Learning jQuery\js\jquery-1.6.2.min.js"></script> 
<script type="text/javascript" src="briefcase.js"></script>
<link rel="stylesheet" type="text/css" href="taskbar.css"/>
<link rel="stylesheet" type="text/css" href="briefcase.css" /> 
<title>Briefcase</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
</head> 

<body> 

<div class="mask"></div>
<div class="float">
  <div id="album1">Album Title</div>
  <img class="left" src="bradBeachHeart.JPG" alt="Brad at the Lake" />

  <img class="left" src="mariaNavi.jpg" alt="Making Maria Na'vi" />

  <img class="left" src="mattWaterRun.jpg" alt="Photoshopped Matt" />
</div>

<div class="gradientTop"></div>
<div class="gradientBottom"></div>


</body> 
</html>

Et voici le CSS:

body {
  font: normal small/3em helvetica, sans-serif;
  text-align: left;
  letter-spacing: 2px;
  font-size: 16px;
  margin: 0;
  padding: 0;
}

div.gradientTop {
  position: absolute;
  margin-top: 5px;
  z-index: 2;
  width: 206px;
  height: 30px;
  float: left;
  background: -webkit-linear-gradient(rgba(255, 255, 255, 2), rgba(255, 255, 255, 0))
}

div.gradientBottom {
  position: absolute;
  margin-bottom: 5px;
  z-index: 2;
  width: 206px;
  height: 120px;
  float: left;
  bottom: -210px;
  background: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1))
}

div.float {
  border-right: 1px solid orange;
  position: absolute;
  z-index: 2;
  margin-left: 5px;
  margin-top: 5px;
  float: left;
  width: 200px;
}

div.mask {
  position: relative;
  z-index: 1;
  margin-top: 5px;
  float: left;
  width: 206px;
  height: 805px;
  background-color: white;
}

img.left {
  z-index: inherit;
  margin-bottom: 3px;
  float: left;
  width: 200px;
  min-height: 200px;
  /* for modern browsers */
  height: auto !important;
  /* for modern browsers */
  height: 200px;
  /* for IE5.x and IE6 */
  opacity: 0.4;
  filter: alpha(opacity=40)
}

img.left:hover + #album1 {
  opacity: .4;
}

img.left:hover {
  opacity: 1.0;
}

#album1 {
  z-index: 2;
  width: 200px;
  color: white;
  text-align: center;
  position: absolute;
  background: orange;
  top: 70px;
}
43
Marlon

La seule façon de le faire avec CSS est si l'élément à affecter est un descendant ou un frère adjacent.

Dans le cas d'un descendant:

#parent_element:hover #child_element, /* or */
#parent_element:hover > #child_element {
    opacity: 0.3;
}

Qui s'appliquera à des éléments tels que:

<div id="parent_element">
    <div id="child_element">Content</div>
</div>

Pour les frères et sœurs adjacents:

#first_sibling:hover + #second_sibling {
    opacity: 0.3;
}

Qui fonctionne pour le balisage tel que:

<div id="first_sibling">Some content in the first sibling</div> <div id="second_sibling">and now in the second</div>

Dans les deux cas, ce dernier élément du sélecteur est celui choisi.

Étant donné votre exemple de pseudo-code, vous voulez probablement quelque chose comme:

img:hover + img {
    opacity: 0.3;
    color: red;
}

JS Fiddle .

62
David Thomas

Je sais que vous cherchez probablement une façon pure css de faire ce que vous voulez, mais je vous suggère d'utiliser HTML + CSS + JS comme la merveilleuse structure MVC qu'ils sont.

  • Le HTML est votre modèle, contenant vos données
  • CSS est votre vue, définissant l'apparence de la page
  • JS est votre contrôleur, contrôlant la façon dont le modèle et la vue interagissent.

C'est l'aspect déterminant qui devrait être mis à profit ici. Vous souhaitez contrôler une vue d'un élément sur une interaction utilisateur. C'est exactement à quoi JS est destiné.

Avec très peu de JavaScript, vous pouvez activer et désactiver une classe sur #thisElement lorsque le img est survolé. Cela vaut certainement mieux que de jouer à des jeux de sélection CSS, bien que je comprenne si vous êtes prêt à accepter une réponse pure css.

5
zzzzBov