การตัดข้อความภายในประเภทอินพุต = องค์ประกอบ "ข้อความ" HTML / CSS


96

HTML ที่แสดงด้านล่าง

<input type="text"/>

จะปรากฏในเบราว์เซอร์ดังนี้:


เมื่อฉันเพิ่มข้อความต่อไปนี้

สุนัขจิ้งจอกสีน้ำตาลได้อย่างรวดเร็วเพิ่มขึ้นกว่าสุนัขขี้เกียจ.

โดยใช้ HTML ด้านล่าง

<input type="text" value="The quick brown fox jumped over the lazy dog."/>

จะปรากฏในเบราว์เซอร์ดังนี้:


แต่ฉันต้องการให้แสดงในเบราว์เซอร์ดังนี้:


ฉันต้องการให้ข้อความในองค์ประกอบอินพุตของฉันถูกตัดออก สามารถทำได้โดยไม่ต้องมี textarea หรือไม่?


3
ไม่ฉันไม่คิดว่ามันจะทำได้ แต่ทำไม textarea ถึงไม่ใช่ตัวเลือก?
Pekka

35
การใช้ textarea บางครั้งอาจไม่ใช่ทางเลือกเนื่องจากคุณไม่ต้องการให้ป้อนข้อความหลายบรรทัด เพียงเพื่อตัดข้อความบรรทัดเดียว (หมายเหตุ: ไม่ใช่สิ่งเดียวกัน)
Flatliner DOA

มีวิธีแก้ปัญหาที่กล่าวถึงเพื่อจุดประสงค์ที่แน่นอนนี้ด้วยCSSWGสำหรับการสร้างมาตรฐาน แต่น่าเศร้าที่ฉันไม่พบปัญหา
Null


1
@Pekka 웃ไม่ใช่ว่าจะเกี่ยวข้อง แต่มีเหตุผลบางประการ ได้แก่ เราไม่สามารถใช้การตรวจสอบความถูกต้องของ html5 บน textareas ได้ เราไม่สามารถใช้ข้อ จำกัด ของรูปแบบเพื่อตรวจสอบพื้นที่ข้อความ textarea เป็นคำพ้องความหมายที่ไม่จำเป็นสำหรับ input type = text (เป็นอินพุตที่เป็น type text!) ซึ่งหมายถึงการจัดแต่งทรงผมเป็นสองเท่า ฯลฯ เป็นต้นกล่าวโดยย่อมีหลายสาเหตุ
Peter Konga-Kamau

คำตอบ:


62

นั่นคือtextareaงานของ - สำหรับการป้อนข้อความหลายบรรทัด input จะไม่ทำมัน ; มันไม่ได้ออกแบบมาให้ทำ

ดังนั้นใช้ไฟล์textarea. นอกจากความแตกต่างของภาพแล้วยังเข้าถึงผ่าน JavaScript ในลักษณะเดียวกัน (ใช้valueคุณสมบัติ)

คุณสามารถป้องกันการขึ้นบรรทัดใหม่ผ่านทางไฟล์ inputกิจกรรมและใช้ไฟล์replace(/\n/g, '').


69
สิ่งนี้ไม่ได้ตอบคำถามเกี่ยวกับวิธีรวบรวมอินพุตบรรทัดเดียวในขณะที่แสดงผลรวมระหว่างการเข้า
ehdv

3
ปัญหาสำคัญของปัญหานี้คือพื้นที่ข้อความจะไม่กดปุ่ม go บนอุปกรณ์เคลื่อนที่
แดน

2
@alex แน่นอน ดังนั้นหากคุณต้องการอินพุตแบบหลายบรรทัดจริง textarea จะดีกว่า แต่ถ้าคุณต้องการเพียงแค่การป้อนข้อมูลแบบห่อคำโซลูชัน css จะดีกว่า
แดน

1
ผมกำลังจะบอกว่า<textarea>จะไม่ทำงานกับสิ่งที่ต้องการเติมข้อความอัตโนมัติของ jQuery แต่เพียงเปลี่ยน<input>ไป<textarea>และนั่นคือทั้งหมดที่จำเป็น ไชโยสำหรับมาตรฐาน!
Sablefoste

9
ดังที่กล่าวไว้ข้างต้น: การตัดบรรทัด! == สตริงหลายบรรทัด ฉันไม่แน่ใจว่าเหตุใดจึงเป็นคำตอบที่ได้รับการยอมรับเนื่องจากไม่ตอบคำถาม
mattLummus

37

