При инициализации Inputmask на DOM-элемент библиотека добавляет
базовый CSS-класс inputmask, который служит маркером того,
что поле находится под управлением маски. Этот класс используется как
точка входа для стилизации всех элементов, на которые навешана маска,
независимо от её типа (числовая, дата, телефон, произвольный
шаблон).
Типичная структура:
<input class="inputmask" />
После применения маски класс сохраняется, а сама логика маскирования начинает контролировать поведение ввода, не изменяя базовую структуру DOM.
Одной из ключевых задач при работе с масками является отслеживание состояния заполненности поля. Inputmask сам по себе не навязывает строгую систему классов для всех состояний, но предоставляет механизмы, через которые эти состояния удобно реализуются.
Неполное заполнение определяется как состояние, при котором пользователь ввёл лишь часть обязательных символов маски. Например, при маске телефона:
+7 (999) 999-99-99
значение вида:
+7 (705) 12
является неполным.
Такое состояние обычно отражается добавлением кастомного CSS-класса через колбэк:
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
this.classList.add("is-incomplete");
this.classList.remove("is-complete");
}
}).mask(document.querySelector("input"));
Полное заполнение фиксируется, когда все обязательные позиции маски заполнены корректными символами.
Inputmask({
mask: "+7 (999) 999-99-99",
oncomplete: function () {
this.classList.add("is-complete");
this.classList.remove("is-incomplete");
}
}).mask(document.querySelector("input"));
Состояние is-complete часто используется для визуального
подтверждения валидного ввода, особенно в формах с многошаговой
валидацией.
Inputmask предоставляет поведение очистки значения, связанное с
опцией clearIncomplete. При её включении неполностью
заполненное поле может автоматически очищаться при потере фокуса.
Inputmask({
mask: "99/99/9999",
clearIncomplete: true
}).mask(input);
В этом сценарии удобно вводить отдельный класс состояния:
oncleared: function () {
this.classList.add("is-empty");
this.classList.remove("is-incomplete");
this.classList.remove("is-complete");
}
Состояние is-empty применяется не только к реально
пустому значению, но и к очищенному Inputmask значению после сброса.
Хотя Inputmask не управляет фокусом напрямую, сочетание с событиями
focus и blur позволяет синхронизировать
CSS-состояния поля с пользовательским взаимодействием.
const el = document.querySelector("input");
el.addEventListener("focus", function () {
this.classList.add("is-focused");
});
el.addEventListener("blur", function () {
this.classList.remove("is-focused");
});
Часто фокус комбинируется с состоянием заполнения, формируя более детализированную визуальную модель:
is-focused + is-empty — активное пустое полеis-focused + is-incomplete — редактируемое
незавершённое значениеis-focused + is-complete — корректно заполненное
полеInputmask не является полноценной системой валидации, однако при некорректном вводе (например, нарушении шаблона или попытке вставки неподходящих символов) часто используется внешний слой валидации.
Типовой подход — связка Inputmask с пользовательской логикой проверки:
function setErrorState(el, hasError) {
el.classList.toggle("is-error", hasError);
}
Состояние is-error обычно управляется не самой
библиотекой, а логикой формы:
CSS-классы в контексте Inputmask выполняют роль слоя представления поверх логики маскирования. Основные состояния формируются комбинацией:
inputmaskПример типовой системы:
.inputmask {
border: 1px solid #ccc;
}
.inputmask.is-focused {
border-color: #4a90e2;
}
.inputmask.is-incomplete {
border-color: #e67e22;
}
.inputmask.is-complete {
border-color: #2ecc71;
}
.inputmask.is-error {
border-color: #e74c3c;
}
Такое разделение позволяет отделить:
Библиотека предоставляет набор событий, которые удобно использовать для синхронизации состояния DOM:
oncomplete — маска полностью заполненаonincomplete — значение не завершеноoncleared — значение очищеноonKeyValidation — контроль ввода символовonBeforePaste — обработка вставкиПример централизованного управления состояниями:
Inputmask({
mask: "9999-9999",
oncomplete: function () {
updateState(this, "complete");
},
onincomplete: function () {
updateState(this, "incomplete");
},
oncleared: function () {
updateState(this, "empty");
}
}).mask(input);
function updateState(el, state) {
el.classList.remove("is-complete", "is-incomplete", "is-empty");
el.classList.add(`is-${state}`);
}
Такой подход предотвращает конфликт классов и обеспечивает единое управление состояниями.
В сложных формах Inputmask часто используется вместе с валидаторами, где CSS-классы становятся связующим слоем между различными системами проверки.
Типовая архитектура:
Пример логики:
function validateField(el) {
const value = el.value;
const isValid = value.length > 0 && !value.includes("_");
el.classList.toggle("is-error", !isValid);
}
При одновременном наличии нескольких состояний требуется явная система приоритетов:
is-error — максимальный приоритетis-completeis-incompleteis-emptyis-focused — модификатор, не конкурирующий с основными
состояниямиТакая иерархия предотвращает визуальные конфликты, например, когда поле одновременно подсвечивается как корректное и ошибочное.
На практике часто применяется атомарный подход, при котором каждое состояние строго взаимоисключающее:
<input class="inputmask state-complete" />
const states = ["state-empty", "state-incomplete", "state-complete", "state-error"];
function setState(el, newState) {
el.classList.remove(...states);
el.classList.add(`state-${newState}`);
}
Такой подход упрощает поддержку интерфейса при большом количестве маскированных полей и снижает вероятность накопления конфликтующих классов.