Zum Inhalt springen

css only dropline menü

Erstellt am 6. Mai 2008 · 17 Antworten · letzte Antwort am 23. Juni 2008

Tags: Frage

Dirk1 ·

Hallo manuel,

arbeitest du wie stu mit den table-tags?

Tut er das wirklich?

und zwar ist per css doch ein li:hover genauso möglich wie ein a:hover, oder?

Aber leider nicht im IE6. Der kann das nur mit <a>-tags.
Deshalb lösen viele das Problem, indem sie den fraglichen Bereich in ein <a> </a> verpacken.

Das ist aber nicht HTML-konform.

versuche ich dann den mauszeiger dort hinzusteuern, verliert er den kontakt zum hauptmenü-link und das submenü verschwindet.

Ist das submenu html-mässig verschachtelt?

<li class="menu-item">
<a ...>...</a>
Unternmenu-elemente

</li>

..erlaubt von dem aussen-liegenden <li> einen Zugriff auf das Untermenu.
Aber nicht von <a> aus, da die beiden Blöcke NACHEINANDER kommen und nicht ineinander verschachtelt sind.

Wenn du also W3C-konformen Code produzieren willst, kannst du beim <a> element als hover-Effekt nur Eigenschaften des <a>-Elementes selbst manipulieren.

Also hover für das submenu nur über das aussen liegende <li>, oder was immer man da verwendet hat.

Das kann aber IE6 wie gesagt nicht. Man kann es ihm aber beibringen mit einem htc-script, EINER Zeile (!) in der CSS-Datei und NULL Eingriff in HTML oder Typo3.
Details verrate ich dir, wenn du dein Verfahren im Firefox und IE7 sauber zu laufen gebracht hast.

Man kann sich aber auch auf den Standpunkt stellen, dass der IE6 dann eben nicht hovern kann - sozusagen als Anreiz zum Update. Deine Navigation sollte aber natürlich trotzdem funktionieren und daher auch nicht auf den hover -Effekt angewiesen sein.

Gruß
Dirk

triskal ·

hi dirk,

ok. in ff und ie7 funktioniert es soweit. hier der beweis: [LINK GELÖSCHT]

verrätst du mir die 'zauber-css-zeile' für den ie6?

danke und gruss, manuel

Dirk1 ·

Gerne:

Du erstellst eine Datei (Inhalt folgt am Ende), die du z.B. in folgender Weise über CSS referenzierst:

body {behavior:url("fileadmin/hover.htc")}

CSS-Validatoren meckern diese Zeile allerdings an.
Vielleicht kann man das über Kommentar-Tricks (mit denen ich mich nicht beschäftigt habe) aber auch noch irgend wie hin bekommen. Denn es ist ja wirklich nur für IE6.

Zu beachten ist allerdings noch, dass die Klassen mit dem voll qualifizierten Objekttyp angesprochen werden müssen.
Also nicht #ml .. li:hover {..}, sondern div#ml .. li:hover {..}
Funktioniert sonst nicht - daran bin ich mal fast einen vollen Tag verzweifelt.

Was dir dann noch passieren kann, ist die Kollision mit Javascript. Ich hatte z.B. mit der Extension JW_Calendar das Problem, dass das menu immer so seltsam flackerte. Aber auch dafür gibts eine Lösung.

<attach event="ondocumentready" handler="parseStylesheets" />
<script>
/**
 *	HOVER - V1.00.031224 - whatever:hover in IE
 *	---------------------------------------------
 *	Peterned - http://www.xs4all.nl/~peterned/
 *	(c) 2003 - Peter Nederlof
 *
 *	howto: body { behavior:url("csshover.htc"); }
 *	---------------------------------------------
 */

var CSSBuffer, doc = window.document;

function parseStylesheets() {
	var rules, sheet, sheets = doc.styleSheets;
	var bufferIndex = sheets.length;	
	var head = doc.getElementsByTagName('head')[0];
	var buffer = doc.createElement('style');

	buffer.setAttribute('media', 'screen');
	buffer.setAttribute('type', 'text/css');
	head.appendChild(buffer);
	CSSBuffer = sheets[bufferIndex];

	for(var i=0; i<sheets.length -1; i++) {
		sheet = sheets[i];
		if(!sheet.media || sheet.media == 'screen') {
			rules = sheet.rules;
			for(var j=0; j<rules.length; j++) {
				parseCSSRule(rules[j]);
			}
		}
	}
}
	function parseCSSRule(rule) {
		var select = rule.selectorText, style = rule.style.cssText;
		if(!select || !style || select.indexOf(':hover') < 0) return;
		var newSelect = select.replace(/\:hover/g, '.onHover');
		CSSBuffer.addRule(newSelect, style);
		
		var affected = select.replace(/\:hover.*$/g, '');
		var elements = getElementsBySelect(affected);
		for(var i=0; i<elements.length; i++) {
			if(elements[i].nodeName == 'A') continue;
			new HoverElement(elements[i]);
		}
	}

/**
 *	HoverElement
 *	-------------------------
 *	applies the hover
 */

