テキストエリアのプレースホルダー属性内に改行を挿入しますか?


179

私はいくつかのアプローチを試しましたが、どれもうまくいきませんでした。誰かがこれを回避するための気の利いたトリックを知っていますか?

<textarea placeholder='This is a line \n this should be a new line'></textarea>

<textarea placeholder='This is a line     
should this be a new line?'></textarea> <!-- this works in chrome apparently -->

更新:Chromeでは機能しません。それはちょうどテキストエリアの幅でした。

参照: http : //jsfiddle.net/pdXRx/


2
PHPを使用している場合<?="\n"?>、新しい行として
記述

39
のよう&#10;に、プレースホルダ属性を追加するだけ<textarea placeholder="This is a line&#10;This is another one"></textarea>です。答えは下にあります。
lu1s

4
@ lu1sこれはChrome、IEでは機能しますが、FirefoxおよびSafariでは機能しません。
mb21

1
@ mb21 Firefox 60.0.2で1分前にテストしましたが、現在は機能しています。多分それは今ほとんどのブラウザで動作するでしょう。
tsuma534 2018

3
それは2020年であり、それでもSafariの解決策はありませんか?
シュメールアン

回答:


61

あなたができることは、改行valueを尊重するテキストをとして追加することです\n

$('textarea').attr('value', 'This is a line \nthis should be a new line');

次に、それを削除してfocus、(空の場合)に再度適用しますblur。このようなもの

var placeholder = 'This is a line \nthis should be a new line';
$('textarea').attr('value', placeholder);

$('textarea').focus(function(){
    if($(this).val() === placeholder){
        $(this).attr('value', '');
    }
});

$('textarea').blur(function(){
    if($(this).val() ===''){
        $(this).attr('value', placeholder);
    }    
});

例: http : //jsfiddle.net/airandfingers/pdXRx/247/

純粋なCSSではなく、クリーンでもありませんが、トリックを行います。


4
私は確かにJavaScriptを使用してプレースホルダー効果を偽造することができましたが、もっとシンプルなものを望んでいました
amosrivera

2
残念ながら、@ amosriveraでは、スクリプトによる回避策以外に、標準的な方法:developer.mozilla.org/en/HTML/HTML5/…がないようです。
Jason Gennaro、2011

3
良い解決策ですがif($(this).val() == 'This is...')focusハンドラーに追加します。それ以外の場合は、テキストを追加してフォーカスを失ってから、もう一度textareaをクリックすると、テキストが消えます。
Dennis Golomazov 2013

2
@DenisGolomazov良い追加。フォーカスハンドラーにチェックを付けて編集を送信しました。また、変更したjsfiddleの例に対するこの更新で示されているように、プレースホルダークラスとプレースホルダーのスタイルを変更することをお勧めします:jsfiddle.net/airandfingers/pdXRx/249
Aaron

ユーザーがプレースホルダーテキストと正確に一致する入力を行った場合、それも消去されませんか?
アルジュナ2015

274

&#10;プレースホルダー属性内に改行htmlエンティティを挿入できます。

<textarea name="foo" placeholder="hello you&#10;Second line&#10;Third line"></textarea>

動作:Chrome 62、IE10、Firefox 60

機能しない:Safari 11

https://jsfiddle.net/lu1s/bxkjLpag/2/


7
これは、元の質問が求めていたこととまったく同じです。なぜそれが高く投票されないのですか?すべてのブラウザで機能しないのですか?
DaveAlger、2015年

9
@DaveAlger-確かにそうではありません。私はFFで試してみましたが&#10;、空白文字を生成せずに文字通り出力しました。developer.mozilla.org/en/HTML/HTML5/…を
Merlyn Morgan-Graham 2015

1
62. IE10とChromeで動作します
miny1997

1
新しいバージョンのFirefoxで非常にうまく機能します
ii iml0sto1

10
Firefoxの60で動作します
ロブ・ポーター

57

許可されているとは思わないでください。 ください http //www.w3.org/TR/html5/forms.html#the-placeholder-attribute

関連コンテンツ(強調鉱山):

プレースホルダー属性は、コントロールに値がない場合のユーザーのデータ入力を支援するための短いヒント(単語または短いフレーズ)を表します。ヒントは、サンプル値または予期される形式の簡単な説明です。この属性を指定する場合、U + 000A LINE FEED(LF)またはU + 000D CARRIAGE RETURN(CR)文字を含まない値にする必要があります。


