[Résolu] Problème sous IE avec menu en CSS

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
EmmaZL
Lézard à collerette
Messages : 245
Inscription : 07 août 2004, 00:43

[Résolu] Problème sous IE avec menu en CSS

Message par EmmaZL »

Bonjour !

J'ai un menu vertical en CSS qui fonctionne bien avec FF mais pas avec IE.

Voilà la page : http://www.molos.ch/molosnew/index.html
(elle n'est pas encore valide... c'est en cours)

Le problème, c'est quand on survole "Evénements" avec la souris (dernière option du menu vertical à gauche). Avec FF, il y a un sous-menu qui apparaît avec des dates (2001, 2002, etc). Mais avec IE, il n'apparaît pas.

Ce n'est pas moi qui ait fait ce code car je dois bien vous avouer que je n'ai fait aucun progrès en CSS depuis ma dernière venue sur ce forum... :cry:

Voilà le code CSS pour le menu :

Code : Tout sélectionner

#menu {
width: 181px; /* set width of menu */
background: #fff;
} 

#menu ul { /* remove bullets and list indents */
list-style: none;
margin: 0;
padding: 0;
}

/* style, color and size links and headings to suit */
#menu a, #menu h2 {
font: 16px Trebuchet MS;
display: block;
border-width: 1px;
border-bottom-style: solid;
border-color: #ccc;
margin: 0;
padding: 8px 8px;
margin: 1px;
}

#menu h2 {
color: #fff;
background: #000;
text-transform: uppercase;
}

#menu a {
color: #7a7a7a;
background: #fff;
text-decoration: none;
}

#menu a:hover {
color: #fff;
background: #76878F;
}

#menu li {
/* make the list elements a containing block for the nested lists */
position: relative;
} 

#menu ul ul ul {
position: absolute;
top: 0;
left: 100%; /* to position them to the right of their containing block */
width: 100%; /* width is based on the containing block */
}

div#menu ul ul ul,
div#menu ul ul li:hover ul ul
{display: none;}

div#menu ul ul li:hover ul,
div#menu ul ul ul li:hover ul
{display: block;}

[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: 1em Trebuchet MS; 
/* if required use em's for IE as it won't resize pixels */
} 
</style>
<![endif]
et le fichier csshover.htc. Je ne sais pas à quoi il sert mais il à l'air important pour IE si je me réfère à la fin de la feuille CSS ( [if IE]> ). Il y a tout une théorie à laquelle je n'ai rien compris ici : http://www.xs4all.nl/~peterned/csshover.html

Code : Tout sélectionner

<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([^#.][^ ]+)+)):(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(/[^:]+:([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(/:(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>
Voilà. Merci d'avance pour votre aide... :wink:

PS : Calimo, pas gronder à cause des tableaux ! :cry:
Dernière modification par EmmaZL le 01 févr. 2006, 23:46, modifié 1 fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème. (devise Shadok)
Ma configuration
SB
Varan
Messages : 1095
Inscription : 05 mars 2004, 18:38

Message par SB »

Là ce soir j'ai pas le temps de jeter un oeil mais il me semble lorsque j'avais été voir le site qui parlait de "pure css menu" (à rechercher sur le web) que IE n'acceptait la pseudo classe ":hover" que sur les éléments <a> et pas sur les <ul> ni les <li>.
A confirmer.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

SB a écrit :Là ce soir j'ai pas le temps de jeter un oeil mais il me semble lorsque j'avais été voir le site qui parlait de "pure css menu" (à rechercher sur le web) que IE n'acceptait la pseudo classe ":hover" que sur les éléments <a> et pas sur les <ul> ni les <li>.
A confirmer.
C'est exact, mais il me semble que c'est exactement le but du script que de corriger ça...

Le pire n'est probablement pas les tableaux, mais l'absence de doctype et les erreurs de validation :roll:

PS : le CSS n'est pas du HTML. Tu ne peux pas y mettre de balises HTML :wink:
SB
Varan
Messages : 1095
Inscription : 05 mars 2004, 18:38

Message par SB »

En effet ça marchera quand tu enlèveras toute la partie

Code : Tout sélectionner

<!--[if IE]>
<style type="text/css" media="screen">
body {
behavior: url(index_fichiers/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: 1em Trebuchet MS; 
/* if required use em's for IE as it won't resize pixels */
} 
</style>
<![endif]-->
de la feuille de style pour la mettre dans ta page html juste après

Code : Tout sélectionner

<link href="index_fichiers/default.css" rel="stylesheet" type="text/css">
EmmaZL
Lézard à collerette
Messages : 245
Inscription : 07 août 2004, 00:43

Message par EmmaZL »

:lol: :lol: :lol: Merci... En effet, ça marche !
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème. (devise Shadok)
Ma configuration
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités