Использование якорной ссылки #id в Angular 6
Я работаю с проектом Angular 6, в котором я отключил / удалил hash-location-стратегии, который удаляет # из URL.
благодаря этому изменению ссылка имеет:
<li routerLinkActive="active">
<a [routerLink]="['/settings']">Contact Settings</a>
<ul class="child-link-sub">
<li>
<a href="#contactTypes">Contact Types</a>
</li>
</ul>
</li>
больше не работает, просто пропускает URL текущих компонентов и ставит #contactTypes после localhost.
Я нашел эту ссылку, которая должна решить проблему с помощью
<a [routerLink]="['/settings/']" fragment="contactTypes" >Contact Types</a>
который помещает #contactTypes в конец URL, но не прокручивается до верхней части браузера.
8 ответов
Angular 6.1 поставляется с опцией под названием achorScrolling
который живет в модуле маршрутизатора ExtraOptions
, Как anchorScrolling
определение говорит:
Настраивает, должен ли маршрутизатор прокручивать до элемента, когда в URL есть фрагмент.
'disabled'
- ничего не делает (по умолчанию).
'enabled'
- прокручивает до элемента. Эта опция будет по умолчанию в будущем.Прокрутка якоря не происходит в "popstate". Вместо этого мы восстанавливаем положение, которое мы сохранили, или прокручиваем вверх.
Вы можете использовать это так:
const routerOptions: ExtraOptions = {
useHash: false,
anchorScrolling: 'enabled',
// ...any other options you'd like to use
};
// then just import your RouterModule with these options
RouterModule.forRoot(MY_APP_ROUTES, routerOptions)
Я искал подобное решение и попытался использовать пакет ngx-scroll-to и обнаружил, что он не работает в последней версии angular, поэтому решил поискать другой вариант и обнаружил, что мы можем использовать scrollIntoView
HTML код:
<button (click)="scrollToElement(target)"></button>
<div #target>Your target</div>
Код Ц:
scrollToElement($element): void {
console.log($element);
$element.scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"});
}
Это сработало для меня (я использую Angular 12.1.3):
В HTML-шаблоне:
<a (click)="scrollTo('anchorId')">Scroll to another position</a>
Передайте идентификатор элемента, к которому вы хотите прокрутить (без символа хэштега
#
) к функции.
Затем в Typescript используйте
.scrollIntoView
чтобы браузер прокрутил до позиции этого элемента.
scrollTo(element: any): void {
(document.getElementById(element) as HTMLElement).scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"});
}
По причинам доступности мне пришлось перейти по ссылке в начале документа, чтобы предоставить пользователю прямой доступ к контенту с помощью программы чтения с экрана, пропуская таким образом части страницы, повторяющиеся от страницы к странице.
Поскольку мне нужна была ссылка, чтобы оставаться в фокусе (желательно с сохранением атрибута href), поскольку я фактически находился за пределами корня приложения или любого компонента (решение все еще работает внутри компонента), для этого я использовал простой старый добрый html и javascript:
<a href="./#content"
onclick="event.preventDefault(); location.hash='content';"
class="content-shortcut"
title="Access page content directly"
i18n-title
aria-label="Access page content directly"
i18n-label>Access page content directly</a>
<style>
.content-shortcut {
position: absolute;
opacity: 0;
height: 0px;
font-size: 1px;
}
.content-shortcut:focus,
.content-shortcut:active {
position: relative;
opacity: 1;
height: auto;
font-size: 1em;
display: block;
color: black;
background: white;
}
</style>
Это для Angular 9, но я уверен, что это принесет пользу сообществу,
Вы можете использовать Location
в @angular/common
чтобы получить текущий путь.
Допустим, у вас есть следующий элемент с идентификатором для фокусировки
<div id="bring-me-to-the-focus">
Здесь я показываю только извлеченные блоки кода.
import { Location } from '@angular/common';
constructor(private location: Location) { }
this.location.path() + '#bring-me-to-the-focus';
Уверен, это кому-то поможет:)
Ура.
Используйте прокрутку страницы ngx
<a pageScroll href="#awesomePart">Take me to the awesomeness</a>
<h2 id="awesomePart">This is where the awesome happens</h2>
Как указал Нитин Авула в комментарии, используяrouterLink
для хеш-якоря работает только в том случае, если вы переходите по другому маршруту или имеете onSameUrlNavigation
включен в конфигурации вашего маршрутизатора.
Способ обойти это - избавиться от routerLink
и вместо этого используйте this.router.navigate
в вашем *.component.ts
файл с fragment
параметр:
HTML -
<a (click)="scrollToContactTypes()">Contact Types</a>
TypeScript -
constructor(private router: Router) { }
scrollToContactTypes() {
this.router.onSameUrlNavigation = "reload";
this.router.navigate(["/settings"], { fragment: "contactTypes" }).finally(() => {
this.router.onSameUrlNavigation = "ignore"; // Restore config after navigation completes
});
}
Вам нужно использовать стратегию маршрутизации хэша, чтобы включить прокрутку хэша.
вам нужно дать второй аргумент в виде объекта типа RouterModule.forRoot ([],{useHash: true}}. Он будет работать.