<textarea>에 여러 줄로 된 HTML5 자리 표시 자 텍스트를 사용할 수 있습니까?


153

HTML5의 자리 표시 자 속성을 사용하여 초점을 맞추면 사라지는 텍스트 필드에 유령 텍스트가 있습니다.

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

동일한 메커니즘을 사용하여 텍스트 영역에 여러 줄 자리 표시 자 텍스트를 만들려고합니다.

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

그러나 그 \n텍스트는 텍스트에 나타나고 줄 바꿈을 일으키지 않습니다 ... 여러 줄 자리 표시자를 가질 수있는 방법이 있습니까?

업데이트 :이 작업을 수행 할 수있는 유일한 방법은 자리 표시 자 텍스트에서 HTML을 허용하는 jQuery Watermark 플러그인 을 사용하는 것입니다.

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

IE가 제대로 처리하는 것 같습니다. Firefox OTOH는 개행을 무시합니다
ekkis

1
stackoverflow.com/questions/7312623/… 도 좋은 답변을 가진 매우 비슷한 질문입니다.
Lloyd Dewolf

이 문제가 발생하고 js를 사용하여 값 확인 CSS를 설정하여 white-space올바르게 설정되어 있는지 확인하십시오. 예 : 프리 랩
Cory Mawhorter

다른 질문에서 : &#10;Safari를 제외한 모든 곳에서 작동합니다.
Sphinxxx

답변:


82

대한 <textarea>사양은 특별히 자리 표시 자 속성에서 그 캐리지 리턴 + 줄 바꿈이 브라우저로 바꿈으로 렌더링되어야 설명합니다.

사용자 에이전트는 요소의 값이 빈 문자열이고 컨트롤에 포커스가없는 경우 (예 : 빈 포커스되지 않은 컨트롤 안에 표시)이 힌트를 사용자에게 제공해야합니다. 힌트의 모든 U + 000D 캐리지 리턴 U + 000A LINE FEED 문자 쌍 (CRLF) 및 힌트의 다른 모든 U + 000D 캐리지 리턴 (CR) 및 U + 000A LINE FEED (LF) 문자는 처리해야합니다. 힌트를 렌더링 할 때 줄 바꿈으로.

MDN에도 반영 : https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#attr-placeholder

FWIW, Chrome 63.0.3239.132를 사용하려고하면 실제로 제대로 작동합니다.


37
title 속성이 같은 방식으로 작동하지 않는다는 것을 제외하고는 유령 콘텐츠를 표시하지 않습니다. 실제로 텍스트 영역은 여러 줄로 구성된 생물체이므로 자리 표시자가 텍스트 영역에 대해 여러 줄을 지원하는 것이 완벽하게 적합합니다. 안타깝게도 사양이 허용하지 않습니다. 해킹이해야 할 것 같아요. 한숨
ekkis

71

대부분의 자바 스크립트의 자리는 여러 자리 수 있도록 편집, 브라우저 (자세한 내용은 아래 참조). 말했듯이, 사양을 준수 하지 않으므로 향후 사양 이 작동하지 않을 것으로 예상됩니다 (편집 : 작동 함).

이 예제는 모든 여러 줄 문자 영역의 자리 표시자를 대체 합니다 .

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 스 니펫.

예상 결과

예상 결과


의견에 따르면 일부 브라우저는이 해킹을 허용하고 다른 브라우저는 허용하지 않는 것으로 보입니다.
이것은 내가 실행 한 테스트 결과입니다 ( browsertshotsbrowserstack 사용 )

  • 크롬 :> = 35.0.1916.69
  • Firefox :> = 35.0 (결과는 플랫폼에 따라 다름)
  • IE :> = 10
  • KHTML 기반 브라우저 : 4.8
  • Safari : 아니요 (테스트 된 = Safari 8.0.6 Mac OS X 10.8)
  • 오페라 : 아니요 (테스트 <= 15.0.1147.72)

이러한 통계 로 인해 현재 (2015 년 10 월) 사용 된 브라우저 의 약 88.7 % 에서 작동 합니다.

업데이트 : 현재, 현재 (2018 년 7 월) 사용되는 브라우저 중 94.4 % 이상에서 작동 합니다.


1
그 jsfiddle 예제는 전혀 작동하지 않습니다 ... 텍스트 영역의 크기 때문에 여러 줄로 표시됩니다.
sebnukem

2
오타가 있지만 StackOverflow에서이 "편집은 6 자 이상이어야합니다"오류를 표시하므로 편집 할 수 없습니다. 수업은 multiline안됩니다multiligne
Daniel Loureiro

@ sebnukem : 테스트 한 대부분의 브라우저에서 작동합니다. 그리고 그것은 텍스트 영역의 크기 문제가 아닙니다. 발생한 문제에 대한 자세한 정보를 제공 할 수 있습니까?
Cyrbil

사파리에서 작동하지 않는 것 같습니다 ...-\ n은 사라지지만 모든 것이 한 줄에 있습니다
Hackeron

1
@Jroonk : 확인할 수 있습니다. 크롬 때문이 아니라 모든 브라우저에서 IOS를 사용하도록 강요하는 Apple 때문 WKWebView입니다. 결과적으로 IOS의 모든 브라우저는이 해킹을 제대로 WKWebView수행하지 않을 것 입니다.
Cyrbil

59

