🛒 Using Custom Elements in Shopify: A Modern JavaScript Approach
As Shopify evolves, modern development techniques like Custom Elements (a part of the Web Components standard) provide a powerful, reusable, and clean way to enhance your storefront — without relying on frameworks like React or Vue.
In this article, we'll explore how to create a custom quantity selector using Custom Elements and integrate it into your Shopify theme with minimal friction.
✅ What Are Custom Elements?
Custom Elements allow developers to define new HTML tags using JavaScript. This makes it easy to encapsulate logic and reuse UI components across your theme.
Instead of writing duplicated jQuery or inline JS for each quantity input, you can create a <quantity-selector> tag that handles everything internally.
🧱 Why Use Custom Elements in Shopify?
📦 Example: Custom Quantity Selector
Here’s how to build a <quantity-selector> component from scratch and use it within Shopify.
🧩 Step 1: HTML Markup
You can use this custom element anywhere inside a product form or cart item loop:
<quantity-selector>
<button class="button-minus">-</button>
<input type="number" name="quantity" value="1" min="1">
<button class="button-plus">+</button>
</quantity-selector>
This will act as a wrapper, and we’ll write the logic once to control all quantity fields site-wide.
🎯 Step 2: JavaScript for the Component
Create a quantity-selector.js file in your assets folder, or inline it in a <script> tag:
class quantitySelector extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.input = this.querySelector('input[type="number"]');
this.plusBtn = this.querySelector('.button-plus');
this.minusBtn = this.querySelector('.button-minus');
this.updateQuantity();
}
updateQuantity() {
if (!this.input) return;
this.plusBtn?.addEventListener('click', () => {
const current = parseInt(this.input.value || "0");
const updated = current + 1;
this.input.value = updated;
this.input.setAttribute('value', updated); // Optional for syncing DOM attribute
this.dispatchEvent(new Event('change', { bubbles: true }));
});
this.minusBtn?.addEventListener('click', () => {
const current = parseInt(this.input.value || "0");
if (current > 1) {
const updated = current - 1;
this.input.value = updated;
this.input.setAttribute('value', updated);
this.dispatchEvent(new Event('change', { bubbles: true }));
}
});
}
}
customElements.define("quantity-selector", quantitySelector);
💡 Tip: Dispatching a change event allows Shopify forms or apps listening to this input to react properly (e.g., Ajax cart updates).
🎨 Step 3: CSS Styling (Optional)
You can apply global or scoped styles to your component:
Recommended by LinkedIn
quantity-selector {
display: inline-flex;
align-items: center;
gap: 10px;
}
quantity-selector button {
padding: 6px 12px;
font-size: 16px;
background: #f0f0f0;
border: none;
cursor: pointer;
}
quantity-selector input {
width: 50px;
text-align: center;
}
🛠 Step 4: Including the Script in Shopify
In your theme.liquid layout or relevant templates:
{{ 'quantity-selector.js' | asset_url | stylesheet_tag }}
This ensures the custom element is defined before any component using it is loaded.
💡 Benefits in Shopify Development
Using Custom Elements in Shopify can bring many benefits:
Feature Benefit 🔁 Reusability Use the same component in product, cart, drawer, upsells, etc. ✨ Cleaner Code No need to repeat JS logic for every quantity field 🧩 Encapsulation Keeps logic self-contained, reducing bugs ⚡ Performance Loads fast without framework overhead 🛠️ Flexibility Easily extend with more features (loading state, disable buttons, etc.)
🧠 Use Cases Beyond Quantity Selectors
Custom Elements can be used for:
🚀 Conclusion
Custom Elements are a modern, lightweight way to bring interactive components into your Shopify theme without relying on bulky frameworks or repeated jQuery code. With just a few lines of code, you can build scalable components that work across your entire storefront.
Start small — like with the <quantity-selector> — and gradually modularize your theme for better performance and maintainability.
🧩 Need Help?
If you're looking to modularize your Shopify theme using modern JS approaches or want help implementing advanced UI elements — feel free to reach out. I'm happy to help!