Bonjour,

Sur mes deux sites web www.barf.ch et www.molos.ch, j'ai des menus entièrement faits en CSS. Ce sont exactement les mêmes sur chaque site, donc vous pouvez regarder indifféremment sur l'un ou l'autre.

Ces menus fonctionnent pafaitement tels quels avec Firefox. Pas de problème à ce niveau là. Par contre avec IE 6, j'ai dû rajouter deux choses : 1 bout de code sur chacune des pages et un ficher csshover.htc sur mon serveur. Sans ces deux choses, le menu ne fonctionne pas avec IE 6. C'est à dire que lorsqu'on passe la souris sur le menu, ce dernier ne se "déroule" pas.

Donc jusqu'à maintenant, tout cela fonctionnait à merveille : naturellement sur Firefox et grâce à l'ajout de code et de csshover.htc sur IE 6.

Seulement sur IE7, ça ne marche plus... :hover semble fonctionner sur <a> mais pas sur <li>

J'ai essayé
<!--[if lt IE 7]>
au lieu de
<!--[if IE>
mais c'est encore pire

Coment dois-je modifier csshover.htc pour que cela fonctionne aussi avec IE7 7 ? (je détestais déjà IE mais alors le 7, je crois que c'est encore pire)

Voici donc le code, et en dessous, le contenu de csshover.htc :



<!--[if IE]>
<style type="text/css" media="screen">
body {
behavior: url(csshover.htc); /* call hover behaviour file */
font-size: 100%; /* enable IE to resize em fonts */
} 
#menu ul li {
float: left; /* cure IE5.x "whitespace in lists" problem */
width: 100%;
}
#menu ul li a {
height: 1%; /* make links honour display: block; properly */
} 

#menu a, #menu h2 {
font: 12px Trebuchet MS; 
/* if required use em's for IE as it won't resize pixels */
} 
</style>
<![endif]-->




<attach event="ondocumentready" handler="parseStylesheets" />
<script>
/**
 *	Whatever:hover - V1.41.050927 - hover & active
 *	------------------------------------------------------------
 *	(c) 2005 - Peter Nederlof
 *	Peterned -  http://www.xs4all.nl/~peterned/
 
 *	License  -  http://creativecommons.org/licenses/LGPL/2.1/
 
 *
 *	Whatever:hover is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU Lesser General Public
 *	License as published by the Free Software Foundation; either
 *	version 2.1 of the License, or (at your option) any later version.
 *
 *	Whatever:hover is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *	Lesser General Public License for more details.
 *
 *	Credits and thanks to:
 *	Arnoud Berendsen, Martin Reurings, Robert Hanson
 *
 *	howto: body { behavior:url("csshover.htc"); }
 *	------------------------------------------------------------
 */

var csshoverReg = /(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)) [decu]hover|active)/i,
currentSheet, doc = window.document, hoverEvents = [], activators = {
	onhover:{on:'onmouseover', off:'onmouseout'},
	onactive:{on:'onmousedown', off:'onmouseup'}
}

function parseStylesheets() {
	if(!/MSIE (5|6)/.test(navigator.userAgent)) return;
	window.attachEvent('onunload', unhookHoverEvents);
	var sheets = doc.styleSheets, l = sheets.length;
	for(var i=0; i<l; i++) 
		parseStylesheet(sheets[i]);
}
	function parseStylesheet(sheet) {
		if(sheet.imports) {
			try {
				var imports = sheet.imports, l = imports.length;
				for(var i=0; i<l; i++) parseStylesheet(sheet.imports[i]);
			} catch(securityException){}
		}

		try {
			var rules = (currentSheet = sheet).rules, l = rules.length;
			for(var j=0; j<l; j++) parseCSSRule(rules[j]);
		} catch(securityException){}
	}

	function parseCSSRule(rule) {
		var select = rule.selectorText, style = rule.style.cssText;
		if(!csshoverReg.test(select) || !style) return;
		
		var pseudo = select.replace(/[^:]+ [decu][a-z-]+).*/i, 'on$1');
		var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
		var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1];
		var affected = select.replace(/ [decu]hover|active).*$/, '');
		var elements = getElementsBySelect(affected);
		if(elements.length == 0) return;

		currentSheet.addRule(newSelect, style);
		for(var i=0; i<elements.length; i++)
			new HoverElement(elements[i], className, activators[pseudo]);
	}

function HoverElement(node, className, events) {
	if(!node.hovers) node.hovers = {};
	if(node.hovers[className]) return;
	node.hovers[className] = true;
	hookHoverEvent(node, events.on, function() { node.className += ' ' + className; });
	hookHoverEvent(node, events.off, function() { node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),''); });
}
	function hookHoverEvent(node, type, handler) {
		node.attachEvent(type, handler);
		hoverEvents[hoverEvents.length] = { 
			node:node, type:type, handler:handler 
		};
	}

	function unhookHoverEvents() {
		for(var e,i=0; i<hoverEvents.length; i++) {
			e = hoverEvents[i]; 
			e.node.detachEvent(e.type, e.handler);
		}
	}

