在<textarea>中,是否可以有多行HTML5占位符文本?

168

我在文本框中使用了HTML5的占位符属性来显示幽灵文本,当你聚焦在这些文本框上时,幽灵文本会消失:

<input type="text" name="email" placeholder="Enter email"/>

我想使用同样的机制在文本域中实现多行占位符文本,可能像这样:

<textarea name="story" placeholder="Enter story\n next line\n more"></textarea>

但是这些 \n 出现在文本中并不会导致换行... 有没有一种方法可以拥有多行占位符?

更新: 我唯一让它工作的方法是利用jQuery Watermark插件,它可以接受占位符文本中的HTML:

$('.textarea_class').watermark('Enter story<br/> * newline', {fallback: false});

IE似乎可以正确处理它。另一方面,Firefox则忽略了换行符。 - ekkis
1
https://dev59.com/8Ww05IYBdhLWcg3wUAM0 是一个非常相似的问题,也有很好的答案。 - Lloyd Dewolf
如果你遇到这个问题并且使用JS设置值,请检查CSS的white-space属性以确保它被正确设置,例如pre-wrap - Cory Mawhorter
1
从其他问题中得知:&#10; 在 Safari 以外的所有地方都有效。 - Sphinxxx
16个回答

87
对于

38
除了title属性不表现出"ghost content(幽灵内容)"之外,它的行为方式并不相同。实际上,对于文本区域来说,占位符支持多行会更加合适,因为文本区域是多行元素。遗憾的是规范不允许这样做,我想我们只能使用一些技巧来实现了。唉。 - ekkis

77

在大多数(具体详情请见下文)浏览器中,使用JavaScript编辑占位符允许多行占位符。

正如所说的那样,这与规范不兼容,您不应该期望它在未来可以使用(编辑:它确实可以使用)。

This example replaces all multiline textarea's placeholder.

var textAreas = document.getElementsByTagName('textarea');

Array.prototype.forEach.call(textAreas, function(elem) {
    elem.placeholder = elem.placeholder.replace(/\\n/g, '\n');
});
<textarea class="textAreaMultiline" 
          placeholder="Hello, \nThis is multiline example \n\nHave Fun"
          rows="5" cols="35"></textarea>

JsFiddle代码片段。

期望的结果


根据评论,有些浏览器接受这个hack,而其他浏览器则不接受。
这是我运行的测试结果(使用browsertshotsbrowserstack

  • Chrome:>= 35.0.1916.69
  • Firefox:>= 35.0(结果因平台而异)
  • IE:>= 10
  • KHTML 浏览器:4.8
  • Safari:否(测试 = Safari 8.0.6 Mac OS X 10.8)
  • Opera:否(测试 <= 15.0.1147.72)

结合这些统计数据,意味着它可以在目前使用的88.7%的浏览器上工作,(截至2015年10月)

更新:今天,它可以在目前使用的94.4%的浏览器上工作。(截至2018年7月)


1
那个 jsfiddle 的例子根本不起作用... 它只是多行的,因为文本区域的大小。 - sebnukem
3
有一个拼写错误,但我无法编辑,因为StackOverflow给了我“编辑必须至少为6个字符”的错误。你的类应该是multiline而不是multiligne - Daniel Loureiro
似乎在Safari上无法工作... - \n消失了,但所有内容都在一行上。 - Hackeron
@CyrilDD:最好的选择是使用文本区域和div的叠加,使用事件来模拟多行占位符。这些帖子只是魔法般的黑客技巧,违反了规范,并不能保证能够正常工作。 - Cyrbil
1
@Jroonk:我可以确认这一点。这不是由于Chrome的原因,而是由于苹果强制任何浏览器使用其IOS的WKWebView。因此,在WKWebView之前,IOS上的任何浏览器都无法正确呈现此黑客。 - Cyrbil
显示剩余8条评论

62

我发现如果您使用了很多空格,浏览器会正确地换行。不用担心使用准确数量的空格,只需添加大量空格即可,浏览器应该会正确地换行到下一行的第一个非空格字符。

<textarea name="address" placeholder="1313 Mockingbird Ln         Saginaw, MI 45100"></textarea>

2
是的,跨浏览器不支持多行占位符。我发现最新的Safari支持,但在IOS5上肯定不支持。 - Tom
8
这在IE和Firefox Windows中对我都不起作用。它只是插入了我要求的空格。 - ekkis
Chrome 37在textarea中显示占位符文本时不会去除换行符。有人知道这个“特性”的名称吗?这样我就可以a)寻找它,b)测试它了。 - Ben