@amosriveraうーん。まあ、ベンダーは彼らが適合すると思う方法で仕様を解釈することが許可されています。
Tieson T. 2011

10
ツールのように、それは改行のように見えましたが、実際には、それは
textarea

3
@amosrivera LOL、少なくともあなたはそれについて笑うことができますよね?試しても何も失われません...:]
Tieson T.

1
正解です。しかし、私はルールを全くナンセンスだと考えています。LRまたはCRを「含まないでください」の正確な引数は何ですか?
イェンスA.コッホ

2
@Jens-AndréKoch仮説は、プレースホルダーは単純でなければならないということだと思います。値が複雑で改行が必要な場合は、このコメントエディターで「ヘルプの表示」リンクをアクティブにした場合と同様に、兄弟要素として存在する必要があります。結局のところ、入力にコンテンツが含まれると、プレースホルダーは表示されなくなります...
Tieson T. 2013

54

更新(2016年1月):素敵な小さなハックがすべてのブラウザーで機能しない可能性があるため、以下の小さなJavaScriptを使用した新しいソリューションがあります。


素敵な小さなハック

いい感じではありませんが、htmlに新しい行を入れるだけです。このような:

<textarea rows="6" id="myAddress" type="text" placeholder="My Awesome House,
        1 Long St
        London
        Postcode
        UK"></textarea>

各行が新しい行にあり(折り返されていない)、「タブ」のインデントは4スペースであることに注意してください。確かにそれはあまり良い方法ではありませんが、うまくいくようです:

http://jsfiddle.net/01taylop/HDfju/

  • 各行のインデントレベルは、テキスト領域の幅によって異なる可能性があります。
  • resize: none;textareaのサイズが固定されるように、cssに含めることが重要です(jsfiddleを参照)。

