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';
            }
        }