您可以在<textarea>中使用多行HTML5占位符文本吗?

我使用HTML5的占位符属性将焦点放在文本字段中时,文本字段中的幽灵文本会消失:

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

我想使用相同的机制,在textarea中有多行占位符文本,可能是这样的:

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

但是,这些显示在文本中,不会导致换行符有没有办法有一个多行占位符?

更新 :我得到这个工作的唯一方法是利用jQuery水印插件 ,它接受占位符文本中的HTML:

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

该规范不允许换行或回车字符。

占位符属性表示旨在帮助用户input数据的简短提示(单词或短语)。 提示可以是样本值或预期格式的简要描述。 该属性(如果指定)必须具有不包含U + 000A LINE FEED(LF)或U + 000D CARRIAGE RETURN(CR)字符的值。

显然,build议是使用title属性更长一些。

对于较长的提示或其他咨询文本,title属性更合适。

我发现,如果你使用了大量的空间,浏览器会正确地包装它。 不要担心使用确切数量的空格,只要在那里扔很多,浏览器应该正确地换行到下一行的第一个非空格字符。

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

大多数 (见下面的细节)浏览器中,在JavaScript中编辑占位符允许多行占位符。 正如前面所说的那样,它不符合规范 ,你不应该期待它在将来的工作。

此示例replace所有多行textarea的占位符。

 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> 

实际上有一个黑客可以在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"; } 

如果你想保持你的线路在一个地方,你可以尝试以下。 这其中的缺点是,其他浏览器比铬,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"; } 

演示小提琴

这将是非常好的,如果可以得到一个类似的演示在Firefox上工作。

html5规范明确拒绝占位符字段中的新行。 当在占位符中使用换行符时,Webkit的版本/将会/插入新的行,但是这是不正确的行为,不应该被依赖。

我想段落不够简短的W3;)

如果你的textarea有一个静态的宽度,你可以使用不间断空间和自动textarea包装的组合。 只需将空格replace为每行的nbsp,并确保两条邻居行不能合并成一行。 在实践line length > cols/2

这不是最好的方法,但可能是唯一的跨浏览器解决scheme。

 <textarea class="textAreaMultiligne" placeholder="Hello,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This&nbsp;is&nbsp;multiligne&nbsp;example Have&nbsp;Fun&nbsp;&nbsp;&nbsp;&nbsp;" rows="5" cols="35"></textarea> 

如果你使用的是AngularJS,你可以简单地使用大括号来放置任何你想要的东西: 这是一个小提琴。

 <textarea rows="6" cols="45" placeholder="{{'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}}"></textarea> 

我不认为这是可能的HTML / CSS单独。 可能使用JavaScript或其他types的黑客多余空间将文本推送到下一行等。

你可以尝试使用CSS,它适用于我。 此处需要属性placeholder=" "

 <textarea id="myID" placeholder=" "></textarea> <style> #myID::-webkit-input-placeholder::before { content: "1st line...\A2nd line...\A3rd line..."; } </style> 

Bootstrap + contenteditable +多行占位符

演示: https : //jsfiddle.net/39mptojs/4/

基于@cyrbil和@daniel的答案

使用Bootstrap,jQuery和https://github.com/gr2m/bootstrap-expandable-input在contenteditable中启用占位符。;

使用“占位符replace”JavaScript并添加“white-space:pre”到css,显示多行占位符。

HTML:

 <div class="form-group"> <label for="exampleContenteditable">Example contenteditable</label> <div id="exampleContenteditable" contenteditable="true" placeholder="test\nmultiple line\nhere\n\nTested on Windows in Chrome 41, Firefox 36, IE 11, Safari 5.1.7 ...\nCredits StackOveflow: .placeholder.replace() trick, white-space:pre" class="form-control"> </div> </div> 

使用Javascript:

 $(document).ready(function() { $('div[contenteditable="true"]').each(function() { var s=$(this).attr('placeholder'); if (s) { var s1=s.replace(/\\n/g, String.fromCharCode(10)); $(this).attr('placeholder',s1); } }); }); 

CSS:

 .form-control[contenteditable="true"] { border:1px solid rgb(238, 238, 238); padding:3px 3px 3px 3px; white-space: pre !important; height:auto !important; min-height:38px; } .form-control[contenteditable="true"]:focus { border-color:#66afe9; } 

原帖中的水印解决scheme效果很好。 谢谢。 如果有人需要它,这里是一个angular度指示。

 (function () { 'use strict'; angular.module('app') .directive('placeholder', function () { return { restrict: 'A', link: function (scope, element, attributes) { if (element.prop('nodeName') === 'TEXTAREA') { var placeholderText = attributes.placeholder.trim(); if (placeholderText.length) { // support for both '\n' symbol and an actual newline in the placeholder element var placeholderLines = Array.prototype.concat .apply([], placeholderText.split('\n').map(line => line.split('\\n'))) .map(line => line.trim()); if (placeholderLines.length > 1) { element.watermark(placeholderLines.join('<br>\n')); } } } } }; }); }());