JSFiddle - React, Tailwind, and code Playground
by ZooeyLai
HTML
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<div class="wrap">
<nav class="navbar">
<div class="container">
<ul class="nav">
<li class="navitem">
<a href="#" class="nav-link">首頁</a>
</li>
<li class="navitem">
<a href="#" class="nav-link">全部商品</a>
</li>
<li class="navitem">
<a href="#" class="nav-link">全部品牌</a>
</li>
<li class="navitem dropdown" id="dropdown">
<a href="#" class="nav-link">關於我們<i class="fa-solid fa-angle-down"></i></a>
<div class="dropdown-menu" id="dropdownMenu">
<a href="#" class="dropdown-link">團隊介紹</a>
<a href="#" class="dropdown-link">企業宗旨</a>
<a href="#" class="dropdown-link">創業故事</a>
</div>
</li>
</ul>
</div>
</nav>
</div>
CSS
:root{
--primary: #4338ca;
--secondary:#2563eb;
--secondary100: #dbeafe;
--gray800: #1e293b;
--white: #fff;
--background:#e4e4e4;
--warning100 :#ffedd5;
--warning : #ea580c;
--danger100 :#fee2e2;
--danger : #dc2626;
--success : #059669;
--success100: #ecfdf5;
}
*{
box-sizing: border-box;
font-size: 1rem;
line-height: 1.5;
padding: 0;
margin: 0;
}
body{
background: #f1f5f9;
color: var(--gray800);
font-family: Lato, sans-serif;
}
ul,ol{
list-style: none;
}
a{
text-decoration: none;
}
.container{
width: 60%;
margin: 0 auto;
}
.navbar{
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
background-color: var(--primary);
padding: 0.5rem 1rem;
}
.nav{
display: flex;
flex-direction: row;
}
.nav-link{
display: flex;
flex-direction: row;
/* justify-content: center; */
align-items: center;
padding: 0.5rem 1rem;
color: var(--white);
opacity: 0.6;
transition: all 0.3s;
}
.nav-link i{
margin-left: 0.5rem;
transform: rotate(0);
transition: all .3s ease-in-out;
}
.nav-link:hover{
opacity: 1 !important;
transition: all 0.3s;
}
.dropdown{
position: relative;
}
.dropdown-menu{
position: absolute;
background: var(--white);
display: flex;
flex-direction: column;
padding: 0.5rem 0;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
min-width: 10rem;
border-radius: 0.25rem;
visibility: hidden;
opacity: 0;
transform: translateY(-30px);
transition: all .3s ease-in-out;
}
.dropdown-link{
...
JavaScript
let dropdown = document.querySelector('#dropdown');
let dropdownMenu = document.querySelector('#dropdownMenu');
let toggleArrow = document.querySelector('.fa-angle-down');
dropdown.addEventListener('click', function(event){
//阻止事件繼續冒泡
event.stopPropagation();
dropdownMenu.classList.toggle('is-open');
toggleArrow.classList.toggle('is-rotate');
if(dropdownMenu.classList.contains('is-open')){
dropdown.querySelector('.nav-link').style.opacity = '1';
}else{
dropdown.querySelector('.nav-link').style.opacity = '0.6';
}
})
window.onclick = function(e){
if(!e.target.matches('is-open')){
dropdownMenu.classList.remove('is-open');
toggleArrow.classList.remove('is-rotate');
dropdown.querySelector('.nav-link').style.opacity = '0.6';
}
}