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 défilant verticalement


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Menu défilant verticalement
    Bonjour à tous,

    Je dois réaliser un menu défilant verticalement en Javascript. Ce menu est composé de logos, qui doivent défiler de bas en haut. Le principe est que quand un logo arrivé en haut n'est plus visible ((logo.style.top + logo.clientHeight) < conteneur.style.top ), il doit être repositionné à la fin, après le dernier élément.

    J'ai réalisé le code suivant:
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    	<head>
    		<title>
    			Test menu défilant
    		</title>
    		<style type="text/css">
    			img {
    				border: none;
    			}
     
    			.menuItem {
    				position: relative;
    				top: auto;
    				margin-top: 2px;
    				margin-bottom: 2px;
    				visibility: visible;
    			}
     
    			#container {
    				background-image: url(bg_logoDefil.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				width: 200px;
    				height: 360px;
    			}
     
    			#menu {
    				overflow: hidden;
    				position: relative;
    				left: 8px;
    				top: 0px;
    				width: 200px;
    				height: 360px;
    			}
    		</style>
    		<script type="text/javascript">
    			var timer = null;
    			var shift = 1;
    			var timeToWait = 20;
     
    			function init() {
    				var menu = document.getElementById("menu");
     
    				// Sous Firefox, les sauts de ligne sont considérés comme des noeuds enfants. La boucle ci-dessous les supprime
    				for(var i = 0; i < menu.childNodes.length; i++) {
    					if(menu.childNodes[i].nodeName.indexOf("DIV") == -1) {
    						menu.removeChild(menu.childNodes[i]);
    					}
    				}
     
    				// Lancement du menu défilant
    				setTimeout(function() { scroll() }, 1000);
    			}
     
    			function getTop(item) {
    				var top = item.style.top;
     
    				if(top == null) {
    					top = 0;
    				} else if(top.indexOf("px") != -1) {
    					top = top.substring(0, top.indexOf("px"));
    				} else if(top.indexOf("auto") != -1) {
    					top = item.offsetTop;
    				}
     
    				return top;
    			}
     
    			function isVisible(item) {
    				var posY = getTop(item);
    				var height = item.clientHeight;
    				var tmp = parseInt(posY) + parseInt(height);
    				var visible = true;
     
    				if(tmp < -2) {
    					visible = false;
    				}
     
    				return visible;
    			}
     
    			function scroll() {
    				var menu = document.getElementById("menu");
    				var last = null;
    				var toHide = null;
    				var toAdd = null
     
    				for(var i = 0; i < menu.childNodes.length; i++) {
    					var item = menu.childNodes[i];
     
    					if(!isVisible(item)) {
    						last = menu.lastChild;
    						toHide = item;
    						toAdd = item.cloneNode(true);
     
    						break;
    					} else {
    						var posY = getTop(item);
    						var newPosY;
     
    						newPosY = posY - parseInt(shift);
     
    						item.style.top = newPosY + "px";
    					}
    				}
     
    				// Si un élément n'est plus visible
    				if(toHide != null) {
    					var lastPosY = last.offsetTop;
     
    					menu.removeChild(toHide);
    					menu.appendChild(toAdd);
     
    					toAdd.style.visibility = "hidden";
    					toAdd.style.top = (parseInt(lastPosY) + parseInt(last.clientHeight)) + "px";
    				}
     
    				timer = setTimeout(function() { scroll() }, timeToWait);
    			}
     
    			window.onload = function() {
    				init();
    			};
    		</script>
    	</head>
    	<body>
    		<div id="container">
    			<div id="menu">
    				<div class="menuItem" id="menuItem1">
    					<a href="#">
    						<img src="logo1.gif" />
    					</a>
    				</div>
    				<div class="menuItem" id="menuItem2">
    					<a href="#">
    						<img src="logo2.gif" />
    					</a>
    				</div>
    				<!-- ... -->
    			</div>
    		</div>
    	</body>
    </html>
    Malheureusement, le résultat est assez improbable Je ne comprend pas d'où cela peut venir, je m'arrache les cheveux là-dessus depuis 2, 3 jours...

    Si quelqu'un parmi vous a une idée pour que tout ça fonctionne correctement, je suis fortement intéressé D'avance merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    il n'y en a pas un viable dans les contributions ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    il n'y en a pas un viable dans les contributions ?
    Je n'y suis pas encore aller voir, j'aimerais auparavant vraiment comprendre ce qui coince dans ce que j'ai fait ! Bien que ne me considérant pas comme 1 expert en javascript (loin de là), je pense que ma logique est bonne. Mais comme j'ai la tête dans le guidon depuis lundi à cause de ça, je suis peut être passé à côté d'une énormité...

    Cependant, si ce post n'aboutissait pas, j'irais piocher dans les contributions.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    je pense que cela peut provenir de l'utilisation de style.top au lieu offsetTop ..

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    moi c'est le
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    position: relative;
    cette propriété m'a toujours donné des résultats aléatoires (peut-être aussi que cela vient du fait que je n'ai jamais bien su l'utiliser )

  6. #6
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    YES ! J'y suis arrivé... enfin je crois.

    J'ai d'abord supprimé la ligne de commentaire
    qui indiquait qu'il pouvait y avoir plusieurs div id="menuItemX".

    Ensuite, j'ai réécrit la fonction scroll() de cette manière :
    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
    function scroll() {
     
    	var menu = document.getElementById("menu");
    	var item = menu.firstChild;
     
    	while (item != null) {					
    		if(!isVisible(item)) {
    			for (i=0; i < menu.childNodes.length; i++) {
    				menu.childNodes[i].style.top = null;
    			}
    			menu.appendChild(item.cloneNode(true));
    			menu.removeChild(item);
    		} else {
    			item.style.top = getTop(item) - parseInt(shift) + "px";
    		}
    		item = item.nextSibling;					
    	}
    	setTimeout(function() { scroll() }, timeToWait);
    }
    Et ça marche sous Firefox 3.0.

    Fred

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Waouh super ! Merci micetf !!!

    Ça marche pile poil comme il faudrait sur FF. Je l'ai testé avec Chrome, c'est nickel également. Malheureusement, avec IE, ce n'est pas ça Les logos défilent beaucoup trop vite... Je vais me pencher là-dessus !

    Citation Envoyé par micetf Voir le message
    J'ai d'abord supprimé la ligne de commentaire
    qui indiquait qu'il pouvait y avoir plusieurs div id="menuItemX".
    De quelle ligne de code parle-tu ? Je ne vois pas... la fatigue du vendredi soir certainement

    Citation Envoyé par micetf Voir le message
    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
    function scroll() {
     
    	var menu = document.getElementById("menu");
    	var item = menu.firstChild;
     
    	while (item != null) {					
    		if(!isVisible(item)) {
    			for (i=0; i < menu.childNodes.length; i++) {
    				menu.childNodes[i].style.top = null;
    			}
    			menu.appendChild(item.cloneNode(true));
    			menu.removeChild(item);
    		} else {
    			item.style.top = getTop(item) - parseInt(shift) + "px";
    		}
    		item = item.nextSibling;					
    	}
    	setTimeout(function() { scroll() }, timeToWait);
    }
    Pourrais-tu stp m'expliquer la boucle for qui positionne style.top à null?


    Merci également à SpaceFrog et Auteur pour leur participation !

  8. #8
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    De quelle ligne de code parle-tu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <div id="menu">
    	<div class="menuItem" id="menuItem1">
    		<a href="#">
    			<img src="logo1.gif" />
    		</a>
    	</div>
    	<div class="menuItem" id="menuItem2">
    		<a href="#">
    			<img src="logo2.gif" />
    		</a>
    	</div>
    	<!-- ... -->  <-- Je parlais de cette ligne-là.
    </div>
    Quant à la boucle for qui positionne style.top à null,
    voyons...

    Ce qui se conçoit clairement s'énonce clairement paraît-il.
    Alors je vais essayer d'être clair,
    et de ne pas dire de bêtises.

    Disons que
    c'est pour repartir avec des contenus de div
    correctement positionnées,
    après déplacement de la div haute en bas.

    En effet,
    mes div="itemMenuX" sont placées
    les unes au-dessous des autres
    dans la div="menu".

    On peut imaginer (faire un dessin ?) un grand rectangle (menu)
    contenant plusieurs petits rectangles (menuItemX)
    aimantés vers le haut.
    Ça, ça ne bougera pas, enfin pas tout de suite.

    Pour faire glisser vers le haut les images
    que je mets dans mes div="menuItemX",
    avec style.top,
    on dit qu'on va les afficher -1px, -2px, -3px,...
    plus haut que nos petits rectangles menuItemX.
    Jusqu'à environ -20px,
    et là on constate que
    l'image la plus haute est cachée.
    Attention, ça va bouger !

    Alors on déplace
    le rectangle itemMenuX le plus haut
    en bas de la pile
    et tous les petits rectangles
    remontent aimantés
    par le haut du grand rectangle menu.
    Voilà, ça a bougé, j'avais prévenu.

    C'est là qu'il faut bien analyser la situation.
    pour que nos images s'affichent au bon endroit,
    par rapport aux nouvelles positions
    de nos petits rectangles menuItemX,
    il n'est plus nécessaire de les décaler,
    il suffit de les afficher bien dans les rectangles,
    donc avec un style.top=null.

    Ce n'est peut-être pas très clair,
    mais au moins j'aurais essayé.

    Fred

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci pour ton explication, j'y réfléchirais mercredi. Pendant 4 jours, je vais essayer de ne plus penser à ce satané script qui me prend la tête depuis lundi ^^

    En tout cas, un grand merci à toi pour ta solution et pour avoir pris le temps de réfléchir au problème

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bon, et bien maintenant, tout ça marche sous FF, Chrome et IE

    Mais j'ai un nouveau souci... On m'a demandé de rajouter 2 boutons haut et bas permettant d'accélérer le défilement vers le haut ou le bas. En cas de défilement vers le bas, aucun soucis, je change juste le décalage en pixels et le temps à attendre entre chaque décalage. Par contre, pour le défilement vers le haut, c'est une autre paire de manches, pour repositionner les éléments devenus invisibles... Encore une fois, le résultat n'est pas celui escompté et je ne comprend pas pourquoi...

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    	<head>
    		<title>
    			Test menu défilant
    		</title>
    		<style type="text/css">
    			img {
    				border: none;
    			}
     
    			.bouton {
    				position: relative;
    				width: 200px;
    				text-align: center;
    			}
     
    			#up {
    				background-image: url(../img/defilHaut.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				cursor: pointer;
    			}
     
    			#down {
    				background-image: url(../img/defilBas.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				cursor: pointer;
    			}
     
    			.menuItem {
    				margin-bottom: 2px;
    				text-align: center;
    				position: relative;
    				top: auto;
    			}
     
    			#container {
    				background-image: url(../img/bg_logoDefil.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				width: 200px;
    				height: 360px;
    			}
     
    			#menu {
    				overflow: hidden;
    				position: relative;
    				top: auto;
    				width: 200px;
    				height: 360px;
    			}
    		</style>
    		<script type="text/javascript">
    			var scrollConstants = {
    				// Décalage en pixels en fonctionnement normal
    				shiftNormal: 1,
     
    				// Décalage en pixels si utilisation des boutons
    				shiftButton: 2,
     
    				// Délai entre chaque décalage en fonctionnement normal
    				timeToWaitNormal: 35,
     
    				// Délai entre chaque décalage si utilisation des boutons
    				timeToWaitButton: 0
    			}
    			var directionConstants = {
    				top: -1,
    				bottom: 1
    			};
    			var timer;
    			var shift;
    			var timeToWait;
     
    			/**
    			 * Initialisation du menu défilant
    			 */
    			function init() {
    				var menu = document.getElementById("menu");
     
    				// Sous Firefox, les sauts de ligne et tabulations sont considérés comme des noeuds enfants. La boucle ci-dessous les supprime
    				for(var i = 0; i < menu.childNodes.length; i++) {
    					if(menu.childNodes[i].nodeName.indexOf("DIV") == -1) {
    						menu.removeChild(menu.childNodes[i]);
    					}
    				}
     
    				// Lancement du menu défilant
    				shift = scrollConstants.shiftNormal;
    				timeToWait = scrollConstants.timeToWaitNormal;
    				timer = setTimeout(function() { scrollMenu(directionConstants.bottom) }, 1000);
    			}
     
    			/**
    			 * @param item Élément du menu
    			 * @return la position haute de l'élément item
    			 */
    			function getTop(item) {
    				var top = item.style.top;
     
    				if((top == null) || ("" == top) || (top.indexOf("auto") != -1)) {
    					top = 0;
    				} else if(top.indexOf("px") != -1) {
    					top = top.substring(0, top.indexOf("px"));
    				}
     
    				return top;
    			}
     
    			/**
    			 * @param item Élément du menu
    			 * @param direction Sens de défilement du menu
    			 * @return true si l'élément est encore visible dans le menu, false sinon
    			 */
    			function isVisible(item, direction) {
    				var visible = true;
     
    				if(direction == directionConstants.bottom) {
    					visible = (item.offsetTop > -70); // 70 => hauteur d'un logo (64px) + espacement entre chaque logo
    				} else if(direction == directionConstants.top) {
    					var menuHeight = document.getElementById("menu").clientHeight;
     
    					visible = (item.offsetTop < menuHeight);
    				}
     
    				return visible;
    			}
     
    			/**
    			 * Défilement du menu
    			 * @param direction Sens de défilement du menu
    			 */
    			function scrollMenu(direction) {
    				var menu = document.getElementById("menu");
    				var item = menu.firstChild;
     
    				clearTimeout(timer);
     
    				while(item != null) {
    					if(!isVisible(item, direction)) {
    						if(direction == directionConstants.bottom) {
    							for(var i = 0; i < menu.childNodes.length; i++) {
    								menu.childNodes[i].style.top = null;
    							}
     
    							menu.appendChild(item.cloneNode(true));
    							menu.removeChild(item);
    						} else if(direction == directionConstants.top) {
    							var clone = item.cloneNode(true);
     
    							clone.style.top = "0px";
     
    							menu.insertBefore(item.cloneNode(true), menu.firstChild);
    							menu.removeChild(item);
    						}
    					} else {
    						item.style.top = getTop(item) - parseInt(shift * direction) + "px";
    					}
     
    					item = item.nextSibling;
    				}
     
    				timer = setTimeout(function() { scrollMenu(direction) }, timeToWait);
    			}
     
    			/**
    			 * Fonction appelée en cas d'utilisation des boutons haut et bas.
    			 * Positionne les variables globales timeToWait et shift à de nouvelles valeurs pour accélérer le défilement puis lance le défilement accéléré
    			 * @param direction Sens de défilement du menu
    			 */
    			function newParamsAndScroll(direction) {
    				timeToWait = scrollConstants.timeToWaitButton;
    				shift = scrollConstants.shiftButton;
     
    				scrollMenu(direction);
    			}
     
    			/**
    			 * Fonction appelée quand les boutons haut et bas ne sont plus utilisés.
    			 * Positionne les variables globales timeToWait et shift à leur valeur initiale puis lance le défilement normal
    			 * @param direction Sens de défilement du menu
    			 */
    			function restoreParamsAndScroll() {
    				timeToWait = scrollConstants.timeToWaitNormal;
    				shift = scrollConstants.shiftNormal;
     
    				scrollMenu(directionConstants.bottom);
    			}
     
    			window.onload = function() {
    				init();
    			};
    		</script>
    	</head>
    	<body>
    		<div id="up" class="bouton" onmouseover="newParamsAndScroll(directionConstants.top);" onmouseout="restoreParamsAndScroll();">
    			&nbsp;
    		</div>
    		<div id="container">
    			<div id="menu" onmouseover="clearTimeout(timer);" onmouseout="restoreParamsAndScroll();">
    				<div class="menuItem" id="altapr">
    					<a href="#">
    						<img id="logo_altapr" src="logo1.gif" />
    					</a>
    				</div>
    				<div class="menuItem" id="bkcp">
    					<a href="#">
    						<img id="logo_bkcp" src="logo2.gif" />
    					</a>
    				</div>
    			</div>
    		</div>
    		<div id="down" class="bouton" onmouseover="newParamsAndScroll(directionConstants.bottom);" onmouseout="restoreParamsAndScroll();">
    			&nbsp;
    		</div>
    	</body>
    </html>
    D'avance merci pour l'aide que vous pourriez m'apporter !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Enfin, j'y suis arrivé !!!

    J'ai abandonné le positionnement position: relative des différents éléments du menu. Ceux-ci sont maintenant ajoutés au lancement du script et positionnés en position: absolute. J'ai également revu le fonctionnement du déplacement des logos lorsque ceux-ci "sortent" du div du menu.

    Tout ça fonctionne correctement sous FF 3, IE 7, Chrome 2, Opera 9.6

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    	<head>
    		<title>
    			Test menu défilant
    		</title>
    		<style type="text/css">
    			img {
    				border: none;
    			}
     
    			.bouton {
    				position: relative;
    				width: 200px;
    				text-align: center;
    			}
     
    			#up {
    				background-image: url(../img/defilHaut.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				cursor: pointer;
    			}
     
    			#down {
    				background-image: url(../img/defilBas.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				cursor: pointer;
    			}
     
    			.menuItem {
    				margin-bottom: 2px;
    				left: 8px;
    			}
     
    			#container {
    				background-image: url(../img/bg_logoDefil.gif);
    				background-repeat: no-repeat; 
    				background-position: center;
    				width: 200px;
    				height: 360px;
    			}
     
    			#menu {
    				overflow: hidden;
    				position: relative;
    				top: auto;
    				width: 200px;
    				height: 360px;
    			}
    		</style>
    		<script type="text/javascript">
    			var logos = [
    				{id: "logo1", href: "#"},
    				{id: "logo2", href: "#"},
    				{id: "logo3", href: "#"},
    				{id: "logo4", href: "#"},
    				{id: "logo5", href: "#"}
    			];
    			var scrollConstants = {
    				// Décalage en pixels en fonctionnement normal
    				shiftNormal: 1,
     
    				// Décalage en pixels si utilisation des boutons
    				shiftButton: 2,
     
    				// Délai entre chaque décalage en fonctionnement normal
    				timeToWaitNormal: 35,
     
    				// Délai entre chaque décalage si utilisation des boutons
    				timeToWaitButton: 0
    			}
    			var directionConstants = {
    				top: -1,
    				bottom: 1
    			};
    			var timer;
    			var shift;
    			var timeToWait;
     
    			/**
    			 * Initialisation du menu défilant
    			 */
    			function init() {
    				var menu = document.getElementById("menu");
     
    				// Ajout des différents éléments du menu
    				for(var i = 0; i < logos.length; i++) {
    					var logo = logos[i];
    					var divLogo = document.createElement("div");
    					var divLogoId = document.createAttribute("id");
    					var divLogoClass = document.createAttribute("class");
    					var linkLogo = document.createElement("a");
    					var linkLogoHref = document.createAttribute("href");
    					var imgLogo = document.createElement("img");
    					var imgLogoId = document.createAttribute("id");
    					var imgLogoSrc = document.createAttribute("src");
     
    					imgLogoId.nodeValue = "logo_" + logo.id;
    					imgLogoSrc.nodeValue = "../img/" + logo.id + ".gif";
     
    					imgLogo.setAttributeNode(imgLogoId);
    					imgLogo.setAttributeNode(imgLogoSrc);
     
    					linkLogoHref.nodeValue = logo.href;
     
    					linkLogo.setAttributeNode(linkLogoHref);
    					linkLogo.appendChild(imgLogo);
     
    					divLogoId.nodeValue = logo.id;
    					divLogoClass.nodeValue = "menuItem";
     
    					divLogo.style.position = "absolute";
    					divLogo.style.top = (71 * i) + "px";
     
    					divLogo.setAttributeNode(divLogoId);
    					divLogo.setAttributeNode(divLogoClass);
    					divLogo.appendChild(linkLogo);
     
    					menu.appendChild(divLogo);
     
    				}
     
    				// Lancement du menu défilant
    				shift = scrollConstants.shiftNormal;
    				timeToWait = scrollConstants.timeToWaitNormal;
    				timer = setTimeout(function() { scrollMenu(directionConstants.bottom) }, 1000);
    			}
     
    			/**
    			 * @param item élément du menu
    			 * @return la position haute de l'élément item
    			 */
    			function getTop(item) {
    				var top = item.style.top;
     
    				if((top == null) || ("" == top) || (top.indexOf("auto") != -1)) {
    					top = 0;
    				} else if(top.indexOf("px") != -1) {
    					top = top.substring(0, top.indexOf("px"));
    				}
     
    				return top;
    			}
     
    			/**
    			 * @param item élément du menu
    			 * @param direction sens de défilement du menu
    			 * @return true si l'élément est encore visible dans le menu, false sinon
    			 */
    			function isVisible(item, direction) {
    				var visible = true;
     
    				if(direction == directionConstants.bottom) {
    					visible = (item.offsetTop > -71);
    				} else if(direction == directionConstants.top) {
    					var menuHeight = document.getElementById("menu").clientHeight;
     
    					visible = (item.offsetTop < menuHeight);
    				}
     
    				return visible;
    			}
     
    			/**
    			 * Défilement du menu
    			 * @param direction sens de défilement du menu
    			 */
    			function scrollMenu(direction) {
    				var menu = document.getElementById("menu");
    				var item = (direction == directionConstants.bottom) ? menu.firstChild : menu.lastChild;
     
    				clearTimeout(timer);
     
    				while(item != null) {
    					if(!isVisible(item, direction)) {
    						var clone = item.cloneNode(true);
     
    						if(direction == directionConstants.bottom) {
    							var last = menu.getElementsByTagName("div")[menu.getElementsByTagName("div").length - 1];
     
    							clone.style.top = (last.offsetTop + 71) + "px";
     
    							menu.appendChild(clone);
    							menu.removeChild(item);
    						} else if(direction == directionConstants.top) {
    							var first = menu.getElementsByTagName("div")[0];
     
    							clone.style.top = (first.offsetTop - 71) + "px";
     
    							menu.insertBefore(clone, first);
    							menu.removeChild(item);
    						}
    					} else {
    						item.style.top = getTop(item) - parseInt(shift * direction) + "px";
    					}
     
    					item = (direction == directionConstants.bottom) ? item.nextSibling : item.previousSibling;
    				}
     
    				timer = setTimeout(function() { scrollMenu(direction) }, timeToWait);
    			}
     
    			/**
    			 * Fonction appelée en cas d'utilisation des boutons haut et bas.
    			 * Positionne les variables globales timeToWait et shift à de nouvelles valeurs pour accélérer le défilement puis lance le défilement accéléré
    			 * @param direction sens de défilement du menu
    			 */
    			function newParamsAndScroll(direction) {
    				timeToWait = scrollConstants.timeToWaitButton;
    				shift = scrollConstants.shiftButton;
     
    				scrollMenu(direction);
    			}
     
    			/**
    			 * Fonction appelée quand les boutons haut et bas ne sont plus utilisés.
    			 * Positionne les variables globales timeToWait et shift à leur valeur initiale puis lance le défilement normal
    			 * @param direction sens de défilement du menu
    			 */
    			function restoreParamsAndScroll() {
    				timeToWait = scrollConstants.timeToWaitNormal;
    				shift = scrollConstants.shiftNormal;
     
    				scrollMenu(directionConstants.bottom);
    			}
     
    			window.onload = function() {
    				init();
    			};
    		</script>
    	</head>
    	<body>
    		<div id="up" class="bouton" onmouseover="newParamsAndScroll(directionConstants.top);" onmouseout="restoreParamsAndScroll();">
    			&nbsp;
    		</div>
    		<div id="container">
    			<div id="menu" onmouseover="clearTimeout(timer);" onmouseout="restoreParamsAndScroll();"></div>
    		</div>
    		<div id="down" class="bouton" onmouseover="newParamsAndScroll(directionConstants.bottom);" onmouseout="restoreParamsAndScroll();">
    			&nbsp;
    		</div>
    	</body>
    </html>
    Merci encore à ceux qui ont participé à ce thread, que je suis content de passer en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Menu Défilant vertical et sens
    Par Cariboutchou dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/03/2010, 10h56
  2. Création d'un menu défilant en C
    Par realkenji dans le forum C
    Réponses: 8
    Dernier message: 03/05/2009, 01h44
  3. Menu défilant au passage de la souris
    Par drizztoli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/11/2007, 13h40
  4. Bannière défilante verticale
    Par Moony Light dans le forum ASP.NET
    Réponses: 4
    Dernier message: 05/09/2007, 17h47
  5. menu défilant
    Par yogui41 dans le forum ASP
    Réponses: 1
    Dernier message: 24/03/2006, 16h40

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