Is there any way to have a label respond to focus. I have some code where the textfield has a different style on focus. The label also however needs a slightly different style. I tried this but it did not effect the label.
#header .search label { background:url(http://www.golfbrowser.com/images/icons/search.png) left top no-repeat; padding-left:20px; height:20px; float:right; } #header .search label:focus { background:url(http://www.golfbrowser.com/images/icons/search-z.png) left top no-repeat; padding-left:20px; height:20px; float:right; } #header .search input { padding:0px; border:0px; width:140px; height:20px; float:left; padding-right:10px; background:url(http://www.golfbrowser.com/images/icons/searchbar.png) right top no-repeat; } #header .search input:focus { padding:0px; width:190px; height:20px; float:left; padding-right:10px; background:url(http://www.golfbrowser.com/images/icons/searchbar-z.png) right top no-repeat; }
The label contains an image and the other part of a round corner and it too must change colour in order for the field to look correct.
Any ideas,
Marvellous
The label cannot have :focus since it cannot receive user input. Only elements with which the user can interact (links, input fields, buttons) can have focus.
No, there isn't. In normal circumstances, a div can't receive the focus at all, and CSS lacks anything to set the focus.
The <div> does not accept input, so it cannot have :focus .
You can't actually give focus to a label. It's not a focusable form element. Besides, even if you could do that, then whatever previously had focus (that means your input) would lose it to the label anyway.
You may have to restructure your HTML (and modify your CSS accordingly) so that you can select input:focus
and then that input's corresponding label. For instance, if you moved your label after your input and used the following CSS selector for your label, you should be able to accomplish what you want.
#header .search input:focus + label
BoltClock's answer is the more semantic, lightweight way of achieving this functionality. However it's not always possible to have a specific HTML structure (especially to facilitate a minor feature like this) and CSS lacks the ability to traverse up the HTML hierarchy. To get around that, here are two alternatives. The first is coming soon (CSS spec 4) and the second is our old mate Javascript.
First up, CSS4's :focus-within
pseudo selector. This does exactly what it says on the tin (scopes based on any child element's active focus state). Read more about the spec here. So assuming you have a HTML structure of:
<div class="input-wrapper"> <label for="elem">Label Text <input name="elem" id="elem" type="text" /> </label> </div>
you could scope the 'focussed' label by simply:
label:focus-within{}
by the same token, you could also scope the parent div with:
div.input-wrapper:focus-within{}
Magical. But not for use today :(
Second up, if you're already using a JS selector engine (i.e. jQuery, Sizzle, etc.), you could also do something along the lines of:
$('input').on("focus", function(){ var input = $(this); // assuming label is the parent, i.e. <label><input /></label> var label = $(this).parent(); label.addClass('focussed'); input.on("blur", function(){ label.removeClass('focussed'); input.off("blur"); }); });
This is untested but the essence of what this achieves is using a class rather than the :focus
pseudo selector. So you can add your focussed styles to label.focussed{}
. I've added (and self-removed) the blur handler to facilitate removing the class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With