O'Reilly

HTML5 Placeholder Styling with CSS

By on  

4/25/2011: This attribute is not styleable as of Opera 11. Internet Explorer 10 will introduce placeholder support.

Last week I showed you how you could style selected text with CSS. I've searched for more interesting CSS style properties and found another: INPUT placeholder styling. Let me show you how to style placeholder text within INPUTelements with some unique CSS code.

The CSS

Firefox employs a different pattern than Safari and Chrome. Each property name is self-explanatory though:

/* all */
::-webkit-input-placeholder { color:#f00; }
::-moz-placeholder { color:#f00; } /* firefox 19+ */
:-ms-input-placeholder { color:#f00; } /* ie */
input:-moz-placeholder { color:#f00; }

/* individual: webkit */
#field2::-webkit-input-placeholder { color:#00f; }
#field3::-webkit-input-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4::-webkit-input-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }

/* individual: mozilla */
#field2::-moz-placeholder { color:#00f; }
#field3::-moz-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4::-moz-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }

You will only want to employ the most basic of styles to the placeholder. Color, font-style, and font-variant are probably the styles you will want to employ. Go too far with your placeholder styling and you may create the animated GIF of input styles. Note that Mozilla Firefox doesn't support placeholder styling until version 4.

Styling elements with the placeholder attribute is something you don't need to do but could be just another one of those small details that sets your website apart from other websites. Hopefully IE9 and Opera soon follow suit in allowing styling of placeholder text within INPUT elements...or expose their API for doing so!

O'Reilly Velocity Conference
Save 20% with discount code AFF20

Recent Features

  • I’m an Impostor

    This is the hardest thing I've ever had to write, much less admit to myself.  I've written resignation letters from jobs I've loved, I've ended relationships, I've failed at a host of tasks, and let myself down in my life.  All of those feelings were very...

  • 9 Mind-Blowing Canvas Demos

    The <canvas> element has been a revelation for the visual experts among our ranks.  Canvas provides the means for incredible and efficient animations with the added bonus of no Flash; these developers can flash their awesome JavaScript skills instead.  Here are nine unbelievable canvas demos that...

Incredible Demos

  • MooTools TextOverlap Plugin

    Developers everywhere seem to be looking for different ways to make use of JavaScript libraries. Some creations are extremely practical, others aren't. This one may be more on the "aren't" side but used correctly, my TextOverlap plugin could add another interesting design element...

  • PHP Woot Checker &#8211; Tech, Wine, and Shirt Woot

    If you haven't heard of Woot.com, you've been living under a rock. For those who have been under the proverbial rock, here's the plot: Every day, Woot sells one product. Once the item is sold out, no more items are available for purchase. You don't know how many...

Discussion

  1. PowerTools! has a fallback for older browsers if you want to use the placeholder property: http://cpojer.net/PowerTools

  2. Not to be all “me too” in a blog comment, but I’d also suggest checking out this Formalize CSS/JS demo I put together…

    http://host.sonspring.com/formalize/

  3. If your has a different line-height (let’s say 20px with a 12px font-size), the actual value will display correctly in Googel Chrome (10.0.612.3 dev), but the placeholder won’t. Apparently (?) the line-height isn’t used for the placeholder (?). In Firefox (4b7) this works just fine.

  4. this is awesome
    hope you can give me hints

    thanks

  5. king jeremiah

    Something about this page is working my laptop harder than flash!

  6. David, thanks for your tutorial, but you’ve mad a slight error with your mozilla code in your demo; the individual styles for mozilla must have only one colon, not two, like so:

    #field2:-moz-placeholder {}
    

    Also not all the values you specify work in Chrome, specifically background, text-transform or text-decoration.

    Do you know if these are deliberately unsupported by Chrome?

  7. ^ I meant *unsupported* of course…

  8. David:

    Following up on John Catterfeld’s comment: the general declaration for Mozilla correctly using a single colon, but the field-by-field selectors use a double-colon and are ignored: I see all red placeholders in FireFox4.

  9. Brilliant… just what I was looking for. Thanks!

  10. gen

    code is here:

    Enter the username

  11. Great information. I’m wondering where you got the information that IE10 would not support placeholder at all. Can you confirm this and cite a source? Thanks in advance

  12. For Firefox 7 you will want to drop the double colon and just use a single colon after input.

    Like this:

    #field2:-moz-placeholder { color:#00f; }
    #field3:-moz-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
    #field4:-moz-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }
    
  13. ::-webkit-input-placeholder 	{ text-align: center; }
    

    align center doesn’t seem to have an effect on OSX Webkit, but works great on Windows Webkit… thoughts?

  14. Matt Willett

    Seems that bundling webkit and moz properties like…

    .item::-webkit-input-placeholder, .item:-moz-placeholder { color: #333333; }

    …does not work. They have to be called individually, I wonder why that is?

    • Hi Matt, you cannot comma separate the selectors because once a browser finds a selector that it doesn’t understand it ignores the whole block of selectors.

  15. The variation in colon syntax is because webkit and mozilla have different ideas about what the placeholder text actually is.

    Mozilla considers it to be merely a different interactive state, so it defines a pseudo-class that address that difference; hence the single-colon syntax.

    Webkit consider it to be a separate pseudo-element, so it defines a pseudo-element to address a different piece of text; hence the double-colon syntax. So you can tweak the positional difference between the placeholder text and value simply by tweaking the padding or line-height using that pseudo-element selector:

    input[type="text"]
    {
        padding:4px;
    }
    
    input[type="text"]::-webkit-input-placeholder  
    {
        padding-top:5px;
    }

    Or whatever.

  16. Brunis

    @Brothercake, I don’t think Matt was confused about the colons, but the fact that you can’t comma seperate the selectors into one rule.

  17. Nathan

    Public test: http://newilk.com/testing/Placeholder_styling

    As of IE10 preview, Internet Explorer is the only browser which supports all the following attributes (listed here http://blog.ajcw.com/2011/02/styling-the-html5-placeholder/):

    Background color
    Border
    Color
    Font size
    Font style
    Font weight
    Letter spacing
    Line height
    Padding
    Text align
    Text decoration
    Text transform

  18. Sanjib

    Really helpfull… Thanks

  19. Great tip!!!

  20. Nice! Thanks for tricks! Great HTML5! :)

  21. Martijn

    Any word on Opera supporting this?

  22. Andy Lorenz

    what others have said about there being a slight problem with the code on this page are correct.

    The line

    ::-moz-placeholder { color:#f00; } /* firefox 19+ */
    

    should be

    :-moz-placeholder { color:#f00; } /* firefox 19+ */
    

    Took me 5 minutes and a quick test to realise why firefox wasn’t styling correctly…

  23. Thank you. I love you. I’d have never guessed that …

  24. Crispen Smith

    Hey, I’m just discovering placeholder text and it really feels like this is a godsend for clean UI. Knowing it can be styled makes it even better.

    One question; currently clicking on the view demo link seems to load the correct URL, but that URL seems to load the example for the resizer handles blogpost. Was that your intention?

  25. Stefan

    Be careful, in Firefox the placeholder opacity is not 1.
    If you want a 100% black color for placeholder, please write :

    input:-moz-placeholder {
        color:#000;
        opacity: 1;
    }
    
  26. thank you very much for the explanation sir …

  27. Cameron

    Thank you! Worked as described, and saved me some effort.

  28. i want to how to use text-align in placeholder

  29. Rahul Giri

    Dude you are awesome.i really want it badly. because its work in IE7 also. thanks a lot man.

    • Martijn

      @Rahul no it doesn’t ;)

  30. I think the important technical thing to consider is that placeholder pseudos need to be separated and cannot be grouped, for some reason it is causing issue with FireFox:

    Good:

    input::-webkit-input-placeholder {
       color:rgba(0,0,0,0.5);
    }
    
    input::-moz-placeholder {
       color:rgba(0,0,0,0.5);
    }
    

    Bad:

    input::-webkit-input-placeholder,
    input::-moz-placeholder {
       color:rgba(0,0,0,0.5);
    }
    

    Hope this helps.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • Prevent Chrome from Translating a Page

    A while back I shared my favorite Google Chrome extension:  Google Art Project.  I've enjoyed seeing beautiful art when I open a new tab -- it's brought genuine happiness to my day, however small that happiness may be.  About a week ago, however, the art presented had...

  • Create Any Type Of Website With These Multi-Purpose Themes

    We have selected what we believe are the very best multipurpose WordPress themes on the market today. Our list contains a number of best sellers, several newcomers that are proving to be highly popular, and a few themes that are ideal for creating the types of...

  • An Introduction to Static Site Generators

    Static site generators seem to have been becoming more and more popular recently, but they’re not one of those ephemeral novelty things that grow in popularity as quickly as they fall into oblivion shortly after. For over a decade, many different projects — 394 of...

  • Automated Tests for Visual Responsive Layouts

    Today it's all about testing. In 2015, many developers knows about TDD and I personally think that testing is one of the key for quality products. But what about testing in a Front-end environment? How do you guys write your tests for a responsive page or...

  • Getting Dicey With Flexbox

    What if you could build complex CSS layouts in minutes? Flexbox is a new CSS layout spec that makes it easy to construct dynamic layouts. With flexbox, vertical centering, same-height columns, reordering, and direction agnosticism are a piece of cake. There's a popular myth floating around that...