Change an HTML5 input's placeholder color with CSS

后端 未结 30 3173
猫巷女王i
猫巷女王i 2020-11-21 04:36

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

But the following CSS doesn\'t do anything

相关标签:
30条回答
  • 2020-11-21 04:51

    Implementation

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

    • WebKit, Blink (Safari, Google Chrome, Opera 15+) and Microsoft Edge are using a pseudo-element: ::-webkit-input-placeholder. [Ref]
    • Mozilla Firefox 4 to 18 is using a pseudo-class: :-moz-placeholder (one colon). [Ref]
    • Mozilla Firefox 19+ is using a pseudo-element: ::-moz-placeholder, but the old selector will still work for a while. [Ref]
    • Internet Explorer 10 and 11 are using a pseudo-class: :-ms-input-placeholder. [Ref]
    • April 2017: Most modern browsers support the simple pseudo-element ::placeholder [Ref]

    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

    • Be careful to avoid bad contrasts. Firefox's placeholder appears to be defaulting with a reduced opacity, so needs to use opacity: 1 here.
    • Note that placeholder text is just cut off if it doesn’t fit – size your input elements in em and test them with big minimum font size settings. Don’t forget translations: some languages need more room for the same word.
    • Browsers with HTML support for placeholder but without CSS support for that (like Opera) should be tested too.
    • Some browsers use additional default CSS for some input types (email, search). These might affect the rendering in unexpected ways. Use the properties -webkit-appearance and -moz-appearance to change that. Example:
        [type="search"] {
            -moz-appearance:    textfield;
            -webkit-appearance: textfield;
            appearance: textfield;
        }
    
    0 讨论(0)
  • 2020-11-21 04:52

    This will work fine. DEMO HERE:

    input::-webkit-input-placeholder,
    textarea::-webkit-input-placeholder {
      color: #666;
    }
    input:-moz-placeholder,
    textarea:-moz-placeholder {
      color: #666;
    }
    input::-moz-placeholder,
    textarea::-moz-placeholder {
      color: #666;
    }
    input:-ms-input-placeholder,
    textarea:-ms-input-placeholder {
      color: #666;
    }
    <input type="text" placeholder="Value" />

    0 讨论(0)
  • 2020-11-21 04:52

    try this code for different input element different style

    your css selector::-webkit-input-placeholder { /*for webkit */
        color:#909090;
        opacity:1;
    }
     your css selector:-moz-placeholder { /*for mozilla */
        color:#909090;
        opacity:1;
    }
     your css selector:-ms-input-placeholder { /*for for internet exprolar */ 
       color:#909090;
       opacity:1;
    }
    

    example 1:

    input[type="text"]::-webkit-input-placeholder { /*for webkit */
        color: red;
        opacity:1;
    }
     input[type="text"]:-moz-placeholder { /*for mozilla */
        color: red;
        opacity:1;
    }
     input[type="text"]:-ms-input-placeholder { /*for for internet exprolar */ 
       color: red;
       opacity:1;
    }
    

    example 2:

    input[type="email"]::-webkit-input-placeholder { /*for webkit */
        color: gray;
        opacity:1;
    }
     input[type="email"]:-moz-placeholder { /*for mozilla */
        color: gray;
        opacity:1;
    }
     input[type="email"]:-ms-input-placeholder { /*for for internet exprolar */ 
       color: gray;
       }
    
    0 讨论(0)
  • 2020-11-21 04:53

    /* do not group these rules */
    *::-webkit-input-placeholder {
        color: red;
    }
    *:-moz-placeholder {
        /* FF 4-18 */
        color: red;
        opacity: 1;
    }
    *::-moz-placeholder {
        /* FF 19+ */
        color: red;
        opacity: 1;
    }
    *:-ms-input-placeholder {
        /* IE 10+ */
        color: red;
    }
    *::-ms-input-placeholder {
        /* Microsoft Edge */
        color: red;
    }
    *::placeholder {
        /* modern browser */
        color: red;
    }
    <input placeholder="hello"/> <br />
    <textarea placeholder="hello"></textarea>

    This will style all input and textarea placeholders.

    Important Note: Do not group these rules. Instead, make a separate rule for every selector (one invalid selector in a group makes the whole group invalid).

    0 讨论(0)
  • 2020-11-21 04:53

    I don't remember where I've found this code snippet on the Internet (it wasn't written by me, don't remember where I've found it, nor who wrote it).

    $('[placeholder]').focus(function() {
            var input = $(this);
            if (input.val() == input.attr('placeholder')) {
                input.val('');
                input.removeClass('placeholder');
            }
        }).blur(function() {
            var input = $(this);
            if (input.val() == '' || input.val() == input.attr('placeholder')) {
                input.addClass('placeholder');
                input.val(input.attr('placeholder'));
            }
        }).blur();
        $('[placeholder]').parents('form').submit(function() {
            $(this).find('[placeholder]').each(function() {
                var input = $(this);
                if (input.val() == input.attr('placeholder')) {
                    input.val('');
                }
            })
        });
    

    Just load this JavaScript code and then edit your placeholder with CSS by calling this rule:

    form .placeholder {
       color: #222;
       font-size: 25px;
       /* etc. */
    }
    
    0 讨论(0)
  • 2020-11-21 04:55

    In Firefox and Internet Explorer, the normal input text color overrides the color property of placeholders. So, we need to

    ::-webkit-input-placeholder { 
        color: red; text-overflow: ellipsis; 
    }
    :-moz-placeholder { 
        color: #acacac !important; text-overflow: ellipsis; 
    }
    ::-moz-placeholder { 
        color: #acacac !important; text-overflow: ellipsis; 
    } /* For the future */
    :-ms-input-placeholder { 
        color: #acacac !important; text-overflow: ellipsis; 
    }
    
    0 讨论(0)
提交回复
热议问题