js5-6

by wang_siang

HTML

<button id="load">Load Products</button>

    <hr>

    <ul class="container">
    </ul>

CSS

* {
            box-sizing: border-box;
        }

        body {
            margin: 0;
            width: 100%;
            /* background: #fff5d5; */
        }

        ul,
        li {
            padding: 0;
            margin: 0;
        }

        button {
            padding: 10px 20px;
            background-color: black;
            color: #ffffff;
            font-weight: 600;
            cursor: pointer;
            border: transparent;
        }

        button:hover {
            background-color: rgb(79, 79, 79);
        }

        button:active {
            transform: scale(0.96);
        }

        #load {
            font-size: 30px;
            margin: 40px auto;
            display: block;
            border-radius: 26px;
        }

        .container {
            max-width: 1400px;
            margin: 80px auto;
            display: flex;
            padding: 0 8%;
            gap: 80px;
            flex-wrap: wrap;
        }

        .product {
            width: calc((100% - 160px) / 3);
            display: flex;
            flex-direction: column;
            justify-content: space-between;
            align-items: center;
            background: #ffffff;
            border-radius: 20px;
            box-shadow: 0px 0px 10px 0px rgba(121, 121, 121, 0.223);
            padding: 20px;
        }

        .imgblock {
            width: 200px;
            height: 200px;
            display: flex;
            justify-content: center;
            align-items: center;
            margin: 0 0 40px 0;
        }

        .product img {
            max-width: 100%;
            max-height: 100%;
            border-top-left-radius: 20px;
            border-top-right-radius: 20px;
        }

        .content {
            width: 100%;
            display: flex;
            flex-direction: column;
            border-radius: 12px;
            gap: 60px;
        }

        .productname {
            text-align: center;
            font-size: 24px;
       ...

JavaScript

const loadBtn = document.querySelector('#load');
        const erroeimg = 'https://memeprod.sgp1.digitaloceanspaces.com/user-resource/aaa5ea30708aef68af78543f707fe55c.png';
        let data;

        loadBtn.addEventListener('click', () => {
            const container = document.querySelector('.container');
            container.innerHTML = '';

            fetch('https://fakestoreapi.com/products')
                .then((res) => res.json())
                .then((json) => {
                    data = json
                    loading();
                })
                .catch((error) => {
                    alert('抱歉,請稍後重新嘗試。')
                })
        })

        function loading() {

            data.forEach((item, index) => {
                let title = item.title;
                let img = item.image;
                const container = document.querySelector('.container')

                let cardData = `
                <li class="product">
                    <div class="imgblock">
                    <img src="${img}" alt="商品圖片${index + 1}" onerror="this.src='${erroeimg}' ">
                    </div>
                    <div class="content">
                        <span class="productname">${title}</span>
                        <div class="btn-block">
                        <button class="details">Details</button>
                        <button class="delete">Delete</button>
                        </div>
                    </div>
                </li>`;
                // insertAdjacentHTML性能更佳,它不會重建整個 DOM 結構,只是插入新的內容。
                container.insertAdjacentHTML('beforeend', cardData)
            });

            const detailsBtn = document.querySelectorAll('.details');
            detailsBtn.forEach((btn, i) => {
                btn.addEventListener('click', () => {
                    const item = data[i]
                    alert(`id = ${item.id}`);
                    alert(`category = ${item.category}`);
                   ...