IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Menu accordéon - garder catégorie ouverte


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut Menu accordéon - garder catégorie ouverte
    Bonjour a tous,

    J'ai trouvé sur ce site un script de menu en accordéon. Il est quasi parfait si ce n'est que j'aimerais pouvoir garder une catégorie ouverte.

    Voici le code de la page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    		<title>Untitled Document</title>
    		<style type="text/css">
    			#menuAcc li{
    				border:1px solid #666;
    				width:150px;
    				height:13px;
    				overflow:hidden;
    				padding:0px;
    			}
    			#menuAcc li h6{
    				padding:0px;
    				margin:0px;
    			}
    		</style>
    		<script type="text/javascript">
    			var ulCurrent = null;
    			var animTimerOpen = null;
    			var animTimerClose = null;
    			var quotient = 0.2;
    			var isOpen = null;
    			var IsMinHeight = true;
     
    			function openMenu(element){
    				ulCurrent = element.parentNode;
    				var heightLink = element.offsetHeight;
    				var heightDiv = element.parentNode.getElementsByTagName('div')[0].offsetHeight;
    				animTimerOpen = setInterval(function(){
    					Expand(heightDiv+heightLink,heightLink)
    					}, 25);
    				}
     
     
    			function Expand(MaxHeight,minHeight){
    				var IsMaxHeight = false;
    				if(parseInt(ulCurrent.offsetHeight)< MaxHeight){
    					ulCurrent.style.height = parseInt(ulCurrent.offsetHeight) + 5 + 'px'; 
    				}
    				else if(!IsMaxHeight){
    					IsMaxHeight = true;
    				}
     
    				if (isOpen != null) {
    					if (parseInt(isOpen.offsetHeight) > minHeight) {
    						IsMinHeight = false;
    						isOpen.style.height = parseInt(isOpen.offsetHeight) - 9 + 'px';
    					}
    					else 
    						if (!IsMinHeight) {
    							IsMinHeight = true;
    					}
    				}
    				if(IsMaxHeight && IsMinHeight){
    					clearInterval(animTimerOpen);
    					ulCurrent.style.height = MaxHeight + "px";
    					if (isOpen != null) {
    						isOpen.style.height = minHeight + 2 + "px";
    					}
    					isOpen = ulCurrent;
    					quotient = 0.2 ;
    				}
    			}
    		</script>
    	</head>
    	<body>
    		<ul id="menuAcc">
    			<li><h6 onclick="openMenu(this);">menu 1</h6>
    				<div>et la tout le contenu <br />
    	  				 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
     
    				</div>
    			</li>
    			<li><h6 onclick="openMenu(this);">menu 1</h6>
    				<div>et la tout le contenu <br />
    	  				 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    				</div>
    			</li>
    			<li><h6 onclick="openMenu(this);">menu 1</h6>
    				<div>et la tout le contenu <br />
    	  				 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    				</div>
    			</li>
    			<li><h6 onclick="openMenu(this);">menu 1</h6>
    				<div>et la tout le contenu <br />
    	  				 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    				</div>
    			</li>
    			<li><h6 onclick="openMenu(this);">menu 1</h6>
    				<div>et la tout le contenu <br />
    	  				 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    					 et la tout le contenu <br />
    				</div>
    			</li>			
    		</ul>
    	</body>
    </html>
    J'ai essayé en ajoutant un ID dans les balises h6 puis en faisant l'appel suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script language="javascript">
    openMenu(document.getElementByID(idPartie));
    </script>;
    mais cela ne fonctionne pas. Quelqu'un saurait il comment faire svp?

    Merci a tous

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    window.addEventListener(
         "load",
          function (){
    	    openMenu(document.getElementById("idPartie"));
          },
          false);
    et voila...

    olivier.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Merci beaucoup pour ton aide. Je ne connaissais pas cette fonction. je vais l'essayer de suite ^^.


    EDIT: ca marche pafaitement. mille fois merci a toi ôh grand maitre du javascript.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Attention... addEventListener n'est pas cross-browser, pour IE, il faut passer par attachEvent !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Par défaut
    Ah... IE, il ne peut jamais rien faire comme tout le monde !
    Merci pour la precision (en general j'utilise plus .onload=...), mais je voulais proposer une solution "propre". C'etait compter sans IE...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 208
    Par défaut
    Bon, désolé de rouvrir le post mais en fait, un petit bug subsiste dans le script. lorsqu'on clic plusieurs fois sur une categorie, les autres se referment plus vite et des elements des categories restent cachés lors de l'ouverture d'une categorie. Ce qui est assez génant. Je ne trouve pas d'ou viens le problème malheureusement....


    voici le code js utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    var ulCurrent = null;
    var animTimerOpen = null;
    var animTimerClose = null;
    var quotient = 0.2;
    var isOpen = null;
    var IsMinHeight = true;
     
    function openMenu(element){
    	ulCurrent = element.parentNode;
    	var heightLink = element.offsetHeight;
    	var heightDiv = element.parentNode.getElementsByTagName('div')[0].offsetHeight;
    	animTimerOpen = setInterval(function(){
    		Expand(heightDiv+heightLink+5,heightLink)
    		}, 25);
    	}
     
     
    function Expand(MaxHeight,minHeight){
    	var IsMaxHeight = false;
    	if(parseInt(ulCurrent.offsetHeight)< MaxHeight){
    		ulCurrent.style.height = parseInt(ulCurrent.offsetHeight) + 5 + 'px'; 
    	}
    	else if(!IsMaxHeight){
    		IsMaxHeight = true;
    	}
     
    	if (isOpen != null) {
    		if (parseInt(isOpen.offsetHeight) > minHeight) {
    			IsMinHeight = false;
    			isOpen.style.height = parseInt(isOpen.offsetHeight) - 5 + 'px';
    		}
    		else 
    			if (!IsMinHeight) {
    				IsMinHeight = true;
    		}
    	}
    	if(IsMaxHeight && IsMinHeight){
    		clearInterval(animTimerOpen);
    		ulCurrent.style.height = MaxHeight + "px";
    		if (isOpen != null) {
    			isOpen.style.height = minHeight + 2 + "px";
    		}
    		isOpen = ulCurrent;
    		quotient = 0.2 ;
    	}
    }

Discussions similaires

  1. Menu accordéon reste ouvert
    Par harkrisz dans le forum jQuery
    Réponses: 0
    Dernier message: 07/11/2013, 12h21
  2. Menu hoveraccordion - Garder le menu ouvert
    Par AnatoleL dans le forum jQuery
    Réponses: 0
    Dernier message: 05/04/2011, 22h19
  3. menu accordéon ne reste pas ouvert
    Par Stéph utilisateur d'acces dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 21/08/2010, 22h23
  4. Réponses: 1
    Dernier message: 13/06/2010, 12h09
  5. Menu javascript devrait rester ouvert..
    Par gregius dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/06/2006, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo