solution 1.) (only for computer, for mobile display, you still need to add custom.js)
./themes/classic/assets/css/custom.css
.product-add-to-cart > .control-label, .product-add-to-cart > .product-quantity > .qty, .product-line-grid-right .input-group { display: none !important; }
solution 2.) (work in computer and mobile)
find 1: (/themes/classic/templates/catalog/_partials/product-add-to-cart.tpl)
<span class="control-label">{l s='Quantity' d='Shop.Theme.Catalog'}</span>
change to:
<span class="control-label" style="display: none !important;">{l s='Quantity' d='Shop.Theme.Catalog'}</span>
find 2:
<div class="qty">
change to:
<div class="qty" style="display: none !important;">
find 3: (/themes/classic/templates/checkout/_partials/cart-detailed-product-line.tpl)
{if !empty($product.is_gift)} <span class="gift-quantity">{$product.quantity}</span> {else} <input class="js-cart-line-product-quantity" data-down-url="{$product.down_quantity_url}" data-up-url="{$product.up_quantity_url}" data-update-url="{$product.update_quantity_url}" data-product-id="{$product.id_product}" type="number" inputmode="numeric" pattern="[0-9]*" {if $product.minimal_quantity > 1 || $product.quantity_wanted} value="{$product.quantity}" min="{$product.minimal_quantity}" step="{$product.minimal_quantity}" data-step="{$product.minimal_quantity}" {else} value="{$product.quantity}" min="1" {/if} name="product-quantity-spin" aria-label="{l s='%productName% product quantity field' sprintf=['%productName%' => $product.name] d='Shop.Theme.Checkout'}" /> {/if}
change to:
<span class="gift-quantity">{$product.quantity}</span>