Bao bọc văn bản bên trong phần tử input type = “text” HTML / CSS


98

HTML được hiển thị bên dưới,

<input type="text"/>

được hiển thị trong một trình duyệt như sau:


Khi tôi thêm văn bản sau,

Con cáo nâu nhanh nhẹn nhảy qua thân con chó lười.

Sử dụng HTML bên dưới,

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

nó được hiển thị trong một trình duyệt như sau:


Nhưng tôi muốn nó được hiển thị trong một trình duyệt như vậy:


Tôi muốn văn bản trong phần tử đầu vào của mình được bao bọc. Điều này có thể được thực hiện mà không có một textarea?


3
Không, tôi không nghĩ nó có thể. Nhưng tại sao một textarea không phải là một tùy chọn?
Pekka

35
Sử dụng một vùng văn bản đôi khi không phải là một tùy chọn vì bạn không muốn cho phép nhập nhiều dòng văn bản. Chỉ để bọc một dòng văn bản (Lưu ý: Chúng không giống nhau).
Flatliner DOA

Có một giải pháp được thảo luận cho mục đích chính xác này với CSSWG để tiêu chuẩn hóa, thật đáng buồn là tôi không thể tìm thấy vấn đề.
Null

Tôi đã tìm thấy nó; github.com/w3c/csswg-drafts/issues/2141
Null

1
@Pekka 웃 không phải là nó có liên quan, nhưng một số lý do bao gồm: chúng tôi không thể sử dụng xác thực html5 trên textareas; chúng ta không thể sử dụng các ràng buộc mẫu để xác thực các textareas; textarea là một từ đồng nghĩa không cần thiết đối với kiểu đầu vào = text (đầu vào là kiểu văn bản!) có nghĩa là kiểu dáng gấp đôi, v.v., v.v. Tóm lại, có nhiều lý do.
Peter Kionga-Kamau

Câu trả lời:


63

Đó là textareacông việc của - để nhập văn bản nhiều dòng. Người input sẽ không làm điều đó ; nó không được thiết kế để làm điều đó.

Vì vậy, sử dụng a textarea. Bên cạnh sự khác biệt về hình ảnh, chúng được truy cập qua JavaScript theo cùng một cách (sử dụng thuộc valuetính).

Bạn có thể ngăn dòng mới được nhập qua inputsự kiện và chỉ cần sử dụng một replace(/\n/g, '').


69
Điều này không thực sự trả lời câu hỏi làm thế nào để thu thập một dòng đầu vào trong khi hiển thị nó được bao bọc trong quá trình nhập.
ehdv

3
Một vấn đề lớn với điều này là một vùng văn bản ngăn chặn nút bắt đầu trên thiết bị di động.
Dan

2
@alex Chính xác. Vì vậy, nếu bạn muốn đầu vào nhiều dòng thực sự, thì một vùng văn bản sẽ tốt hơn, nhưng nếu bạn chỉ muốn đầu vào bao bọc từ, thì giải pháp css tốt hơn.
Dan

1
Tôi đã định nói rằng điều đó <textarea>sẽ không hoạt động với những thứ như tính năng tự động hoàn thành của jQuery, nhưng chỉ cần thay đổi <input>thành <textarea>và đó là tất cả những gì cần thiết. Hoan hô các tiêu chuẩn!
Sablefoste

9
Như đã nói ở trên: Wrapping a line! == một chuỗi nhiều dòng. Tôi không chắc tại sao đây là câu trả lời được chấp nhận vì nó không trả lời câu hỏi.
mattLummus

38

Word Break sẽ bắt chước một số ý định

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

Như một giải pháp thay thế, giải pháp này đã mất hiệu quả trên một số trình duyệt. Vui lòng kiểm tra bản demo: http://cssdesk.com/dbCSQ


7
Tôi chỉ thử nghiệm nó trong Firefox 43.0.4 và nó không hoạt động tuy nhiên trong Safari và Chrome 9 48 nó có vẻ làm việc: cssdesk.com/dbCSQ
Jason Sperske

6
Kèm theo bản demo bởi @JasonSperske không làm việc đối với tôi không phải trong Firefox 45 không trong Chrome 50.
Czerny

Bản demo hoạt động đối với tôi trong chrome 48 trên linux, nhưng css tương tự trong trang của riêng tôi thì không.
Mnebuerquo

40
Giải pháp trở nên lỗi thời ít nhất từ chrome 50 :(
userlond

4
Quên về giải pháp này: không làm việc với Chrome 74/75, Firefox 63/67, Edge 42, IE 11 và UC Browser 7.0 (nhưng làm việc với GNOME Web 3,28 - AppleWebKit / 605.1.15)
tanguy_k

10

Bạn không thể sử dụng đầu vào cho nó, thay vào đó bạn cần sử dụng textarea. Sử dụng textarea với wrap="soft"mã và tùy chọn phần còn lại của các thuộc tính như sau:

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

Thuộc tính : Để giới hạn số lượng văn bản trong đó, chẳng hạn như "40" ký tự, bạn có thể thêm thuộc tính maxlength="40"như sau: <textarea name="text" rows="14" cols="10" wrap="soft" maxlength="40"></textarea> Để ẩn kiểu cuộn cho nó. nếu bạn chỉ sử dụng overflow:scroll;hoặc overflow:hidden;hoặc overflow:auto;nó sẽ chỉ ảnh hưởng đến một thanh cuộn. Nếu bạn muốn các thuộc tính khác nhau cho mỗi thanh cuộn thì hãy sử dụng các thuộc tính như thế này overflow:scroll; overflow-x:auto; overflow-y:hidden;trong vùng kiểu: Để làm cho vùng văn bản không thể thay đổi kích thước, bạn có thể sử dụng kiểu resize:none;như sau:

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

Bằng cách đó, bạn có thể có hoặc ví dụ một vùng văn bản có 14 hàng và 10 cols có bọc từ và độ dài ký tự tối đa là "40" ký tự hoạt động chính xác như hộp văn bản đầu vào nhưng với các hàng thay thế và không sử dụng văn bản đầu vào.

LƯU Ý: textarea hoạt động với các hàng không giống như đầu vào <input type="text" name="tbox" size="10"></input>được tạo ra để hoàn toàn không hoạt động với các hàng.


7

Để tạo một đầu vào văn bản trong đó giá trị bên dưới là một chuỗi dòng đơn nhưng được hiển thị cho người dùng ở định dạng bao bọc từ, bạn có thể sử dụng thuộc tính contenteditable trên một <div>hoặc phần tử khác:

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.