js5-7

by wang_siang

HTML

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

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

    <div class="modal">
        <div class="modal-card">
            <div class="modal-content">
                <div class="modal-img">
                    <img src="" alt="">
                </div>
                <div class="modal-text">
                    <h1></h1>
                    <h4></h4>
                    <p></p>
                    <span></span>
                </div>
            </div>
            <button class="windowDeleteBtn">Close</button>
        </div>
    </div>

CSS

* {
            box-sizing: border-box;
        }

        body {
            margin: 0;
            width: 100%;
        }

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


        h4 {
            padding: 0;
            margin: 10px 0 20px;
        }

        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;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .content {
            width: 100%;
            display: flex;
            flex-direction: column;
           ...

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()
      console.log(data)
    })
    .catch((error) => {
      alert("抱歉,請稍後重新嘗試。")
    })
})

function loading() {
  data.forEach((item, index) => {
    let title = item.title
    let category = item.category
    let description = item.description
    let img = item.image
    let price = item.price

    const container = document.querySelector(".container")

    let cardData = `
                <li class="product" data-title="${title}" data-category="${category}" data-description="${description}" data-img="${img}" data-price="${price}">
                    <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", (e) => {
      const item = data[i]
      const dataHtml = e.target.closest("li")

      const modalCard = document.querySelector(".modal-card")
      const imgSrc = document.querySelector(".modal-img img")
      const modal =...