5546 sujets

Sémantique web et HTML

Modérateur
Bonjour,

Ça a l'air de marcher sans rien faire de spécial.

Tu mets juste tes deux menus avec les mêmes classes.

Ci-dessous un exemple complet avec 2 menus. Il n'y a que les textes affichés qui changent, toute la structure est la même, y compris le nom des classes (j'ai pris exactement le même code que l'exemple que tu as cité).

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<style>
.navigation {
  margin: 0;
  padding: 0;
  list-style: none;
  background: #000;
  color: #fff;
  width: 200px;
  font: 1.2em "Trebuchet MS", sans-serif;
}
.navigation a, .navigation span {
  display: block;
  padding: 4px 10px;
  color: #fff;
  text-decoration: none;
  background: #000 url(menu-item.png) left bottom no-repeat;
}
.navigation .toggleSubMenu a, .navigation .toggleSubMenu span {
  background-image: url(menu-item-deroule.png);
}
.navigation .open a, .navigation .open span {
  background-image: url(menu-item-enroule.png);
}
.navigation a:hover, .navigation a:focus, .navigation a:active {
  text-decoration: underline;
}
.navigation .subMenu {
  font-size: .8em;
  background: #ccc url(subMenu.png) 0 0 repeat-x;
  font-size: .9em;
  margin: 0;
  padding: 0;
  border-bottom: 1px solid #666;
}
.navigation ul.subMenu a {
  background: none;
  padding: 3px 20px;
}
</style>
</head>
<body>
<ul class="navigation">
  <li><a href="#" title="Aller à la page 1">Page 1</a></li>
  <li class="toggleSubMenu"><span>Page 2</span>
    <ul class="subMenu">
      <li><a href="#" title="Aller à la page 2.1">Page 2.1</a></li>
      <li><a href="#" title="Aller à la page 2.2">Page 2.2</a></li>
      <li><a href="#" title="Aller à la page 2.3">Page 2.3</a></li>
    </ul>
    </li>
    <li class="toggleSubMenu"><span>Page 3</span>
      <ul class="subMenu">
        <li><a href="#" title="Aller à la page 3.1">Page 3.1</a></li>
        <li><a href="#" title="Aller à la page 3.2">Page 3.2</a></li>
      </ul>
    </li>
    <li><a href="#" title="Aller à la page 4">Page 4</a></li>
</ul>
<ul class="navigation">
  <li><a href="#" title="Aller à l'autre page 1">L'autre page 1</a></li>
  <li class="toggleSubMenu"><span>L'autre page 2</span>
    <ul class="subMenu">
      <li><a href="#" title="Aller à l'autre page 2.1">L'autre page 2.1</a></li>
      <li><a href="#" title="Aller à l'autre page 2.2">L'autre page 2.2</a></li>
      <li><a href="#" title="Aller à l'autre page 2.3">L'autre page 2.3</a></li>
    </ul>
    </li>
    <li class="toggleSubMenu"><span>L'autre page 3</span>
      <ul class="subMenu">
        <li><a href="#" title="Aller à l'autre page 3.1">L'autre page 3.1</a></li>
        <li><a href="#" title="Aller à l'autre page 3.2">L'autre page 3.2</a></li>
      </ul>
    </li>
    <li><a href="#" title="Aller à l'autre page 4">L'autre page 4</a></li>
</ul>
<script>
$(document).ready( function () {
    // On cache les sous-menus :
    $(".navigation ul.subMenu").hide();
    // On sélectionne tous les items de liste portant la classe "toggleSubMenu"

    // et on remplace l'élément span qu'ils contiennent par un lien :
    $(".navigation li.toggleSubMenu span").each( function () {
        // On stocke le contenu du span :
        var TexteSpan = $(this).text();
        $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ;
    } ) ;

    // On modifie l'évènement "click" sur les liens dans les items de liste
    // qui portent la classe "toggleSubMenu" :
    $(".navigation li.toggleSubMenu > a").click( function () {
        // Si le sous-menu était déjà ouvert, on le referme :
        if ($(this).next("ul.subMenu:visible").length != 0) {
            $(this).next("ul.subMenu").slideUp("normal");
        }
        // Si le sous-menu est caché, on ferme les autres et on l'affiche :
        else {
            $(".navigation ul.subMenu").slideUp("normal");
            $(this).next("ul.subMenu").slideDown("normal");
        }
        // On empêche le navigateur de suivre le lien :
        return false;
    });    

} ) ;
</script>
</body>
</html>