function HoverElement(element) {
	if(element.isHoverElement) return;
	element.isHoverElement = true;
	element.attachEvent('onmouseover', 
		function() { element.className += ' onHover'; });

	element.attachEvent('onmouseout', 
		function() { element.className = element.className.replace(/onHover/g, ''); });
}

/**
 *	domFinder
 *	-----------------------------------
 *	returns list of elements based on css selector
 */

function getElementsBySelect(rule) {
	var nodeList = [doc], sets = rule.split(' ');
	for(var i=0; i<sets.length; i++) {
		nodeList = domFinder.filterNodes(sets[i], nodeList);
	}	return nodeList;
}

var domFinder = {
	findNodes:function(tag, docs) {
		var res, nodes = [];
		for(var i=0; i<docs.length; i++) {
			res = docs[i].getElementsByTagName(tag);
			for(var j=0; j<res.length; j++) nodes[nodes.length] = res[j];
		}	return nodes;
	},

	filterNodes:function(select, docs) {
		var filtered = [], nodes,rule,atr,s = (/#|\./).exec(select);
		if(!s) return this.findNodes(select, docs);
		nodes = this.findNodes((rule = select.split(s))[0], docs);
		atr = (s == '#')? 'id':'className';
		for(var i=0; i<nodes.length; i++) {
			if(new RegExp('(^|\\s)' +  rule[1] + '(\\s|$)').exec(nodes[i][atr]))
				filtered[filtered.length] = nodes[i];
		}	return filtered;
	}
}
</script>

Gruß
Dirk

triskal ·

hi dirk,

es funktioniert, vielen dank. ich habe beide skripts getestet, aber nur das neuere von beiden aktiv bekommen. das ist allerdings sicher auf einen fehler meinerseits zurückzuführen.

es macht den anschein, als wenn auch beim neuen skript die klassen mit dem voll qualifizierten objekttyp angesprochen werden müssen. anders hat es bei mir jedenfalls nicht funktioniert.

was bekommst du für deine tatkräftige unterstützung?

danke und gruss, manuel

triskal ·

hi dirk,

bist du noch da? oder sonst wer der das problem kennt?

und zwar werfen die meisten ie's (sowohl 6er als auch 7er) eine fehlermeldung die wie folgt lautet: 'probleme mit dieser website verhindern evtl., dass die seite nicht richtig dargestellt wird. [...]'

leider kann ich den fehler bei mir nicht provozieren, da meine ie-konfigurationen irgendwie anders zu sein scheinen...

die funktionalität ist wohl trotzdem gegeben, aber viele scheint diese fehlermeldung einfach zu nerven.

jemand eine idee? wie hängt das mit diesen htc-dateien zusammen?

danke und gruss, manuel

Dirk1 ·

Da wirst du wohl nicht drum herum kommen, den Fehler zu reproduzieren.
Wie soll andernfalls eine vernünftige Analyse statt finden.

Welche IE-Versionen sind denn im Spiel?

triskal ·

hi dirk,

entschuldige dass meine vorherigen bemerkungen so wenig informativ waren. ich sitze mittlerweile an einem anderen rechner, kann den fehler im ie6 reproduzieren und genauer eingrenzen:

der fehler tritt nur dann auf, wenn der browser (ie) neu gestartet wird und ich per domain.org die entsprechende url anwähle. zu diesem zeitpunkt funktionieren die menüeffekte auch nicht. ein anklicken der hauptmenüpunkte (ohne rollover) ist trotzdem möglich.

wähle ich einen menüpunkt an, ist der fehler weg. gehe ich zurück zur startseite, entweder über das hauptmenü das den link www.domain.org/index.php?id=start anspringt, ist der fehler nicht da. wähle ich erneut die url domain.org an, wird der fehler ebenfalls nicht mehr angezeigt.

schließe ich jedoch den browser, öffne ihn erneut und wähle die url www.domain.org an, ist der fehler wieder da.

und nun zur fehlermeldung:
unten links in der statuszeile: [ausrufezeichen in gelbem dreieck] fertig, es sind fehler aufgetreten. [klick auf die fehlermeldung/meldungstext:] probleme mit dieser website verhindern eventuell, [...]

[details:]
zeile: 0
zeichen: 0
fehler: access is denied to http://www.domain.org/fileadmin/template/hover.htc
code: 0
URL: http://domain.org
[/details]

oh. gerade fällt mir auf, wo ich die letzte zeile der details erblicke, der fehler tritt nur dann auf, wenn ich die url http://domain.org anwaehle. bei http://www.domain.org tritt der fehler ebenfalls nicht auf. welche auswirkungen hat das fehlende www. und was hat das mit der hover.htc zu tun?

gruss, manuel

Dirk1 ·

Ich tippe auf Pfadprobleme.
Er findet die hover.htc nicht.

Wie ist deine Dateistruktur aufgebaut?

Du könntest spasseshalber die hover.htc aus dem html-head heraus referenzieren (natürlich hier den Pfad zu der Datei entsprechend anpassen).

Dirk