function getElementsBySelect(rule) {
	var parts, nodes = [doc];
	parts = rule.split(' ');
	for(var i=0; i<parts.length; i++) {
		nodes = getSelectedNodes(parts[i], nodes);
	}	return nodes;
}
	function getSelectedNodes(select, elements) {
		var result, node, nodes = [];
		var identify = (/\#([a-z0-9_-]+)/i).exec(select);
		if(identify) return [doc.getElementById(identify[1])];
		
		var classname = (/\.([a-z0-9_-]+)/i).exec(select);
		var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');
		var classReg = classname? new RegExp('\\b' + classname[1] + '\\b'):false;
		for(var i=0; i<elements.length; i++) {
			result = tagName? elements[i].all.tags(tagName):elements[i].all; 
			for(var j=0; j<result.length; j++) {
				node = result[j];
				if(classReg && !classReg.test(node.className)) continue;
				nodes[nodes.length] = node;
			}
		}	return nodes;
	}
</script>



Merci d'avance.

Emma[/i][/i][/i][/i][/i][/i][/i]
Modifié par EmmaZL (29 Nov 2006 - 13:56)
EmmaZL a écrit :

Seulement sur IE7, ça ne marche plus...


salut EmmaZL,

ben, c'est bizarre cette histoire de menu déroulant ne fonctionnant pas sur IE 7, parce que logiquement IE prend en charge ces mêmes menus à partir de la version 7 sans devoir passer par un fichier csshover.htc.

Regarde sur mon site, parce que j'y ai mis un menu déroulant sur quelques pages ça fonctionne très bien sur toutes les versions de navigateurs.

voici l'adresse : http://www.spdesign.be/spdesign-350-presse7.htm [/url] (promène ta souris au dessus de l'image "navigation" en haut à gauche avec une petite flèche rouge pour voir apparaître le menu).

Sinon, en attendant, je vais aller voir dans le bouquin(CSS de Eric Meyer) avec lequel j'ai appris à le faire et te montrer le code que j'ai utilisé.

à+ Smiley cligne
Touvert

ps : Ah oui, selon moi, tu ne devrais pas avoir besoin de modifier le fichier csshover.htc puisque ça doit fonctionner direct comme ça.
Modifié par touvert (28 Nov 2006 - 23:31)
Bon voilà le code que j'ai copié de ma page :

<div id="nav">
			<ul class="level1">
				<li class="submenu" title="navigation">
					<ul class="level2">
						<li><a href="accueil-spdesign.htm">home page</a></li>
						<li><a href="pagewebdesign1.htm">webdesign</a></li>
						<li><a href="pageprepresse1.htm">pré-presse</a></li>
						<li><a href="pageillustration1.htm">illustration</a></li>
						<li><a href="cv-spdesign.htm">curriculum</a></li>
						<li><a href="liens-spdesign.htm">liens</a></li>
						<li><a href="contact-spdesign.htm">contact</a></li>
					</ul>
				</li>
			</ul>
		</div>



et voici le code css correspondant :

#nav {
float:left;
width:7em;
background:#fff;
margin-left:5px;
border-bottom:0;
}

#nav ul {
width:7em;
background-color:#fff;
margin:0;
padding:0;
}

#nav li {
position:relative;
list-style:none;
height:23px;
padding-top:2px;
margin:0;
}

#nav ul ul {
position:absolute;
top:35px;
left:-3px;
display:none;
}

#nav li.submenu {
background:url(navigation.gif);
background-repeat:no-repeat;
width:111px;
height:37px;
}

#nav li a {
display:block;
text-decoration:none;
width:6.5em;
}

#nav ul a {
width:auto;
}

#nav ul.level1 li.submenu:hover ul.level2 {
display:block;
}

#nav ul.level2 li {
border-bottom:1px solid red;
}


Voilà, en reprenant ça(en l'adaptant à ton site biensûr puisque sur mon exemple, le menu se déroule en dessous alors que toi c'est sur le côté), logiquement ça doit fonctionner.

à+ Smiley cligne
Touvert
Bonjour Touvert.

Merci beaucoup de ton aide.

En fait, dans csshover.htc, j'ai fini par remplacer :

if(!/MSIE (5|6)/.test(navigator.userAgent)) return;


par

if(!/MSIE (5|6|7)/.test(navigator.userAgent)) return;


Et ça marche. Smiley lol

Par contre, je vais quand même voir pour m'inspirer de ton code. Si je peux éviter l'utilisation de csshover.htc, ça sera plus simple.
EmmaZL a écrit :
Si je peux éviter l'utilisation de csshover.htc, ça sera plus simple.


salut EmmaZL,

oui, mais en fait, on a pas besoin de csshover.htc pour IE 7 puisqu'il prend en compte les menus déroulants en natif, mais il est quand même toujours nécessaire pour l'utiliser dans les versions antérieures de IE.

d'ailleurs, dans le code que j'avais montré dans l'autre message, j'avais oublié d'insérer le bout de code dans le sélecteur body qui me sert à prendre le csshover.htc dans mes css.

le voici :

body {
font-family:Verdana, Arial, Helvetica, sans-serif;
text-align:center;
color:#000;
behavior:url(csshover.htc);
background:#fff;
margin:0;
padding:0;
}


voilà, à+ Smiley cligne
Ok, je comprends.

Par contre, j'ai un autre problème. Smiley decu

Ca marche avec mon IE 7 à la maison, mais ça ne marche pas avec mon IE 7 du bureau. On a plein de restrictions au bureau (activeX, etc). Est-ce que cela pourrait être une explication ?

Regarde là, ils disent que le :hover ne marche pas très bien avec IE7 :

http://www.webdevout.net/browser_support_css.php#css2pseudoclasses

a écrit :
Sometimes remains in hover state on mouse out while button is pressed; Hover state sometimes doesn't apply when it should; Doesn't select elements with negative z-index


Sinon, j'ai installé IE7 mais il a écrasé mon IE6. Est-il possible d'avoir les deux en même temps. Si oui, comment ?

Franchement je suis débutante en CSS et je trouve ça dur. J'avais enfin réussi à faire un truc cool et voilà que IE7 me fout tout en l'air. Je suis dégoutée... Pourquoi est-ce qu'ils ne peuvent pas faire un navigateur qui interprète les standards ? Smiley bawling
Modifié par EmmaZL (29 Nov 2006 - 13:58)
salut EmmaZL,

ouh laaa Smiley ohwell , je saurais vraiment pas te dire ce qu'il se passe parce que moi, j'ai toujours vu que pour mon site, ça fonctionnait toujours très bien (avec des différences entre navigateurs mais bon), mais là, je vois pas du tout. Désolé.

EmmaZL a écrit :
Sinon, j'ai installé IE7 mais il a écrasé mon IE6. Est-il possible d'avoir les deux en même temps. Si oui, comment ?


ouais, ça je t'ai rassemblé quelques adresses(anglais, mais avec des exemples visuels) où on peut apprendre à utiliser différentes versions de IE en même temps. Et, j'ai mis aussi une adresse où on peut télécharger des version "Standalone" indépendantes.

Voici les adresse :
http://tredosoft.com/Multiple_IE [/url]
http://tredosoft.com/IE7_standalone [/url]
http://browsers.evolt.org/?ie/32bit/standalone [/url]

elles sont dispos, ainsi que plein d'autres adresses dans les sujets permanents de la rubrique "Ressources et liens sur les standards" du forum d'Alsa.

Sinon, oui, c'est vrai que c'est frustrant d'avoir un navigateur récalcitrant comme IE, c'est souvent pour ça que les designers et les développeurs préfèrent Firefox et les autres comme Opéra. Mais bon, on va dire que Microsoft, c'est le cancre avec qui personne ne veut partager ses billes à la récré, et que tôt ou tard, ça leur retombera dessus.

voilà, à+ Smiley cligne
Touvert
Modifié par touvert (29 Nov 2006 - 21:21)
Salut EmmaZL,

Si ton menu fonctionne sous les navigateurs communs (IE 6,7 et firefox ??), tout cela m'interesse fortement... Smiley smile
J'ai trouvé ce menu là, que je trouve super sympa mais je n'ai pas réussi a l'adapter à mes besoins.
Donc si ton menu ressemble à celui que je recherche (voir le lien ci-dessus), pourrais-tu éventuellement mettre l'url de ton site (s'il n'est pas trop personnel) et reprendre cette discussion pour m'aider Smiley cligne Smiley confus Smiley ravi car j'ai copier/coller le code que tu as mis en remplacant les Smiley decu par le code bien connu ": (" (sans espace) Smiley cligne mais j'peux pas remplacer ce qu'il y a dans "var parts, nodes = ;" ?! Smiley decu et de ce fait ça marche pas !?

Donc si tu pouvais m'aider, ca serait bien cool ^^

Merci d'avance ... Smiley cligne
Bonjour,

Juste en passant: c'est amusant, cette illusion des menus déroulants "full CSS sans javascript"... reposant en fait inévitablement sur javascript via les .htc Smiley ravi

Faites donc directement des menus déroulants javascript, ce sera mieux supporté et beaucoup plus robuste... Smiley cligne
Bonjour,

En ce qui me concerne, le fait d'avoir un menu en Javascript ne me dérange pas plus que ça si ce n'est que IE7 me fait ..... avec les contrôles ActiveX et tout ca (normal me direz-vous) !! Donc, si j'étais le seul visiteru de mon site, cela ne me derangerais pas mais je ne veux pas imposer a mes visiteurs de cliquer sur l'alerte IE pour autoriser "le contenu actif" !! C'est pour cela que je me rabats sur l'utilisation des "htc" car le fichier etant appelé par notre fichier CSS, il n'est pas directement dans notre page html et IE voit bien le "contenu actif" mais l'interprête correctement !?!?
Donc si il existe une solution pour que IE ne fasse pas ..... avec les contenus actifs, je suis tout ouïe Smiley cligne

Merci d'avance... Smiley smile
Modérateur
Bonjour,

oui, la solution, c'est de mettre ton menu en ligne plutôt que de le tester en local Smiley cligne