Tabs

Tailwind CSS and Alpine JS Tab

Tabs are a great way to display different sections of your website. They can be used to indicate the current section, navigate to the next or previous section, and more.

Requires Alpine JS

This component requires Alpine JS v3 to function properly. Some advanced features may require additional Alpine plugins (such as focus).

Tell Me More

Default tabs

Requires Alpine JS Focus Plugin

A list of tabs with a tab panel.

Groups tab is selected
Likes tab is selected
Comments tab is selected
Saved tab is selected
HTML
<div class="">
	<div class="" role="tablist" aria-label="tab options">
		<button class="" type="button" role="tab" aria-controls="tabpanelGroups" >Groups</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelLikes" >Likes</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelComments" >Comments</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelSaved" >Saved</button>
	</div>
	<div class="">
		<div id="tabpanelGroups" role="tabpanel" aria-label="groups"><b><a href="#" class="">Groups</a></b> tab is selected</div>
		<div id="tabpanelLikes" role="tabpanel" aria-label="likes"><b><a href="#" class="">Likes</a></b> tab is selected</div>
		<div id="tabpanelComments" role="tabpanel" aria-label="comments"><b><a href="#" class="">Comments</a></b> tab is selected</div>
		<div id="tabpanelSaved" role="tabpanel" aria-label="saved"><b><a href="#" class="">Saved</a></b> tab is selected</div>
	</div>
</div>

Tabs with icon

Requires Alpine JS Focus Plugin

A list of tabs with icons and a tab panel.

Groups tab is selected
Likes tab is selected
Comments tab is selected
Saved tab is selected
HTML
<div class="">
	<div class="" role="tablist" aria-label="tab options">
		<button class="" type="button" role="tab" aria-controls="tabpanelGroups" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="M10 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM6 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM1.49 15.326a.78.78 0 0 1-.358-.442 3 3 0 0 1 4.308-3.516 6.484 6.484 0 0 0-1.905 3.959c-.023.222-.014.442.025.654a4.97 4.97 0 0 1-2.07-.655ZM16.44 15.98a4.97 4.97 0 0 0 2.07-.654.78.78 0 0 0 .357-.442 3 3 0 0 0-4.308-3.517 6.484 6.484 0 0 1 1.907 3.96 2.32 2.32 0 0 1-.026.654ZM18 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM5.304 16.19a.844.844 0 0 1-.277-.71 5 5 0 0 1 9.947 0 .843.843 0 0 1-.277.71A6.975 6.975 0 0 1 10 18a6.974 6.974 0 0 1-4.696-1.81Z" />
			</svg>
			Groups
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelLikes" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="m9.653 16.915-.005-.003-.019-.01a20.759 20.759 0 0 1-1.162-.682 22.045 22.045 0 0 1-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 0 1 8-2.828A4.5 4.5 0 0 1 18 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 0 1-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 0 1-.69.001l-.002-.001Z" />
			</svg>
			Likes
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelComments" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="M3.505 2.365A41.369 41.369 0 0 1 9 2c1.863 0 3.697.124 5.495.365 1.247.167 2.18 1.108 2.435 2.268a4.45 4.45 0 0 0-.577-.069 43.141 43.141 0 0 0-4.706 0C9.229 4.696 7.5 6.727 7.5 8.998v2.24c0 1.413.67 2.735 1.76 3.562l-2.98 2.98A.75.75 0 0 1 5 17.25v-3.443c-.501-.048-1-.106-1.495-.172C2.033 13.438 1 12.162 1 10.72V5.28c0-1.441 1.033-2.717 2.505-2.914Z" />
				<path d="M14 6c-.762 0-1.52.02-2.271.062C10.157 6.148 9 7.472 9 8.998v2.24c0 1.519 1.147 2.839 2.71 2.935.214.013.428.024.642.034.2.009.385.09.518.224l2.35 2.35a.75.75 0 0 0 1.28-.531v-2.07c1.453-.195 2.5-1.463 2.5-2.915V8.998c0-1.526-1.157-2.85-2.729-2.936A41.645 41.645 0 0 0 14 6Z" />
			</svg>
			Comments
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelSaved" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path fill-rule="evenodd" clip-rule="evenodd" d="M10 2c-1.716 0-3.408.106-5.07.31C3.806 2.45 3 3.414 3 4.517V17.25a.75.75 0 0 0 1.075.676L10 15.082l5.925 2.844A.75.75 0 0 0 17 17.25V4.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 2Z" />
			</svg>
			Saved
		</button>
	</div>
	<div class="">
		<div id="tabpanelGroups" role="tabpanel" aria-label="groups"><b><a href="#" class="">Groups</a></b> tab is selected</div>
		<div id="tabpanelLikes" role="tabpanel" aria-label="likes"><b><a href="#" class="">Likes</a></b> tab is selected</div>
		<div id="tabpanelComments" role="tabpanel" aria-label="comments"><b><a href="#" class="">Comments</a></b> tab is selected</div>
		<div id="tabpanelSaved" role="tabpanel" aria-label="saved"><b><a href="#" class="">Saved</a></b> tab is selected</div>
	</div>
