Как сделать редактируемый DIV похожим на текстовое поле?

82

У меня DIVесть contentEditable=trueфайл, который можно редактировать. Проблема в том, что оно не похоже на текстовое поле, поэтому пользователю может быть непонятно, что его можно редактировать.

Есть ли способ, которым я могу стилизовать DIVтак, чтобы он казался пользователю как поле ввода текста?

здравомыслие
источник
2
фон: белый; граница: 1px solid # 666; курсор: текст; ? : P смотри мою демонстрацию
mkk
Я полагаю, чтобы это выглядело как textarea? jsfiddle.net/vwPgT
Джаред Фарриш
1
@mkk - Может немного помочь, если вы добавите образец текста: jsfiddle.net/ZevvE/1
Джаред Фарриш
@ Джаред :) молодец! ;-) теперь его сложнее спутать с div .. ох, это же div, забыл :)
mkk
@mkk - Лично я считаю, что моя демонстрация более понятна , но, эй, это то, что есть.
Джаред Фарриш

Ответы:

128

Они выглядят так же, как их настоящие аналоги в Safari, Chrome и Firefox. Они изящно деградируют и выглядят нормально в Opera и IE9.

Демо: 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>

Вывод:

введите описание изображения здесь

Мышление
источник
1
Что именно делают -webkit-small-control и medium -moz-fixed ? Похоже, что в Firefox v13.0 шрифт выглядит моноширинным
Hengjie 02
1
@Hengjie Это стили по умолчанию, которые браузеры используют при отображении полей ввода.
ThinkingStiff
1
вот пример использования, попробуйте скопировать в них содержимое HTML. Вы увидите разницу.
Praveen
1
Также следует добавить - фон: белый;
Брана,
1
Что, если мне нужен другой div внутри этого div, который я не хочу, чтобы он был редактируемым?
FrenkyB
23

Если вы используете бутстрап, просто добавьте form-controlкласс. Например:

class="form-control" 
параплю
источник
Это отличный ответ, и я считаю, что он самый чистый. Я голосую за то, чтобы это был правильный ответ.
Aholtry 02
Есть ли способ разрешить пользователю расширять область? Обычное текстовое поле делает это.
МАРС
14

В WebKit вы можете: -webkit-appearance: textarea;

Абхи Бекерт
источник
10
Что ж, это слишком удобно.
Джаред Фарриш
3

Вы можете использовать тень внутреннего блока:

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

Я обновил jsfiddle от Jarish: http://jsfiddle.net/ZevvE/2/

время
источник
1

Я бы предложил это для соответствия стилю Chrome, заимствованному из примера Джариша. Обратите внимание на свойство курсора, которое было пропущено в предыдущих ответах.

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;
Роберт Уодделл
источник
1

Проблема со всем этим заключается в том, что они не решаются, если строки текста длинные и намного шире, чем у div overflow: auto не отображается полоса прокрутки, которая работает правильно. Вот идеальное решение, которое я нашел:

Создайте два div. Внутренний div, достаточно широкий, чтобы обрабатывать самую широкую строку текста, а затем меньшую внешнюю строку, которая действует как держатель для внутреннего 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>
Эван Тодер
источник
0

Вы можете разместить ТЕКСТАРУ аналогичного размера под DIV, чтобы рамка стандартного элемента управления была видна вокруг div.

Вероятно, лучше отключить его, чтобы предотвратить случайное кражу фокуса.

wizzard0
источник
Да, не уверен, что это именно то, что OP ищет в ответе.
Джаред Фарриш
Если вы хотите, чтобы текстовое поле автоматически масштабировалось вместе с содержимым div, это становится трудным.
время