• 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.
  • Posts

    • I miss when there was blue and red and green devices. Now we get sand black or silver.... just like most car lots now.
    • Microsoft should never have purchased anything after RARE.
    • Call of Duty: Vanguard, EA Sports FC 26, and more come to Xbox Game Pass by Pulasthi Ariyasinghe Microsoft is in the process of making some big changes to Xbox Game Studios right now, which might include studio shutdowns, but Game Pass drops aren't pausing for that. The second wave of June was just announced, unveiling another Call of Duty addition, the latest soccer game from EA, an indie road trip hit from last year, and more. While Microsoft said it won't put Call of Duty titles on Game Pass on the day of launch anymore, older titles keep landing, with the latest one being 2021's Call of Duty: Vanguard. Here are all the games that were announced today for Xbox Game Pass, their platforms, and arrival dates: Junkster (Cloud, XBOX Series X|S, Handheld, and PC) – June 16 Call of Duty: Vanguard (Cloud, Console, and PC) – June 17 EA Sports FC 26 (Cloud, Console, and PC) – June 18 Abyssus (Cloud, Xbox Series X|S, and PC) – June 25 RV There Yet? (Cloud, Xbox Series X|S, and PC) – June 30 Tony Hawk's Pro Skater 3 + 4 (Cloud, Console, and PC) – July 2 Winds of Arcana: Ruination (Cloud, Console, Handheld, and PC) – July 6 From the bunch, Junkster is the sole day-one drop into Game Pass libraries of this selection. As new games arrive, eight will be leaving the Game Pass programs on June 30. Here's the full list of leaving titles: Mecha Break (Cloud, Console, and PC) Payday 2 (Console) Rise of Tomb Raider (Cloud, Console, and PC) Tomb Raider (Cloud, Console, and PC) Slay the Spire (Cloud, Console, and PC) Ultimate Chicken Horse (Cloud, Console, and PC) Volcano Princess (Cloud, Console, and PC) Unpacking (Cloud, Console, and PC) With June drops finished, Microsoft should have a new Game Pass announcement in about two weeks to reveal the first wave of games coming to subscribers in July. Already confirmed games for the month include the Halo: Campaign Evolved remake, Corsair Cove, SpeedRunners 2: King of Speed, and Mistfall Hunter.
  • Recent Achievements

    • One Year In
      Console General earned a badge
      One Year In
    • One Year In
      Twozo Technologies earned a badge
      One Year In
    • One Month Later
      Twozo Technologies earned a badge
      One Month Later
    • Week One Done
      Twozo Technologies earned a badge
      Week One Done
    • Veteran
      branfont went up a rank
      Veteran
  • Popular Contributors

    1. 1
      +primortal
      522
    2. 2
      +Edouard
      201
    3. 3
      PsYcHoKiLLa
      111
    4. 4
      Steven P.
      89
    5. 5
      Nick H.
      71
  • Tell a friend

    Love Neowin? Tell a friend!