แทรกตัวแบ่งบรรทัดภายในแอตทริบิวต์ตัวยึดตำแหน่งของ textarea หรือไม่


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

ปรับปรุง: มันไม่ทำงานในโครเมี่ยม มันเป็นเพียงความกว้างของ textarea

ดู: 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
ฉันสามารถปลอมผลตัวยึดตำแหน่งโดยใช้จาวาสคริปต์ได้ แต่ฉันหวังว่าจะได้อะไรที่ง่ายกว่านี้อีกแล้ว
amosrivera

2
น่าเสียดายที่ @amosrivera นั้นดูเหมือนจะไม่มีวิธีมาตรฐาน: developer.mozilla.org/en/HTML/HTML5/ ...... นอกเหนือจากวิธีแก้ปัญหาแบบสคริปต์
Jason Gennaro

3
วิธีแก้ปัญหาที่ดี แต่ฉันจะเพิ่มif($(this).val() == 'This is...')ไปยังfocusตัวจัดการมิฉะนั้นถ้าคุณเพิ่มข้อความบางส่วนจากนั้นก็เสียสมาธิแล้วคลิกที่ textarea อีกครั้งข้อความของคุณจะหายไป
Dennis Golomazov

2
@DenisGolomazov นอกจากนี้ดี; ฉันเพิ่งส่งการแก้ไขพร้อมการตรวจสอบในตัวจัดการโฟกัส ฉันยังแนะนำให้เพิ่มคลาสตัวยึดตำแหน่งและตัวยึดตำแหน่งการจัดแต่งทรงผมแตกต่างกันดังที่แสดงในการอัปเดตนี้กับตัวอย่าง jsfiddle ที่ฉันแก้ไข: jsfiddle.net/airandfingers/pdXRx/249
Aaron

จะเกิดอะไรขึ้นถ้าผู้ใช้ป้อนข้อมูลที่ตรงกับข้อความของตัวยึดตำแหน่งนั้นจะไม่ถูกลบด้วย
Arjuna

276

คุณสามารถแทรกเอนทิตี 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/…
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
ฉันเป็นเครื่องมือมันดูเหมือนการทำลายเส้น แต่ในความเป็นจริงมันเป็นเพียงตัวยึดตำแหน่งล้อมรอบความกว้างของ textarea ..
amosrivera

3
@amosrivera LOL อย่างน้อยคุณก็หัวเราะได้ใช่มั้ย ไม่มีอะไรหายไปจากการลอง ... :]
Tieson T.

1
คำตอบนั้นถูกต้อง แต่ฉันพิจารณาเรื่องไร้สาระทั้งหมดของกฎ อาร์กิวเมนต์ที่แน่นอนของ "ต้องไม่มี" LR หรือ CR คืออะไร
Jens A. Koch

2
@ Jens-AndréKochฉันถือว่าอาร์กิวเมนต์เป็นตัวยึดตำแหน่งที่ควรจะง่าย หากค่ามีความซับซ้อนมากพอที่จะต้องมีการแบ่งบรรทัดมันควรจะมีอยู่เป็นองค์ประกอบพี่น้องคล้ายกับสิ่งที่คุณเห็นถ้าคุณเปิดใช้งานลิงค์ "แสดงความช่วยเหลือ" โดยแก้ไขความคิดเห็นนี้ ตัวยึดจะไม่ปรากฏเมื่ออินพุตมีเนื้อหาหลังจากทั้งหมด ...
Tieson T.

54

อัปเดต (ม.ค. 2559):แฮ็คตัวเล็ก ๆ อาจไม่ทำงานบนเบราว์เซอร์ทั้งหมดอีกต่อไปดังนั้นฉันจึงมีโซลูชันใหม่พร้อมจาวาสคริปต์เล็ก ๆ ด้านล่าง


แฮ็คน้อยที่ดี

รู้สึกไม่ดี แต่คุณสามารถใส่บรรทัดใหม่ใน 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)

