Using CSS only! Whoop Whoop!

Note: I built this in Flare v11 – but you can build it in v10 as well.

Friends, it’s been too long since I’ve written. Let’s just say that the following got in the way of my posting here:

  • Work
  • Kids
  • Clients
  • Spine surgery
  • Kids
  • Work
  • Life

Anyhoo, I built this cool feature in Flare for a client and thought it would be cool to share with folks. It’s a horizontal menu with a second level of items.

Capture118

The cool part: the HTML is super easy…and the CSS is easy (not super easy, I’ll admit). Especially when you can copy my code and look like a superhero to your colleagues.

Let’s look at the HTML first – and when I say super easy, I’m not kidding:

  <ul class="tablist">
            <li><a href="#">First Item</a>
            </li>
            <li><a href="#">Second Item</a>
            </li>
            <li><a href="#">Third Item</a>
            </li>
            <li><a href="#">Fourth Item</a>
            </li>
            <li><a href="#">Fifth Item</a>
                <ul>
                    <li><a href="Exhibit_A.htm">Exhibit A</a>
                    </li>
                    <li><a href="Exhibit_B.htm">Exhibit B</a>
                    </li>
                    <li><a href="Exhibit_C.htm">Exhibit C</a>
                    </li>
                    <li><a href="Exhibit_D.htm">Exhibit D</a>
                    </li>
                    <li><a href="Exhibit_E.htm">Exhibit E</a>
                    </li>
                    <li><a href="Exhibit_F.htm">Exhibit F</a>
                    </li>
                    <li><a href="Exhibit_G.htm">Exhibit G</a>
                    </li>
                    <li><a href="Exhibit_H.htm">Exhibit H</a>
                    </li>
                </ul>
            </li>
            <li><a href="#">Sixth Item</a>
            </li>
        </ul>

It looks like this in the Flare XML Editor.

Capture102

(Just ignore the eyeball thing for now. I’ll show you what this is and what it does shortly).

The important thing to note is that you’re looking at a nested list…and not just one list interrupted by another.

I’ve pasted the HTML for this list in to a blank topic in a new project so I can build it step-by-step. It looks like this:

Capture103First – before I start dorking around with the CSS, I’m going to create a new <ul> class. I’m calling mine ul.tablist. If you don’t  know why I’m doing this – please contact me. We need to talk.

In the new class, I open the List section and set

ul.tablist{
list-style-type: none;
}

When using the Flare default stylesheet, there was an image assigned to the list-style-image property, so I’m going to turn that off as well.

ul.tablist{
list-style-type: none;
list-style-image: none;
}

Now, one thing you’ll notice in this screenshot is that not all the bullets are gone. Essentially only the top-level bullets are gone, with the secondary-level bullets still remaining.

Capture105The reason for this is: technically, only the top-level <ul> has that class assigned to it. Even though the nested list is inside the <ul>, it doesn’t have the same class assigned….and shouldn’t. I have to remove the bullets from the nested list with a complex selector:

ul.tablist ul
{
    list-style: none;
list-style-image: none; //if necessary//
}

This means that any <ul> inside of the ul.tablist will not have bullets. A quick preview shows my progress.

Capture106Now I need to shift the list from a horizontal position to a vertical one. Keep in mind that I’m not making the LIST itself (meaning the <ul>) horizontal, but rather the items in it (the <li> tags). So I’m going to create another complex selector that looks like this:

.tablist > li
 {
 float: left;
 margin-right: 5px;
 line-height: 13pt;
 }

Now you may have noticed the ‘>’ between the two tags. This means that I only want those <li> tags that are children of <ul.tablist> to move. This is called a child selector.

If I were to remove that, then ALL of the <li> inside of the <ul.tablist>, including those in the nested <ul> would behave this way.  This is a descendant selector. Since I only want the top-level items to be horizontal, I make sure the ‘>’ is there.

The float:left setting will cause each <li> to move to the right of the previous one until there’s no space on the row left. I added margin so the entries wouldn’t bump up against each other and line height to give the entry a particular height.

Let’s see what we have now.

Capture108Not much has changed in the XML Editor view except that maybe the entries are scrunched up. But let’s see what a preview looks like.

Capture107And it’s horizontal! Ugly – but horizontal. The next issue is to hide that secondary list until some action is taken, in this case hovering over the <li>.

ul.tablist ul
{
    display: none;
    list-style: none;
}

That line of CSS code means that any nested lists inside a <ul> with the class of ‘tablist’ will be hidden. All others will continue to be visible.

And here’s what I’m seeing now in the XML Editor. The eyeball icon with the red x means that something is technically not visible when compiled…but remains visible for you to continue working on it.

Capture109And via Preview:

Capture111I’m getting closer!

Now to get the hover behavior to work. Normally, I would have to use JavaScript to get the hover behavior to work – but let’s just say that JavaScript and I, we’re not close. But clearly the folks behind CSS3 knew that there were people out there like me who couldn’t really work with JavaScript…so they developed some pseudo classes, one of which is hover.

Let’s talk about that a bit more by way of a visual.

ul.tablist li:hover ul{}

