Вставить разрыв строки внутри атрибута-заполнителя текстовой области?


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"?>как новую строку
— rybo111

39
Просто добавьте &#10;в атрибут заполнителя, как <textarea placeholder="This is a line&#10;This is another one"></textarea>. Ответ ниже.
— 1

4
@ lu1s это работает в Chrome, IE, но не в Firefox и Safari.
— mb21

1
@ mb21 Я протестировал его минуту назад в Firefox 60.0.2 и теперь он работает. Может быть, это будет работать в большинстве браузеров сейчас.
— tsuma534

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/… , кроме сценария обходного пути.
— Джейсон Дженнаро

3
хорошее решение, но я бы добавил if($(this).val() == 'This is...')к focusобработчику, в противном случае, если вы добавите некоторый текст, затем потеряете фокус, а затем снова щелкните текстовую область, ваш текст исчезнет.
— Денис Голомазов,

2
@DenisGolomazov Хорошее дополнение; Я только что представил редактирование с проверкой в ​​обработчике фокуса. Я также рекомендую по-разному добавлять класс-заполнитель и оформлять заполнители, как показано в этом обновлении для моего измененного примера jsfiddle
— Аарон,

Что если пользователь сделал ввод, который точно соответствует вводимому тексту, не будет ли он также удален?
— Арджуна

278

Вы можете вставить новую строку html-сущности &#10;внутри атрибута placeholder:

<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 Морган-Graham

1
Работает на IE10 и Chrome 62.
— miny1997

1
Очень хорошо работает в новых версиях Firefox
— ii iml0sto1

10
Работает в Firefox 60.
— Роб Портер

57

Не думайте, что вам разрешено это делать: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Соответствующий контент (акцент мой):

Атрибут placeholder представляет краткую подсказку (слово или короткую фразу), предназначенную для помощи пользователю с вводом данных, когда элемент управления не имеет значения. Подсказкой может быть примерное значение или краткое описание ожидаемого формата. Атрибут, если он указан, должен иметь значение, которое не содержит символов U + 000A LINE FEED (LF) или U + 000D CARRIAGE RETURN (CR).


@amosrivera Хмм. Что ж, поставщики могут интерпретировать спецификацию так, как считают нужным.
— Тисон Т.

10
я инструмент, это выглядело как разрыв строки, но на самом деле это был просто заполнитель, оборачивающийся вокруг ширины текстовой области ..
— amosrivera

3
@amosrivera LOL, по крайней мере, вы можете смеяться над этим, верно? Ничего не потеряно при попытке ...:]
— Тисон Т.

1
Ответ правильный. но я считаю правилом полную глупость. Какой точный аргумент для "не должен содержать" LR или CR?
— Йенс А. Кох

2
@ Jens-AndréKoch Я предполагаю, что аргумент в том, что заполнитель должен быть простым; если значение достаточно сложное, чтобы нуждаться в переносе строк, оно должно существовать как элемент-брат, аналогично тому, что вы видите, если вы активируете ссылку «show help» в этом редакторе комментариев. Заполнитель не виден, если вход содержит контент, в конце концов ...
— Tieson T.

54

ОБНОВЛЕНИЕ (январь 2016 г.): приятный небольшой взлом может не сработать во всех браузерах, поэтому у меня есть новое решение с небольшим количеством JavaScript ниже.


Хороший маленький взломать

Это не очень приятно, но вы можете просто вставить новые строки в HTML. Как это:

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

Обратите внимание, что каждая строка находится на новой строке (без переноса), а каждый отступ «tab» равен 4 пробелам. Конечно, это не очень хороший метод, но, похоже, он работает:

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

  • Вполне вероятно, что уровень отступа каждой строки будет варьироваться в зависимости от ширины вашей текстовой области.
  • Важно иметь resize: none;в css, чтобы размер текстовой области был фиксированным (см. Jsfiddle).

