使用CSS更改HTML5输入的占位符颜色


3973

Chrome支持元素上的占位符属性input[type=text](其他可能也支持)。

但是以下CSS内容对占位符的价值没有任何作用:

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

Value仍将保留grey而不是red

有没有办法改变占位符文本的颜色?


375
快速抬头(不是解决方案,只是一个FYI):如果我没记错的话,input [placeholder]只是与具有占位符属性的<input>标记匹配,它与占位符属性本身不匹配。
pinkgothic 2010年

12
是的,这种想法让我望而却步,这就像在尝试设置元素的“ title”属性的样式一样。因此,+ 1可以让所有人都想一想!
David Murdoch'4

5
@MathiasBynens :placeholder-shown伪类与显示此类占位符文本的输入元素匹配。因此,它与<input>标签(如input选择器)相匹配,但仅显示占位符文本。它也与占位符属性本身不匹配。
HEX

3
@HEX与input选择器不同,因为它会选择所有input元素。:placeholder-shown仅选择input当前显示占位符的元素,从而允许您仅设置这些元素的样式,并有效地设置占位符文本的样式。你想说什么
Mathias Bynens '16

1
@HEX(当然,它还会选择textarea显示占位符文本的元素。)
Mathias Bynens

Answers:


4807

实作

有三种不同的实现:伪元素,伪类,什么也没有。

  • WebKit,Blink(Safari,Google Chrome,Opera 15+)和Microsoft Edge使用的是伪元素:::-webkit-input-placeholder[ 参考 ]
  • Mozilla Firefox的4至18是使用伪类::-moz-placeholder一个冒号)。[ 参考 ]
  • Mozilla Firefox 19+使用的是伪元素:::-moz-placeholder,但是旧的选择器仍然可以使用一段时间。[ 参考 ]
  • Internet Explorer 10和11使用伪类::-ms-input-placeholder[ 参考 ]
  • 2017年4月:大多数现代浏览器都支持简单的伪元素::placeholder [ Ref ]

Internet Explorer 9和更低版本完全不支持该placeholder属性,而Opera 12和更低版本则不支持占位符的任何CSS选择器。

关于最佳实现的讨论仍在进行中。请注意,伪元素的行为类似于Shadow DOM中的真实元素。一个paddinginput不会得到相同的背景颜色与伪元素。

CSS选择器

用户代理必须忽略带有未知选择器的规则。参见选择器级别3

包含无效选择器的一选择器无效。

因此,我们需要为每个浏览器使用单独的规则。否则,整个组将被所有浏览器忽略。

::-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!">

使用说明

  • 小心避免对比度差。Firefox的占位符似乎是默认的,具有降低的不透明度,因此需要在opacity: 1此处使用。
  • 请注意,如果占位符文本不合适,则会将其截断-调整输入元素的大小,em并使用较大的最小字体设置对其进行测试。不要忘记翻译:某些语言需要为同一个单词留出更多空间
  • 具有HTML支持placeholder但不具有CSS支持的浏览器(例如Opera)也应进行测试。
  • 某些浏览器对某些input类型(emailsearch)使用其他默认CSS 。这些可能会以意想不到的方式影响渲染。使用属性 -webkit-appearance-moz-appearance进行更改。例:
    [type="search"] {
        -moz-appearance:    textfield;
        -webkit-appearance: textfield;
        appearance: textfield;
    }

27
还要注意,尽管Webkit认为这具有很强的特异性,但Mozilla却没有。您可能必须在其中弹出一些!important才能显示出来。
dmnc 2011年

18
@toscho:感谢您的出色回答。我只需要对它进行“现场”演示,因此您的示例也可以在这里找到:jsfiddle.net/Sk8erPeter/KyVXK。再次感谢。
Sk8erPeter

90
Firefox的占位符似乎是默认的,具有降低的不透明度。对于其他任何需要刷新并想知道为什么这似乎无法正常工作的人(“为什么我的白色文本仍然是灰色..”),请使用opacity:1
jwinn

8
在IE10中*:-ms-input-placeholder:-ms-input-placeholder其本身不起作用,但起作用INPUT:-ms-input-placeholder。奇。
杰瑞德(Jared)2013年

37
关于Bootstrap 3的注意事项:由于CSS的特殊性,“ form-control”类会覆盖颜色(即“ form-control ::-webkit-input-placeholder”),因此您至少需要具有特定的含义或使用“!important”在您的CSS中。(这很难调试,因为Firebug和Devtools都没有显示此伪类)
Costa

724

