views:

1261

answers:

5

I'm working on a login page for my website and I want to bold the label that comes before the input box when the text box gains focus. Right now I have the following markup:

<label for="username">Username:</label>
<input type="textbox" id="username" />

<label for="password">Password:</label>
<input type="textbox" id="password" />

I can use the adjacent selector to select the label after the text box, but I can't select the element before it. I can use this CSS selector rule, but it only selects the label after, so when the username text box gains focus, the password label becomes bold.

input:focus + label {font-weight: bold}

Is there anything I can do to make this work? I know JavaScript could be used to easily do this, but I'd like to use a purely CSS-based solution if possible, I just can't figure out a way to do it.

A: 

There's no selector that will give you the previous element using CSS..

You will need to use javascript to handle what you're after.

JayTee
A: 

Use this selector:

label[for=username]
{
font-weight: bold
}

this will select the label that has the value 'username' in the attribute 'for'

Marwan Aouida
Will this select the label when the text box has focus though?
Dan Herbert
no, this will only select the element
Marwan Aouida
I think the question was: will label become bold when input has focus?
mouviciel
Oops! thanks mouviciel. I've removed my comment just in case.
sanchothefat
+4  A: 

It would be possible to use the 'adjacent sibling selector' if the input was before the label. Just put the input before the label, and then modify the layout to put label before the input. Here's an example:

<head runat="server">
    <title></title>
    <style type="text/css">
    input:focus + label {font-weight: bold}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div style="direction:rtl">
        <input type="text" id="username" />
        <label for="username">Username:</label>
    </div>
    <div style="direction:rtl">
        <input type="password" id="password" />
        <label for="password">Password:</label>
    </div>
    </form>
</body>

(It's kind of a hack, I would personally use javascript to do this)

Matt Brunell
This is still good accessibility wise. They can be in any order but always always always use the 'for' and 'id' attributes.
sanchothefat
How portable is the input:focus? which browsers don't like it?
tyndall
input:focus does not work in IE7 (I just checked.) It works in firefox. Not sure about other browsers.
Matt Brunell
Unfortunately, the above code does not work in Safari 3.2.1. I didn't take the time to understand what is wrong. Firefox, as already noted is just fine.
mouviciel
+1  A: 

Floating the input element to the right, achieves correct element order without changing order of "Username" and ":" in the label text that you get with direction:rtl.

<style type="text/css">
    form {text-align: right;}
    input:focus + label {font-weight: bold}
    input {float:right; clear:right;}
</style>
<form>
    <div>
        <input type="text" id="username" />
        <label for="username">Username:</label>
    </div>
    <div>
        <input type="password" id="password" />
        <label for="password">Password:</label>
    </div>
</form>
Ole J. Helgesen
In my opinion, this is a better solution than changing text direction. For a better alignment, I would add: div {overflow: auto;} in the stylesheet.
mouviciel