• 0

Help with CSS Menu and Tags


Question

I have this annoying menu that I can't get to work.

It collapses and everything perfect, but I don't want the top item to collapse. I can remove the divs, but when I try and make it linkable, it takes on the CSS for the explanded divs.

post-70235-1210583341.jpg

That one pointed at shouldn't expand, but just be clickable.

Here's the CSS:

div.sdmenu {
	 width: 150px;
	 font-family: Arial, sans-serif;
	 font-size: 12px;
	 padding-bottom: 10px;
	 background: url(bottom.jpg) no-repeat  right bottom;
	 color: #fff;
	 text-decoration: none;
 }
 div.sdmenu div {
	 background: url(title.jpg) repeat-x;
	 overflow: hidden;
		 text-decoration: none;
 }
 div.sdmenu div:first-child {
	 background: url(toptitle.jpg) no-repeat;
 }
 div.sdmenu div.collapsed {
	 height: 25px;
 }
 div.sdmenu div span {
	 display: block;
	 padding: 5px 25px;
	 font-weight: bold;
	 color: white;
	 cursor: default;
	 border-bottom: 1px solid #ddd;
	 text-decoration: None;
	 font-style: normal;
 }
 div.sdmenu div.collapsed span {
	 background-image: none);
 }
 div.sdmenu div a {
	 padding: 5px 10px;
	 background: #eee;
	 display: block;
	 border-bottom: 1px solid #ddd;
	 color: #000;
	 text-decoration: none;
 }
 div.sdmenu div a.current {
	 background : #ccc;
 }
 div.sdmenu div a:hover {
	 background : #332B5E url(linkarrow.gif) no-repeat right center;
	 color: #fff;
	 text-decoration: none;
 }

And the body:

<div style="float: cen" id="my_menu" class="sdmenu">
	   <div class="sdmenu_none">
		 <span>Online Tools</span></div>
	   <div>
		 <span>Support Us</span>
		 <a href="http://www.dynamicdrive.com/recommendit/">Recommend Us</a>
		 <a href="http://www.dynamicdrive.com/link.htm">Link to Us</a>
		 <a href="http://www.dynamicdrive.com/resources/">Web Resources</a>
	   </div>
	   <div class="collapsed">
		 <span>Partners</span>
		 <a href="http://www.javascriptkit.com">JavaScript Kit</a>
		 <a href="http://www.cssdrive.com">CSS Drive</a>
		 <a href="http://www.codingforums.com">CodingForums</a>
		 <a href="http://www.dynamicdrive.com/style/">CSS Examples</a>
	   </div>
	   <div>
		 <span>Test Current</span>
		 <a href="?foo=bar">Current or not</a>
		 <a href="./">Current or not</a>
		 <a href="index.html">Current or not</a>
		 <a href="index.html?query">Current or not</a>
	   </div>
	 </div>

Some pleaaaase help :-(

Link to comment
https://www.neowin.net/forum/topic/636447-help-with-css-menu-and-tags/
Share on other sites

12 answers to this question

Recommended Posts

  • 0
Where's the JS?

function SDMenu(id) {
	if (!document.getElementById || !document.getElementsByTagName)
		return false;
	this.menu = document.getElementById(id);
	this.submenus = this.menu.getElementsByTagName("div");
	this.remember = true;
	this.speed = 3;
	this.markCurrent = true;
	this.oneSmOnly = false;
}
SDMenu.prototype.init = function() {
	var mainInstance = this;
	for (var i = 0; i < this.submenus.length; i++)
		this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
			mainInstance.toggleMenu(this.parentNode);
		};
	if (this.markCurrent) {
		var links = this.menu.getElementsByTagName("a");
		for (var i = 0; i < links.length; i++)
			if (links[i].href == document.location.href) {
				links[i].className = "current";
				break;
			}
	}
	if (this.remember) {
		var regex = new RegExp("sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
		var match = regex.exec(document.cookie);
		if (match) {
			var states = match[1].split("");
			for (var i = 0; i < states.length; i++)
				this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
		}
	}
};
SDMenu.prototype.toggleMenu = function(submenu) {
	if (submenu.className == "collapsed")
		this.expandMenu(submenu);
	else
		this.collapseMenu(submenu);
};
SDMenu.prototype.expandMenu = function(submenu) {
	var fullHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
	var links = submenu.getElementsByTagName("a");
	for (var i = 0; i < links.length; i++)
		fullHeight += links[i].offsetHeight;
	var moveBy = Math.round(this.speed * links.length);

	var mainInstance = this;
	var intId = setInterval(function() {
		var curHeight = submenu.offsetHeight;
		var newHeight = curHeight + moveBy;
		if (newHeight < fullHeight)
			submenu.style.height = newHeight + "px";
		else {
			clearInterval(intId);
			submenu.style.height = "";
			submenu.className = "";
			mainInstance.memorize();
		}
	}, 30);
	this.collapseOthers(submenu);
};
SDMenu.prototype.collapseMenu = function(submenu) {
	var minHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
	var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
	var mainInstance = this;
	var intId = setInterval(function() {
		var curHeight = submenu.offsetHeight;
		var newHeight = curHeight - moveBy;
		if (newHeight > minHeight)
			submenu.style.height = newHeight + "px";
		else {
			clearInterval(intId);
			submenu.style.height = "";
			submenu.className = "collapsed";
			mainInstance.memorize();
		}
	}, 30);
};
SDMenu.prototype.collapseOthers = function(submenu) {
	if (this.oneSmOnly) {
		for (var i = 0; i < this.submenus.length; i++)
			if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
				this.collapseMenu(this.submenus[i]);
	}
};
SDMenu.prototype.expandAll = function() {
	var oldOneSmOnly = this.oneSmOnly;
	this.oneSmOnly = false;
	for (var i = 0; i < this.submenus.length; i++)
		if (this.submenus[i].className == "collapsed")
			this.expandMenu(this.submenus[i]);
	this.oneSmOnly = oldOneSmOnly;
};
SDMenu.prototype.collapseAll = function() {
	for (var i = 0; i < this.submenus.length; i++)
		if (this.submenus[i].className != "collapsed")
			this.collapseMenu(this.submenus[i]);
};
SDMenu.prototype.memorize = function() {
	if (this.remember) {
		var states = new Array();
		for (var i = 0; i < this.submenus.length; i++)
			states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
		var d = new Date();
		d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
		document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
	}
};

  • 0

OK, here's what you need to do:

1) Remove the <span> from the first div and add an <a> with a class:

&lt;div class="sdmenu_none"&gt;
	&lt;a class="no_expand" href="whatever.html"&gt;Online Tools&lt;/a&gt;
&lt;/div&gt;

2) Add a couple of rules in the css file:

div.sdmenu a.no_expand {
	background-color : transparent;
	border: none;
	color: #fff;
	display: block;
	font-weight: bold;
	padding: 5px 25px;
}
div.sdmenu a.no_expand:hover {
	background-color : transparent;
	background-image : none;
}

3) Find this in the sdmenu.js:

this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
	mainInstance.toggleMenu(this.parentNode);
};

and replace with this:

if (this.submenus[i].getElementsByTagName("span").length&gt;0) {
	this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
		mainInstance.toggleMenu(this.parentNode);
	};
}

That should do it!

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.