В качестве альтернативы, если вы хотите новую строку, дважды нажмите return (чтобы между вашими «новыми строками» была пустая строка. Для создания этой «пустой строки» должно быть достаточно табуляции / пробелов, которые бы равнялись ширине текстовой области. Кажется, не имеет значения, если у вас слишком много, вам просто нужно достаточно. Это настолько грязно и, вероятно, не совместимо с браузером. Хотелось бы, чтобы был более легкий путь!


Лучшее решение

Проверьте JSFiddle .

  • Это решение размещает div за текстовой областью.
  • Некоторый javascript используется для изменения цвета фона текстовой области, скрывая или раскрывая заполнитель соответствующим образом.
  • Входные данные и заполнители должны иметь одинаковый размер шрифта, следовательно, два миксина.
  • box-sizingиdisplay: block свойства на текстовое поле являются важными или ДИВ за ним не будет иметь тот же размер.
  • Установка 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();
}

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. Можем ли мы подтвердить, что он работает одинаково во всех других основных браузерах?
— Марк Эмери

2
Я хотел бы, чтобы кто-то проверил это в IE. Я могу подтвердить, что он работает на самых последних версиях Safari и Chrome, но определенно не на Firefox. Теперь я использую текст вместо заполнителя и имею класс css, чтобы текст выглядел как заполнитель. Затем небольшая функция jQuery, чтобы очистить текст, когда он имеет фокус, или вернуть его обратно, если он пуст!
— Патрик

2
Прекрасно работает в Chrome и IE 11. Но не работает в браузере Firefox и Android по умолчанию.
— Химический программист

1
Не работает на Safari, Firefox, Opera. Работает только в Chrome :(
— by0

1
Это должен быть принятый ответ, потому что текущий может отправить значение «заполнителя» вместе с формой. Примечание: решение в разделе «Лучшее решение» корректно работает в разных браузерах. Комментарии, говорящие по-разному, должны ссылаться на «Хороший маленький взлом»
— Рой Принс

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
Это лучшее решение из всех перечисленных здесь, ИМО.
— '37

Это решение не работает в Firefox (протестировано 22.0-28.0b9).
— Хартвиг,

@Hartwig Я действительно заметил то же самое. По какой-то причине Firefox не справляется с этим правильно. На самом деле это не работает и в IE ==> К сожалению, это только WebKit.
— Самули Хакониеми

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 м

08:43:08 AST 6 Rabi Al-Awwal, 1437, четверг, 17 декабря 2015 г.

Спасибо


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

Старый ответ:

Нет, вы не можете сделать это в атрибуте заполнителя. Вы даже не можете 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/


Это просто табуляция некоторого пробела после 1-го предложения, и его нельзя использовать для большего числа строк или гибкой ширины
— Джеффри Нео

5

Вы не можете сделать это с чистым HTML, но этот плагин jQuery позволит вам: https://github.com/bradjasper/jQuery-Placeholder-Newlines


Хорошо, сработало для меня, я заменил стандартный jquery.placeholder на matthias на этот и должен был заменить эти вызовы: $('input, textarea').placeholder();этим$('input[placeholder], textarea[placeholder]').placeholder();
— ryan2johnson9

4

Немного улучшенная версия ответа Джейсона Дженнаро (см. Комментарии к коду):

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

Мне понравились работы Джейсона Дженнаро и Дениса Голомазова, но я хотел чего-то более полезного в глобальном масштабе. Я изменил концепцию, чтобы ее можно было добавить на любую страницу без каких-либо последствий.

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

2

Textarea уважает атрибут пробела для заполнителя. https://www.w3schools.com/cssref/pr_text_white-space.asp

Установка его в pre-line решила проблему для меня.

textarea {
  white-space: pre-line;
}
<textarea placeholder='This is a line     
should this be a new line'></textarea>


1

Я изменил скрипку @Richard Bronosky следующим образом .

Лучше использовать data-*атрибут, а не пользовательский атрибут. Я заменил <textarea placeholdernl>на <textarea data-placeholder>и некоторые другие стили , а также.

Отредактированный
Вот оригинальный ответ Ричарда, который содержит полный фрагмент кода.


1
Лучше, чтобы всякий раз, когда вы включали jsfiddle, здесь также объясняли и вставляли код, поэтому у нас есть его для дальнейшего использования, и нам не нужно полагаться, что контент будет в jsfiddle навсегда.
— avcajaraville

Вы правы, @avcajaraville. Но я не включил полный фрагмент кода, так как оригинальный ответ Ричарда на ту же тему, а мой - просто простая модификация. Вместо этого я указал его ответ.
— Гондо Гун

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.