/* 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>

这将设置所有样式inputtextarea占位符。

重要说明:请勿对这些规则进行分组。而是为每个选择器制定一个单独的规则(组中一个无效的选择器会使整个组无效)。


2
您链接到的MSDN文档指出,它仅在Internet Explorer 10中受支持。仍然是一个不错的发现,但在IE10用户群变得越来越重要之前,它并不是很有用(我们可能会考虑使用几年的时间框架)。
danishgoel 2012年

1
实际上,您将要在整个网站上统一设置占位符的样式,而不是通过ID为每个单独的输入设置样式。
BadHorsie

10
在FF19之后,您必须使用::
moz

1
如果还要在输入上应用一个类,则需要将此CSS放在样式表的底部,以使其在IE(11)上正常工作。参见JSFiddle jsfiddle.net/9kkef上的此fork 。在IE和另一个浏览器中都打开页面,在IE中,您将看到占位符文本为所应用类的颜色。
Timo002

有时,如果不起作用,请将<!important>添加到color属性。
艾哈迈德·纳

277

您可能还想设置textareas的样式:

input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
  color: #636363;
}
input:-moz-placeholder, textarea:-moz-placeholder {
  color: #636363;
}

2
在chrome上打印不起作用...任何帮助@media print {input [type = text] .form-control ::-webkit-input-placeholder,input [type = textarea] .form-control ::-webkit -input-placeholder {color:#FFFFFF; }
Mahdi Alkhatib 2015年

107

对于BootstrapLess用户,有一个mixin .placeholder:

// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
  &:-moz-placeholder {
    color: @color;
  }
  &:-ms-input-placeholder {
    color: @color;
  }
  &::-webkit-input-placeholder {
    color: @color;
  }
}

16
或者更简单,编辑变量@input-color-placeholder-通常是在发现variables.less
威廉

@William是不是很容易定义选择器本身并使用mixin来避免不得不返回并更改它,以防您要使另一个输入的占位符具有不同的颜色?
布兰迪托

@Brandito-听起来像是边缘情况-通常,占位符颜色对于设计中的所有表单元素都是相同的。
威廉

@William对不起,我很难说出这种东西,我认为最好将mixin与所需输入颜色的参数一起使用,尽管说实话,我可能想到的是边缘情况我曾经(在彩色背景上对搜索输入占位符进行样式设置:P)很抱歉,但您是对的,很抱歉。
布兰迪托

99

除了toscho的答案外,我还注意到Chrome 9-10和Safari 5之间在支持CSS属性方面存在一些webkit不一致之处,值得注意。

具体地说铬9和10不支持background-colorbordertext-decorationtext-transform定型占位符时。

完整的跨浏览器比较在这里


76

对于Sass用户:

// Create placeholder mixin
@mixin placeholder($color, $size:"") {
  &::-webkit-input-placeholder {
    color: $color;
    @if $size != "" {
      font-size: $size;
    }
  }
  &:-moz-placeholder {
    color: $color;
    @if $size != "" {
      font-size: $size;
    }
  }
  &::-moz-placeholder {
    color: $color;
    @if $size != "" {
      font-size: $size;
    }
  }
  &:-ms-input-placeholder {
    color: $color;
    @if $size != "" {
      font-size: $size;
    }
  }
}

// Use placeholder mixin (the size parameter is optional)
[placeholder] {
  @include placeholder(red, 10px);
}

更灵活的使用方式@content;
milkovsky '17

60

这样就可以了。此处演示:

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" />


1
我还必须在Firefox v56中添加!important
Savage

49

在Firefox和Internet Explorer中,正常的输入文本颜色将覆盖占位符的color属性。因此,我们需要

::-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; 
}

41

跨浏览器解决方案:

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

/* individual elements: 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 elements: 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; }

信用:大卫·沃尔什(David Walsh)


41

::placeholder如果使用autoprefixer,请使用新的。

请注意,不赞成使用Bootstrap中的.placeholder mixin 。

例:

input::placeholder { color: black; }

使用autoprefixer时,以上内容将转换为所有浏览器的正确代码。


40

现在,我们有了一种将CSS应用于输入的占位符的标准方法: CSS模块4级草稿中的::placeholder伪元素。


这在Firefox 51中有效。我将使用这种方法。其他浏览器将很快赶上我(如果未应用将成为标准样式的功能,则不会破坏任何功能)。
Lonnie Best,

36

对于Mozilla Firefox 19+,我只是意识到浏览器为占位符提供了不透明度值,因此颜色将不是您真正想要的颜色。

input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
    color: #eee; opacity:1;
}
input:-moz-placeholder, textarea:-moz-placeholder {
    color: #eee; opacity:1;
}
input::-moz-placeholder, textarea::-moz-placeholder {
    color: #eee; opacity:1;
}
input:-ms-input-placeholder, textarea:-ms-input-placeholder {
    color: #eee; opacity:1;
}

我将opacityfor 覆盖为1,这样就很好了。


35

我不记得在Internet上哪里找到了此代码片段(它不是我写的,不记得我在哪里找到的,也不是谁写的)。

$('[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('');
            }
        })
    });

只需加载以下JavaScript代码,然后通过调用以下规则即可使用CSS编辑占位符:

form .placeholder {
   color: #222;
   font-size: 25px;
   /* etc. */
}