</div>

Tabs with icon and badge

Requires Alpine JS Focus Plugin

A list of tabs with icons and badges and a tab panel.

Groups tab is selected
Likes tab is selected
Comments tab is selected
Saved tab is selected
HTML
<div class="">
	<div class="" role="tablist" aria-label="tab options">
		<button class="" type="button" role="tab" aria-controls="tabpanelGroups" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="M10 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM6 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM1.49 15.326a.78.78 0 0 1-.358-.442 3 3 0 0 1 4.308-3.516 6.484 6.484 0 0 0-1.905 3.959c-.023.222-.014.442.025.654a4.97 4.97 0 0 1-2.07-.655ZM16.44 15.98a4.97 4.97 0 0 0 2.07-.654.78.78 0 0 0 .357-.442 3 3 0 0 0-4.308-3.517 6.484 6.484 0 0 1 1.907 3.96 2.32 2.32 0 0 1-.026.654ZM18 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM5.304 16.19a.844.844 0 0 1-.277-.71 5 5 0 0 1 9.947 0 .843.843 0 0 1-.277.71A6.975 6.975 0 0 1 10 18a6.974 6.974 0 0 1-4.696-1.81Z" />
			</svg>
			Groups
			<span class="">2</span>
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelLikes" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="m9.653 16.915-.005-.003-.019-.01a20.759 20.759 0 0 1-1.162-.682 22.045 22.045 0 0 1-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 0 1 8-2.828A4.5 4.5 0 0 1 18 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 0 1-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 0 1-.69.001l-.002-.001Z" />
			</svg>
			Likes
			<span class="">3124</span>
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelComments" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path d="M3.505 2.365A41.369 41.369 0 0 1 9 2c1.863 0 3.697.124 5.495.365 1.247.167 2.18 1.108 2.435 2.268a4.45 4.45 0 0 0-.577-.069 43.141 43.141 0 0 0-4.706 0C9.229 4.696 7.5 6.727 7.5 8.998v2.24c0 1.413.67 2.735 1.76 3.562l-2.98 2.98A.75.75 0 0 1 5 17.25v-3.443c-.501-.048-1-.106-1.495-.172C2.033 13.438 1 12.162 1 10.72V5.28c0-1.441 1.033-2.717 2.505-2.914Z" />
				<path d="M14 6c-.762 0-1.52.02-2.271.062C10.157 6.148 9 7.472 9 8.998v2.24c0 1.519 1.147 2.839 2.71 2.935.214.013.428.024.642.034.2.009.385.09.518.224l2.35 2.35a.75.75 0 0 0 1.28-.531v-2.07c1.453-.195 2.5-1.463 2.5-2.915V8.998c0-1.526-1.157-2.85-2.729-2.936A41.645 41.645 0 0 0 14 6Z" />
			</svg>
			Comments
			<span class="">243</span>
		</button>
		<button class="" type="button" role="tab" aria-controls="tabpanelSaved" >
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="">
				<path fill-rule="evenodd" clip-rule="evenodd" d="M10 2c-1.716 0-3.408.106-5.07.31C3.806 2.45 3 3.414 3 4.517V17.25a.75.75 0 0 0 1.075.676L10 15.082l5.925 2.844A.75.75 0 0 0 17 17.25V4.517c0-1.103-.806-2.068-1.93-2.207A41.403 41.403 0 0 0 10 2Z" />
			</svg>
			Saved
			<span class="">32</span>
		</button>
	</div>
	<div class="">
		<div id="tabpanelGroups" role="tabpanel" aria-label="groups"><b><a href="#" class="">Groups</a></b> tab is selected</div>
		<div id="tabpanelLikes" role="tabpanel" aria-label="likes"><b><a href="#" class="">Likes</a></b> tab is selected</div>
		<div id="tabpanelComments" role="tabpanel" aria-label="comments"><b><a href="#" class="">Comments</a></b> tab is selected</div>
		<div id="tabpanelSaved" role="tabpanel" aria-label="saved"><b><a href="#" class="">Saved</a></b> tab is selected</div>
	</div>
</div>

Data

List of all Alpine JS data used in this component.

Property Description
selectedTab String - Name or identifier of the selected tab

Keyboard Navigation

Key Action
Tab Focus outside tablist: Active gets the focus
Focus inside tablist: Active tab panel gets the focus
Space Enter Focused item gets selected
Previous/Next tab gets focus