Word Break จะเลียนแบบเจตนาบางอย่าง

    input[type=text] {
        word-wrap: break-word;
        word-break: break-all;
        height: 80px;
    }
<input type="text" value="The quick brown fox jumped over the lazy dog" />

วิธีแก้ปัญหาคือโซลูชันนี้สูญเสียประสิทธิภาพในเบราว์เซอร์บางตัว โปรดตรวจสอบการสาธิต: http://cssdesk.com/dbCSQ


7
ฉันเพิ่งทดสอบใน Firefox 43.0.4 และใช้งานไม่ได้ แต่ใน Safari 9 และ Chrome 48 ดูเหมือนว่าจะใช้งานได้: cssdesk.com/dbCSQ
Jason Sperske

6
การสาธิตที่แนบมาโดย @JasonSperske ไม่ได้ผลสำหรับฉันทั้งใน Firefox 45 ไม่ใช่ใน Chrome 50
czerny

การสาธิตใช้งานได้สำหรับฉันใน chrome 48 บน linux แต่ css เดียวกันในหน้าของฉันเองใช้ไม่ได้
Mnebuerquo

40
โซลูชันเริ่มล้าสมัยอย่างน้อยจาก chrome 50 :(
userlond

4
อย่าลืมวิธีแก้ปัญหานี้: ใช้ไม่ได้กับ Chrome 74/75, Firefox 63/67, Edge 42, IE 11 และ UCBrowser 7.0 (แต่ใช้ได้กับ GNOME Web 3.28 - AppleWebKit / 605.1.15)
tanguy_k

10

คุณไม่สามารถใช้อินพุตได้คุณต้องใช้ textarea แทน ใช้ textarea กับwrap="soft"โค้ดและไม่บังคับส่วนที่เหลือของแอตทริบิวต์ดังนี้:

<textarea name="text" rows="14" cols="10" wrap="soft"> </textarea>

แอตทริบิวต์:หากต้องการ จำกัด จำนวนข้อความในข้อความตัวอย่างเช่น "40" อักขระคุณสามารถเพิ่มแอตทริบิวต์maxlength="40"ดังนี้: <textarea name="text" rows="14" cols="10" wrap="soft" maxlength="40"></textarea> หากต้องการซ่อนการเลื่อนสไตล์ให้ หากคุณใช้เพียงoverflow:scroll;หรือoverflow:hidden;หรือoverflow:auto;จะมีผลกับแถบเลื่อนเดียวเท่านั้น หากคุณต้องการแอตทริบิวต์ที่แตกต่างกันสำหรับแถบเลื่อนแต่ละแถบให้ใช้แอตทริบิวต์เช่นนี้overflow:scroll; overflow-x:auto; overflow-y:hidden;ในพื้นที่รูปแบบ: ในการทำให้พื้นที่ข้อความไม่สามารถปรับขนาดได้คุณสามารถใช้ลักษณะresize:none;ดังนี้:

<textarea name="text" rows="14" cols="10" wrap="soft" maxlength="40" style="overflow:hidden; resize:none;></textarea>

ด้วยวิธีนี้คุณสามารถมีหรือเป็นตัวอย่างพื้นที่ข้อความที่มี 14 แถวและ 10 คอลัมน์พร้อมการตัดคำและความยาวอักขระสูงสุด "40" อักขระที่ทำงานเหมือนกับกล่องข้อความอินพุต แต่มีแถวแทนและไม่ต้องใช้ข้อความอินพุต

หมายเหตุ: textarea ทำงานกับแถวที่แตกต่างจากอินพุต<input type="text" name="tbox" size="10"></input>ที่สร้างขึ้นเพื่อไม่ทำงานกับแถวเลย


7

ในการสร้างอินพุตข้อความซึ่งค่าที่อยู่ใต้ฝากระโปรงเป็นสตริงบรรทัดเดียว แต่นำเสนอให้กับผู้ใช้ในรูปแบบที่ห่อด้วยคำคุณสามารถใช้แอตทริบิวต์contenteditableใน<div>องค์ประกอบหรือองค์ประกอบอื่น ๆ :

const el = document.querySelector('div[contenteditable]');

// Get value from element on input events
el.addEventListener('input', () => console.log(el.textContent));

// Set some value
el.textContent = 'Lorem ipsum curae magna venenatis mattis, purus luctus cubilia quisque in et, leo enim aliquam consequat.'
div[contenteditable] {
  border: 1px solid black;
  width: 200px;
}
<div contenteditable></div>

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