3
这是做旧的方法,我已经使用了很多。缺点是占位符文本在您聚焦时会消失。当UI在输入旁边也不包含标签时,我发现这很烦人。在过去的几个月中,我开始使用占位符文本替换此方法,我认为这是对UX的改进。
Redtopia 2013年

4
这样的代码的另一个问题是您的服务器端代码必须将占位符文本作为空输入来处理,这在您要进入称为“镇”的城镇的边缘情况下存在问题。而不是对照占位符文本检查值,您应该真正在输入上使用经过数据修改的标志,然后如果未设置标志,则在表单提交上清除输入。对于AJAX界面,您甚至可能没有表单,因此您应该能够将任意提交事件与输入相关联。这是不是的那些真正简单的情况之一。
Whelkaholism 2014年

34

我认为此代码将起作用,因为仅输入类型文本需要占位符。因此,这一行CSS足以满足您的需求:

input[type="text"]::-webkit-input-placeholder {
    color: red;
}

不要再使用这个了。还有更多带有占位符和更多前缀的元素。请参阅上面的解决方案或::placeholder与自动前缀一起使用。
RiZKiT

33

对于Bootstrap用户,如果使用class="form-control",则可能存在CSS特殊性问题。您应该获得更高的优先级:

.form-control::-webkit-input-placeholder {
    color: red;
}
//.. and other browsers

或者,如果您使用的是Less

.form-control{
    .placeholder(red);
}

19

如果您使用的是Bootstrap,但无法正常工作,那么您可能会错过Bootstrap本身添加了这些选择器的事实。我们正在谈论的是Bootstrap v3.3。

如果要更改.form-control CSS类中的占位符,则应像这样重写它:

.form-control::-webkit-input-placeholder { /* WebKit, Blink, Edge */
    color:    #777;
}
.form-control:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
    color:    #777;
    opacity:  1;
}
.form-control::-moz-placeholder { /* Mozilla Firefox 19+ */
    color:    #777;
    opacity:  1;
}
.form-control:-ms-input-placeholder { /* Internet Explorer 10-11 */
    color:    #777;
}

17

这个简短的代码:

::-webkit-input-placeholder {color: red;}
:-moz-placeholder           {color: red; /* For Firefox 18- */}
::-moz-placeholder          {color: red; /* For Firefox 19+ */}
:-ms-input-placeholder      {color: red;}

17

这个怎么样

<input type="text" value="placeholder text" onfocus="this.style.color='#000'; 
    this.value='';" style="color: #f00;" />

没有CSS或占位符,但是您获得了相同的功能。


15
如果有人在写完东西后再次单击该怎么办..他们写的原始文本将消失!
Lucky Soni

3
@LuckySoni您可以这样做,但是我个人更喜欢第一个。 <input type="text" value="placeholder text" onfocus="if(!this.haswriting){this.style.color='#000'; this.value='';}" onblur="if(!this.value){this.style.color='#f00'; this.value='placeholder text'; this.haswriting=false;}else{this.haswriting=true};" style="color: #f00;"/>
user1729061 2013年

9
即使您的第二个版本也不提供相同的功能。如果用户<form>使用此输入提交,则占位符文本将发送到服务器。我看到很多网站都做错了。
lqc

这很危险!如果您再次返回表格,则会丢失所有内容!
Mobarak Ali,

15

我在这里尝试了每种组合来更改颜色,在我的移动平台上,最终是:

-webkit-text-fill-color: red;

绝招。


2
This property allows you to specify a fill color for text. If it is not set, then the color property will be used to do the fill.在我看来,您还有其他用于设置color属性的CSS规则。
大卫·默多克

8

对于使用Bourbon的 SASS / SCSS用户,它具有内置功能。

//main.scss
@import 'bourbon';

input {
  width: 300px;

  @include placeholder {
    color: red;
  }
}

CSS输出,您也可以抓取这一部分并将其粘贴到您的代码中。

//main.css

input {
  width: 300px;
}

input::-webkit-input-placeholder {
  color: red;
}
input:-moz-placeholder {
  color: red;
}
input::-moz-placeholder {
  color: red;
}
input:-ms-input-placeholder {
  color: red;
}

8

针对不同的输入元素,不同的样式尝试此代码

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;
}

范例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;
}

范例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;
   }


5

添加一个实际的非常好的和简单的可能性:css过滤器

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

它将设置所有样式,包括占位符。

下面将使用色相滤镜更改颜色,将两个输入都设置在同一调色板上。现在,它在浏览器中的渲染效果非常好(除了...)

