{"id":29701,"date":"2025-03-27T13:05:28","date_gmt":"2025-03-27T12:05:28","guid":{"rendered":"https:\/\/www.angulararchitects.io\/blog\/accessible-angular-routes\/"},"modified":"2025-04-07T20:06:03","modified_gmt":"2025-04-07T18:06:03","slug":"accessible-angular-routes","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/","title":{"rendered":"Accessible Angular Routes"},"content":{"rendered":"<div class=\"wp-post-series-box series-accessibility-in-angular-en wp-post-series-box--expandable\">\n\t\t\t<input id=\"collapsible-series-accessibility-in-angular-en69deaff2c9097\" class=\"wp-post-series-box__toggle_checkbox\" type=\"checkbox\">\n\t\n\t<label\n\t\tclass=\"wp-post-series-box__label\"\n\t\t\t\t\tfor=\"collapsible-series-accessibility-in-angular-en69deaff2c9097\"\n\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\t\t<p class=\"wp-post-series-box__name wp-post-series-name\">\n\t\t\tThis is post 3 of 6 in the series <em>&ldquo;Accessibility in Angular&rdquo;<\/em>\t\t<\/p>\n\t\t\t<\/label>\n\n\t\t\t<div class=\"wp-post-series-box__posts\">\n\t\t\t<ol>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/web-accessibility-in-angular\/\">Web Accessibility (A11y) in Angular \u2013 Introduction<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/accessibility-testing-tools\/\">Accessibility Testing Tools for Angular<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><span class=\"wp-post-series-box__current\">Accessible Angular Routes<\/span><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/aria-roles-attributes\/\">ARIA roles and attributes in Angular<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-forms\/\">Building Accessible Forms with Angular<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/angular-aria\/\">Why Angular ARIA in v21 is pretty neat<\/a><\/li>\n\t\t\t\t\t\t\t<\/ol>\n\t\t<\/div>\n\t<\/div>\n<p>This article explains how to use <em>Angular Router<\/em> features to achieve quick wins in improving <strong>Accessibility (A11y)<\/strong>. It is the third edition of our <strong>A11y blog series<\/strong>. If you want to enhance your <em>Angular A11y<\/em> skills, please make sure to read the other articles in this series as well.<\/p>\n<h2>Page Titles<\/h2>\n<p>Does your <em>Angular App<\/em> look like this if you open it in multiple tabs?<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/a11y-no-page-titles.png\" alt=\"Angular App without Page Titles\" \/><\/p>\n<p>If it does, you should definitely consider adding unique page titles for each route. The very easy-to-use <code>Route.title<\/code> feature shipped with <a href=\"https:\/\/x.com\/twerske\/status\/1488313309644214272\">Angular v14<\/a> in 2022, yet many <em>Angular Developers<\/em> are still not using it \ud83d\ude31. Please take a look and adopt it in your <em>Angular Apps<\/em>.<\/p>\n<h3>Route.title<\/h3>\n<p>Use this built-in <code>Router<\/code> feature to automatically update the page <code>&lt;title&gt;<\/code> after each successful navigation, enhancing both accessibility and UX for all of us. To enable it in your primary <code>&lt;router-outlet \/&gt;<\/code>, you only need to set the <code>title<\/code> property in your routes configuration array:<\/p>\n<pre><code class=\"language-typescript\">export const routes: Routes = [\n  {\n    path: &#039;demo&#039;,\n    title: &#039;Look how easy it is to use&#039;,\n    component: DemoComponent,\n  },\n];<\/code><\/pre>\n<p>This will update the page title in the browser tab and make it accessible to screen readers.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/a11y-page-title.png\" alt=\"Page Title Demo\" \/><\/p>\n<p>In larger <em>Angular Apps<\/em>, setting page titles can become inconsistent due to the lack of a common prefix or suffix for routes.<\/p>\n<h3>Global Page Title Strategy<\/h3>\n<p>To address this, you can extend <em>Angular's<\/em> abstract <code>TitleStrategy<\/code> class and implement your custom <strong>page title strategy<\/strong>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ [imports]\n\n@Injectable()\nexport class PageTitleStrategy extends TitleStrategy {\n  private readonly title = inject(Title);\n\n  updateTitle(routerState: RouterStateSnapshot): void {\n    const pageTitle = this.buildTitle(routerState);\n    if (pageTitle) {\n      this.title.setTitle(pageTitle + &#039; \u2013 Demo&#039;);\n    } else {\n      this.title.setTitle(&#039;Link to Demo below!&#039;);\n    }\n  }\n}<\/code><\/pre>\n<p>Then add the custom title strategy to your <code>app.config.ts<\/code>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ [imports]\nimport { PageTitleStrategy } from &quot;.\/page-tite-strategy&quot;;\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideClientHydration(withIncrementalHydration()),\n    provideExperimentalZonelessChangeDetection(),\n    provideRouter(routes),\n    { provide: TitleStrategy, useClass: PageTitleStrategy }, \/\/ add this line\n  ],\n};<\/code><\/pre>\n<h3>Dynamic Page Titles using Angular Router Params<\/h3>\n<p>To create dynamic page titles using <em>Angular Router<\/em> parameters, follow these steps:<\/p>\n<ol>\n<li>First, we set up the <code>withComponentInputBinding()<\/code> function to bind the route parameters to your component inputs:<\/li>\n<\/ol>\n<pre><code class=\"language-typescript\">\/\/ [imports]\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideClientHydration(withIncrementalHydration()),\n    provideExperimentalZonelessChangeDetection(),\n    provideRouter(routes, withComponentInputBinding()), \/\/ add feature to router\n    { provide: TitleStrategy, useClass: PageTitleStrategy },\n  ],\n};<\/code><\/pre>\n<ol start=\"2\">\n<li>Then, we add the parameter to the route definition:<\/li>\n<\/ol>\n<pre><code class=\"language-typescript\">export const routes: Routes = [\n  \/\/ [...]\n  {\n    path: &#039;demo\/:id&#039;,\n    title: &#039;Demo #id&#039;, \/\/ note that this will be ignored and replaced by the dynamic title\n    loadComponent: () =&gt; import(&#039;.\/demo\/demo.component&#039;),\n  },\n];<\/code><\/pre>\n<ol start=\"3\">\n<li>Now, we can simply add a <code>input<\/code> signal to the component that will automatically receive the route param (thanks to the <code>withComponentInputBinding()<\/code> feature):<\/li>\n<\/ol>\n<pre><code class=\"language-typescript\">\/\/ [imports &amp; decorator]\nexport class DemoComponent {\n  readonly id = input&lt;number | undefined&gt;();\n\n  \/\/ [...]\n}\n\nexport default DemoComponent;<\/code><\/pre>\n<ol start=\"4\">\n<li>Finally, we can use an <code>effect<\/code> on our <code>id<\/code> input signal to display the dynamic page title:<\/li>\n<\/ol>\n<pre><code class=\"language-typescript\">\/\/ [imports &amp; decorator]\nexport class DemoComponent {\n  readonly id = input&lt;number | undefined&gt;();\n  private readonly title = inject(Title);\n\n  constructor() {\n    effect(() =&gt; this.title.setTitle(this.id() !== undefined ? <code>Page #${this.id()} - Demo<\/code> : &#039;Page - Demo&#039;));\n  }\n}\n\nexport default DemoComponent;<\/code><\/pre>\n<p>Now, when you navigate to <code>\/demo\/1<\/code>, the page title will be set to <code>Page #1 - Demo<\/code>.<\/p>\n<h3>All Together Now<\/h3>\n<p>To bring it all together \u2013 with the global page title strategy \u2013 we add another method to the <code>PageTitleStrategy<\/code> class and provide it in <code>root<\/code>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ page-title-strategy.ts\nimport { RouterStateSnapshot, TitleStrategy } from &#039;@angular\/router&#039;;\nimport { inject, Injectable } from &#039;@angular\/core&#039;;\nimport { Title } from &#039;@angular\/platform-browser&#039;;\n\n@Injectable({\n  providedIn: &#039;root&#039;,\n})\nexport class PageTitleStrategy extends TitleStrategy {\n  private readonly title = inject(Title);\n\n  updateTitle(routerState: RouterStateSnapshot): void {\n    this.setTitle(this.buildTitle(routerState));\n  }\n\n  setTitle(pageTitle?: string): void {\n    if (pageTitle) {\n      this.title.setTitle(<code>${pageTitle} \u2013 Demo<\/code>);\n    } else {\n      this.title.setTitle(&#039;Page title like a pro&#039;);\n    }\n  }\n}<\/code><\/pre>\n<p>And here is the final version of the dynamic page title <code>effect<\/code> in the <code>DemoComponent<\/code> using our injected <code>PageTitleStrategy<\/code>:<\/p>\n<pre><code class=\"language-typescript\">\/\/ demo.component.ts\n\/\/ [imports &amp; decorator]\nexport class DemoComponent {\n  private readonly pageTitleStrategy = inject(PageTitleStrategy);\n\n  readonly id = input&lt;number | undefined&gt;();\n\n  constructor() {\n    effect(() =&gt; this.pageTitleStrategy.setTitle(this.id() !== undefined ? <code>Page #${this.id()}<\/code> : &#039;Page&#039;));\n  }\n}\n\nexport default DemoComponent;<\/code><\/pre>\n<p>Now you can set the page title depending on the route params and have a consistent suffix for all routes in your <em>Angular App<\/em>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/a11y-dynamic-page-title.png\" alt=\"Dynamic Page Title Demo\" \/><\/p>\n<p>Pretty nice, huh? Check out the full source code in the <code>title-strategy<\/code> branch of <a href=\"https:\/\/github.com\/L-X-T\/ssr-ih-ng19-days\/tree\/title-strategy\">my GitHub repo<\/a>.<\/p>\n<h2>RouterLinkActive<\/h2>\n<p>The <code>RouterLinkActive<\/code> directive is another powerful and lightweight tool for indicating the active state of navigation links in your <em>Angular App<\/em>. It allows you to apply CSS styles to navigation links based on their active state, making it easier to create appealing and accessible menus.<\/p>\n<pre><code class=\"language-html\">&lt;!-- nav.component.html --&gt;\n&lt;nav&gt;\n  &lt;a [routerLink]=&quot;demo&quot; routerLinkActive=&quot;active&quot;&gt;Demo&lt;\/a&gt;\n  &lt;!-- ... --&gt;\n&lt;\/nav&gt;<\/code><\/pre>\n<pre><code class=\"language-css\">&lt;!-- nav.component.scss --&gt;\nnav a.active {\n  color: var(--nav-link--active__color);\n  text-decoration: none;\n}<\/code><\/pre>\n<h3>Fine-tuned control with <code>routerLinkActiveOptions<\/code><\/h3>\n<p>Since <em>Angular v14<\/em>, you can use the <code>routerLinkActiveOptions<\/code> directive to fine-tune the active state of your links. Where <code>options<\/code> will have either the shape of <a href=\"https:\/\/angular.dev\/api\/router\/IsActiveMatchOptions\"><strong>IsActiveMatchOptions<\/strong><\/a>:<\/p>\n<pre><code class=\"language-typescript\">export declare interface IsActiveMatchOptions {\n  fragment: &#039;exact&#039; | &#039;ignored&#039;;\n  matrixParams: &#039;exact&#039; | &#039;subset&#039; | &#039;ignored&#039;;\n  paths: &#039;exact&#039; | &#039;subset&#039;;\n  queryParams: &#039;exact&#039; | &#039;subset&#039; | &#039;ignored&#039;;\n}<\/code><\/pre>\n<p>Or, just a boolean named <code>exact<\/code>:<\/p>\n<pre><code class=\"language-typescript\">{\n  exact: boolean\n}<\/code><\/pre>\n<p>To apply exact matching, add the <code>routerLinkActiveOptions<\/code> directive to your link:<\/p>\n<pre><code class=\"language-html\">&lt;!-- nav.component.html --&gt;\n&lt;nav&gt;\n  &lt;a\n    routerLink=&quot;\/demo&quot;\n  routerLinkActive=&quot;active&quot;\n  [routerLinkActiveOptions]=&quot;{ exact: true }&quot;\n  &gt;\n  Demo\n  &lt;\/a&gt;\n  &lt;!-- ... --&gt;\n&lt;\/nav&gt;<\/code><\/pre>\n<h3>Indicate current page <code>ariaCurrentWhenActive<\/code><\/h3>\n<p>A final quick win in <em>A11y in Angular<\/em> is to highlight the <strong>current page link<\/strong> in the nav for screen readers via <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-current\">aria-current<\/a>: We need to add the <code>aria-current=&quot;page&quot;<\/code> attribute. This can easily be done using the <a href=\"https:\/\/angular.dev\/best-practices\/a11y#active-links-identification\"><strong>ariaCurrentWhenActive<\/strong><\/a> input on the <code>routerLinkActive<\/code> directive by setting its value to &quot;page&quot;:<\/p>\n<pre><code class=\"language-html\">&lt;!-- nav.component.html --&gt;\n&lt;nav&gt;\n  &lt;a\n    routerLink=&quot;\/demo&quot;\n    routerLinkActive=&quot;active&quot;\n    [routerLinkActiveOptions]=&quot;{ exact: true }&quot;\n    ariaCurrentWhenActive=&quot;page&quot;\n  &gt;\n    Demo\n  &lt;\/a&gt;\n  &lt;!-- ... --&gt;\n&lt;\/nav&gt;<\/code><\/pre>\n<h2>Accessibility Workshop<\/h2>\n<p>For those looking to deepen their <em>Angular<\/em> expertise, we offer a range of workshops \u2013 both in English and German:<\/p>\n<ul>\n<li>\u267f <a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-accessibility-workshop\/\"><strong>Accessibility Workshop<\/strong><\/a><\/li>\n<li>\ud83d\udcc8 <a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-best-practices\/\"><strong>Best Practices Workshop<\/strong><\/a> (including accessibility related topics)<\/li>\n<li>\ud83d\ude80 <a href=\"https:\/\/www.angulararchitects.io\/en\/training\/angular-performance-optimization-workshop\/\"><strong>Performance Workshop<\/strong><\/a><\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Implementing <em>Angular's<\/em> built-in router features is a simple yet powerful way to boost your A11y \ud83d\ude80<\/p>\n<p>By leveraging dynamic page titles, a global title strategy, and fine-tuning active link indicators with <code>RouterLinkActive<\/code> and <code>ariaCurrentWhenActive<\/code>, you can create a more inclusive UX that benefits everyone \u2013 from seasoned Devs (like me \ud83d\ude02) to users who rely on assistive technologies. These strategies not only improve UX but also help standardize navigation and page management across all <em>Angular Apps<\/em>. Back to our example from the beginning, now our browser tab bar looks like this:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/a11y-with-page-titles.png\" alt=\"Angular App with Page Titles\" \/><\/p>\n<p>I think this is a great example of a quick win! Keep playing with these features and explore the rest of our A11y blog series for more insights on building accessible, high-performing web apps.<\/p>\n<p>In the next edition of our <strong>A11y blog series<\/strong>, we'll cover more <strong><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/aria-roles-attributes\/\">ARIA roles and attributes<\/a><\/strong>.<\/p>\n<p>This blog post was written by <a href=\"https:\/\/alex.thalhammer.name\">Alexander Thalhammer<\/a>. Follow me on <a href=\"https:\/\/at.linkedin.com\/in\/thalhammer\">Linkedin<\/a>, <a href=\"https:\/\/twitter.com\/LX_T\">X<\/a> or <a href=\"https:\/\/github.com\/L-X-T\">giThub<\/a>.<\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/L-X-T\/ssr-ih-ng19-days\/tree\/title-strategy\">GitHub repo of demo<\/a>, by Alexander Thalhammer<\/li>\n<li><a href=\"https:\/\/blog.angular.dev\/angular-v14-is-now-available-391a6db736af\">Angular v14 \u2013 official blog post<\/a> by Emma Twersky<\/li>\n<li><a href=\"https:\/\/x.com\/twerske\/status\/1488277224008478721\">Tweet about Route title<\/a> by Emma Twersky<\/li>\n<li><a href=\"https:\/\/dev.to\/brandontroberts\/setting-page-titles-natively-with-the-angular-router-393j\">Page Titles With The Router<\/a> by Brandon Roberts<\/li>\n<li><a href=\"https:\/\/briantree.se\/angular-tutorial-router-link-and-accessibility\/\">Router Link Accessibility Features<\/a> by Brian Treese<\/li>\n<li><a href=\"https:\/\/dev.to\/thisdotmedia\/make-it-accessible-navigation-in-angular-2gee\">Make it accessible: Navigation in Angular<\/a> by Daniel Marin<\/li>\n<li><a href=\"https:\/\/angular.dev\/api\/router\/RouterLinkActive#ariaCurrentWhenActive\">ariaCurrentWhenActive \u2013 official docs<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This is post 3 of 6 in the series &ldquo;Accessibility in Angular&rdquo; Web Accessibility (A11y) in Angular \u2013 Introduction Accessibility Testing Tools for Angular Accessible Angular Routes ARIA roles and attributes in Angular Building Accessible Forms with Angular Why Angular ARIA in v21 is pretty neat This article explains how to use Angular Router features [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":29502,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-29701","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","post_series-accessibility-in-angular-en"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Accessible Angular Routes - ANGULARarchitects<\/title>\n<meta name=\"description\" content=\"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Accessible Angular Routes - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-27T12:05:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-07T18:06:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/08\/a11y.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"417\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Alexander Thalhammer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/08\/a11y.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@LX_T\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alexander Thalhammer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\"},\"author\":{\"name\":\"Alexander Thalhammer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\"},\"headline\":\"Accessible Angular Routes\",\"datePublished\":\"2025-03-27T12:05:28+00:00\",\"dateModified\":\"2025-04-07T18:06:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\"},\"wordCount\":775,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\",\"name\":\"Accessible Angular Routes - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg\",\"datePublished\":\"2025-03-27T12:05:28+00:00\",\"dateModified\":\"2025-04-07T18:06:03+00:00\",\"description\":\"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg\",\"width\":1280,\"height\":853,\"caption\":\"Angular Router Highway Sunset\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Accessible Angular Routes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45\",\"name\":\"Alexander Thalhammer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g\",\"caption\":\"Alexander Thalhammer\"},\"sameAs\":[\"https:\/\/x.com\/LX_T\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Accessible Angular Routes - ANGULARarchitects","description":"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/","og_locale":"en_US","og_type":"article","og_title":"Accessible Angular Routes - ANGULARarchitects","og_description":"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/","og_site_name":"ANGULARarchitects","article_published_time":"2025-03-27T12:05:28+00:00","article_modified_time":"2025-04-07T18:06:03+00:00","og_image":[{"width":800,"height":417,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/08\/a11y.jpg","type":"image\/jpeg"}],"author":"Alexander Thalhammer","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2024\/08\/a11y.jpg","twitter_creator":"@LX_T","twitter_misc":{"Written by":"Alexander Thalhammer","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/"},"author":{"name":"Alexander Thalhammer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45"},"headline":"Accessible Angular Routes","datePublished":"2025-03-27T12:05:28+00:00","dateModified":"2025-04-07T18:06:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/"},"wordCount":775,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/","name":"Accessible Angular Routes - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg","datePublished":"2025-03-27T12:05:28+00:00","dateModified":"2025-04-07T18:06:03+00:00","description":"This article explains how to use Angular Router features to achieve quick wins in improving Accessibility (A11y)","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2025\/03\/angular-router-highway-sunset-1.jpg","width":1280,"height":853,"caption":"Angular Router Highway Sunset"},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/accessible-angular-routes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Accessible Angular Routes"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/eefb0cd4d115dfd406a02b6dbc760d45","name":"Alexander Thalhammer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23f1b6f9b1ee7d04247b8320851762347d56c76b1537d100d07390d6d919b78d?s=96&d=mm&r=g","caption":"Alexander Thalhammer"},"sameAs":["https:\/\/x.com\/LX_T"]}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/29701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=29701"}],"version-history":[{"count":3,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/29701\/revisions"}],"predecessor-version":[{"id":29706,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/29701\/revisions\/29706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/29502"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=29701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=29701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=29701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}