Navbar SCSS Sources
The Navbar component comes packed with a set of SCSS mixins and functions you can use for various purposes. The idea behind is to allow for flexible customization and enable seamless integration with third party applications.
While the component can work out of the box with Bootstrap with minor markup adjustments, some special mixins have been developed to better complement the library without overloading the render and keeping the same design concept.
Starting with version 3.1.x, Navbar supports CSS variables for setting all styling, color and layout of the navbar and sub-menu, except the responsive breakpoint.
Main SCSS Mixins
Next up, we're going to highlight the navbar component features out of the box, with the default style applied to the
default markup. There are several mixins you can combine or extend, for instance the navbar.scss
file sets the default style and uses the default mixins:
@import 'variables', 'mixins', 'root';
@include navbar-mobile-layout;
@include navbar-desktop-layout;
@include navbar-style;
@include nav-layout;
@include nav-style;
@include subnav-style;
@include main-menu;
navbar-mobile-layoutprovides the basic layout styling and base typography for the mobile view of the navbar as well as for its parts, specifically the brand link, navbar-toggle button and the menu wrapper;navbar-desktop-layoutoverrides the layout styling for larger screen sizes and desktop computers by changing the flexbox properties and elements visibility;navbar-stylesets the navbar background but also sets text color for the brand link, regular links, text contents;nav-layoutsets the layout style for the menu itself, then for root menu items and the sub-menu items, all in terms of spacing, typography, etc; in addition it sets the menu icons layout style;nav-stylesets the text color and background color for root menu items, for normal, active and hover states;subnav-stylesets the background color and the box-shadow for the sub-menu, the text color and background color for sub-menu items, for normal, active and hover states; if you don't use any sub-menus, you can skip this mixin all together;main-menusets the position of the sub-menus as well as the animation for each level.
In other cases shown in the demos, some of these mixins can be skiped, others can be configured for different other unique purposes. For instance the Left Menu build only styles the menu itself, or the Bootstrap build uses its own specific set of mixins, to preserve the original design concept.
CSS / SCSS Variables
The SCSS mixins are fed a series of variables you can control, anything from typography and spacing to colors and animation. The input values can change how the mixins function by providing specific values:
- Typography variables are designed to set an overall consistent layout and some of them can be inherited in the menu tree structure.
- Typography in general is designed to cover various other content types, within the navbar itself or sub-menu items, but you can remove parts or entire sets of style rules, just by using specific input values.
- Color variables can also be inherited in the menu tree, but mixins will then apply a small contrast to avoid any possible visual inconsistency.
- While accepting valid color values, variables related to text color can also use
autovalue, so you can have less work to worry about. - In other cases the style rule is automatically reduntant, for instance brand link text color and background are not
needed when you use an
<img>element, a case where you only need to adjust some spacing. - Keep in mind that the mixins use variables designated for navbar and root menu items apply to mobile devices on all menu tree structure, while variables designated for sub-menu apply on non-mobile devices. This is why we call our component a mobile first design concept.
- Due to the nature of the automatic and/or inherit functionality, the mixins also provide a fail-safe mechanism for invalid input values, but mixins will provide a log of the build process.
Navbar Padding and Global Typography
First we have the Navbar padding setting, which is ZERO by default, but when used it will make easier integration with third party application, as we will see in the Bootstrap demo.
Then the global navbar typography variables are important for the size of menu items of the root menu, the brand link, menu icons, as well as other content items. These values are inherited by sub-menu items and other contents as we'll see in a minute. Valid values are expected, but when you set to ZERO, the style rules are removed, so then the navbar will inherit these values from a parent element.
// NAVBAR METRIX
$navbar-padding-x: 0 !default;
$navbar-padding-y: 0 !default;
$navbar-line-height: 1.5rem !default;
$navbar-font-size: 14px !default;
$navbar-padding-xsets the horizontal padding for the navbar;$navbar-padding-ysets the vertical padding for the navbar;$navbar-line-heightsets the globally applied line-height of the navbar;$navbar-font-sizesets the globally applied font-size of the navbar.
These SCSS variables are translated into the following CSS variables:
// NAVBAR METRIX
--nv-padding-x: #{real-size($navbar-padding-x, 1)};
--nv-padding-y: #{real-size($navbar-padding-y, 1)};
--nv-line-height: #{$navbar-line-height};
--nv-font-size: #{$navbar-font-size};
The padding related CSS variables are forced to use a unit via the real-size() function,
the resulting values are consistent with the CSS calc() function.
Primary Color
The color you can use to highlight active menu items. The variable expects valid HEX,
RGBA, RGB or transparent values.
// PRIMARY COLOR
$primary-color: #006699 !default;
$primary-colorsets an accent color to be used by active menu items for text color or background color, in our case it's the second.
This value is then used by the CSS variable:
// PRIMARY COLOR
--nv-primary-color: #{$primary-color};
Navbar and Submenu Background
The navbar global color variables are both totally up to your project, they expect valid values HEX,
RGBA, RGB or transparent. The $navbar-background is required to
determine the value of other variables set to auto as we'll see in a minute.
The sub-menu can use its own background color or inherit the value of $navbar-background with a light
contrast applied when set to inherit.
// NAVBAR AND SUBNAV BACKGROUND COLOR
$navbar-background: #687c86 !default;
$subnav-background: #dadee0 !default;
$navbar-backgroundsets the navbar background color.$subnav-backgroundsets the background color for sub-menus.
These SCSS variables are then pushed into the following CSS variables:
// NAVBAR AND SUBNAV BACKGROUND COLOR
--nv-bg: #{$navbar-background};
--nv-subnav-bg: #{$subnav-background};
Navbar Text Colors
The following variables set the global navbar text color and anchor link color. The expected values are HEX,
RGBA, RGB, transparent or auto.
When set to auto the mixins will set a color based on the lightness of the above $navbar-background,
with a light contrast for text content and a stronger contrast for links. Now if the background is also transparent
the style rule is again removed so you must provide a valid color value if that is required in order to keep consistency in check.
// NAVBAR TEXT COLORS
$navbar-text-color: auto !default;
$navbar-link-color: auto !default;
$navbar-link-color-hover: auto !default;
$navbar-text-colorsets a global color for regular text content;$navbar-link-colorsets a global color for anchor links and applies to non-menu item links;$navbar-link-color-hoversets a global color for anchor links in hover state.
These variables are then processed to have good contrast with the navbar background and pushed into the CSS variables:
// NAVBAR TEXT COLORS
--nv-text-color: #{get-color($navbar-text-color, $navbar-background, .55)};
--nv-link-color: #{get-color($navbar-link-color, $navbar-background, .75)};
--nv-link-color-hover: #{get-color($navbar-link-color-hover, $navbar-background, .95)};
These global color values apply mostly for the mobile layout and they are important for the .navbar-toggle
and .subnav-toggle elements.
Submenu Text Colors
These variables override the above variables for sub-menu content items on non-mobile devices and work pretty much the same.
They expect the same HEX, RGBA, RGB, transparent or auto
values. When set to transparent, the respective style rule is ignored and when set to auto
the color is determined based on the lightness of $subnav-background or $subnav-item-background
if any of them is set a valid color value, if not, the style rule is removed.
// SUBNAV TEXT COLORS
$subnav-text-color: auto !default;
$subnav-link-color: auto !default;
$subnav-link-color-hover: auto !default;
$subnav-text-colorsets a color for regular text content inside your sub-menu;$subnav-link-colorsets a color for anchor links inside your sub-menu;$subnav-link-color-hoversets a color for anchor links inside your sub-menu in hover state.
Similar with above CSS variables, same apply to sub-menus on the desktop layout:
// SUBNAV TEXT COLORS
--nv-subnav-text-color: #{get-color($subnav-text-color, $subnav-background, .55)};
--nv-subnav-link-color: #{get-color($subnav-link-color, $subnav-background, .75)};
--nv-subnav-link-color-hover: #{get-color($subnav-link-color-hover, $subnav-background, .95)};
Menu Item Metrics
These variables set the global typography and spacing strictly for menu items. Accepted values are basically all
numerical em, vw, vh, rem, px based values or
inherit. When inherit is set for the first two of the below, $navbar-font-size
and $navbar-line-height will be used respectivelly; when any of the two variables are set to ZERO,
their respective style rules are removed.
Now the next two variables $item-padding-y and $item-padding-x are used
for the menu item padding, both the root menu items and sub-menu items, but also for other spacing related
variables used for other content items or sub-menu.
The last two variables $root-item-padding and $subnav-item-padding set the menu item
padding; the first is important for the general layout of the menu and is inherited by the second when that
is set to inherit.
The $root-item-padding-x $root-item-padding-y are very important, they must set a
valid value.
// MENU ITEM METRIX
$root-item-font-size: $navbar-font-size !default;
$root-item-line-height: $navbar-line-height !default;
$subnav-item-font-size: inherit !default;
$subnav-item-line-height: inherit !default;
$item-padding-y: 0.5rem !default;
$item-padding-x: 1rem !default;
$root-item-margin: 0 !default;
$subnav-item-margin: 0 !default;
$root-item-font-sizesets a font size for root menu items and overrides the$navbar-font-sizeif a valid value is set;$root-item-line-heightsets a line height for menu items, overrides the$navbar-line-heightif a valid value is set;$subnav-item-font-sizesets a font size for sub-menu items and overrides the$subnav-font-sizeif a valid value is set;$subnav-item-line-heightsets a line height for sub-menu items, overrides the$subnav-line-heightif a valid value is set;$item-padding-ysets a global vertical spacing for menu items;$item-padding-xsets a global horizontal spacing for menu items;$root-item-marginsets the margin for root menu items, but only for desktop layout;$subnav-item-marginsets the margin for sub-menu items and applies only to the desktop layout.
These variables are pushed into the following CSS variables:
// MENU ITEM METRIX
--nv-item-font-size: #{$root-item-font-size};
--nv-item-line-height: #{$root-item-line-height};
--nv-item-padding-y: #{$item-padding-y};
--nv-item-padding-x: #{$item-padding-x};
--nv-item-margin: #{$root-item-margin};
--nv-subnav-item-font-size: #{$subnav-item-font-size};
--nv-subnav-item-line-height: #{$subnav-item-line-height};
--nv-subnav-item-padding-x: var(--nv-item-padding-x);
--nv-subnav-item-padding-y: var(--nv-item-padding-y);
--nv-subnav-item-margin: #{$subnav-item-margin};
Keep in mind that overriding any of the --nv-item-padding-x and --nv-item-padding-y
as well as --nv-subnav-item-padding-x and --nv-subnav-item-padding-y will also update
the spacing of all menu icons.
Brand Metrics
These variables are mostly optional, especially if you have your own special branding design. As with
the other menu item metrics, you can either set a valid value or ZERO if you choose to cancel the style
rules associated with these variables. All these values apply to your <a class="brand">
element and affect all devices.
// BRAND METRIX
$brand-font-size: 18px !default;
$brand-line-height: inherit !default;
$brand-font-sizesets a font size for your.brandelement;$brand-line-heightsets a line height for.brandelement.
These variables are then pushed into the following CSS variables:
// BRAND METRIX
--nv-brand-font-size: #{$brand-font-size};
--nv-brand-line-height: #{$brand-line-height};
--nv-brand-padding: var(--nv-item-padding-y) var(--nv-item-padding-x);
Submenu Metrics
Next we can have a look at the variables responsible for the layout of the sub-menu itself. These variables
have some special designation because they apply only to a certain level sub-menu. Keep in mind that the
$subnav-width is important for layout consistency.
// SUBNAV METRIX
$subnav-line-height: inherit !default;
$subnav-font-size: inherit !default;
$subnav-margin: 0 !default;
$subnav-padding: 0 !default;
$subnav-width: 200px !default;
$subnav-larger-width: ($subnav-width * 3) !default;
$subnav-line-heightsets the line-height for your sub-menu on non-mobile devices; when set toinheritthe value from$navbar-line-heightis used;$subnav-font-sizesets the font-size for your sub-menu on non-mobile devices; when set toinheritthe value from$navbar-font-sizeis used; this and the above variable are very important when using menus without the navbar wrapper;$subnav-marginsets a margin for the FIRST.subnavelement, we'll talk more about this in the Bootstrap demo page;$subnav-paddingsets a padding for the FIRST.subnavelement; it's best to use a valid single number value like10pxto also adjust the below larger width;$subnav-widthsets the width of all<ul class="subnav">elements;$subnav-larger-widthsets the width of the<div class="subnav">element, the mega-menu wrapper.
The following CSS variables are set:
// SUBNAV METRIX
--nv-subnav-padding-x: #{real-size($subnav-padding-x, 1)};
--nv-subnav-padding-y: #{real-size($subnav-padding-y, 1)};
--nv-subnav-line-height: #{$subnav-line-height};
--nv-subnav-font-size: #{$subnav-font-size};
--nv-subnav-width: #{$subnav-width};
--nv-subnav-larger-width: calc(var(--nv-subnav-width) * 3 + var(--nv-subnav-padding-x) * 2);
Now here comes the importance of the use of real-size() function to make sure the
--nv-subnav-larger-width is consistent with its calc() set value.
Menu Item Colors
Now we can talk about the menu item text color and background color. First we talk about the variables
that deal with the root menu items which apply globally on mobile view. As usual the transparent
value removes the style rule, while for text color variables the auto value can be quite handy.
When you set $root-item-color to auto and a valid color value for
root-item-background then your color will be determined based on this background color, then will
check for $navbar-background, if both of these backgrounds are not valid, the style rule will
be removed and your menu items will use an inherited style rule. The same applies to hover state of the menu
items, and the mixins will check the $root-item-hover-background value first.
// MENU ITEM COLOR STYLING
$root-item-color: auto !default;
$root-item-background: transparent !default;
$root-item-hover-color: $navbar-background !default;
$root-item-hover-background: rgba(255,255,255,0.85) !default;
$root-item-active-color: #fff !default;
$root-item-active-background: $primary-color !default;
$root-item-colorsets the text color for root menu items;$root-item-backgroundsets the background color for root menu items;$root-item-hover-colorsets the hover state text color for the root menu items;$root-item-hover-backgroundsets the hover state background color for the root menu items;$root-item-active-colorsets the active state text color for root menu items;$root-item-active-backgroundsets the active state background color for root menu items; this is where we usually make use of the$primary-colorvalue.
// MENU ITEM COLOR STYLING
--nv-item-color: #{get-item-color($root-item-color, $root-item-background, $navbar-background, .65)};
--nv-item-bg: #{$root-item-background};
--nv-item-hover-color: #{get-item-color($root-item-hover-color, $root-item-hover-background, $navbar-background, .85)};
--nv-item-hover-bg: #{$root-item-hover-background};
--nv-item-active-color: #{get-item-color($root-item-active-color, $root-item-active-background, $navbar-background, 1)};
--nv-item-active-bg: var(--nv-primary-color);
The special get-item-color() function is used to set proper text colors in contrast with the
background, for all states of the root menu item.
Submenu Item Colors
Next we have the sub-menu item text color and background color. The exact same principle applies as for the above, however these variables override the above for sub-menu items and only affect the desktop and large screen devices.
// SUBNAV MENU ITEM COLOR
$subnav-item-color: auto !default;
$subnav-item-background: transparent !default;
$subnav-item-hover-color: auto !default;
$subnav-item-hover-background: rgba(0,0,0,0.4) !default;
$subnav-item-active-color: #fff !default;
$subnav-item-active-background: $primary-color !default;
$subnav-item-colorsets the text color for sub-menu items;$subnav-item-backgroundsets the background color for sub-menu items;$subnav-item-hover-colorsets the hover state text color for sub-menu items;$subnav-item-hover-backgroundsets the hover state background color for sub-menu items;$subnav-item-active-colorsets the active state text color for sub-menu items;$subnav-item-active-backgroundsets the active state background color for sub-menu items; again we make use of the$primary-colorvalue.
// SUBNAV MENU ITEM COLOR
--nv-subnav-item-color: #{get-item-color($subnav-item-color, $subnav-item-background, $subnav-background, .65)};
--nv-subnav-item-bg: #{$subnav-item-background};
--nv-subnav-item-hover-color: #{get-item-color($subnav-item-hover-color, $subnav-item-hover-background, $subnav-background, .85)};
--nv-subnav-item-hover-bg: #{$subnav-item-hover-background};
--nv-subnav-item-active-color: #{get-item-color($subnav-item-active-color, $subnav-item-active-background, $subnav-background, 1)};
--nv-subnav-item-active-bg: var(--nv-primary-color);
Similar to root menu items, the get-item-color() function will do the same for sub-menu items.
Brand Link Color
If you're not using a media element for your brand, you can easily set a brand link text color:
// BRAND LINK COLOR
$brand-link-color: auto !default;
$brand-link-colorsets the text color for the<a class="brand">element.
The corresponding CSS variable is:
// BRAND LINK COLOR
--nv-brand-link-color: #{get-color($brand-link-color, $navbar-background, .95)};
Miscellaneous
A set of variables that control various things, but the most important is the $responsive-breakpoint
variable. The default value is 768px which is also the default value of the breakpoint option
required by the Navbar JavaScript API for initialization. When you change the value of this variable, you must
make the necessary adjustments to your navbar markup or initialization options.
// MISC
$responsive-breakpoint: 768px !default;
$subnav-zindex: 50 !default;
$icon-height: auto !default;
$navbar-toggle-padding: 0.125rem 0.5rem !default;
$mobile-expanded-background: auto !default;
$subnav-shadow: 2px 2px 4px 2px rgba(0,0,0,.25) !default;
$base-radius: 0.25rem !default;
$responsive-breakpointsets the width of the viewport to which the Navbar component switches its behaviour, above this value the menu is expected to work with non-mobile devices, and with mobile devices when the viewport width is below this value;$subnav-zindexsets the z-index for the sub-menus;$icon-heightsets the height of all the menu icons, by default we're using one of the above line-height metrics, which is probably most accurate; if your menu has sub-menus and you are using any menu icons, this value or the line-height variables must be a validem,px,rembased value; the style rule associated to this variable is never removed, the default value is16px;$navbar-toggle-paddingsets the padding for your toggle button visible on mobile devices;$mobile-expanded-backgroundsets a background color for expanded menu items on mobile devices; you can set thetransparentvalue if you want to disable this feature.$subnav-shadowsets a box shadow for all.subnavelements, all your sub-menus; you can set a ZERO value here and the mixins will remove this style rule;$base-radiussets a global border-radius needed for various elements of the navbar, currently used by the toggle button and icons specific to parent menu items.
With the exception of the responsive breakpoint, because the @media query doesn't yet support
CSS variables, the corresponding CSS variables here will be:
// MISC
--nv-subnav-zindex: #{$subnav-zindex};
--nv-icon-height: #{get-icon-height()};
--nv-toggle-padding: #{$navbar-toggle-padding};
--nv-base-radius: #{$base-radius};
--nv-expanded-bg: #{$mobile-expanded-background};
--nv-subnav-shadow: #{$subnav-shadow};