텍스트 영역의 자리 표시 자 속성 안에 줄 바꿈을 삽입 하시겠습니까?


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

업데이트 : 크롬에서는 작동하지 않습니다. 그냥 텍스트 영역 너비였습니다.

참조 : http://jsfiddle.net/pdXRx/


2
PHP를 사용한다면 <?="\n"?>, 새로운 줄로 입력 할 수 있습니다
rybo111

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

3
2020 년인데 여전히 Safari 솔루션이 없습니까?
Ömer An

답변:


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
나는 가짜 자리 표시 자 효과를 자바 스크립트를 사용하여 확실하게 할 수 있지만, 좀 더 간단하게 뭔가를 기대했다
amosrivera

2
불행히도 @amosrivera 에는 스크립트 해결 방법 이외의 표준 방법이 없습니다. developer.mozilla.org/en/HTML/HTML5/…
Jason Gennaro

3
좋은 해결책,하지만 추가 할 if($(this).val() == 'This is...')받는 사람 focus은 다음 잃게 초점을 일부 텍스트를 추가, 그렇지 않은 경우, 핸들러, 다시 텍스트 영역을 클릭, 텍스트가 사라집니다.
Dennis Golomazov

2
@DenisGolomazov 좋은 추가; 방금 포커스 핸들러에서 확인 사항을 편집하여 제출했습니다. 수정 된 jsfiddle 예제에 대한 이번 업데이트에서 볼 수 있듯이 자리 표시 자 클래스와 스타일 지정 자리 표시자를 다르게 추가하는 것이 좋습니다. jsfiddle.net/airandfingers/pdXRx/249
Aaron

사용자가 자리 표시 자 텍스트와 정확히 일치하는 입력을하면 삭제되지 않습니까?
Arjuna

275

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

9
@DaveAlger-실제로 그렇지 않습니다. 방금 FF로 시도 &#10;하고 공백 문자를 생성하지 않고 문자 그대로 인쇄 합니다. developer.mozilla.org/en/HTML/HTML5/…
Merlyn Morgan-Graham

1
IE10 및 Chrome 62에서 작동합니다.
miny1997

1
최신 버전의 Firefox에서 매우 잘 작동합니다
ii iml0sto1

10
Firefox 60에서 작동합니다.
Rob Porter

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.

10
도구 인 경우 줄 바꿈처럼 보였지만 실제로는 텍스트 영역 너비를 감싸는 자리 표시 자일뿐입니다.
amosrivera

3
@amosrivera LOL, 적어도 그것에 대해 웃을 수 있습니다. 아무것도 시도하지
않고

1
정답입니다. 그러나 나는 규칙의 총체가 무의미하다고 생각합니다. LR 또는 CR을 "포함하지 않아야 함"에 대한 정확한 주장은 무엇입니까?
Jens A. Koch

2
@ Jens-AndréKoch 저는 자리 표시자가 단순해야한다고 주장합니다. 값이 줄 바꿈이 필요할 정도로 복잡하면이 주석 편집기에서 "도움말 표시"링크를 활성화 할 때 표시되는 것과 유사한 형제 요소로 존재해야합니다. 입력에 내용이 포함 된 후에는 자리 표시자가 표시되지 않습니다.
Tieson T.

54

업데이트 (2016 년 1 월) : 멋진 작은 핵이 더 이상 모든 브라우저에서 작동하지 않을 수 있으므로 아래에 작은 자바 스크립트가있는 새로운 솔루션이 있습니다.


좋은 작은 해킹

기분이 좋지는 않지만 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;텍스트 영역의 크기가 (참조 jsfiddle)에 고정되도록 CSS에서.

