Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Anyway to have a label respond to :focus CSS

Tags:

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

like image 840
RIK Avatar asked May 12 '11 12:05

RIK


People also ask

Can a label have focus?

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.

Can I set focus with CSS?

No, there isn't. In normal circumstances, a div can't receive the focus at all, and CSS lacks anything to set the focus.

Can a div have focus CSS?

The <div> does not accept input, so it cannot have :focus .


2 Answers

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 
like image 152
BoltClock Avatar answered Nov 10 '22 19:11

BoltClock


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.

like image 34
milehighsi Avatar answered Nov 10 '22 19:11

milehighsi