Ваши подозрения верны: стили будут применяться только ко всему вводу.
Поскольку стили могут применяться только ко всему элементу, для решения потребуется по крайней мере один элемент на требуемый цвет.
Рассмотрим деление поля ввода относительно точки, в которой пользователь вносит изменения. Есть три раздела ввода:
- до точки, в которой применяются изменения
- что после точки, в которой применяются изменения
- что в данный момент применяются изменения
Вы не можете достичь этого с помощью одного элемента ввода. И поскольку точка, в которой применяются изменения, может измениться, части «входных данных», обернутые этими тремя элементами, также изменятся. JavaScript требуется для решения.
Вы должны изначально включить обычный элемент ввода и отказаться от любой требуемой раскраски. Используйте JavaScript для замены ввода подходящим элементом контейнера. Это может быть стилизовано для имитации элемента ввода.
Когда происходят изменения, используйте JavaScript для определения вышеупомянутых трех подразделений. Оберните их подходящими элементами (промежутки были бы идеальными) и по необходимости раскрасили.
Рассмотрим следующую отправную точку для сгенерированной разметки замены:
<div class="input">
<span class="nonEdited before">foo</span>
<span class="edited">fizz</span>
<span class="nonEdited after">bar</span>
</div>
Используйте события click, keydown и keyup, чтобы выяснить три деления для ввода и применить обтекание трех частей поддельного ввода, как требуется.