23

实际上有一个技巧可以在Webkit浏览器中添加多行占位符,Chrome过去可以使用,但在更近的版本中已将其删除:


首先像往常一样将占位符的第一行添加到HTML5中。

<textarea id="text1" placeholder="Line 1" rows="10"></textarea>

然后通过CSS添加该行的其余部分:

#text1::-webkit-input-placeholder::after {
    display:block;
    content:"Line 2\A Line 3";
}
如果您想让您的文本保持在一个位置,可以尝试以下方法。缺点是除了Chrome、Safari、Webkit等浏览器外,其他浏览器甚至不会显示第一行:
<textarea id="text2" placeholder="." rows="10"></textarea>

然后通过CSS添加该行的其余部分:

#text2::-webkit-input-placeholder{
    color:transparent;
}

#text2::-webkit-input-placeholder::before {
    color:#666;
    content:"Line 1\A Line 2\A Line 3\A";
}

演示 Fiddle

如果有人能在Firefox上让类似的演示工作起来,那将非常好。


感谢提供fiddle链接。它使得在各种浏览器中验证行为变得容易。在IE 10上,两个版本都失败了,还有在FF 12(Windows)上也是如此。真遗憾。Safari 6.1可以工作 :( - ekkis
2
不再适用于Chrome - 我猜已经有很长一段时间了。 - Mike Rockétt

23

根据MDN的说法,

在占位文本中输入回车或换行符时,在呈现提示时必须将其视为换行符。

这意味着如果你只是跳到新一行,它应该会被正确呈现。即:

<textarea placeholder="The car horn plays La Cucaracha.
You can choose your own color as long as it's black.
The GPS has the voice of Darth Vader.
"></textarea> 

应该呈现为这样:

在此输入图片描述


1
适用于最新版本的Chrome。 - Avatar
这种方法是最容易实现的。它也支持制表符。 - Dan Swain

10

React:

如果您正在使用React,可以按照以下方式操作:

placeholder={'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}

我无法在React 18中使其工作。不确定原因。 - RyanNerd

9
如果您正在使用AngularJS,您可以简单地使用大括号将任何您想要的内容放入其中:这是一个fiddle示例。
<textarea rows="6" cols="45" placeholder="{{'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}}"></textarea>

4
我正在使用类似的方法,但在Safari和Firefox中无法正常工作。 - Stan

7

这似乎可以通过正常输入来完成,

<textarea name="" id="" placeholder="Hello awesome world. I will break line now

Yup! Line break seems to work."></textarea>


3
HTML5规范明确拒绝在占位符字段中添加换行符。Webkit的某些版本/会/在占位符中输入换行符,但这是不正确的行为,不能依靠它。

我猜段落对w3来说还不够简洁 ;)


1
Webkit的行为并不是错误的,因为规范没有说明如果存在CR/LF会发生什么。 - Christian
1
@Christian,现在它可以了,它说:“用户代理应该在从中删除换行符后向用户呈现此提示...”。关于删除换行符,它说:“当用户代理要从字符串中删除换行符时,用户代理必须从该字符串中删除任何“LF”(U+000A)和“CR”(U+000D)字符。”。 - Richard Turner
这个答案已经不再正确了。规范现在明确要求占位符中的换行符应该被渲染为换行符。 - Clonkex

3

使用Vue.js

<textarea name="story" :placeholder="'Enter story\n next line\n more'"></textarea>

另一种方式: placeholder="\/robots.txt \r\n /google-analytics-auth.html`"` - Kingsley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接