มีวิธีทำให้ textarea ยืดให้พอดีกับเนื้อหาโดยไม่ต้องใช้ PHP หรือ JavaScript หรือไม่?


97

ฉันกำลังกรอก textarea ที่มีเนื้อหาเพื่อให้ผู้ใช้แก้ไข

เป็นไปได้ไหมที่จะทำให้มันยืดออกเพื่อให้พอดีกับเนื้อหาด้วย CSS (เช่นoverflow:showdiv)


1
ไม่มีใครมีคำตอบที่ไม่มีจุดบกพร่องใด ๆ ที่ไม่ใช้กรอบ? :-(
starbeamrainbowlabs

ฉันใช้ css max-width: 100% และมันพอดีกับกล่องโดยอัตโนมัติ มีปัญหาอะไรไหม
yashas123

นี่เป็นทางออกที่ทันสมัย (ใช้หนึ่งบรรทัดของ JS และบางเล่นกล CSS): codepen
Oliver

คำตอบ:



219

หนึ่งบรรทัดเท่านั้น

<textarea name="text" oninput='this.style.height = "";this.style.height = this.scrollHeight + "px"'></textarea>

8
วิธีนี้มีเพียงสองโหวต นี่คือมาร์ตินที่น่าทึ่ง ฉันใช้เวลา 30 นาทีในการแก้ปัญหานี้ การทำงานที่ดี.
Philip Duffney

31
นี่มันเยี่ยมมาก ฉันแค่อยากจะเพิ่มว่าการเปลี่ยนthis.scrollHeight + "px"เพื่อthis.scrollHeight + 3 + "px"ทำให้พื้นที่ข้อความใหญ่พอที่จะไม่แสดงแถบเลื่อน
maarten

ปัญหา: เมื่อผู้ใช้เขียนมากพอที่จะเลื่อนลงระบบจะรีเซ็ตตำแหน่งการเลื่อนทุกครั้งที่เพิ่มบรรทัดใหม่ด้วย Enter
Costa

5
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันมีพื้นที่ข้อความในหน้าแก้ไขและมีค่าอยู่แล้วเมื่อโหลดหน้าเว็บฉันจะขยายให้พอดีกับเนื้อหาได้อย่างไร
Arootin Aghazaryan

1
@ArootinAghazaryan - คุณอาจคิดวิธีแก้ปัญหาไปแล้ว แต่สำหรับคนอื่น: เพียงแค่สร้างฟังก์ชันที่มีโค้ดปรับขนาดแทนที่จะให้อินไลน์ใน HTML จากนั้นคุณสามารถเรียกใช้ฟังก์ชันเดียวกันในการโหลดหน้า
Magnus Eriksson

6

นี่คือฟังก์ชั่นที่ใช้งานได้กับ jQuery (สำหรับความสูงเท่านั้นไม่ใช่ความกว้าง):

function setHeight(jq_in){
    jq_in.each(function(index, elem){
        // This line will work with pure Javascript (taken from NicB's answer):
        elem.style.height = elem.scrollHeight+'px'; 
    });
}
setHeight($('<put selector here>'));

หมายเหตุ: ฝ่ายปฏิบัติการขอวิธีแก้ปัญหาที่ไม่ใช้ Javascript แต่สิ่งนี้น่าจะเป็นประโยชน์กับหลาย ๆ คนที่เจอคำถามนี้


5

นี่เป็นวิธีแก้ปัญหาที่ง่ายมาก แต่ใช้ได้กับฉัน:

<!--TEXT-AREA-->
<textarea id="textBox1" name="content" TextMode="MultiLine" onkeyup="setHeight('textBox1');" onkeydown="setHeight('textBox1');">Hello World</textarea>

<!--JAVASCRIPT-->
<script type="text/javascript">
function setHeight(fieldId){
    document.getElementById(fieldId).style.height = document.getElementById(fieldId).scrollHeight+'px';
}
setHeight('textBox1');
</script>


2
ความสูงของกล่องจะเพิ่มขึ้นทุกจังหวะสำคัญไม่ใช่แค่การขึ้นบรรทัดใหม่ แม้แต่ backspace และลบก็ทำให้ความสูงเพิ่มขึ้น แก้ไขแล้วคุณจะได้รับคะแนนโหวตกลับมา
Birrel

เบราว์เซอร์บางตัวเช่น IE ไม่สามารถคำนวณความสูงในการเลื่อนได้อย่างถูกต้องซึ่งอาจทำให้เกิดปัญหาเหล่านั้นได้ ไม่เป็นไรที่เกิดขึ้นกับฉันใน Chrome เช่นกัน ...
KthProg

1
นี่คือวิธีแก้ปัญหา (คิวแก้ไขเต็ม): <style> textarea { resize: none; overflow: auto; } </style> <!--TEXT-AREA--> <textarea onkeyup="setHeight.call(this);">Hello World</textarea> <!--JAVASCRIPT--> <script type="text/javascript"> function setHeight(){ this.style.height = '1px'; this.style.height = this.scrollHeight + 'px'; } </script>โดยทั่วไปคุณต้องตั้งค่าความสูงเป็น 1px ก่อนเนื่องจากสิ่งนี้: stackoverflow.com/questions/10722058/…
KthProg

3

อีกวิธีง่ายๆสำหรับการควบคุมพื้นที่ข้อความแบบไดนามิก

<!--JAVASCRIPT-->
<script type="text/javascript">
$('textarea').on('input', function () {
            this.style.height = "";
            this.style.height = this.scrollHeight + "px";
 });
</script>

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