What the heck, you say. What is that? Let’s examine each item in the selector.

Earlier in this post, I set the nested <ul> to not appear at all. So I have to change that…but I only want it to appear when I hover over a particular <li> in that <ul>. So….that line of CSS code says:

“When in the <ul> with the class of ‘tablist,’ make the nested <ul> appear only when I hover over the <li> that contains that nested <ul>.” So, I have to make the <ul> appear.

ul.tablist li:hover ul
{
    display: block;
}

In that chunk of code, the :hover is the pseudo class. There are other pseudo classes like :after, :before, etc.

This means that when I hover over an <li> item with a nested list in it, make the list appear. Here’s the result via the Preview:

Capture112Oooh, it works! So happy! However….(isn’t there always a ‘however’)…I don’t want the sixth bullet in the list to move to the right to accommodate the now-appearing list. To do this, I have to set the positioning for that nested list AND the top-level list. I’ll do that through absolute positioning and here’s how.

Before I can absolutely position the nested list – I have to position it relative to something else. In this instance I’m going to set the relative position on the parent <ul>. Work with me on this – the container item is positioned relatively like so:

ul.tablist{
list-style-type: none;
list-style-image: none;
position: relative;
}

Then, I position the nested list. I remember it this way – the containing tag must be relatively positioned before the other tag can be positioned absolutely.

ul.tablist li:hover ul
{
    display: block;
    position: absolute;
}

Think of absolute positioning as part of a pair, like Sith lords. There are always two. So if there’s a need to position a particular tag absolutely, there must be another tag that is postitioned relatively.

Let’s see what the results are via the Preview window:

Capture113Niiiiiiice…..I’ve prevented that last bulleted item from moving and now I want to do some beautifying. I want to move the nested list down and way from the horizontal list and put a border with rounded edges around it. First step – borders:

ul.tablist li:hover ul
{
    display: block;
    position: absolute;
    border: 1px solid blue;
    border-radius: 10px;
    padding: 5px; 
}

In Preview, I get this:

Capture114Hmmmm…while I like the border, I don’t think I have enough padding inside the border (changing it to 10px instead of 5px) and I’m really disliking the underlining on each Exhibit. To remove the underlining, you don’t change the style of the <li> but rather the <a> inside it, like this:

.tablist ul li a
{
    display: block;
    padding: 3px 10px 3px 10px;
    text-decoration: none;
}

Notice the ‘ul’ after the .tablist. This narrows the change to just the nested list. If I had wanted to remove the underlining from ALL the <li> tags, I could remove that <ul>. It would result in this:

Capture115

Don’t get me wrong, I like this a lot…but folks like to see underlining when there’s a link….and without it, readers may not know that those items are linked. So, I’ll leave the underlining on the top-level list.

Capture116

Now for the positioning. I’m going to approach this the easiest way possible: top margin.

ul.tablist li:hover ul
{
    display: block;
    position: absolute;
    border: 1px solid blue;
    border-radius: 10px;
    padding: 10px;
    margin-top:7px;    
}

It’s a subtle difference, but a good one.

Capture118Hopefully this has been helpful. If I covered anything that you need further clarification on, please don’t hesitate to post a comment.

Friends, it’s been a long time since we’ve talked. I’m sorry.

It’s that pesky thing called Life. I have two teenagers, a new job, and, well, just stuff that gets in the way of writing here.

But I have something to show you.

I’m working on a project that has a rather large TOC and it’s unorganized (only because of the nature of the import acrobatics that was required).

Screenshot_012415_100006_AM

The issue is with the prefix on each and every topic title. That prefix has to go…and I’m not really too keen on clicking on each entry and removing ‘Server Backup: ‘.

Instead, I need to do a search and replace. Unfortunately, on first glance, search and replace doesn’t work on a TOC file.

But then again, it does!

I right-click on the TOC file in Project > TOCs and select Open With… > Internal Text Editor. I see this (sorry for the blurring – it has to be done).

Screenshot_012415_101527_AM

Yes, it’s intimidating…and scary….but it’s now completely workable with a search and replace!

Here’s my search criteria.

Screenshot_012415_101656_AM

Essentially, I want to find every instance of “Server Backup : ” and remove it. To narrow the search and only find the instance of that string in the title tag, I make sure to select the Title=” part as well. I want to replace it with just  ‘Title=”‘

In the Find in: field, I only want to look through the open file – so I select (current document).

Selecting Find in Source Code is a good practice as well.

Now, you may choose to do this differently, but I prefer to be cautious when it comes to replacing code. Needless to say, I’m not going to click on Replace All. Instead I select Find Next.

You can see what it has selected. This is good.

Screenshot_012415_102228_AM

I click on Replace and get this result:

Screenshot_012415_102535_AM

The prefix I wanted gone….is gone!

So I repeat this process for each entry. Again, I’ve been burned using “Replace All” so I prefer not to use that method. But if you like to live dangerously, go for it.

My resulting TOC when I switch back to the TOC Editor looks like this:

Screenshot_012415_102914_AM

The prefix is gone and I’ve saved a ton of time!

I hope this helps!

Page 2 of 6112345102030...Last →