46
loading...
This website collects cookies to deliver better user experience
<!-- navbar.component.html -->
<ul class="header-menu">
<li #navElements *ngFor="let item of navItemsList">
<a
routerLink="/{{item.route}}"
(click)="calcNewIndicatorDOMStyles()"
>
{{ item.name }}
</a>
</li>
<li
class="slider"
[style.width.px]="activeItemWidth"
[style.left.px]="activeItemLeftMargin">
</li>
</ul>
// navbar.component.css
.slider {
position: absolute;
bottom: -5px;
margin-left: 2.2em;
border-bottom: 2px solid white;
transition: 0.3s;
width: 50px;
}
<!-- navbar.component.html -->
<li
class="slider"
[style.width.px]="activeItemWidth" <======
[style.left.px]="activeItemLeftMargin"> <======
</li>
// navbar.component.ts
calcNewIndicatorDOMStyles() {
this.activeItemWidth = this.router.isActive(routes.name,
false)
? this.navItemDOMProps?.[0].width
: this.router.isActive(routes.posts, false)
? this.navItemDOMProps?.[1].width
: this.router.isActive(routes.random, false)
? this.navItemDOMProps?.[2].width
: this.router.isActive(routes.speed, false)
? this.navItemDOMProps?.[3].width
: 0;
this.activeItemLeftMargin =
this.router.isActive(routes.name, false)
? 0
: this.router.isActive(routes.posts, false)
? this.navItemDOMProps?.[0].width + 30
: this.router.isActive(routes.random, false)
? this.navItemDOMProps?.[0].width +
this.navItemDOMProps?.[1].width + 60
: this.router.isActive(routes.speed, false)
? this.navItemDOMProps?.[0].width +
this.navItemDOMProps?.[1].width +
this.navItemDOMProps?.[2].width + 90
: 0;
}
// navbar.component.ts
@ViewChildren('navElements') navElements:
QueryList<ElementRef>;
// navbar.component.ts
private getNewNavItemDOMWidths(navElementsList: any) {
this.navItemDOMProps = navElementsList.map(item => ({
width: item.nativeElement.offsetWidth
}));
}
ngAfterViewInit() {
this.getNewNavItemDOMWidths(this.navElements.toArray());
this.calcNewIndicatorDOMStyles();
}
ngAfterViewChecked() {
this.getNewNavItemDOMWidths(this.navElements.toArray());
this.calcNewIndicatorDOMStyles();
}
ngAfterViewChecked() {
this.getNewNavItemDOMWidths(this.navElements.toArray());
this.calcNewIndicatorDOMStyles();
setTimeout(() => {}, 0);
}