Amicalement,
Modifié par parsimonhi (19 Oct 2020 - 23:19)
bonsoir
un tout grand merci pour la reponse

mais cela ne fonctionne pas correctement car quand j ouvre un sous menu dans le menu 1
et que je vais dans ouvrir un autre sous menu dans la menu 2
celui du menu ce ferme

amicalement
Modérateur
Bonjour,

Ça me semble normal qu'il n'y ait qu'un seul sous-menu d'ouvert à la fois.

Amicalement,
bonsoir
merci pour l aide
en fait voici ce que j aimerais
voir image jointe
upload/1603144548-22488-ecran2.jpg
Modifié par flexi2202 (19 Oct 2020 - 23:55)
Modérateur
Bonjour,

Une possibilité est de remplacer dans la partie "// Si le sous-menu est caché, on ferme les autres et on l'affiche :" :
$(".navigation ul.subMenu").slideUp("normal");
par :
$(this).closest("ul").find("ul.subMenu").slideUp("normal");

Explication :

C'est cette ligne qui referme les sous-menus quand on clique sur un sous-menu qui n'est pas déjà ouvert.

Dans le code initial, cette ligne referme tous les sous-menus ouverts, puisque l'on cible tous les ".navigation ul.subMenu", y compris donc les éventuels sous-menus des autres menus.

Dans le code modifié, on ne referme que les sous-menus du menu dans lequel se trouve le sous-menu sur lequel on vient de cliquer. Le sous-menu sur lequel on vient de cliquer est représenté dans le code par $(this). La balise contenant l'ensemble du menu dont il fait partie est l'élément le plus proche parmi ses parents qui est un <ul>. On cible ça grâce à closest("ul"). Il suffit ensuite de ne cibler que les <ul> subMenu du menu ainsi trouvé par find("ul.subMenu"). Et ça donne $(this).closest("ul").find("ul.subMenu").

Amicalement,
Bonjour,

J'ai fait quelque-chose de comparable, sans jQuery et avec un balisage sémantique à jour, on peut mettre autant d'accordéons que l'on veut. J'en parlais récemment sur le forum.

C'est juste une partie d'un projet complet pour un site, mais j'avais fait un pen : Accordion
Modifié par Olivier C (20 Oct 2020 - 08:45)
bonjour
Merci pour les réponses
en fait je viens de faire des essais et j ai simplement créer deux codes css et deux codes js
que j ai modifier en ajoutant 1 a tous les liens
par exemple navigation1
sousmenu1
ect....
cela semble fonctionner
Olivier C waouhhh super ton menu je l ai téléchargé
je vais l essayer et qui sait
encore merci pour le lien
et feliciatations
dommage que l on ne puisse pas faire deux menus dans un seul
du style ajouter un items4
qui ce ferme lorsque on ouvre le 3
et que quand on ouvre le 4 le 3 ce ferme
mais juste sur ces deux onglets
comme ca on peux choisir avec la croix celui que l on veux fermer notamment le 1 et le2
Modifié par flexi2202 (20 Oct 2020 - 14:40)
Pardon effectivement, j'ai (encore) lu en diagonale...
Smiley smash
Je pensais que vous vouliez plusieurs accordéons, alors que vous vouliez des sous menus pour l'accordéon. Ce qui n'a rien à voir, j'en conviens.
en fait
voici ce que j aurais souhaiter mais ne trouvant rien sur le net
j ai bricoler avec avec deux menus

autrement j aurais souhaiter
avoir un onglet fixe
puis un autre qui s ouvre a la demande avec une croix par exemple
ensuite un 3eme qui s ouvre a la demande mais ce ferme lorsque le 4 eme s ouvre
sans pour autant fermer les deux premiers
et que le 4 eme ce ferme lorsque le 3 eme est ouvert
C'est super spécifique comme demande. Si j'ai bien compris les consignes :
- les deux premiers onglets sont indépendant
- les deux derniers fonctionnent ensembles
- le premier onglet est ouvert par défaut

Sans rien changer à mon code et en jouant seulement avec les options (et donc avec le html) que je propose voici mon accordéon revisité (en fait 2 accordéons, mais ça ne se voit pas) : Accordion, demande spécifique pour un alsanaute
Modifié par Olivier C (20 Oct 2020 - 19:44)
bonsoir olivier

waouhhh génial ça...un tout grand merci
je le teste demain pour voir ce que cela donne
bonne soirée