อีกทางเลือกหนึ่ง เมื่อคุณต้องการขึ้นบรรทัดใหม่ให้กดส่งคืนสองครั้ง (ดังนั้นจะมีบรรทัดว่างระหว่าง 'บรรทัดใหม่' ของคุณการสร้าง 'บรรทัดว่าง' นี้จำเป็นต้องมีแท็บ / ช่องว่างเพียงพอที่จะเท่ากับความกว้างของ textarea ของคุณ ดูเหมือนจะมีความสำคัญถ้าคุณมีมากเกินไปคุณแค่ต้องการพอนี่สกปรกมากและอาจไม่เข้ากันได้กับเบราว์เซอร์ฉันหวังว่าจะมีวิธีที่ง่ายกว่านี้!


ทางออกที่ดีกว่า

ตรวจสอบJSFiddle

  • วิธีการแก้ปัญหานี้ตำแหน่ง div หลัง textarea
  • จาวาสคริปต์บางตัวใช้เพื่อเปลี่ยนสีพื้นหลังของ textarea ซ่อนหรือเปิดเผยตัวยึดตำแหน่งอย่างเหมาะสม
  • อินพุตและตัวยึดต้องมีขนาดแบบอักษรเดียวกันดังนั้นทั้งสองมิกซ์อิน
  • box-sizingและdisplay: blockคุณสมบัติในการ textarea มีความสำคัญหรือ div ที่อยู่เบื้องหลังมันจะไม่เป็นขนาดเดียวกัน
  • การตั้งค่าresize: verticalและ a min-heightบน textarea ก็มีความสำคัญเช่นกันโปรดสังเกตว่าตัวยึดข้อความจะตัดและขยาย textarea อย่างไรจะรักษาพื้นหลังสีขาว อย่างไรก็ตามการแสดงความคิดเห็นออกresizeคุณสมบัติจะทำให้เกิดปัญหาเมื่อขยาย textarea แนวนอน
  • เพียงตรวจสอบให้แน่ใจว่าความสูงขั้นต่ำของ textarea นั้นเพียงพอที่จะครอบคลุมพื้นที่ที่คุณยึดไว้ทั้งหมดด้วยความกว้างที่เล็กที่สุด **

ภาพหน้าจอของ 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 แน่นอน เราสามารถยืนยันได้ว่ามันทำงานเหมือนกันในเบราว์เซอร์หลักอื่น ๆ ทั้งหมดหรือไม่
Mark Amery

2
ฉันจะรักใครสักคนเพื่อทดสอบใน IE ฉันสามารถยืนยันได้ว่าทำงานได้กับ Safari และ Chrome เวอร์ชันล่าสุด แต่ไม่ใช่ Firefox แน่นอน ตอนนี้ฉันใช้ข้อความแทนตัวยึดตำแหน่งและมีคลาส css เพื่อทำให้ข้อความดูเหมือนตัวยึดตำแหน่ง จากนั้นฟังก์ชั่น jQuery ขนาดเล็กเพื่อล้างข้อความเมื่อมีการโฟกัสหรือนำกลับมาใช้ใหม่ถ้าว่าง!
Patrick

2
ทำงานได้ดีใน Chrome และ IE 11 แต่ไม่สามารถใช้งานได้กับเบราว์เซอร์เริ่มต้นของ Firefox และ Android
โปรแกรมเมอร์เคมี

1
ไม่ทำงานบน Safari, Firefox, Opera ใช้งานได้เฉพาะใน Chrome :(
by0

1
นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากคำตอบปัจจุบันอาจส่งค่า "ตัวยึดตำแหน่ง" ด้วยแบบฟอร์ม หมายเหตุ: โซลูชันภายใต้ "A Better Solution" จะทำงานข้ามเบราว์เซอร์ได้อย่างถูกต้อง ความคิดเห็นที่ต่างกันต้องอ้างถึง "A Nice Little Hack"
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
นี่คือทางออกที่ดีที่สุดของรายการทั้งหมดที่อยู่ที่นี่ IMO
aendrew

วิธีนี้ไม่ทำงานใน Firefox (ทดสอบบน 22.0-28.0b9)
Hartwig

@Hartwig จริง ๆ แล้วฉันก็สังเกตเห็นเหมือนกัน ด้วยเหตุผลบางอย่าง Firefox ไม่สามารถจัดการเรื่องนี้ได้อย่างถูกต้อง จริงๆแล้วมันใช้งานไม่ได้บน IE ทั้ง ==> น่าเสียดายที่มันเป็น WebKit เท่านั้น
Samuli Hakoniemi

15

Salaamun Alekum

&#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 Rabi Al-Awwal, 1437 พฤหัสบดี, 17 ธันวาคม 2558

ขอบคุณ


10

เพิ่มเพียง & # 10 สำหรับการขึ้นบรรทัดใหม่ไม่จำเป็นต้องเขียน CSS หรือจาวาสคริปต์

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 และไม่สามารถใช้กับคอลัมน์เพิ่มเติมหรือความกว้างที่ยืดหยุ่นได้
Jeffrey Neo

5

คุณไม่สามารถทำได้ด้วย HTML บริสุทธิ์ แต่ปลั๊กอิน jQuery นี้จะช่วยให้คุณ: https://github.com/bradjasper/jQuery-Placeholder-Newlines


ดีทำงานให้ฉันฉันแทนที่ jquery.placeholder มาตรฐานโดย matthias กับอันนี้และต้องเปลี่ยนสายเหล่านี้: $('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');
});

2

Textarea เคารพคุณสมบัติ white-space สำหรับตัวยึดตำแหน่ง 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>และรูปแบบอื่น ๆ บางส่วนเช่นกัน

แก้ไข
นี่คือคำตอบดั้งเดิมของ 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;

value แทนสตริงเดิม


1

ลองดูโซลูชันนี้พร้อมตัวยึดตำแหน่งที่กำหนดเอง

  • คุณได้ตัวยึดหลายบรรทัดที่ใช้ได้กับเบราว์เซอร์ทุกประเภท
  • มันเป็นไปได้ที่จะปรับแต่งตัวแทนจำหน่ายตามที่คุณต้องการ

การสาธิตเกี่ยวกับไวโอลิน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.