Smooth Scroll в JavaScript позволяет реализовать плавную анимацию прокрутки страницы к определённым элементам. Часто это используется для навигации по разделам, но особенно полезно при работе с формами и полями ввода. Якоря для полей ввода обеспечивают удобный переход к нужному полю без резкой прокрутки, улучшая пользовательский опыт.
Для создания якоря в HTML используется атрибут id.
Каждое поле ввода, к которому планируется прокрутка, должно иметь
уникальный идентификатор:
<form>
<label for="username">Имя пользователя</label>
<input type="text" id="username" name="username">
<label for="email">Email</label>
<input type="email" id="email" name="email">
<label for="password">Пароль</label>
<input type="password" id="password" name="password">
</form>
Ссылки или кнопки, которые будут инициировать прокрутку к полю,
используют href с соответствующим ID:
<a href="#username" class="scroll-link">Перейти к имени пользователя</a>
<a href="#email" class="scroll-link">Перейти к email</a>
<a href="#password" class="scroll-link">Перейти к паролю</a>
Для работы плавной прокрутки подключается библиотека Smooth Scroll и создаётся экземпляр с нужными параметрами:
const scroll = new SmoothScroll('.scroll-link', {
speed: 600,
offset: 20,
easing: 'easeInOutCubic',
updateURL: false,
clip: true
});
Ключевые параметры:
speed — скорость анимации в миллисекундах.offset — смещение от верхнего края страницы. Полезно,
если фиксированное меню перекрывает поле.easing — функция сглаживания движения.updateURL — обновление URL при прокрутке к якорю.clip — предотвращает прокрутку за границы
документа.При прокрутке к полю важно, чтобы оно было полностью видимым. Если поле находится в скрытом блоке или внутри вкладки, Smooth Scroll автоматически не сможет корректно определить позицию. В таких случаях необходимо раскрывать контейнер перед прокруткой:
document.querySelectorAll('.scroll-link').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const targetID = this.getAttribute('href').substring(1);
const target = document.getElementById(targetID);
if (target.closest('.tab-content')) {
const tab = target.closest('.tab-content');
tab.style.display = 'block'; // раскрытие вкладки
}
scroll.animateScroll(target);
});
});
Для форм важно не только прокрутить страницу к полю, но и поставить курсор в него. Smooth Scroll позволяет передавать колбэк после завершения анимации:
scroll.animateScroll(target, null, {
updateURL: false,
offset: 20,
easing: 'easeInOutCubic',
callback: () => {
target.focus();
}
});
Это особенно удобно для длинных форм, где пользователь должен сразу начать ввод данных.
На мобильных экранах положение поля может смещаться из-за клавиатуры. Чтобы корректно отображать поле, стоит использовать дополнительное смещение:
const mobileOffset = () => (window.innerWidth < 768 ? 100 : 20);
document.querySelectorAll('.scroll-link').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const targetID = this.getAttribute('href').substring(1);
const target = document.getElementById(targetID);
scroll.animateScroll(target, null, { offset: mobileOffset() });
});
});
Якоря особенно полезны для скроллинга к первому полю с ошибкой после проверки формы:
const form = document.querySelector('form');
form.addEventListener('submit', e => {
e.preventDefault();
const firstError = form.querySelector('.error');
if (firstError) {
scroll.animateScroll(firstError, null, {
offset: 20,
callback: () => firstError.focus()
});
}
});
Такой подход позволяет пользователю мгновенно перейти к проблемному полю и исправить ошибки.
Эти техники обеспечивают удобную навигацию по формам с плавной прокруткой и корректной фокусировкой на полях ввода, улучшая пользовательский опыт на всех устройствах.