JSFiddle - React, Tailwind, and code Playground

by Vadim

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@600&display=swap" rel="stylesheet">
    <link href='css/normalise.css' rel='stylesheet'>
    <link href='css/style.css' rel='stylesheet'>
    <title>JSpractice</title>
</head>
<body>
    <div class="container">
        <div class="product_card">
            <div class="card_img">
                <img src="http://tajemb.kiev.ua/wp-content/themes/bootstrap-basic/img/placeholder.png" alt="" class="img">
            </div>
            <h2 class='card_title'>Title of Product</h2>
            <p class="card_text">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Sit adipisci corporis eaque et soluta odit nulla aut saepe ratione aliquam facilis cumque repellendus atque delectus odio, tempore eveniet optio molestias.</p>
            <div class="product_count">
                <button class='card_button_minus card_buttons'>-</button>
                <form action="#">
                    <input type="number" class='card_input' min='1' max='99' step='1' value='1'>
                </form>
                <button class='card_button_plus card_buttons'>+</button>
            </div>
        </div>
        <div class="product_card">
            <div class="card_img">
                <img src="http://tajemb.kiev.ua/wp-content/themes/bootstrap-basic/img/placeholder.png" alt="" class="img">
            </div>
            <h2 class='card_title'>Title of Product</h2>
            <p class="card_text">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Sit adipisci corporis eaque et soluta odit nulla aut saepe ratione aliquam facilis cumque repellendus atque delectus odio, tempore eveniet optio molestias.</p>
            <div class="product_count">
                <button class='card_button_minus...

CSS

body{
    font-family: 'Montserrat';
    background: #222;
    color: #fff;
    padding-bottom: 500px;
}

button{
    cursor: pointer;
}

button:focus{
    outline: none;
    background: #fff;
    color: #222;
}

.card_buttons{
    background: #222;
    border: none;
    color: #fff;
    transition: 0.2s;
}

.container{
    display: flex;
    justify-content: space-between;
    max-width: 1170px;
    margin: 0 auto;
    padding-top: 50px;
    flex-wrap: wrap;
}

.product_card{
    flex: 0 0 300px;
    background-color:darkslategray;
    border-radius: 5px;
    padding: 10px 15px;
    text-align: center;
    margin-bottom: 50px;
}

.card_img{
    margin-bottom: 20px;
}

.img{
    width: 100%;
}

.card_title{
    margin-bottom: 10px;
}

.card_text{
    font-size: 12px;
    line-height: 1.8em;
}

.product_count{
    display: flex;
    justify-content: center;
    align-items: center;
}

.card_input{
    max-width: 20px;
    text-align: center;
    background: #222;
    border: none;
    margin-top: -5px;
    color: #fff;
}

.card_input::-webkit-inner-spin-button{
    -webkit-appearance: none;
}

form{
    margin: -2px 2px 0 2px;
}

.card_input:focus{
    outline: none;
    overflow: hidden;
}

JavaScript

'use strict'

let cards = document.querySelectorAll('.product_card');
let btnAdd = document.querySelectorAll('.card_button_plus');
let btnRemove = document.querySelectorAll('.card_button_minus');
let input = document.querySelectorAll('.card_input');

for(let index = 0; index < cards.length; index++){
    btnAdd[index].addEventListener('click', () => {
    		const idx = index;
        const count = Number(input[idx].value) || 2;
        input[idx].value = count + 1;
    });
    // btnRemove[index].addEventListener('click', removeNum);
}

console.log(cards.length);