Возможно ли переполнение, видимое при вводе текста?

CSS overflow:visible, похоже, не применяется к входам.

См. следующий скрипт JS: https://jsfiddle.net/b4sr578j/

input {
  border: 1px dashed black;
  overflow: visible;
  height: 28px;
  font-size: 30px;
}
<input type='text' value='gggyyyXXX'/>

Ответы

Ответ 1

Вот решение для Webkit и Firefox:

(Это не будет работать в IE - потому что не поддерживает офсетное смещение)

1) Удалите высоту

2) Используйте outline вместо border

3) Добавьте отрицательный outline-offset

4) Добавьте padding для точной настройки смещения

FIDDLE

input {
  overflow: visible;
  font-size: 30px;
  outline: 1px dashed black;
  border: 0;
  outline-offset: -8px;
  padding: 6px 0 2px 8px;
}
<input type='text' value='gggyyyXXX' />

Ответ 2

Чтобы сделать это коротко: Нет, это невозможно! Единственное, что вы можете сделать, это создать замену javascript/html/css для ввода. Но это было бы накладными расходами.

Чтобы получить представление:

  • задайте ввод скрытой видимости
  • позиционируйте DIV с "стилем ввода" под вводом
  • пусть проверка javascript, если пользователь делает нажатие клавиши при фокусировке ввода, копирует входное значение в div

Ответ 3

Ответ на исходный вопрос. Как уже было сказано Себастьяном Хенсом, это невозможно. Причина в том, что элементы input - это замененные элементы, а свойство переполнения только для не замененных элементов.

Цитата из MDN о переполнении:

Применяется к - не замененным элементам уровня блока и незаменяемым элементам встроенного блока

Как уже упоминалось в комментариях, идеальным решением было бы использовать элементы contenteditable, поскольку они соблюдают настройки overflow.


Ниже приведено обходное решение, которое использует несколько linear-gradient для создания штрихового пограничного эффекта. Часть ответа принимается из ответа Danield (части padding и удаление height). Кроме того, я изменил appearance и добавил градиенты.

Хотя мы не добавили высоту явно, фактическая высота области внутри границы будет по-прежнему такой же, как в исходном коде. Для сравнения я добавил поле ввода с исходным кодом слева. Я не знаю, приемлемо ли это для вас. Если вы обязательно захотите установить height, это не сработает.

input.test {
  appearance: none;
  box-sizing: border-box;
  font-size: 30px;
  padding: 2px 0px 6px;
  border: 0;
  background: linear-gradient(to right, gray 50%, transparent 50%), linear-gradient(to right, gray 50%, transparent 50%), linear-gradient(to bottom, gray 50%, transparent 50%), linear-gradient(to bottom, gray 50%, transparent 50%);
  background-size: 8px 1px, 8px 1px, 1px 8px, 1px 8px;
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
  background-position: 0px 0px, 0px 1em, 0px 0px, 100% 0px;
  box-shadow: inset 0px -10px 0px white;
  width: 200px;
}
input.original {
  border: 1px dashed black;
  overflow: visible;
  height: 28px;
  font-size: 30px;
  width: 200px;
}

input{
  vertical-align: top;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<input type='text' value='gggyyyXXX' class='original' />
<input type='text' value='gggyyyXXX' class='test' />

Ответ 4

Больше обходного пути действительно, но почему бы не полностью позиционировать вход без границы над вершиной?

body {
  position:relative;
}
input {
  border: 1px dashed black;
  overflow: visible;
  height: 28px;
  font-size: 30px;
}
input.noborder {
  border:1px transparent solid;
  height:34px;
  position:absolute;
  left:0;
  background:transparent;
}
<input type='text' value=''/>
<input class="noborder" type='text' value='gggyyyXXX'/>

Ответ 5

Я сомневаюсь, что это можно сделать так. для этого используется атрибут size. поэтому манипулируйте размером, используя код. например. в php;

<input type="text" name="nm" size = "<?php if(strlen($text)<=10)echo 10;
 else echo strlen($text); ?>" >