Проблема навигации к полям с ошибками в формах встречается часто, особенно в длинных формах с множеством полей. При стандартной отправке формы браузер обычно просто обновляет страницу или отображает ошибку валидации, оставляя пользователя без указания, где именно ошибка возникла. Smooth Scroll позволяет автоматически прокручивать страницу к первому полю с ошибкой, создавая плавный переход и улучшая пользовательский опыт.
Для начала необходимо определить, какие элементы будут целевыми для
прокрутки. Обычно это поля формы с классом .error или
атрибутом data-error. Например:
<form id="registrationForm">
<label>Имя</label>
<input type="text" name="name" class="error" />
<label>Email</label>
<input type="email" name="email" />
<label>Пароль</label>
<input type="password" name="password" class="error" />
<button type="submit">Отправить</button>
</form>
В этом примере поля с ошибками имеют класс error. Эти
элементы будут целями для прокрутки.
Smooth Scroll можно использовать как чисто JavaScript библиотеку или через npm. Пример подключения через CDN:
<script src="https://cdn.jsdelivr.net/npm/smooth-scroll@16/dist/smooth-scroll.polyfills.min.js"></script>
Или через npm:
npm install smooth-scroll
Создаётся экземпляр Smooth Scroll, который будет отвечать за плавную прокрутку:
const scroll = new SmoothScroll();
По умолчанию Smooth Scroll прокручивает к якорям, но его можно адаптировать для прокрутки к произвольным элементам.
Чтобы автоматически прокручивать к первому элементу с классом
.error, используется следующий подход:
document.getElementById('registrationForm').addEventListener('submit', function(event) {
event.preventDefault();
const firstError = this.querySelector('.error');
if (firstError) {
scroll.animateScroll(firstError);
firstError.focus();
}
});
Здесь:
querySelector('.error') находит первый элемент с
ошибкой.scroll.animateScroll(firstError) выполняет плавную
прокрутку.firstError.focus() устанавливает фокус на поле,
облегчая ввод исправления ошибки.Smooth Scroll поддерживает настройку скорости и смещения:
const scroll = new SmoothScroll(null, {
speed: 800, // время прокрутки в миллисекундах
offset: 50, // смещение от верхней границы окна
easing: 'easeInOutCubic' // функция плавности прокрутки
});
speed – регулирует скорость анимации.offset – полезно при фиксированных шапках сайта, чтобы
элемент не оказался скрыт под навигационной панелью.easing – функция сглаживания движения для более
естественной прокрутки.Если форма содержит несколько ошибок, можно прокрутку выполнять к первому элементу с ошибкой. Для удобства пользователя также можно подсвечивать все элементы с ошибками:
const errors = form.querySelectorAll('.error');
errors.forEach((el) => {
el.classList.add('highlight');
});
highlight может содержать анимацию или временное
изменение цвета, чтобы привлечь внимание к проблемным полям.
Smooth Scroll эффективно работает в сочетании с клиентской валидацией через JavaScript. Пример валидации:
function validateForm(form) {
let isValid = true;
const fields = form.querySelectorAll('input');
fields.forEach(field => {
field.classList.remove('error');
if (!field.value) {
field.classList.add('error');
isValid = false;
}
});
return isValid;
}
form.addEventListener('submit', function(event) {
event.preventDefault();
if (!validateForm(this)) {
const firstError = this.querySelector('.error');
scroll.animateScroll(firstError);
firstError.focus();
} else {
this.submit();
}
});
offset, если
присутствует фиксированное меню, чтобы поле было полностью видимо.Smooth Scroll позволяет не только визуально улучшить навигацию по форме, но и повысить эффективность валидации, уменьшить количество пропущенных пользователем ошибок и сделать интерфейс более отзывчивым. Правильная настройка скорости, смещения и фокусировки на полях создаёт естественное ощущение навигации и снижает фрустрацию пользователя при заполнении длинных форм.