Làm cách nào để biến DIV có thể chỉnh sửa trông giống như một trường văn bản?


82

Tôi có một DIVcái có contentEditable=trueđể người dùng có thể chỉnh sửa nó. Vấn đề là nó không giống một trường văn bản, vì vậy người dùng có thể không rõ ràng rằng nó có thể được chỉnh sửa.

Có cách nào để tôi có thể tạo kiểu DIVđể nó xuất hiện với người dùng giống như trường nhập văn bản không?


2
nền: trắng; viền: 1px solid # 666; con trỏ: văn bản; ? : P xem bản demo của tôi
mkk

Tôi cho rằng làm cho nó trông giống như một textarea? jsfiddle.net/vwPgT
Jared Farrish

1
@mkk - Có thể giúp một chút nếu bạn thêm một số văn bản mẫu: jsfiddle.net/ZevvE/1
Jared Farrish

@Jared :) làm tốt lắm! ;-) bây giờ nó là khó khăn hơn nhiều để gây nhầm lẫn nó với div .. oh nó là một div, tôi quên :)
MKK

@mkk - Cá nhân tôi nghĩ rằng bản demo của tôi rõ ràng hơn, nhưng này, nó là như thế nào.
Jared Farrish

Câu trả lời:


125

Chúng trông giống như các đối tác thực của chúng trong Safari, Chrome và Firefox. Chúng xuống cấp một cách duyên dáng và trông cũng ổn trong Opera và IE9.

Demo: http://jsfiddle.net/ThinkingStiff/AbKTQ/

CSS:

textarea {
    height: 28px;
    width: 400px;
}

#textarea {
    -moz-appearance: textfield-multiline;
    -webkit-appearance: textarea;
    border: 1px solid gray;
    font: medium -moz-fixed;
    font: -webkit-small-control;
    height: 28px;
    overflow: auto;
    padding: 2px;
    resize: both;
    width: 400px;
}

input {
    margin-top: 5px;
    width: 400px;
}

#input {
    -moz-appearance: textfield;
    -webkit-appearance: textfield;
    background-color: white;
    background-color: -moz-field;
    border: 1px solid darkgray;
    box-shadow: 1px 1px 1px 0 lightgray inset;  
    font: -moz-field;
    font: -webkit-small-control;
    margin-top: 5px;
    padding: 2px 3px;
    width: 398px;    
}

HTML:

<textarea>I am a textarea</textarea>
<div id="textarea" contenteditable>I look like textarea</div>

<input value="I am an input" />
<div id="input" contenteditable>I look like an input</div>

Đầu ra:

nhập mô tả hình ảnh ở đây


1
Chính xác thì -webkit-small-controlmedium -moz-fixed làm gì? Họ dường như để làm cho giao diện font chữ đơn trong Firefox v13.0
Hengjie

1
@Hengjie Đó là những kiểu mặc định mà trình duyệt sử dụng khi hiển thị các trường nhập.
ThinkingStiff

1
đây là một usecase, hãy thử sao chép và dán nội dung html vào chúng. Bạn sẽ thấy sự khác biệt.
Praveen

1
Cũng nên thêm - nền: trắng;
Brana

1
Điều gì sẽ xảy ra nếu tôi muốn một div khác bên trong div này, mà tôi không muốn nó có thể chỉnh sửa được?
FrenkyB

21

Nếu bạn sử dụng bootstrap chỉ cần thêm form-controllớp. Ví dụ:

class="form-control" 

Đây là một câu trả lời tuyệt vời và tôi cảm thấy là sạch sẽ nhất. Phiếu bầu của tôi cho đây là câu trả lời đúng.
aho Bird

Có cách nào để cho phép người dùng mở rộng khu vực không? Textarea bình thường thực hiện điều này.
MARS



1

Tôi sẽ đề xuất điều này để phù hợp với phong cách của Chrome, mở rộng từ ví dụ của Jarish. Lưu ý thuộc tính con trỏ mà các câu trả lời trước đó đã bỏ qua.

cursor: text;
border: 1px solid #ccc;
font: medium -moz-fixed;
font: -webkit-small-control;
height: 200px;
overflow: auto;
padding: 2px;
resize: both;
-moz-box-shadow: inset 0px 1px 2px #ccc;
-webkit-box-shadow: inset 0px 1px 2px #ccc;
box-shadow: inset 0px 1px 2px #ccc;

0

Bạn có thể đặt một TEXTAREA có kích thước tương tự bên dưới DIV của mình, để khung của điều khiển tiêu chuẩn sẽ hiển thị xung quanh div.

Có thể tốt nếu bạn đặt nó ở chế độ vô hiệu hóa để ngăn chặn việc vô tình lấy cắp tiêu điểm.


Vâng, không chắc đây là những gì OP đang tìm kiếm câu trả lời.
Jared Farrish

Nếu bạn muốn trường văn bản tự động chia tỷ lệ với nội dung của div thì điều này trở nên khó khăn.
thời gian

0

Vấn đề với tất cả những thứ này là chúng không giải quyết được nếu các dòng văn bản dài và rộng hơn nhiều khiến tràn div: auto không quảng cáo thanh cuộn hoạt động đúng. Đây là giải pháp hoàn hảo mà tôi tìm thấy:

Tạo hai div. Một div bên trong đủ rộng để xử lý dòng văn bản rộng nhất và sau đó là một div bên ngoài nhỏ hơn đóng vai trò giữ cho div bên trong:

<div style="border:2px inset #AAA;cursor:text;height:120px;overflow:auto;width:500px;">
    <div style="width:800px;">

     now really long text like this can be put in the text area and it will really <br/>
     look and act more like a real text area bla bla bla <br/>

    </div>
</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.