C’est ce que j’ai lien jsFiddle
nav.main ul ul {
position: absolute;
list-style: none;
display: none;
opacity: 0;
visibility: hidden;
padding: 10px;
background-color: rgba(92, 91, 87, 0.9);
-webkit-transition: opacity 600ms, visibility 600ms;
transition: opacity 600ms, visibility 600ms;
}
nav.main ul li:hover ul {
display: block;
visibility: visible;
opacity: 1;
}
<nav class="main">
<ul>
<li>
<a href="">Lorem</a>
<ul>
<li><a href="">Ipsum</a></li>
<li><a href="">Dolor</a></li>
<li><a href="">Sit</a></li>
<li><a href="">Amet</a></li>
</ul>
</li>
</ul>
</nav>
Pourquoi n'y a-t-il pas de transition? Si je mets
nav.main ul li:hover ul {
display: block;
visibility: visible;
opacity: 0; /* changed this line */
}
Alors le "subnav" n'apparaîtra jamais (bien sûr) mais pourquoi la transition sur l'opacité ne se déclenche-t-elle pas? Comment faire fonctionner la transition?
Comme vous le savez, la propriété display
ne peut pas être animée MAIS elle n’est pas animée, elle remplace les transitions visibility
et opacity
.
La solution ... vient de supprimer les propriétés display
.
nav.main ul ul {
position: absolute;
list-style: none;
opacity: 0;
visibility: hidden;
padding: 10px;
background-color: rgba(92, 91, 87, 0.9);
-webkit-transition: opacity 600ms, visibility 600ms;
transition: opacity 600ms, visibility 600ms;
}
nav.main ul li:hover ul {
visibility: visible;
opacity: 1;
}
<nav class="main">
<ul>
<li>
<a href="">Lorem</a>
<ul>
<li><a href="">Ipsum</a>
</li>
<li><a href="">Dolor</a>
</li>
<li><a href="">Sit</a>
</li>
<li><a href="">Amet</a>
</li>
</ul>
</li>
</ul>
</nav>
Généralement, lorsque les gens essaient d'animer display: none
ce qu'ils veulent vraiment, c'est:
La plupart des réponses populaires utilisent visibility
, qui ne peut atteindre le premier objectif, mais heureusement, il est tout aussi facile de réaliser les deux en utilisant position
.
Puisque position: absolute
supprime l'élément de la saisie de l'espacement des flux de documents, vous pouvez basculer entre position: absolute
et position: static
(valeur globale par défaut), associé à opacity
. Voir l'exemple ci-dessous.
.content-page {
position:absolute;
opacity: 0;
}
.content-page.active {
position: static;
opacity: 1;
transition: opacity 1s linear;
}
Vous pouvez le faire avec animation-keyframe plutôt qu'avec transition. Modifiez votre déclaration de survol et ajoutez l'image clé d'animation. Vous devrez peut-être également ajouter les préfixes du navigateur pour -moz- et -webkit-. Voir https://developer.mozilla.org/en/docs/Web/CSS/@keyframes pour plus d'informations.
nav.main ul ul {
position: absolute;
list-style: none;
display: none;
opacity: 0;
visibility: hidden;
padding: 10px;
background-color: rgba(92, 91, 87, 0.9);
-webkit-transition: opacity 600ms, visibility 600ms;
transition: opacity 600ms, visibility 600ms;
}
nav.main ul li:hover ul {
display: block;
visibility: visible;
opacity: 1;
animation: fade 1s;
}
@keyframes fade {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
<nav class="main">
<ul>
<li>
<a href="">Lorem</a>
<ul>
<li><a href="">Ipsum</a></li>
<li><a href="">Dolor</a></li>
<li><a href="">Sit</a></li>
<li><a href="">Amet</a></li>
</ul>
</li>
</ul>
</nav>
Voici une mise à jour de votre violon. https://jsfiddle.net/orax9d9u/1/