---
title: Active Items
weight: 1
---
## Manually Activating Items
All items have an `isActive`, `setActive` and `setInactive` method. The last two allow you to manually determine whether an item is active or not (by default all items are inactive).
```php
Menu::new()->add(Link::to('#', 'Active')->setActive());
```
```html
```
If a child item is active, the parent will be considered active too:
```php
Menu::new()->add(
Menu::new()
->add(Html::raw('
')->setActive())
);
```
```html
```
## Automatically Determining the Active Items
The `Menu` class also has a `setActive` method, but it behaves differently than the method on `Link` and `Html`. It accepts a url or a callable as it's parameter, and will use that to determine which underlying items are active.
### Determining the Active Items With a Url
By providing a url you can set all links that contain or are equal to the url as active. Mixing absolute and relative url's isn't an issue either.
```php
Menu::new()
->link('/', 'Home')
->link('/about', 'About')
->link('/contact', 'Contact')
->setActive('https://example.com/about');
```
```html
```
If your base url isn't `/`, you should provide a request root to improve the active url matching.
```php
Menu::new()
->link('/nl/', 'Home')
->link('/nl/about', 'About')
->link('/nl/contact', 'Contact')
->setActive('https://example.com/nl/about', '/nl');
```
Html elements won't ever be set active automatically since they don't have a dedicated url property.
Calling `setActive` with a url will recursively traverse through submenus.
### Determining the Active Items With a Callable
If you want more control over which items you want to set active, you can use a callable that returns a boolean.
```php
$menu = Menu::new()
->link('/', 'Home')
->link('/about', 'About')
->link('/contact', 'Contact')
->setActive(function (Link $link) {
return $link->segment(1) === 'about';
});
```
```html
```
If you only want to iterate over a specific type of item, you can typehint it in the callable, and it will ignore other instances.
See
Manipulating Items for some examples.
The callable will not traverse through submenus. If you want to traverse deeper, you'll have to manually add a `setActive` call with a callable that typehints `Menu`.
## Active Items Class
By default, the parent element of active items will receive an `active` class. If you'd like to override the class name, you can do so with `setActiveClass`.
```php
Menu::new()
->setActiveClass('is-active')
->add(Link::to('/', 'Home')->setActive());
```
```html
```
If you want to apply the active class on the `a` instead of the `ul`, call the `setActiveClassOnLink` method when building your menu.
```php
Menu::new()
->setActiveClass('is-active')
->setActiveClassOnLink()
->add(Link::to('/', 'Home')->setActive());
```
```html
```