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


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.