Короткий ответ
Ссылки должны использоваться, если URL-адрес изменяется (навигация) для всего остального, следует использовать кнопку. <a href="#"
- не лучшая практика, но для СПА должно быть нормально, если текст вашей ссылки точный и подробный. Избегайте плавной прокрутки или дайте людям возможность отключить ее, так как это может дезориентировать.
Более длинный ответ
Я дал довольно развернутый ответ на <a>
против <button>
в SPA здесь , поэтому я надеюсь, что этого достаточно, чтобы ответить, какой из них использовать в каком сценарии для общих случаев использования.
Что касается #
в URL-адресе из-за того, что вы не знали URL-адрес раньше рука. Было бы намного лучше, если вы запустите его как #
, если URL-адрес неизвестен, но затем обновите href
, как только вы узнаете, куда вы собираетесь направлять людей.
Это по причинам, обсуждаемым в ответ, который я связал относительно заверения, т.е. зная, куда меня приведет ссылка.
Очевидно, если вы не можете сделать это, убедитесь, что текст ссылки очень информативный, чтобы я мог быть уверен, что иду в нужное место.
Прокрутка в SPA
Что касается прокрутки к различным частям страницы, которые все равно будут ссылкой, как вы говорите, при условии, что вы обновляете URL с #section-name
. Вы должны сделать это , но если маршрутизатор вашего приложения не может обрабатывать фрагменты URL-адресов, я бы вообще не обновлял URL-адрес и заменял его на кнопку.
На этом этапе я бы использовал некоторые визуальные скрытый текст внутри кнопки, поясняющий, что при этом выполняется прокрутка к разделу на текущей странице.
Пример ниже иллюстрирует это. Пожалуйста, используйте класс CSS ниже, чтобы визуально скрыть текст , поскольку он имеет лучшую совместимость, чем bootstrap sr-only класс, как объяснено в этом ответе, который я дал .
.visually-hidden {
border: 0;
padding: 0;
margin: 0;
position: absolute !important;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 - a 0 height clip, off to the bottom right of the visible 1px box */
clip: rect(1px, 1px, 1px, 1px); /*maybe deprecated but we need to support legacy browsers */
clip-path: inset(50%); /*modern browsers, clip-path works inwards from each corner*/
white-space: nowrap; /* added line to stop words getting smushed together (as they go onto seperate lines and some screen readers do not understand line feeds as a space */
}
<button><span class="visually-hidden">Go To </span>Section name<span class="visually-hidden"> on this page</span></button>
Коротко о плавной прокрутке
Наконец, я хотел бы предостеречь вас от использования плавной прокрутки. Если вы используете это, убедитесь, что есть способ отключить его, так как он может отвлекать или дезориентировать людей с двигательными или тревожными расстройствами.
Один из способов сделать это - использовать CSS медиа-запрос prefers-reduced-motion
.
Заключительные мысли
Не видя каждого сценария, трудно дать 100% окончательный ответ, если вы можете попробовать и следовать стандартным шаблонам навигации кнопок для действий на одной и той же странице, ссылок с фрагментами URL для перехода к разделам той же страницы и ссылок на другие страницы, даже если они обрабатываются через AJAX и только частичные перезагрузки.
Очевидно, что это цель , Я знаю, что с некоторыми решениями маршрутизации это не всегда возможно, и в этом случае используйте здравый смысл и протестируйте его с помощью программы чтения с экрана , поскольку пользователи программ чтения с экрана, скорее всего, пострадают от плохо сформированной системы навигации в SPA.
Последний совет - если вы все же меняете страницу в SPA, сделайте <h1>
на ne xt, программно настраиваемая с помощью tabindex="-1"
и фокусируемая после загрузки страницы. Это отличный способ сообщить пользователям с ограниченным зрением, что навигация в SPA завершена, используя AJAX.