Web Components On Fire
Mobile screens are small and their tiny headers rarely fit all the navigation links that we want to put in them. This is a very common problem and the reason for the popularity for one of the most played-out interface patterns of the last decade: the hamburger icon (), those three horizontal lines that somehow indicate to contemporary humans that a menu is hidden somewhere.
Ideally, navigation links should be visible all the time and not hidden inside a menu. An optimal setup balances these constraints by displaying all the links on larger desktop screens, then collapsing them behind the hamburger icon when screen space gets tight.
That is the functionality encapsulated in the
<hotfx-responsive-menu>
custom element. We’ve used
this element on many sites on Hot Page already, including our home page and our documentation. Here’s another quick
example of the menu. Use the buttons to resize the window and see it in
its two different states.
To create this menu, first add this script to your page:
Then you can just wrap your menu items in the
<hotfx-responsive-menu>
element:
<hotfx-responsive-menu>
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/pricing">Pricing</a>
</hotfx-responsive-menu>
That’s actually all you need to get this working, but let’s see how you can customize the behavior and styles of the menu.
The responsive menu accepts a width
attribute which lets
you control the breakpoint for the metamorphosis of the menu. By
default, this value is 800
, which means that the element
uses a (max-width: 800px)
media query and the menu will
hide itself behind the hamburger icon when the browser’s width is below
800 pixels. You can play with the following example to see how the
breakpoint works.
You can set your breakpoint at the point when your menu links start to feel a bit too crowded for their space. Every menu is different so there’s really no telling what is the best value for you. Always remember to check the result in different browsers and operating systems.
The menu exposes different pieces of the markup using
part()
pseudo elements, so that you can style them with
your own CSS.
When the menu is in it’s expanded form on desktop, your content is
slotted into a <nav>
element that can be styled with
::part(static)
. By default it’s just a simple flexbox row.
When the menu is in it’s collapsed or hamburger state, things get a
little more interesting and you have three parts:
::part(button)
, ::part(drawer)
,
::part(backdrop)
. This is pretty self-explanatory but the
button is the hamburger, the drawer is the menu itself and the backdrop
is the menu background. On the Hot Page home
page, we styled the backdrop using the
backdrop-filter
property with a blur and a hue-rotate
filter for a neat effect.
The hamburger icon itself is an inline SVG image and it’s
easy to change its color using the CSS color:
property.
You can of course style your menu items in light DOM before they are
slotted into the menu. If you want to change the style of your links
only when they are shown in the drawer, you can do that using the
[state="drawer"]
attribute selector on the menu
itself. Something like this:
hotfx-responsive-menu[state="drawer"] a {
color: blue;
}
The above styles will change the links to blue only when they
are shown in the drawer. When the menu content is displayed without the
drawer you can use [state="static"]
to target the
content.
By default, the drawer slides in from the right side. But you might
also prefer the left side. There’s an easy customization for that by
setting a position="left"
attribute:
<hotfx-responsive-menu position="left">
The menu element provides a handful of methods to control it imperatively:
open()
to open the menuclose()
to close the menutoggle()
closes the menu if it is open and openes the
menu if it is closedYou could use this to, for example, include a close button inside the drawer. Take a look how that might work:
<button onClick="this.closes('hotfx-responsive-menu').close()">Close</button>
If customizing the size and color of the hamburger icon is not enough
for you, you may want to replace it entirely by adding a new one and
setting slot="icon"
. In this example, we’ve
included a separate button to close the menu using JavaScript as
described in the previous section.
If you wish to make any bigger changes to the menu, you may want to read the source code or checkout the GitHub repo for HotFX. If you find any bugs or have feature requests, please open an issue on the repo and we’ll be happy to take a look.