または 、新しい行が必要な場合は、改行を2回押します(「新しい行」の間に空の行があります。作成されたこの「空の行」には、テキスト領域の幅と同じになる十分なタブ/スペースが必要です。数が多すぎても問題はないようですが、これで十分です。これは非常に汚いもので、おそらくブラウザに準拠していません。もっと簡単な方法があったらいいのにと思います!


より良いソリューション

JSFiddleを調べてください。

  • このソリューションは、divをtextareaの後ろに配置します。
  • 一部のjavascriptは、テキスト領域の背景色を変更して、プレースホルダーを適切に非表示または表示するために使用されます。
  • 入力とプレースホルダーのフォントサイズは同じである必要があるため、2つのミックスインが必要です。
  • box-sizingdisplay: blocktextareaプロパティは重要です。そうでない場合、背後のdivは同じサイズではありません。
  • textareaの設定resize: verticalとa min-heightも重要です。プレースホルダーテキストがどのように折り返され、textareaを拡張しても白い背景が維持されることに注意してください。ただし、コメントアウトresizeプロパティをと、テキスト領域を水平方向に拡張するときに問題が発生します。
  • textareaのmin-heightが、最小幅でプレースホルダー全体をカバーするのに十分であることを確認してください。**

JSFiddleスクリーンショット

HTML:

<form>
  <input type='text' placeholder='First Name' />
  <input type='text' placeholder='Last Name' />
  <div class='textarea-placeholder'>
    <textarea></textarea>
    <div>
      First Line
      <br /> Second Line
      <br /> Third Line
    </div>
  </div>
</form>

SCSS:

$input-padding: 4px;

@mixin input-font() {
  font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;
  font-size: 12px;
  font-weight: 300;
  line-height: 16px;
}

@mixin placeholder-style() {
  color: #999;
  @include input-font();
}

* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

form {
  width: 250px;
}

input,textarea {
  display: block;
  width: 100%;
  padding: $input-padding;
  border: 1px solid #ccc;
}

input {
  margin-bottom: 10px;
  background-color: #fff;

  @include input-font();
}

textarea {
  min-height: 80px;
  resize: vertical;
  background-color: transparent;
  &.data-edits {
    background-color: #fff;
  }
}

.textarea-placeholder {
  position: relative;
  > div {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: $input-padding;
    background-color: #fff;
    @include placeholder-style();
  }
}

::-webkit-input-placeholder {
  @include placeholder-style();
}
:-moz-placeholder {
  @include placeholder-style();
}
::-moz-placeholder {
  @include placeholder-style();
}
:-ms-input-placeholder {
  @include placeholder-style();
}

JavaScript:

$("textarea").on('change keyup paste', function() {
  var length = $(this).val().length;
  if (length > 0) {
    $(this).addClass('data-edits');
  } else {
    $(this).removeClass('data-edits');
  }
});

とてもかわいいハック。これは間違いなくChromeで機能します。他のすべての主要ブラウザで同じように機能することを確認できますか?
Mark Amery 2013年

2
私は誰かがIEでそれをテストするのが大好きです。SafariとChromeの最新バージョンで動作することを確認できますが、Firefoxでは動作しません。プレースホルダーの代わりにテキストを使用し、テキストをプレースホルダーのように見せるcssクラスを用意しました。次に、フォーカスがあるときにテキストをクリアする小さなjQuery関数、または空の場合は元に戻す!
Patrick

2
ChromeおよびIE 11では正常に動作しますが、FirefoxおよびAndroidのデフォルトブラウザーでは動作しません。
化学プログラマ

1
Safari、Firefox、Operaでは動作しません。Chromeでのみ動作します:(
by0

1
現在の回答はフォームで「プレースホルダー」値を送信する可能性があるため、これは受け入れられる回答であるはずです。注:「A Better Solution」の下のソリューションは、ブラウザ間で正しく機能します。違うと言うコメントは、「A Nice Little Hack」を参照する必要があります。
Roy Prins 2017

15

CSSソリューションはどうですか:http : //cssdeck.com/labs/07fwgrso

::-webkit-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

::-moz-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

:-ms-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

2
これは、ここにリストされているすべてのIMOの最良のソリューションです。
2014

このソリューションはFirefoxでは機能しません(22.0〜28.0b9でテスト済み)。
Hartwig、2014年

@Hartwig私は実際に同じことに気づきました。何らかの理由でFirefoxはこれを正しく処理しません。実際にはIEでも機能しません==>残念ながらWebKitのみです。
Samuli Hakoniemi 2014年

15

サラームンアレクム

&#10;

Google Chromeに対応

ここに画像の説明を入力してください

<textarea placeholder="Enter Choice#1 &#10;Enter Choice#2 &#10;Enter Choice#3"></textarea>

Windows 10.0(ビルド10240)とGoogle Chromeバージョン47.0.2526.80 mでテストしました

08:43:08 AST 6 Rabi Al-Awwal、1437 2015年12月17日木曜日

ありがとうございました


10

改行のために&#10のみを追加します。CSSやJavaScriptを記述する必要はありません。

textarea{
    width:300px;
    height:100px;

}
<textarea placeholder='This is a line this &#10should be a new line'></textarea>

<textarea placeholder=' This is a line 

should this be a new line?'></textarea>


9

古い答え:

いいえ、プレースホルダ属性ではできません。&#13;&#10;プレースホルダーのように改行をHTMLエンコードすることもできません。

新しい答え:

最近のブラウザでは、これを行うためのいくつかの方法が提供されています。このJSFiddleを参照してください。

http://jsfiddle.net/pdXRx/5/


役立つフィドル!ソリューション2は実際にはSafariで機能します。
sandinmyjoints


6

これを試して:

<textarea
placeholder="Line1&#x0a;&#x09;&#x09;&#x09;Line2"
cols="10"
rows="5"
style="resize:none">
</textarea>

http://jsfiddle.net/vr79B/


これは最初の文の後のスペースをタブで移動するだけであり、これ以上のcolsまたは柔軟な幅では使用できません。
Jeffrey Neo

5

純粋なHTMLでそれを行うことはできませんが、このjQueryプラグインを使用すると、次のことが可能になります。https//github.com/bradjasper/jQuery-Placeholder-Newlines


ニースは、私のために働いた、私はこの1つでマティアスによって標準jquery.placeholderを交換し、これらの呼び出しを交換しなければならなかった:$('input, textarea').placeholder();これで$('input[placeholder], textarea[placeholder]').placeholder();
ryan2johnson9

4

Jason Gennaroの回答のわずかに改良されたバージョン(コードのコメントを参照):

var placeholder = 'This is a line \nthis should be a new line';
$('textarea').attr('value', placeholder);
$('textarea').focus(function(){
    if($(this).val() == placeholder){
        // reset the value only if it equals the initial one    
        $(this).attr('value', '');
    }
});
$('textarea').blur(function(){
    if($(this).val() == ''){
        $(this).attr('value', placeholder);
    }    
});
// remove the focus, if it is on by default
$('textarea').blur();

4

Jason GennaroとDenis Golomazovの作品は好きでしたが、もっとグローバルに役立つ何かが欲しかったのです。影響を与えずにどのページにも追加できるように、コンセプトを変更しました。

http://jsfiddle.net/pdXRx/297/

<h1>Demo: 5 different textarea placeholder behaviors from a single JS</h1>

<h2>Modified behaviors</h2>

<!-- To get simulated placeholder with New Lines behavior,
     add the placeholdernl attribute -->

<textarea placeholdernl>    (click me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea placeholder='Address' placeholdernl>    (click me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<h2>Standard behaviors</h2>

<textarea placeholder='Address'>    (delete me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea>    (delete me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea placeholder='Address'></textarea>

JavaScriptは非常に単純です

<script>
(function($){
var handleFocus = function(){
    var $this = $(this);
    if($this.val() === $this.attr('placeholdernl')){
        $this.attr('value', '');
        $this.css('color', '');
    }
};

var handleBlur = function(){
    var $this = $(this);
    if($this.val() == ''){
        $this.attr('value', $this.attr('placeholdernl'))
        $this.css('color', 'gray');
    }    
};

$('textarea[placeholdernl]').each(function(){
    var $this = $(this),
        value = $this.attr('value'),
        placeholder = $this.attr('placeholder');
    $this.attr('placeholdernl', value ? value : placeholder);
    $this.attr('value', '');
    $this.focus(handleFocus).blur(handleBlur).trigger('blur');
});
})(jQuery);
</script>

2

HTML

<textarea data-placeholder="1111\n2222"></textarea>

JS

$('textarea[data-placeholder]').each(function(){
    var $this = $(this),
        placeholder = $this.data('placeholder'),
        placeholderSplit = placeholder.split('\\n');
    placeholder = placeholderSplit.join('\n');
    $this.focus(function(){
        var $this = $(this);
        if($this.val() === placeholder){
            $this.val('');
            // $this.removeClass('placeholder');
        }
    }).blur(function(){
        var $this = $(this);
        if($this.val() == '') {
            $this.val(placeholder);
            // $this.addClass('placeholder');
        }
    }).trigger('blur');
});


1

@Richard Bronoskyのフィドルを次のように変更しました。

data-*カスタム属性よりも属性を使用する方が良い方法です。他のスタイルにも置き換えまし<textarea placeholdernl><textarea data-placeholder>

編集した
ここにリチャードのあるオリジナルの答えは完全なコードスニペットが含まれています。


1
jsfiddleを含めるときはいつでも、ここにもコードを説明して貼り付けてください。そのため、これを参照用に用意し、コンテンツがjsfiddleに永久に存在することを信頼する必要はありません。
avcajaraville 14

あなたは正しい、@ avcajaraville。しかし、リチャードの元の答えは同じトピックに関するものであり、私のものは単純な修正なので、完全なコードスニペットは含めませんでした。代わりに、私は彼の答えを指摘しました。
Gongdo Gong 2014

1

とてもシンプル

  var position = your break position;
    var breakLine = "&#13;&#10;";//in html 
    var output = [value.slice(0, position), breakLine, value.slice(position)].join('');
    return output;

値は元の文字列を表します


1

カスタムプレースホルダーを使用してこのソリューションを確認してください。

  • すべてのブラウザー(Firefoxを含む)で機能する複数行のプレースホルダーを取得します
  • あなたが望むようにプレースホルダーをカスタマイズすることは可能です

フィドルのデモ

$(document).on('input', '#textArea', function () {
	
        if ($('#textArea').val()) {
            $('#placeholderDiv').hide();
        } else {
            $('#placeholderDiv').show();
        }   
});
#textAreaWrap {
    position: relative;
    background-color: white;
}

#textArea {
    position: relative;
    z-index: 1;
    width: 350px;
    height: 100px;
    min-height: 100px;
    padding: 6px 12px;
    resize: vertical;
    background-color: transparent;
    /* When set background-color: transparent - Firefox  displays
    unpleasant textarea border. Set border style to fix it.*/
    border: 1px solid #a5a5a5;
}

#placeholderDiv {
    position: absolute;
    top: 0;
    padding: 6px 13px;
    color: #a5a5a5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="textAreaWrap">
    
<textarea id="textArea"></textarea>

<!-- Check here. If textarea has content -
     set for this div attribute style="display: none;" -->
<div id="placeholderDiv">Multiline textarea<br>
                         placeholder<br>
                         <br>
                         that works in Firefox</div>
    
</div>


0

テキストエリアにフォーカスを当てるときにプレースホルダーを非表示にするのは好きではありません。そのPlaceholderため、組み込みのプレースホルダーのように見え、Google Chrome以外のブラウザーでも機能するコンストラクター関数を作成しました。Placeholder関数は何度でも使用でき、jQueryも必要ないため、非常に便利です。

編集:

また、プレースホルダーの挿入などの特殊なケースも正しく処理するようになりました。

var textarea = document.getElementById("textarea");
new Placeholder(textarea, "Line 1\nLine 2\nLine 3");

function Placeholder(el, placeholder) {
    if (el.value == "" || el.value == placeholder) {
        el.style.color = "gray";
        el.value = placeholder;
        el._plc = true;
        el.className += " unselectable";
    }
    function keyPress(e) {
        window.setTimeout(function() {
            var replaced = reverseStr(el.value).replace(reverseStr(placeholder), "");
            
            if (el.value == "") {
                el.value = placeholder;
                el.style.color = "gray";
                cursorToStart(el);
                el._plc = true;
                el.className += " unselectable";
            } else if (el._plc && el.value.endsWith(placeholder) && replaced !== "") {
                el.value = reverseStr(replaced);
                el.style.color = "black";
                el._plc = false;
                el.readOnly = false;
                el.className = el.className.replace("unselectable", "");
            } else if (el._plc && el.readOnly) {
                var ch = String.fromCharCode(e.charCode);
                if (e.keyCode == 13) ch = "\n";     // ENTER
                else if (e.charCode == 0) return;   // non-character keys
                
                el.value = ch;
                el.style.color = "black";
                el._plc = false;
                el.readOnly = false;
                el.className = el.className.replace("unselectable", "");
            }
        }, 10);
    }
    el.addEventListener("keypress", keyPress, false);
    el.addEventListener("paste", keyPress, false);
    el.addEventListener("cut", keyPress, false);
    el.addEventListener("mousedown", function() {
        if (el._plc) el.readOnly = true;
    }, false);
    el.addEventListener("mouseup", function() {
        el.readOnly = false;
        if (el._plc) cursorToStart(el);
    }, false);
  
    function cursorToStart(input) {
        if (input.createTextRange) {
            var part = input.createTextRange();
            part.move("character", 0);
            part.select();
        } else if (input.setSelectionRange){
            input.setSelectionRange(0, 0);
        } input.focus();
    }
    function reverseStr(str) {
        if (!str) return "";
        return str.split("").reverse().join("");
    }
}
textarea {
    border: 1px solid gray;
    padding: 3px 6px;
    font-family: Arial;
    font-size: 13px;
    transition: .2s;
}
textarea:hover, textarea:focus {
    border-color: #2277cc;
}
textarea:focus {
    box-shadow: inset 0 0 5px #85B7E9;
}
*.unselectable {
    -webkit-user-select: none;
    -webkit-touch-callout: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    -o-user-select: none;
}
<textarea id="textarea"></textarea>


0

この問題は、実装で許可されている場合は、プレースホルダー表示のセレクターと重ね合わせた背景を使用して対処できます。

textarea:not(:placeholder-shown) {
  background: #fff;
}

div {
  top: 0;
  left: 14px;
  color: rgba(0,0,0,0.4);
  z-index: -1;
  position: absolute;
  line-height: 1.2;
  white-space: pre-wrap;
}

https://codepen.io/franciscoaquino/pen/YzyBPYK

セレクターのサポート:

https://caniuse.com/#feat=css-placeholder-shown

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.