또는 새 줄을 원할 때 return 키를 두 번 누르십시오 (따라서 '새 줄'사이에 빈 줄이 있습니다. 만들어진 '빈 줄'에는 텍스트 영역의 너비와 같은 충분한 탭 / 공간이 있어야합니다. 너무 많은 경우 문제가되지 않는 것만으로 충분합니다. 이것은 너무 더럽고 브라우저와 호환되지 않을 수 있습니다. 더 쉬운 방법이 있었으면 좋겠습니다!


더 나은 솔루션

JSFiddle을 확인하십시오 .

  • 이 솔루션은 텍스트 영역 뒤에 div를 배치합니다.
  • 일부 자바 스크립트는 텍스트 영역의 배경색을 변경하여 자리 표시자를 적절하게 숨기거나 표시하는 데 사용됩니다.
  • 입력과 자리 표시자는 동일한 글꼴 크기를 가져야하므로 두 믹스 인입니다.
  • 텍스트 영역 의 box-sizingdisplay: block속성이 중요하거나 뒤에있는 div의 크기가 동일하지 않습니다.
  • 텍스트 영역의 설정 resize: vertical및 a min-height도 중요합니다. 자리 표시 자 텍스트가 어떻게 줄 바꿈되는지 확인하고 텍스트 영역을 확장하면 흰색 배경이 유지됩니다. 그러나 resize속성을 주석 처리 하면 텍스트 영역을 가로로 확장 할 때 문제가 발생합니다.
  • 텍스트 영역의 최소 높이가 전체 자리 표시자를 가장 작은 너비로 덮을 수있을만큼 충분한 지 확인하십시오. **

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

자바 스크립트 :

$("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

2
IE에서 테스트 할 누군가를 좋아합니다. 최신 버전의 Safari 및 Chrome에서는 작동하지만 Firefox에서는 작동하지 않습니다. 이제 자리 표시 자 대신 텍스트를 사용하고 텍스트를 자리 표시 자처럼 보이도록 CSS 클래스가 있습니다. 그런 다음 작은 jQuery 함수는 텍스트에 포커스가있을 때 텍스트를 지우거나 비어 있으면 다시 넣습니다!
패트릭

2
Chrome 및 IE 11에서는 제대로 작동하지만 Firefox 및 Android 기본 브라우저에서는 작동하지 않습니다.
화학 프로그래머

1
Safari, Firefox, Opera에서 작동하지 않습니다. Chrome에서만 작동 :(
by0

1
현재 답변은 "자리 표시 자"값을 양식과 함께 제출할 수 있으므로 허용되는 답변이어야합니다. 참고 : "더 나은 솔루션"아래의 솔루션은 브라우저 간에서 올바르게 작동합니다. 다른 의견은 "A Nice Little Hack"을 언급해야합니다.
Roy Prins 2012

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 솔루션 중 가장 좋은 솔루션입니다.
aendrew

이 솔루션은 Firefox (22.0-28.0b9에서 테스트)에서 작동하지 않습니다.
Hartwig

@Hartwig 나는 실제로 같은 것을 알았습니다. 어떤 이유로 Firefox는 이것을 올바르게 처리하지 못합니다. 실제로 그것은 IE에서 작동하지 않습니다 ==> 불행히도 WebKit 만 있습니다.
Samuli Hakoniemi

15

살라 문 알레 쿰

&#10;

Chrome에서 작동

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

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

Windows 10.0 (빌드 10240) 및 Chrome 버전 47.0.2526.80 m에서 이것을 테스트했습니다.

08:43:08 AST 6 Rabi Al-Awwal, 1437 2015 년 12 월 17 일 목요일

감사합니다


10

CSS 또는 자바 스크립트를 작성할 필요없이 줄 바꿈을 위해 & # 10 만 추가하십시오.

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

이전 답변 :

아니요, 자리 표시 자 속성에서는 그렇게 할 수 없습니다. 같은 줄 바꿈을 HTML로 인코딩 할 수도 없습니다.&#13;&#10;자리 표시 자 .

새로운 답변 :

최신 브라우저는 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 이 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/


이것은 첫 번째 문장 다음에 약간의 공간을 두드리는 것이므로 더 많은 열이나 유연한 너비에는 사용할 수 없습니다.
Jeffrey Neo

5

순수한 HTML로 할 수는 없지만이 jQuery 플러그인을 사용하면 다음을 수행 할 수 있습니다 : https://github.com/bradjasper/jQuery-Placeholder-Newlines


나를 위해 일한 니스, 나는이 하나 마티아스에 의해 표준 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>

자바 스크립트는 매우 간단합니다

<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> 다른 스타일로 .

편집
여기에 전체 코드 스 니펫이 포함 된 Richard의 원래 답변 이 있습니다.


1
jsfiddle을 포함시킬 때마다 여기에 코드를 설명하고 붙여 넣으십시오. 따라서 추가 참조를 위해 코드가 있으며 내용이 jsfiddle에 영원히 존재할 것이라고 의존 할 필요가 없습니다.
avcajaraville

당신은 맞습니다, @avcajaraville. 그러나 Richard의 원래 답변이 같은 주제에 있기 때문에 전체 코드 스 니펫을 포함하지 않았으며 간단한 수정입니다. 대신에 나는 그의 대답을 지적했다.
Gongdo Gong

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내장 자리 표시 자와 똑같이 보이고 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>


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.