Вставити розрив рядка всередині атрибута заповнювача текстової області?


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 і тепер він працює. Можливо, це буде працювати в більшості браузерів зараз.
tsuma534

3
Настає 2020 рік і все ще немає рішення для Safari?
Ömer

Відповіді:


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
Aaron

Що робити, якщо користувач зробив вклад, що відповідає точно тексту тексту заповнення, не буде це також стерто?
Арджуна

274

Ви можете вставити новий об’єкт html-рядка &#10;всередині атрибута заповнення:

<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/…
Мерлін Морган-Грем

1
Працює на IE10 та Chrome 62.
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 POVURN CARRIAGE (CR).


@amosrivera Хм. Що ж, продавцям дозволено інтерпретувати технічні характеристики в той спосіб, який вони вважають за потрібне.
Тієсон Т.

10
у них інструмент, це виглядало як розрив лінії, але насправді це просто заповнювач, що обертається навколо ширини текстової області ..
amosrivera

3
@amosrivera LOL, принаймні ви можете посміятися з цього приводу, правда? Нічого не втрачено спробувавши ...:]
Tieson T.

1
Відповідь правильна. але я вважаю правило загальною нісенітницею. Який точний аргумент для "не повинен містити" LR або CR?
Єнс А. Кох

2
@ Jens-AndréKoch Я припускаю, що аргумент полягає в тому, що заповнювач місця повинен бути простим; якщо значення є досить складним, щоб потребувати перерв рядків, воно повинно існувати як елемент сибінгу, подібний до того, що ви бачите, якщо активувати посилання "показати допомогу" цим редактором коментарів.
Зрештою,

54

ОНОВЛЕННЯ (січень 2016): Гарний маленький хак може більше не працювати у всіх браузерах, тому в мене нижче є нове рішення з крихітним шматочком 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;в css, щоб розмір textarea був фіксованим (див. Jsfiddle).

Як альтернативи Якщо ви хочете нову лінію, вдарив повернення в два рази (Так що є порожній рядок між вашими "новими лініями. Ця« порожній рядок » , створеної потреби мати достатню кількість вкладок / прогалин , які прирівнюються до ширини вашого текстового поля. Це Байдуже Мабуть, не має значення, якщо їх занадто багато, тобі просто потрібно достатньо. Це так брудно, але, ймовірно, не сумісний із браузером. Я б хотів, щоб був простіший спосіб!


Краще рішення

Перевір JSFiddle .

  • Це рішення позиціонує діву за текстовою областю.
  • Деякі javascript використовуються для зміни кольору фону текстової області, приховування або виявлення заповнювача місця.
  • Введення та заповнювачі повинні мати однакові розміри шрифту, отже, два комбінації.
  • В box-sizingі display: blockвластивості на текстове поле є важливими або ДІВ за ним не буде мати той же розмір.
  • Налаштування resize: verticalта 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 :(
до

1
Це має бути прийнятою відповіддю, оскільки поточний може надіслати значення "заповнення" за допомогою форми. Примітка: рішення в розділі "Краще рішення" працює правильно у веб-переглядачі. У коментарях, що говорять про різні, слід посилатися на "Гарний маленький хак".
Roy Prins

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
Це найкраще рішення з усіх перелічених тут ІМО.
aendrew

Це рішення не працює у 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 (Build 10240) та Google Chrome версії 47.0.2526.80 m

08:43:08 AST 6 Рабі Аль-Аввал, 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/


Це просто вкладка пробілу після першого речення, і його не можна використовувати для більшої кількості знаків або гнучкої ширини.
Джеффрі Нео

5

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


Приємно, працював для мене, я замінив стандартний jquery.placeholder матіасом на цей і повинен був замінити ці дзвінки: $('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

Встановлення його на попередній рядок вирішило для мене проблему.

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


1

Я змінив загадку @ Річарда Броноського так .

Краще підходити до використання 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.