How to separate styles in a nested list styling?
Asked Answered
R

4

17

I have a list and list also has list in it.
I set styles on parent list but I want different styles for parent and child list but they are mixed somehow I can't separate them.

HTML file:

<ul id="accountNavigation">
  <li><a href="#">Something</a></li>                    
  <li id="userNavigation">
    <img src="https://si0.twimg.com/profile_images/135460415/UAB_dragon_head_normal.png" alt=""/>
    <a href="#">Username</a>
    <div class="showme">
      <ul id="userNavigationSubMenu">
        <li>test</li>
        <li>test</li>
        <li>test</li>
        <li>test</li>
        <li>test</li>
        <li>test</li>
        <li>test</li>

      </ul>
    </div>
  </li>
</ul>

CSS file:

body{background:#ff0000;}
#accountNavigation{ list-style: none;float: right;height: 44px;}
#accountNavigation li{ float: left;color: #fff;height: 44px;}
#accountNavigation li:hover{ background: #ddd;cursor: pointer;}
#accountNavigation li a{ text-decoration: none;color: #fff;line-height: 44px;font-weight: bold;font-size: 13px;height: 44px;padding: 15px 27px 0 14px;outline: none;}
#accountNavigation li img{ position: absolute;top: 12px;left: 10px;width: 22px;height: 22px;}
#userNavigation{position: relative;}
#userNavigation a {padding-left: 38px !important;}

#userNavigation{}
#userNavigation:hover{}
#userNavigation:hover .showme{display: inline;}
.showme
{
  display: none;
  width: 140px;
  height: 200px;
  background: #f5f5f5;
  margin: 0px auto;
  padding: 10px 5px 0px 5px;
  border: 1px solid #ddd;
  border-top: none;
  z-index: 10;
  position: absolute;
  right:0;
  top: auto;

}
#userNavigation ul { list-style: none;}

This is fiddle.

Raze answered 8/10, 2012 at 18:25 Comment(0)
C
31

Simply use the > direct/immediate descendant combinator, and an id to specify which li (or ul) elements you're targeting:

#accountNavigation { /* outer ul element */
}

#accountNavigation > li { /* outer ul element's children li */
}

#accountNavigation > li > ul { /* first 'inner' ul element */
}

#accountNavigation > li > ul > li { /* first 'inner' ul element's li children */
}

You can, of course, be more generic and simply use:

ul { /* targets all ul elements */
    /* general styles */
}
ul li { /* targets all li elements within a ul */
    /* general styles */
}
ul li ul { /* targets all ul elements within an li element, itself within a ul */
    /* overrule general 'outer' styles */
}
ul li ul li { /* targets all li elements within a ul element,
                 within an li element, itself within a ul...and so on */
    /* overrule general 'outer' styles */
}

Using the general approach:

<ul>
    <li>This should be green!</li>
    <li>This is also green...
        <ul>
            <li>But this is not, it's, um...blue!</li>
            <li>And so on...</li>
        </ul></li>
    <li>This is green too, just because.</li>
</ul>

The following CSS should demonstrate its use:

ul li {
    color: green; /* the 'general'/'default' settings */
    margin-left: 10%;
}

ul li ul li {
    color: blue; /* this overrides the 'general' color setting */
                 /* the margin is not overridden however */
}​

JS Fiddle demo.

References:

Creatural answered 8/10, 2012 at 18:29 Comment(2)
What if N number of UL nested ? not just 3 as in example here ? can it more generic ?Fixer
Is there a way to specify that the intermediate lists can be ul or ol, so that a nested ol uses the right style regardless of what kind of lists its ancestors are?Urn
H
9

The solutions given here will work, but too much typing. Due to how selectors work in CSS3, it may be simplified thusly,…

/* list styles */

/* ordered lists */
ol { list-style-type: decimal;}
ol ol { list-style-type: upper-alpha;}
ol ol ol {list-style-type: upper-roman;}
ol ol ol ol {list-style-type: lower-alpha;}
ol ol ol ol ol {list-style-type: lower-roman;}
ol ol ol ol ol ol {list-style-type: lower-greek;}


/* set colours here */
ol li { color: darkblue; }
ol ol li { color: orange; }
ol ol ol li { color: darkgoldenrod; }
ol ol ol ol li { color: green; }
ol ol ol ol ol li { color: blue; }
ol ol ol ol ol ol li  { color: indigo; }



/* unordered lists */
ul { list-style: disc outside ;}
ul ul { list-style: square outside ;}
ul ul ul {list-style: circle outside ;}
ul ul ul ul {list-style: disc outside ;}
ul ul ul ul ul {list-style: square outside ;}
ul ul ul ul ul ul {list-style: circle outside ;}


/* set colours here */
ul li { color: darkblue; }
ul ul li { color: orange; }
ul ul ul li { color: darkgoldenrod; }
ul ul ul ul li { color: green; }
ul ul ul ul ul li { color: blue; }
ul ul ul ul ul ul li { color: indigo; }


Throwing the “li”s between the “ol”s —and vice-versa— are redundant, and may be omitted.

Furthemore, since the list items will inherit the properties of the ordered/unordered list, the second set may be just as easily done with “ul” istead.

/* unordered lists */
ul { 
   list-style-type: circle;
   color: red;
   }
ul ul { 
   list-style-type: disc;
   color: orange;
   }
ul ul ul {
   list-style-type: square;
   color: darkgoldenrod;
   }

This is a generic answer, (since the question is very old, and I surmise that the specific use case has been settled).

ERRATUM: Made an error, regarding the colour values. Corrected.

Helgeson answered 29/10, 2019 at 22:1 Comment(0)
U
5

Have you tried CSS child-selectors?

ul { /* parent list styles here */ }
ul > li > ul { /* child list styles here */ }
Unapproachable answered 8/10, 2012 at 18:29 Comment(0)
K
0

Use the ul li ul li {...} Or

ul li ul {....} to give different style to child list. if you are looking for navigation menu with child menu.

Here is really nice example of same.

It uses CSS3.

Karleenkarlen answered 8/10, 2012 at 19:15 Comment(1)
According to SE policy, an answer should not be a link to another answer; it should be self-contained. Links you provide should be considered sources, not your answer in and of itself. Incorporate the answer you have linked to, and hopefully you will see your answer upvoted.Indra

© 2022 - 2024 — McMap. All rights reserved.