Search code examples
htmlcssclassidentifier

Changing HTML id to class messes up CSS styling


I am wanting to change some items that I have labeled using ids to one single class so that in my CSS I can refer to them with .sortsubmenu rather than #sortsongmenu, #sortartistmenu, etc.

The problem is that when I change one of them from an id to a class, it messes up the formatting. In the picture below, everything about the songsubmenu and artistsubmenu are exactly the same, only songsubmenu is identified using an id and artistsubmenu is identified using a class.

enter image description here

#topbar {
	background-color: #222;
}

#topbar_wrapper {
	width: 100%;
	margin: 0 auto;
	text-align: left;
}

#mainmenu {
	list-style-type: none;
	padding: 0px;
	margin: 0px;
	position: relative;
	min-width: 200px;
}

#mainmenu li {
	display: inline-block;
	width: 200px;
}

#mainmenu li:hover {
	background-color: #333;
}

#mainmenu li a {
	color: #CCC;
	display: block;
	padding: 15px;
	text-decoration: none;
}

#mainmenu li:hover > ul {
	display: block;
}

#sortmenu {
	display: none;
	position: absolute;
	background-color: #333;
	border: 5px solid #222;
	border-top: 0;
	margin-left: -5px;
}

#sortmenu > li {
	display: block;
	position: relative;
}

#sortmenu li a:hover {
	color: #699;
}

#sortmenu li:hover ul {
	display: inline-block;
}

#sortsongmenu, .sortsubmenu {
	display: none;
	position: absolute;
	background-color: #333;
	border: 5px solid #222;
	border-left: 0px;
	text-align: right;
	top: 0;
	left: 100%;
	width: 100px;
}

#sortsongmenu li, .sortsubmenu li {
	display: inline;
}

#sortsongmenu li a:hover, .sortsubmenu li a:hover {
	color: #DB7093;
}
<div id="topbar">
  <div id="topbar_wrapper">
    <ul id="mainmenu">
      <li><a href="#">Home</a>
      </li>
      <li>
        <a href="#">Search</a>
      </li>
      <li>
        <a href="#">Sort By &#9660</a>
        <ul id="sortmenu">
          <li><a href='#'>Song</a>
            <ul id="sortsongmenu">
              <li><a href='#'>A to Z</a>
              </li>
              <li>
                <a href='#'>Z to A</a>
              </li>
            </ul>
          </li>
          <li>
            <a href='#'>Artist</a>
            <ul class="sortsubmenu">
              <li><a href='#'>A to Z</a>
              </li>
              <li>
                <a href='#'>Z to A</a>
              </li>
            </ul>
          </li>
          <li>
            <a href='#'>Album</a>
          </li>
          <li>
            <a href='#'>Genre</a>
          </li>
          <li>
            <a href='#'>BPM</a>
          </li>
          <li>
            <a href='#'>Release Date</a>
          </li>
        </ul>
      </li>
      <li>
        <a href="#">Add Song</a>
      </li>
      <li>
        <a href="#">Contact Us</a>
      </li>
    </ul>
  </div>
</div>


Solution

  • The #mainmenu li rule is getting in your way. It's not overridden by the class-based selector, as it was by the id-based selector.

    Keep that positioning / size to the immediate descendants only, that is, change:

    #mainmenu li {
    

    to

    #mainmenu > li {
    

    and all is well.

    #topbar {
    
      background-color: #222;
    
    }
    
    #topbar_wrapper {
    
      width: 100%;
    
      margin: 0 auto;
    
      text-align: left;
    
    }
    
    #mainmenu {
    
      list-style-type: none;
    
      padding: 0px;
    
      margin: 0px;
    
      position: relative;
    
      min-width: 200px;
    
    }
    
    #mainmenu > li {
    
      display: inline-block;
    
      width: 200px;
    
    }
    
    #mainmenu li:hover {
    
      background-color: #333;
    
    }
    
    #mainmenu li a {
    
      color: #CCC;
    
      display: block;
    
      padding: 15px;
    
      text-decoration: none;
    
    }
    
    #mainmenu li:hover > ul {
    
      display: block;
    
    }
    
    #sortmenu {
    
      display: none;
    
      position: absolute;
    
      background-color: #333;
    
      border: 5px solid #222;
    
      border-top: 0;
    
      margin-left: -5px;
    
    }
    
    #sortmenu > li {
    
      display: block;
    
      position: relative;
    
    }
    
    #sortmenu li a:hover {
    
      color: #699;
    
    }
    
    #sortmenu li:hover ul {
    
      display: inline-block;
    
    }
    
    #sortsongmenu,
    
    .sortsubmenu {
    
      display: none;
    
      position: absolute;
    
      background-color: #333;
    
      border: 5px solid #222;
    
      border-left: 0px;
    
      text-align: right;
    
      top: 0;
    
      left: 100%;
    
      width: 100px;
    
    }
    
    #sortsongmenu li,
    
    .sortsubmenu li {
    
      display: inline;
    
    }
    
    #sortsongmenu li a:hover,
    
    .sortsubmenu li a:hover {
    
      color: #DB7093;
    
    }
    <div id="topbar">
      <div id="topbar_wrapper">
        <ul id="mainmenu">
          <li><a href="#">Home</a>
          </li>
          <li>
            <a href="#">Search</a>
          </li>
          <li>
            <a href="#">Sort By &#9660</a>
            <ul id="sortmenu">
              <li><a href='#'>Song</a>
                <ul id="sortsongmenu">
                  <li><a href='#'>A to Z</a>
                  </li>
                  <li>
                    <a href='#'>Z to A</a>
                  </li>
                </ul>
              </li>
              <li>
                <a href='#'>Artist</a>
                <ul class="sortsubmenu">
                  <li><a href='#'>A to Z</a>
                  </li>
                  <li>
                    <a href='#'>Z to A</a>
                  </li>
                </ul>
              </li>
              <li>
                <a href='#'>Album</a>
              </li>
              <li>
                <a href='#'>Genre</a>
              </li>
              <li>
                <a href='#'>BPM</a>
              </li>
              <li>
                <a href='#'>Release Date</a>
              </li>
            </ul>
          </li>
          <li>
            <a href="#">Add Song</a>
          </li>
          <li>
            <a href="#">Contact Us</a>
          </li>
        </ul>
      </div>
    </div>