JSFiddle - React, Tailwind, and code Playground

by ZooeyLai

HTML

<div class="wrap">

        <button class="btn btn-primary" id="loadBtn">Load Products</button>

        <ul id="productList" class="collection"></ul>

        <div class="modal hidden">
            <div class="modal-content">
                <img src="" class="modal-content__img" alt="">
                <div class="modal-content__intro">
                    <h3 class="modal-content__title"></h3>
                    <span class="modal-content__category"></span>
                    <p class="modal-content__description"></p>
                    <span class="modal-content__price"></span>
                </div>
            </div>
            <button class="btn-close btn btn-primary" onclick="closeBtn()">關閉</button>  
        </div>
        <div class="overlay hidden"></div>
        <hr>
    </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;
    }    
    *,
    *::after,
    *::before {
        padding: 0px;
        margin: 0px;
        font-family: inherit;
        box-sizing: border-box;
        line-height: 1.5;
    }
    html,
    body {
        height: 100vh;
    }

    body {
        font-family: sans-serif;
        font-size: 16px;
        display: flex;
        /* flex-direction: column;
        align-items: center;
        justify-content: center; */
        background-color: aliceblue;
    }
    .wrap{
        margin: 0 auto;
    }
    .btn,button{
        padding: 0.5rem 1rem;
        border: 2px solid transparent;
        border-radius: 0.25rem;
        background-color: var(--gray);
        color: #475569;
        cursor: pointer;
    }
    .btn-primary{
        background-color: var(--primary);
        color: var(--white);
    }
    .btn-primary:hover{
        background-color: #3730a3;
    }
    .btn-outline-primary{
        border-color: var(--primary);
        color: var(--primary);
        background-color: transparent;
    }
    ul,li{
        list-style: none;
    }
    .collection{
        display: grid;
        gap: 2rem;
        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    }
    .product-card{
        grid-column: span 1;
        /* grid-row: span 2; */
    }
    .product-item__image{
        padding: 2rem;
        max-width: 100%;
        width: 100%;
        aspect-ratio: 1 / 1;
        object-fit: cover;
        border-radius: 0.875rem;
    }
    .product-item__caption{
        display: flex;
        flex-direction: column;   
    }
    .product-item__title{
        margin: 0.5rem 0;
        display:...

JavaScript

let overlay = document.querySelector('.overlay');
        let modals = document.querySelectorAll('.modal');
        let modal = document.querySelector('.modal');
        
        function openModal(){
            modal.classList.remove('hidden');
            overlay.classList.remove('hidden')
        }
        function closeBtn(){
            event.target.closest('.modal').classList.add('hidden');
            overlay.classList.add('hidden')
        }
        // 遍歷所有彈窗,在點擊overlay時關閉所有彈窗(forEach)
        modals.forEach((modal) =>{
            overlay.addEventListener('click', ()=>{
                overlay.classList.add('hidden');
                modal.classList.add('hidden');
            })
        })

        // 分割功能:創建商品元件
        function createProductCard(product){
            let productList = document.querySelector('#productList');
            let li = document.createElement('li');
            let item = document.createElement('div');
            let image = document.createElement('img');
            let caption = document.createElement('div');
            let title = document.createElement('h3');
            let price = document.createElement('span');
            let btnBox = document.createElement('div');
            let detailBtn = document.createElement('button'); 
            let deleteBtn = document.createElement('button');

            li.classList.add('product-card');
            item.classList.add('product-item');
            image.classList.add('product-item__image');
            caption.classList.add('product-item__caption');
            title.classList.add('product-item__title');
            price.classList.add('product-item__price');
            btnBox.classList.add('product-item__btnbox');
            detailBtn.classList.add('btn', 'btn-outline-primary');
            deleteBtn.classList.add('btn', 'btn-outline-danger');

            li.append(item);
            item.append(image);
            item.append(caption);
           ...