input {
  filter: sepia(100%) saturate(400%) grayscale(0) contrast(200%) hue-rotate(68deg) invert(18%);
}
<input placeholder="Hello world!" />
<input type="date" /><br>
<input type="range" />
<input type="color" />

要允许用户使用输入类型的颜色进行更改来动态更改它,或查找细微差别,请查看以下代码段:

来自:https : //codepen.io/Nico_KraZhtest/pen/bWExEB

function stylElem() {
  stylo.dataset.hue = ((parseInt(stylo.value.substring(1), 16))/46666).toFixed(0)
  Array.from(document.querySelectorAll('input, audio, video')).forEach(function(e){
      e.style.cssText += ";filter:sepia(100%) saturate(400%)grayscale(0)contrast(200%)hue-rotate("+ stylo.dataset.hue+"deg)invert("+(stylo.dataset.hue/3.6)+"%)"
  out.innerText = e.style.cssText
})()}

stylElem()
<div id="out"></div> <p>
  <input placeholder="Hello world!" />
  <input type="date" /><br>
  <input type="range" />
  <input type="color" />
Colors (change me)-> 
<input type="color" id="stylo" oninput="stylElem()" /> <br><br>
<audio controls src="#"></audio> <br><br> 
<video controls src="#"></video>

CSS过滤器文档:https//developer.mozilla.org/zh-CN/docs/Web/CSS/filter


4

好的,占位符在不同的浏览器中的行为有所不同,因此您需要在CSS中使用浏览器前缀以使它们相同,例如,Firefox默认情况下为占位符提供透明性,因此需要在CSS中添加不透明度1,加上颜色,不是在大多数情况下,这是一个大问题,但最好使它们保持一致:

*::-webkit-input-placeholder { /* WebKit browsers */
    color:    #ccc;
}
*:-moz-placeholder { /* Mozilla Firefox <18 */
    color:    #ccc;
    opacity:  1;
}
*::-moz-placeholder { /* Mozilla Firefox 19+ */
    color:    #ccc;
    opacity:  1;
}
*:-ms-input-placeholder { /* Internet Explorer 10-11 */
    color:    #ccc;
}

3

您可以使用CSS更改HTML5输入的占位符颜色。如果偶然,您的CSS冲突,此代码注释正常工作,您可以使用(!important)如下所示。

::-webkit-input-placeholder { /* WebKit, Blink, Edge */
    color:#909 !important;
}
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
   color:#909 !important;
   opacity:1 !important;
}
::-moz-placeholder { /* Mozilla Firefox 19+ */
   color:#909 !important;
   opacity:1 !important;
}
:-ms-input-placeholder { /* Internet Explorer 10-11 */
   color:#909 !important;
}
::-ms-input-placeholder { /* Microsoft Edge */
   color:#909 !important;
}

<input placeholder="Stack Snippets are awesome!">

希望这会有所帮助。


3

您可以将其用于输入和焦点样式:

input::-webkit-input-placeholder  { color:#666;}
input:-moz-placeholder  { color:#666;}
input::-moz-placeholder { color:#666;}
input:-ms-input-placeholder  { color:#666;}
/* focus */
input:focus::-webkit-input-placeholder { color:#eee; }
input:focus:-moz-placeholder { color:#eee } /* FF 4-18 */
input:focus::-moz-placeholder { color:#eee } /* FF 19+ */
input:focus:-ms-input-placeholder { color:#eee } /* IE 10+ */

2

最简单的方法是:

#yourInput::placeholder {
    color: red;/*As an example*/
}
/* if that would not work, you can always try styling the attribute itself: */
#myInput[placeholder] {
    color: red;
}


1

这是CSS选择器的解决方案

::-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 { /* Microsoft Edge */
   color:    #909;
}
:-ms-input-placeholder { /* Internet Explorer 10-11 */
   color:    #909;
}
  • WebKit,Blink (Safari,Google Chrome,Opera 15+)Microsoft Edge使用伪元素
    :::-webkit-input-placeholder。
  • Mozilla Firefox 4至18使用的是伪类::
    -moz-placeholder(一个冒号)。
    Mozilla Firefox 19+使用的是伪元素
    :::-moz-placeholder,但是旧的选择器仍然可以使用一段时间。
  • Internet Explorer 10和11使用伪类::
    -ms-input-placeholder。
  • Internet Explorer 9和更低版本完全不支持占位符属性,而Opera 12和更低版本不支持任何CSS选择器。

0

HTML的一部分:

 <form action="www.anything.com">
 <input type="text" name="name"
  placeholder="Enter sentence"/>
  </form>

我将展示如何通过CSS更改“输入句子”的表达颜色:

  ::placeholder{
  color:blue;
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.