많은 공간을 사용하면 브라우저가 올바르게 줄 바꿈합니다. 정확한 수의 공백을 사용하는 것에 대해 걱정하지 말고 그냥 많이 넣으십시오. 그러면 브라우저는 다음 줄의 첫 번째 공백이 아닌 문자로 올바르게 줄 바꿈해야합니다.

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

2
crossbrowser를 지원하지 않는 네 여러 자리는 최신 사파리가 지원합니까하지만 확실히 iOS5를 지원하지 않습니다 발견

7
IE 또는 Firefox Windows에서는 작동하지 않습니다. 그것은 단지 내가 요청한 공간을 삽입합니다
ekkis

Chrome 37은 줄 바꿈을 제거하지 않고 텍스트 영역에 자리 표시 자 텍스트를 표시합니다. 누구든지 '기능'의 이름이 무엇인지 알고 있으므로 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";
}

한 곳에서 회선을 유지하려면 다음을 시도하십시오. 이것의 단점은 크롬, 사파리, 웹킷 등의 다른 브라우저입니다. 첫 줄도 표시하지 않습니다.

<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에서 비슷한 데모를 얻을 수 있다면 매우 좋을 것입니다.


바이올린 링크를 제공해 주셔서 감사합니다. 다양한 브라우저에서 동작을 쉽게 확인할 수 있습니다. IE 10에서는 FF 12 (Windows)뿐만 아니라 두 버전 모두 실패합니다. 동정. Safari 6.1 작동 :(
ekkis

더 이상 Chrome에서 더 이상 작동하지 않습니다. 오랫 동안 가정합니다.
Mike Rockétt

6

AngularJS를 사용하는 경우 중괄호를 사용하여 원하는 것을 배치 할 수 있습니다. 여기에 바이올린이 있습니다.

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

1
나는 유사한 접근 방식을 사용하고 있지만, 사파리와 파이어 폭스에서 작동하지 않습니다
스탠

6

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> 

다음과 같이 렌더링되어야합니다.

여기에 이미지 설명을 입력하십시오


3

HTML5 스펙이 명시 장소 홀더 필드에 새로운 라인을 거부합니다. 웹킷 버전 / will / 자리 표시 자에 라인 피드 제시 할 때, 그러나 이것은 잘못된 동작이며 의존해서는 안 새로운 라인을 삽입합니다.

단락이 w3에 충분하지 않다고 생각합니다.)


1
사양에 CR / LF가있는 경우 발생해야하는 내용 이 없으므로 웹킷의 동작이 올바르지 않습니다.
Christian

1
@Christian 이제는 "사용자 에이전트가 줄 바꿈을 제거한 후이 힌트를 사용자에게 제시해야합니다 ..."라고 말합니다. 줄 바꿈 제거에 대한 내용은 다음과 같습니다. "사용자 에이전트가 문자열에서 줄 바꿈을 제거 할 때 사용자 에이전트는 해당 문자열에서"LF "(U + 000A) 및"CR "(U + 000D) 문자를 제거해야합니다. ".
Richard Turner

이 답변은 더 이상 사실이 아닙니다. 사양은 이제 명시 자리에서 줄 바꿈은 줄 바꿈으로 렌더링해야합니다.
Clonkex

3

반응 :

React를 사용하는 경우 다음과 같이 수행 할 수 있습니다.

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

2

textarea너비가 정적 인 경우 비 줄기 공간과 자동 텍스트 영역 줄 바꿈을 함께 사용할 수 있습니다. 모든 줄에 대해 공백을 nbsp로 바꾸고 두 개의 인접한 줄이 하나에 맞지 않도록하십시오. 실제로 line length > cols/2.

이것이 최선의 방법은 아니지만 유일한 브라우저 간 솔루션 일 수 있습니다.

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


1

CSS를 사용해 볼 수 있습니다. 저에게 효과적입니다. 여기에 속성 placeholder=" "이 필요합니다.

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

1

PHP에서 함수 chr (13) :

echo '<textarea class="form-control" rows="5" style="width:100%;" name="responsable" placeholder="NOM prénom du responsable légal'.chr(13).'Adresse'.chr(13).'CP VILLE'.chr(13).'Téléphone'.chr(13).'Adresse de messagerie" id="responsable"></textarea>';

0

나는 그것이 html / css에서만 가능하다고 생각하지 않습니다. JavaScript 또는 다른 종류의 핵을 사용하여 텍스트를 다음 줄로 밀어 넣을 수있는 추가 공간이있을 수 있습니다.


0

부트 스트랩 + 컨텐츠 편집 가능 + 여러 줄 플레이스 홀더

데모 : https://jsfiddle.net/39mptojs/4/

@cyrbil 및 @daniel 답변을 기반으로

부트 스트랩, jQuery 및 https://github.com/gr2m/bootstrap-expandable-input 사용 을 사용하여 자리 표시자를 컨텐츠 편집 가능으로 설정 .

"placeholder replace"자바 스크립트를 사용하고 CSS에 "white-space : pre"를 추가하면 여러 줄 플레이스 홀더가 표시됩니다.

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>

자바 스크립트 :

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

-1

원래 게시물의 워터 마크 솔루션이 효과적입니다. 고마워 누군가가 필요로하는 경우 여기에 각도 지시문이 있습니다.

(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'));
              }
            }
          }
        }
      };
    });
}());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.