Ошибка должна быть рядом с полем, связанной программно и заметной визуально — без опоры только на цвет.
Рекомендации
У поля: текст ошибки сразу после/до инпута.
Связь через aria-describedby (и при необходимости aria-invalid="true").
Сводка ошибок вверху формы для длинных форм + ссылки к полям.
Фокус: при submit — на сводку или первое невалидное поле.
<labelfor="email">Email</label><inputid="email"type="email"aria-invalid="true"aria-describedby="email-err"><pid="email-err">Укажите email в формате name@example.com</p>
Итог
Локально у поля + программная связь. Глобальный список — дополнение для больших форм.
Куда лучше помещать сообщения об ошибках в форме? · Sobeso