A lightweight, customizable Angular library for creating beautiful horizontal scrolling menus with smooth navigation controls. Compatible with Angular 19+ and includes 100% test coverage.
npm install ngx-horizontal-scroll-menu





> π Now compatible with Angular 19! Fully updated with 100% test coverage and modern Angular features.
A lightweight, customizable Angular library for creating beautiful horizontal scrolling menus with smooth navigation controls. Perfect for navigation bars, category filters, or any horizontal list that needs elegant scrolling functionality.
β¨ Key Benefits:
- π― Zero Configuration - Works out of the box with sensible defaults
- π¨ Fully Customizable - Style with your own CSS classes
- π± Responsive - Adapts to different screen sizes
- β‘ Lightweight - Minimal bundle size impact
- π§ TypeScript Support - Full type safety included
- π§ͺ 100% Test Coverage - Production-ready reliability
- π Dynamic Menu Items - Pass any array of objects as menu items
- π Smart Link Handling - Automatic link detection or custom click events
- π¨ Custom Styling - Apply your own CSS classes for background and text
- πββοΈ Smooth Scrolling - Configurable scroll speed and distance
- ποΈ Navigation Controls - Optional left/right arrow navigation
- πΌοΈ Custom Icons - Use your own navigation arrow icons
- π± Touch Friendly - Works great on mobile devices
- βΏ Accessible - Keyboard navigation support
``bash`
npm install ngx-horizontal-scroll-menu --save
For Angular 19+ (Standalone Components - Recommended):
`typescript
import { HorizontalScrollMenuComponent } from 'ngx-horizontal-scroll-menu';
@Component({
standalone: true,
imports: [HorizontalScrollMenuComponent],
// ... your component
})
export class MyComponent { }
`
Alternative - Using the Module:
`typescript
import { HorizontalScrollMenuModule } from 'ngx-horizontal-scroll-menu';
@Component({
standalone: true,
imports: [HorizontalScrollMenuModule],
// ... your component
})
export class MyComponent { }
`
For NgModule-based Apps:
`typescript
import { NgModule } from '@angular/core';
import { HorizontalScrollMenuModule } from 'ngx-horizontal-scroll-menu';
@NgModule({
imports: [
HorizontalScrollMenuModule
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule { }
`
Basic Usage:
`typescript
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template:
[linkLabel]="'url'"
[background]="'bg-primary'"
[text]="'text-white'">
`
})
export class AppComponent {
menuItems = [
{ title: 'Home', url: '/home' },
{ title: 'Products', url: '/products' },
{ title: 'Services', url: '/services' },
{ title: 'About', url: '/about' },
{ title: 'Contact', url: '/contact' }
];
}
With Click Events (No Links):
`typescript
@Component({
template:
(clickedEventEmiiter)="onCategoryClick($event)">
})
export class AppComponent {
categories = [
{ title: 'Electronics', id: 1 },
{ title: 'Clothing', id: 2 },
{ title: 'Books', id: 3 },
{ title: 'Sports', id: 4 }
];
onCategoryClick(category: any) {
console.log('Selected category:', category);
// Handle navigation programmatically
this.router.navigate(['/category', category.id]);
}
}
`
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| items | any[] | [] | Array of menu items to display. Each item should have a title property |linkLabel
| | string | 'link' | Property name in items that contains the URL. Omit for click events only |background
| | string | undefined | CSS class name for styling the menu background |text
| | string | undefined | CSS class name for styling the menu item text |distance
| | number | 50 | Scroll distance in pixels when using navigation arrows |scrollSpeed
| | number | 100 | Scroll animation speed in milliseconds (for mousedown events) |hideNav
| | boolean | false | Hide the left/right navigation arrows |leftIcon
| | string | Base64 arrow | Custom icon for navigation arrows (24px recommended) |navIcon
| | ImageModel | undefined | Custom navigation icon configuration |
| Event | Type | Description |
|-------|------|-------------|
| clickedEventEmiiter | EventEmitter | Emitted when a menu item is clicked. Returns the clicked item object |
`typescript`
interface ImageModel {
type: string; // Image type (e.g., 'png', 'svg')
image: string; // Image URL or base64 data
}
Bootstrap Classes:
`html`
[background]="'bg-dark'"
[text]="'text-light fw-bold'">
Custom CSS Classes:
`css
.custom-menu-bg {
background: linear-gradient(45deg, #667eea 0%, #764ba2 100%);
border-radius: 10px;
padding: 10px;
}
.custom-menu-text {
color: white;
font-weight: 600;
text-transform: uppercase;
}
`
Custom Scroll Behavior:
`html`
[distance]="100"
[scrollSpeed]="50"
[hideNav]="false">
- [ ] Virtual Scrolling - Handle thousands of items efficiently
- [ ] Keyboard Navigation - Arrow key support
- [ ] RTL Support - Right-to-left language support
- [ ] Accessibility Improvements - Enhanced ARIA support
- [ ] Animation Presets - Pre-built scroll animations
- [ ] Icon Customization - More flexible icon system
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
1. Fork the repository
2. Create your feature branch (git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature'
3. Commit your changes ()git push origin feature/AmazingFeature`)
4. Push to the branch (
5. Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Isah Ohieku
- GitHub: @isahohieku
- Twitter: @isahohieku
---
β If this library helped you, please give it a star! β