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">
        <div class="accordion-box" id="accordion">
            <div class="accordion-item">
                <div class="accordion-header">
                    <span class="title">如何辦理退換貨?</span>
                    <i class="fa-solid fa-circle-chevron-down"></i>
                </div>
                <div class="accordion-content">
                    <p class="text">請參考退貨服務頁面。</p>
                </div>
            </div>
            <div class="accordion-item">
                <div class="accordion-header">
                    <span class="title">退款方式及退款時間?</span>
                    <i class="fa-solid fa-circle-chevron-down"></i>
                </div>
                <div class="accordion-content">
                    <p class="text">約7-8個工作天完成退款作業。</p>
                </div>
            </div>
            <div class="accordion-item">
                <div class="accordion-header">
                    <span class="title">未退回的退款,是否可直接折抵新訂單?</span>
                    <i class="fa-solid fa-circle-chevron-down"></i>
                </div>
                <div class="accordion-content">
                    <p class="text">很抱歉,重新訂購時無法直接於新訂單扣抵。</p>
                </div>
            </div>
            <div class="accordion-item">
                <div class="accordion-header">
                    <span class="title">發票遺失是否仍能辦理退換貨?</span>
                    <i class="fa-solid fa-circle-chevron-down"></i>
                </div>
                <div class="accordion-content">
                    <p class="text">很抱歉,需要有發票才能辦理退換貨。</p>
                </div>
            </div>
            <div class="accordion-item">
                <div class="accordion-header">
                    <span class="title">什麼情況無法辦理退換貨?</span>
                    <i class="fa-solid fa-circle-chevron-down"></i>
                </div>
                <div...

CSS

:root{
        --primary: #4f46e5;
        --secondary:#2563eb;
        --secondary100: #dbeafe;
        --gray800: #333;
        --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: linear-gradient(to right, #25c481, #25b7c4);
        color: var(--gray800);
        font-family: Lato, sans-serif;
    }
    .wrap{
        width: 50%;
        margin: 100px auto;
    }
    .accordion-box{
        width: 100%;
    }
    .accordion-item{
        margin-bottom: 1rem;
    }
    .accordion-header{
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        padding: 1rem;
        background: var(--white);
        border-radius: 0.5rem;
        cursor: pointer;
        /* transition: ease-in-out 0.3s; */
    }
    .accordion-header i{
        transition: all 0.3s;
    }

    .accordion-content{
        background: var(--white);
        border-radius: 0 0 0.5rem 0.5rem;
        max-height: 0;
        overflow: hidden;
        transition: max-height, padding 0.15s ease;
    }
    .is-open .accordion-header{
        background-color: var(--primary);
        color: var(--white);
        border-radius: 0.5rem 0.5rem 0 0 ;
        /* transition: ease-in 0.3s; */
    }
    .is-open .accordion-header i{
        transform: rotate(180deg);
        transition: all 0.3s;
    }
    .is-open .accordion-content{
        max-height: 50rem;
        padding: 1.5rem;
	      transition: max-height, padding 0.25s ease;
    }

JavaScript

let accordion = document.querySelector('#accordion');
        let accordionHeader = document.querySelectorAll('.accordion-header');
        
        accordionHeader.forEach(header => {
            header.addEventListener('click', (event)=>{
                let accordionList = header.parentElement;
                //可以讓accordion顯示隱藏,沒有is-open的加,有則隱藏(無判斷僅顯示點擊中的accordion)
                // accordionList.classList.toggle('is-open'); 
                // 判斷只顯示目前點擊的選項卡(另一個選項關閉)
            
                if(accordionList.classList.contains('is-open')){
                    accordionList.classList.remove('is-open');
                }else{
                    let accordionIsOpen = document.querySelectorAll('.is-open');
                    accordionIsOpen.forEach(item =>{
                        item.classList.remove('is-open');
                    })
                    accordionList.classList.add('is-open');
                }
            })
        });