csshtmlplaceholderhtml-input

Change an HTML input's placeholder color with CSS


Chrome v4 supports the placeholder attribute on input[type=text] elements (others probably do too).

However, the following CSS doesn't do anything to the placeholder's value:

input[placeholder], [placeholder], *[placeholder] {
    color: red !important;
}
<input type="text" placeholder="Value">

Value will still remain grey instead of red.

Is there a way to change the color of the placeholder text?


Solution

  • From April 2017: most modern browsers now support the simple pseudo-element ::placeholder [Ref]

    Implementation

    There are three different implementations: pseudo-elements, pseudo-classes, and nothing.

    Internet Explorer 9 and lower does not support the placeholder attribute at all, while Opera 12 and lower do not support any CSS selector for placeholders.

    The discussion about the best implementation is still going on. Note the pseudo-elements act like real elements in the Shadow DOM. A padding on an input will not get the same background color as the pseudo-element.

    CSS selectors

    User agents are required to ignore a rule with an unknown selector. See Selectors Level 3:

    a group of selectors containing an invalid selector is invalid.

    So we need separate rules for each browser. Otherwise the whole group would be ignored by all browsers.

    ::-webkit-input-placeholder { /* WebKit, Blink, Edge */
        color:    #909;
    }
    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */
       color:    #909;
       opacity:  1;
    }
    ::-moz-placeholder { /* Mozilla Firefox 19+ */
       color:    #909;
       opacity:  1;
    }
    :-ms-input-placeholder { /* Internet Explorer 10-11 */
       color:    #909;
    }
    ::-ms-input-placeholder { /* Microsoft Edge */
       color:    #909;
    }
    
    ::placeholder { /* Most modern browsers support this now. */
       color:    #909;
    }
    <input placeholder="Stack Snippets are awesome!">

    Usage notes

        [type="search"] {
            -moz-appearance:    textfield;
            -webkit-appearance: textfield;
            appearance: textfield;
        }