Jak sprawić, by edytowalny DIV wyglądał jak pole tekstowe?

82

Mam DIVktóry ma, contentEditable=truewięc użytkownik może go edytować. Problem polega na tym, że nie wygląda jak pole tekstowe, więc dla użytkownika może nie być jasne, że można je edytować.

Czy istnieje sposób, w jaki mogę ustawić styl DIVtak, aby wyglądało ono dla użytkownika jak pole wprowadzania tekstu?

zdrowie psychiczne
źródło
2
tło: białe; obramowanie: 1px solid # 666; kursor: tekst; ? : P zobacz moje demo
mkk
Przypuszczam, że to wygląda jak textarea? jsfiddle.net/vwPgT
Jared Farrish
1
@mkk - Może trochę pomóc, jeśli dodasz przykładowy tekst: jsfiddle.net/ZevvE/1
Jared Farrish
@Jared :) Dobra robota! ;-) teraz dużo trudniej go pomylić z div .. och to div, zapomniałem :)
mkk
@mkk - Osobiście uważam, że moje demo jest bardziej przejrzyste, ale hej, tak właśnie jest.
Jared Farrish

Odpowiedzi:

128

Wyglądają tak samo, jak ich prawdziwe odpowiedniki w Safari, Chrome i Firefox. Degradują się wdzięcznie i wyglądają dobrze również w Operze i 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>

Wynik:

wprowadź opis obrazu tutaj

Myślenie Sztywne
źródło
1
Co dokładnie robi -webkit-small-control i medium -moz-fixed ? Wydaje się, że w przeglądarce Firefox 13.0 czcionka wygląda na nieregularną
Hengjie
1
@Hengjie Są to domyślne style używane przez przeglądarki podczas wyświetlania pól wejściowych.
ThinkingStiff
1
tutaj jest przypadek użycia, spróbuj skopiować i wkleić zawartość HTML w nich. Zobaczysz różnicę.
Praveen
1
Należy również dodać - tło: białe;
Brana
1
A co, jeśli chcę mieć inny element div wewnątrz tego elementu div, którego nie chcę, aby był edytowalny?
FrenkyB,
23

Jeśli używasz bootstrap, po prostu dodaj form-controlclass. Na przykład:

class="form-control" 
paraplu
źródło
To świetna odpowiedź i wydaje mi się, że jest najczystsza. Głosuję za właściwą odpowiedzią.
aholtry
Jakikolwiek sposób, aby umożliwić użytkownikowi rozszerzenie obszaru? Robi to zwykły obszar teksturowy.
MARS
14

W WebKit możesz: -webkit-appearance: textarea;

Abhi Beckert
źródło
10
Cóż, to po prostu zbyt wygodne.
Jared Farrish
3

Możesz wybrać wewnętrzny cień pudełka:

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

Zaktualizowałem jsfiddle z Jarish: http://jsfiddle.net/ZevvE/2/

wyczucie czasu
źródło
1

Sugerowałbym to, aby dopasować styl Chrome, rozszerzony na przykładzie Jarisha. Zwróć uwagę na właściwość kursora, która została pominięta w poprzednich odpowiedziach.

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;
Robert Waddell
źródło
1

Problem z tym wszystkim polega na tym, że nie rozwiązują problemu, jeśli wiersze tekstu są długie i znacznie szersze niż przepełnienie div: auto nie wyświetla paska przewijania, który działa poprawnie. Oto idealne rozwiązanie, które znalazłem:

Utwórz dwa elementy div. Wewnętrzny element div, który jest dostatecznie szeroki, aby obsłużyć najszerszą linię tekstu, a następnie mniejszy zewnętrzny element, który działa jako uchwyt wewnętrznego elementu div:

<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>
evan toder
źródło
0

Możesz umieścić TEXTAREA o podobnym rozmiarze pod swoim DIV, aby ramka standardowej kontrolki była widoczna wokół div.

Prawdopodobnie dobrze jest ustawić go jako wyłączony, aby zapobiec przypadkowej kradzieży ostrości.

wizzard0
źródło
Tak, nie jestem pewien, czy tego OP szuka w odpowiedzi.
Jared Farrish
Jeśli chcesz, aby pole tekstowe skalowało się automatycznie wraz z zawartością elementu div, jest to trudne.
czas na