2012-01-21 15 views
63

Ho uno DIV che ha contentEditable=true in modo che l'utente possa modificarlo. Il problema è che non sembra un campo di testo, quindi potrebbe non essere chiaro all'utente che può essere modificato.Come faccio a rendere un DIV modificabile come un campo di testo?

Esiste un modo per personalizzare lo DIV in modo che appaia all'utente come un campo di immissione del testo?

+2

sfondo: bianco; border: 1px solid # 666; cursore: testo; ? : P vedi [la mia demo] (http://jsfiddle.net/ZevvE/) – mkk

+0

Suppongo che faccia sembrare una 'textarea'? http://jsfiddle.net/vwPgT/ –

+0

Forse un bordo interno? – j08691

risposta

99

Questi hanno lo stesso aspetto come loro controparti reali in Safari, Chrome e Firefox. Si degradano con grazia e sembrano OK anche in Opera e 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> 

uscita:

enter image description here

+0

Cosa fa esattamente _-webkit-small-control_ e _medium -moz-fixed_? Sembrano far sembrare il font monospace in Firefox v13.0 – Hengjie

+0

@Hengjie Questi sono gli stili predefiniti che i browser usano quando visualizzano i campi di input. – ThinkingStiff

+0

per rendere questo lavoro corretto in IE9 aggiungere un altro div all'interno di textarea div.like questo.

I look like textarea
user10

0

È possibile posizionare un TEXTAREA di dimensioni simili sotto il DIV, in modo che la cornice del controllo standard sia visibile attorno a div.

Probabilmente è bene impostarlo su disabilitato, per evitare il furto accidentale del fuoco.

+0

Sì, non sono sicuro che questo è ciò che l'OP sta cercando nella risposta. –

+1

lol :) bel scherzo :) – mkk

+0

Se si desidera che il campo di testo venga ridimensionato automaticamente con il contenuto del div questo diventa difficile. – timing

13

In WebKit, si può fare: -webkit-appearance: textarea;

+9

Beh, è ​​semplicemente troppo comodo. –

4

Si potrebbe andare per una casella di un'ombra interna:

div[contenteditable=true] { 
    box-shadow: inset 0px 1px 4px #666; 
} 

ho aggiornato il jsfiddle da Jarish: http://jsfiddle.net/ZevvE/2/

1

Vorrei suggerire questo per abbinare lo stile di Chrome, esteso dall'esempio di Jarish. Si noti la proprietà del cursore che le risposte precedenti hanno omesso.

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

Il problema di tutte queste è che non affrontano se le righe di testo sono lunghi e molto più ampia che l'overflow div: auto non lo fa ad una barra di scorrimento che funziona bene. Ecco la soluzione perfetta che ho trovato:

Creare due div. Un div interiore che è sufficientemente ampia per gestire la linea più ampia di testo e poi uno esterno più piccolo, che agisce a supporto del div interno:

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

Se si utilizza bootstrap basta aggiungere form-control classe. Ad esempio:

class="form-control" 
+0

Questa è un'ottima risposta e credo sia la più pulita. Il mio voto è che questa sia la risposta giusta. – aholtry

Problemi correlati