Поле с датой DatePicker
Давно не обновляли

Поле помогает вводить дату с клавиатуры или выбирать её с помощью мыши.

Когда использовать

Используйте поле с датой, когда нужно ввести дату в формате ДД.ММ.ГГГГ.

Описание работы

Поле с датой отличается от обычного поля ввода наличием иконки, маски и блока календаря.

Календарь и маска появляются всегда, когда поле получает фокус. Для этого можно кликнуть по самому полю или иконке, также можно перейти в поле табом.

Быстрый ввод

Если можно предположить, какое значение введёт пользователь, предложите быстрый ввод соответствующих дат:

Пустое поле с датой, под ним ссылки быстрого ввода «Вчера», «Сегодня» и «Завтра»

Блок календаря

Блок календаря состоит из заголовка и скроллируемой области с календарной сеткой. Когда курсор находится над календарной сеткой, основной скролл страницы блокируется.

В заголовке показывается название текущего месяца и года.

Поле «30.01.2021» с открытым календарём: в заголовке «Январь» и «2021» со стрелками выбора, ниже сетка января с выбранным 30-м числом и выходными красным, под ней начало февраля и кнопка «Сегодня»

Календарный блок «следует» за значением в поле: поменяли месяц с клавиатуры — календарь скроллится до соответствующей даты.

Выбор месяца и года

При клике на год или месяц раскрываются соответствующие списки. Список открывается «вокруг» выбранного пункта, но если верхняя граница списка оказывается за пределами экрана, список смещается вниз так, чтобы верхняя граница вошла.

В списке годов одновременно показывается 11 пунктов, чтобы сверху и снизу было по 5 строк. Список также можно скроллить колесом мышки или кнопками вверху и внизу списка: однократное нажатие скроллит список сразу на 3 строки, если зажать кнопку, список начнёт скроллиться непрерывно. Нажатие клавиши Esc закрывает список, другого управления с клавиатуры у списка нет.

Два календаря с раскрытыми списками. Слева поверх заголовка — список месяцев с января по декабрь, курсор на пункте «Февраль». Справа — список годов с 2016 по 2026 со стрелками прокрутки сверху и снизу: выбранный 2021 посередине, курсор на 2019.

После выбора месяца или года из раскрывающегося списка значение подставляется в поле ввода, календарь скроллится к соответствующей дате.

Сегодня

В нижней части календаря есть кнопка «Сегодня», нажатие на которую скроллит календарь до текущего месяца, выбирается текущий день. Календарь при этом не закрывается — это полезно для сценариев, когда пользователю нужно выбрать дату, близкую сегодняшней.

Нижняя часть календаря крупным планом: под сеткой дней кнопка «Сегодня» со стрелкой вверх

Если выбор текущей даты не нужен по сценарию, кнопку можно не показывать.

Выходные и праздничные дни

В контрол можно передать данные производственного календаря. Компонент подсветит красным праздничные дни, так же, как выходные.

Данные производственного календаря можно взять через API портала открытых данных РФ на data.gov.ru.

Неактивные дни

Если пользователь должен выбрать дату только внутри заданного периода — ограничьте выбор, передав в параметры максимальную и минимальную дату. Недоступные для выбора дни будут отображаться серым и высветленным красным.

Сетка месяца, где доступны только дни с 1 по 12, а с 13 по 31 недоступны — будни серые, выходные бледно-красные

Дизайн

Правила выделения дат и наведения, как в раскрывающемся списке: выбранный день выделяется серым фоном, фон дня под курсором — светло-серым.

Выбранный день выделяется серым кружком #E6E6E6.

Заблокированные дни отображаются с прозрачностью 50 %.

Открытый календарь и легенда к нему: день при наведении — в светло-сером кружке, выбранный — в сером, текущий день подчёркнут, выбранный текущий — подчёркнут и в сером кружке, выходной или праздничный — красный, заблокированные дни бледные

Размер и расположение

Поле с датой, как и обычное поле ввода, может быть трёх размеров. Подробнее — в гайде «Поле ввода».

Валидация

Некорректные даты должны быть заблокированы в блоке с календарной сеткой. Если пользователь указал некорректную дату с помощью клавиатуры, при потере фокуса поле валидируется и подсвечивается красным:

Поле «Дата рождения» со значением «15.10.205» в красной рамке, рядом подсказка «Укажите дату в промежутке 01.01.1900 — 01.01.2022 в формате ДД.ММ.ГГГГ»

Если поле обязательно для заполнения:

Пустое поле «Дата рождения» в красной рамке, рядом подсказка «Заполните поле»

Подробнее о поведении полей ввода с ошибками — в гайде «Валидация».

Доступность

Управление клавиатурой

Редактирование значения в поле отличается от обычного поля с маской. При получении фокуса в поле не появляется текстовый курсор, вместо этого выделяется одна из трёх частей даты.

Если фокус получает пустое поле, всегда выделяется первый блок:

Пустое поле с датой, затем оно же в фокусе: появилась маска даты, выделен блок дня

После ввода двух цифр выделение переходит на месяц:

Ввод дня: в поле с выделенным днём нажимают «1» — цифра появляется, выделение остаётся на дне; затем нажимают «2» — день становится «12», выделение переходит на месяц

После ввода одной цифры можно нажать пробел, точку или запятую — фокус будет переведён на следующую часть даты.

После ввода четырёх цифр года выделение остаётся на месте, если пользователь продолжает набирать — ввод игнорируется, как в поле с маской: поле вспыхивает синим, значение не меняется.

В поле с днём и месяцем «31.01» по одной цифре вводится год 2021, затем поле трижды вспыхивает голубым, а значение «31.01.2021» не меняется

В заполненном поле клик мышкой выделяет ту часть даты, над которой был курсор:

Клик по месяцу в поле «30.01.2021»: сначала курсор мыши над «01», затем поле в фокусе и месяц выделен

Нажатие клавиш ← → перемещает область выделения:

В поле «30.01.2021» выделен день, после нажатия стрелки вправо выделение переходит на месяц

Клавиши ↑ ↓ увеличивают или уменьшают выделенное значение на 1. Увеличение/уменьшение затрагивает только выделенное значение, например, за 31 января следует 1 января и наоборот:

В поле «31.01.2021» выделен день, после нажатия стрелки вверх в поле «01.01.2021»: день сменился на первое число, месяц остался прежним

Если период выбора даты ограничен, увеличение/уменьшение просто останавливается у границы. Например, нельзя выбирать дату позднее 31 декабря 2020 года — при нажатии клавиши ↑ поле вспыхивает синим, но значение не меняется.

Backspace работает как в обычном поле с маской: последовательно удаляет цифры с конца выделенной части даты, перепрыгивая разделители-точки:

Удаление клавишей Backspace: в поле «31.1» стирается цифра месяца, а следующее нажатие перескакивает точку и стирает последнюю цифру дня — остаётся «3» с выделенным днём

Если пользователь ввёл число из одной или двух цифр — контрол считает это указанием дня текущего месяца.

В поле в фокусе введено «15», после потери фокуса в поле «15.04.2021»

Поле корректно обрабатывает вставку даты из буфера обмена, приводя значение к правильному формату:

Вставленные значения «30/01/2021», «30,01,2021», «30-01-2021» и «30.01.21» приводятся к виду «30.01.2021»

Анимация

При скролле название следующего месяца выталкивает текущий месяц из заголовка.