JSFiddle - React, Tailwind, and code Playground
by birdie2019
HTML
<button id="load-btn">Load Products</button>
<hr>
<ul id="list"></ul>
<div class="container">
<div class="pd-modal">
<div class="pd-photo">
<img class="pd-img" src="" alt="">
</div>
<div class="pd-content">
<h2 class="title"></h2>
<span class="cat"></span>
<p class="description"></p>
<span class="price"></span>
</div>
<button class="close-btn">×</button>
</div>
</div>
SCSS
* {
box-sizing: border-box;
margin: 0;
padding: 0;
list-style-type: none;
letter-spacing: 1px;
}
body {
position: relative;
}
button {
width: 100px;
padding: 10px;
border: 0;
cursor: pointer;
border-radius: 5px;
background-color: rgb(49, 100, 172);
color: #fff;
transition: all 0.3s;
&:hover {
background-color: rgb(255, 150, 63);
}
}
#list {
display: flex;
flex-wrap: wrap;
li {
width: 50%;
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: center;
padding: 50px;
img {
width: 150px;
height: 150px;
object-fit: contain;
display: block;
}
span {
text-align: center;
color: rgb(100, 100, 100);
}
button {
width: 100px;
padding: 5px;
margin-bottom: 5px;
}
}
}
.container {
display: none;
background-color: rgba(0, 0, 0, 0.5);
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 0;
.pd-modal {
display: flex;
width: 800px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #fff;
padding: 30px;
border-radius: 10px;
box-shadow: 0 0 20px rgba(69, 69, 69, 0.3);
.pd-photo {
display: flex;
justify-content: center;
align-items: center;
img {
display: block;
width: 300px;
height: 300px;
object-fit: contain;
}
}
.pd-content {
display: flex;
flex-direction: column;
width: 800px;
margin-left: 20px;
.title {
text-transform: uppercase;
font-size: 20px;
}
.cat {
text-transform: uppercase;
color: #777;
}
.description {
color: #777;
font-size: 14px;
margin: 15px 0;
}
.price {
color: rgb(238, 0, 0);
font-weight: 700;
font-size: 20px;
}
}
.close-btn {
position: absolute;
...
JavaScript
const loadBtn = document.querySelector('#load-btn');
loadBtn.onclick = () => {
fetch('https://fakestoreapi.com/products')
.then(res => res.json())
.then(json => {
for (const item of json) {
const list = document.querySelector('#list');
const li = document.createElement('li');
const span = document.createElement('span');
const div = document.createElement('div');
const img = document.createElement('img');
const detailBtn = document.createElement('button');
const deleteBtn = document.createElement('button');
const pdModal = document.querySelector('.container');
const title = document.querySelector('.title');
const cat = document.querySelector('.cat');
const description = document.querySelector('.description');
const price = document.querySelector('.price');
const pdImg = document.querySelector('.pd-img');
const closeBtn = document.querySelector('.close-btn');
list.append(li);
li.append(div);
li.append(span);
li.append(detailBtn);
li.append(deleteBtn);
div.append(img);
span.textContent = item.title;
img.src = item.image;
detailBtn.textContent = 'Detail';
deleteBtn.textContent = 'Delete';
li.dataset.title = item.title;
li.dataset.category = item.category;
li.dataset.description = item.description;
li.dataset.image = item.image;
li.dataset.price = item.price;
detailBtn.onclick = () => {
let liInfo = event.target.closest('li');
console.log(liInfo)
title.textContent = liInfo.dataset.title;
cat.textContent = liInfo.dataset.category;
description.textContent = liInfo.dataset.description;
price.textContent = 'US$ ' + liInfo.dataset.price;
pdImg.src = liInfo.dataset.image;
pdModal.style.display = 'block';
closeBtn.onclick = () => {
...