Padding, Margin, Font Size Choices
:root {
--clr-navbar-text: #FFF;
--clr-navbar-link-hover: #555;
--clr-navbar-bg: #333;
/* default 16px with line-height 1.2 (may change based on font family)*/
/* customizable */
--line-height-root: 1.2;
--font-size-brand-name: 1.5rem;
--margin-brand-name: .5rem;
--height-hamburger-icon: var(--font-size-brand-name) * var(--line-height-root);
--margin-navbar-links: 0.5rem;
/* computed */
--height-navbar-approximate: calc(
var(--font-size-brand-name) * var(--line-height-root)
+ 2 * var(--margin-brand-name)
);
line-height: var(--line-height-root);
}
Code Without Padding, Margins, and Font Size
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="styles_nav.css">
<script src="script.js" defer></script>
</head>
<body>
<div class="navbar">
<div class="navbar__brand-name">Brand Name</div>
<div class="navbar__hamburger-icon">
<button class="icon-btn" onclick="hamburgerOnClick()">
<img src="Hamburger_icon_white.svg" alt="Hamburger icon"></img>
</button>
</div>
<div data-hamburger-active="false" class="navbar__links">
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
</div>
</div>
<div style="height:2000px;"></div>
</body>
</html>
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
:root {
--clr-navbar-text: #FFF;
--clr-navbar-link-hover: #555;
--clr-navbar-bg: #333;
}
body {
margin: 0;
padding: 0;
}
.navbar {
position: fixed;
width: 100%;
display: flex;
flex-wrap: wrap; /* just in case the root font size is changed
and we need to display the brand title and links
on separate lines */
align-items: center;
justify-content: space-between;
background-color: var(--clr-navbar-bg);
}
.navbar__brand-name {
color: var(--clr-navbar-text);
}
.navbar__links ul {
margin: 0;
padding: 0;
display:flex;
}
.navbar__links li {
list-style: none; /* remove bullets in list */
}
.navbar__links li a {
text-decoration: none; /* remove underlining */
display: block;
color: var(--clr-navbar-text);
}
.navbar__links li:hover,
.navbar__hamburger-icon:hover {
background-color: var(--clr-navbar-link-hover);
}
.icon-btn {
border: none;
background-color: transparent;
cursor: pointer;
}
.navbar__hamburger-icon {
display: none;
}
@media (max-width: 400px) {
.navbar__hamburger-icon {
display: block;
}
.navbar__links {
position: absolute;
top: 100%;
width: 100%;
transform: scale(1, 0);
transform-origin: top;
background-color: var(--clr-navbar-bg);
}
.navbar {
flex-wrap: wrap;
}
.navbar__links ul {
width: 100%;
flex-direction: column;
}
.navbar__links li {
text-align: center;
}
.navbar__links[data-hamburger-active="true"] {
transition: transform 300ms ease-in-out;
transform: scale(1, 1);
}
}
const navLinks = document.querySelector('.navbar__links');
const hamburgerAttrName = "data-hamburger-active";
// data-* attributes are custom
/*
const hamburgerActiveClassName = "hamburger-active";
function hamburgerOnClickOld() {
const isHamburgerActive = navLinks.classList.contains(hamburgerActiveClassName);
if (isHamburgerActive) {
navLinks.classList.remove(hamburgerActiveClassName);
} else {
navLinks.classList.add(hamburgerActiveClassName);
}
}
*/
function hamburgerOnClick() {
const isHamburgerActive = navLinks.getAttribute(hamburgerAttrName) === "true";
if (isHamburgerActive) {
navLinks.setAttribute(hamburgerAttrName, "false");
} else {
navLinks.setAttribute(hamburgerAttrName, "true");
}
}