views:

1337

answers:

7

Sorry if this sounds like a really stupid question, but I need to make a link change color when you are on the page it links to.

For example, when you are on the "Questions" page of stackoverflow, the link at the top changes color. How do you do this?

+4  A: 

It's a server-side thing -- when rendering the page, add a class like "current-page" to the link. Then you can style it separately from the other links.

For example, StackOverflow renders the links with class="youarehere" when it points to the page you're already on.

John Millikin
+1  A: 

Set a class on the body tag for each page (manually or server-side). Then in your CSS use that class to identify which page you're on and update the style on the item accordingly.

body.questions #questionsTab
{
    color: #f00;
}

Here's a good longer explanation

John Sheehan
A: 

You need code on the server for this. A simplistic approach is to compare the URL of the current page to the URL in the link; however consider that there are many different URLs in stackoverflow which all result in the 'Questions' tab being highlighted.

A more sophisticated version can either put something in the session when you change pages (not too robust); store a list of pages/URL patterns which are relevant to each menu item; or within the code of the page itself, set a variable to determine which item to highlight.

Then, as John Millikin suggests, put a class on the link or on one of its parent elements such as "current-page" which will control the colour of it.

Leigh Caldwell
+4  A: 

It really depends on how your page is constructed. Typically, I would do this using CSS, and assign give the link an id called "active"...

<a id="active" href="thisPage.html">this page</a>

...and in the CSS...

a#active { color: yellow; }

Obviously this is a fairly simplistic example, but it illustrates the general idea.

steve_c
This is really what a class should be used for, not an ID
John Sheehan
Sorry, John, but I beg to differ here. Since it's a navigation link that was referred to in the question, and it's only going to appear once on the page, an ID is more appropriate. If it was going to appear more than once on the page, a class would be more appropriate.
steve_c
And if you had a non-active class too? I'd rather use a class and keep it all in the same type, but either works fine.
Matthew Scharley
Why would you have a non-active class? The non-active state would be the anchor element with its default style.
steve_c
I would use a class here. What if you decide to have the navigation repeated at the bottom of the page or something like that?
mrinject
I've never encountered an instance in an app where the main navigation was repeated at the bottom. I would consider this differently if the application mandated a repeatable nav. This question referred to stackoverflow's nav as an example. That's what I commented on.
steve_c
+2  A: 

You can do this without having to actually modify the links themselves for each page.

In the Stack Overflow clone I'm building with Django, I'm doing this:

<!-- base.html -->
...
<body class="{% block bodyclass %}{% endblock %}">
...
<div id="nav">
  <ul>
    <li id="nav-questions"><a href="{% url questions %}">Questions</a></li>
    <li id="nav-tags"><a href="{% url tags %}">Tags</a></li>
    <li id="nav-users"><a href="{% url users %}">Users</a></li>
    <li id="nav-badges"><a href="{% url badges %}">Badges</a></li>
    <li id="nav-ask-question"><a href="{% url ask_question %}">Ask Question</a></li>
  </ul>
</div>

Then filling in the bodyclass like so in page templates:

<!-- questions.html -->
{% extends "base.html" %}
{% block bodyclass %}questions{% endblock %}
...

Then, with the following CSS, the appropriate link is highlighted for each page:

body.questions #nav-questions a,
body.tags #nav-tags a,
body.users #nav-users a,
body.badges #nav-badges a,
body.ask-question #nav-ask-question a { background-color: #f90; }
insin
Just curious, why are you building a clone?
eyelidlessness
As the starting point for http://stackoverflow.com/questions/172516/
insin
A: 

Server side code is the easiest, by just setting a class on the link on the current page, but this is also possible on the client-side with JavaScript, setting a second class on all elements in a particular class which have an href which matches the current page.

You could use either document.getElementsByTagName() or document.links[] and look only for those in a class denoting your navigation links and then set a second class denoting current if it matches the current URL.

The URLs will be relative, while document.URL will not. But you can sometimes have this same problem with relative vs. absolute on the server-side if you are generating content from a table-driven design and the users can put either absolute or relative URLs anyway.

Cade Roux
+1  A: 

If for some reason you don't want to handle this on the server-side, you can try this:

// assuming this JS function is called when page loads
onload()
{
  if (location.href.indexOf('/questions') > 0)
  {
    document.getElementById('questionsLink').className = 'questionsStyleOn';
  }
}
Kon