Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain
Custom Shower Curtain

Custom Shower Curtain

Your photo, your size, printed in vivid, waterproof detail. Need help with image quality or cropping? We’re here to help.
$20.85
$35.89
Size
Please select a size
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = '288b02d6-a953-42f6-b2a2-f06db057fdd4'; this.isRTL = SPZ.win.document.dir === 'rtl'; this.isAddingToCart_ = false; // 加购中状态 } static deferredMount() { return false; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback() { this.init(); // 监听事件 this.bindEvent_(); } async init() { this.handleFitTheme(); const data = await this.getDiscountList(); this.renderApiData_(data); } async getDiscountList() { const productId = '83d89f1f-ac69-4ef0-b4fa-00f80ced4860'; const variantId = this.variant_id; const productType = ''; const reqBody = { product_id: productId, variant_id: variantId, discount_method: "DM_AUTOMATIC", customer: { customer_id: window.C_SETTINGS.customer.customer_id, email: window.C_SETTINGS.customer.customer_email }, product_type: productType } const url = `/api/storefront/promotion/display_setting/text/list`; const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then(res => { return res; }).catch(err => { this.setContainerDisabled(false); }) return data; } async renderDiscountList() { this.setContainerDisabled(true); const data = await this.getDiscountList(); this.setContainerDisabled(false); // 重新渲染 抖动问题处理 this.renderApiData_(data); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } async renderApiData_(data) { const parentDiv = document.querySelector('.automatic_discount_container'); const newTplDom = await this.getRenderTemplate(data); if (parentDiv) { parentDiv.innerHTML = ''; parentDiv.appendChild(newTplDom); } else { console.log('automatic_discount_container is null'); } } doRender_(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); this.element.appendChild(el); }); } async getRenderTemplate(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, { ...renderData, isRTL: this.isRTL }) .then((el) => { this.clearDom(); return el; }); } setContainerDisabled(isDisable) { const automaticDiscountEl = document.querySelector('.automatic_discount_container_outer'); if(isDisable) { automaticDiscountEl.setAttribute('disabled', ''); } else { automaticDiscountEl.removeAttribute('disabled'); } } // 绑定事件 bindEvent_() { window.addEventListener('click', (e) => { let containerNodes = document.querySelectorAll(".automatic-container .panel"); let bool; Array.from(containerNodes).forEach((node) => { if(node.contains(e.target)){ bool = true; } }) // 是否popover面板点击范围 if (bool) { return; } if(e.target.classList.contains('drowdown-icon') || e.target.parentNode.classList.contains('drowdown-icon')){ return; } const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { node.classList.remove('open-dropdown'); }) // 兼容主题 this.toggleProductSticky(true); }) // 监听变体变化 document.addEventListener('dj.variantChange', async(event) => { // 重新渲染 const variant = event.detail.selected; if (variant.product_id == '83d89f1f-ac69-4ef0-b4fa-00f80ced4860' && variant.id != this.variant_id) { this.variant_id = variant.id; this.renderDiscountList(); } }); } // 兼容主题 handleFitTheme() { // top 属性影响抖动 let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ productInfoEl.classList.add('force-top-auto'); } } // 兼容 wind/flash /hero 主题 (sticky属性影响 popover 层级展示, 会被其他元素覆盖) toggleProductSticky(isSticky) { let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ if(isSticky) { // 还原该主题原有的sticky属性值 productInfoEl.classList.remove('force-position-static'); return; } productInfoEl.classList.toggle('force-position-static'); } } setupAction_() { this.registerAction('handleDropdown', (invocation) => { const discount_id = invocation.args.discount_id; const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { if(node.getAttribute('id') != `automatic-${discount_id}`) { node.classList.remove('open-dropdown'); } }) const $discount_item = document.querySelector(`#automatic-${discount_id}`); $discount_item && $discount_item.classList.toggle('open-dropdown'); // 兼容主题 this.toggleProductSticky(); }); // 加购事件 this.registerAction('handleAddToCart', (invocation) => { // 阻止事件冒泡 const event = invocation.event; if (event) { event.stopPropagation(); event.preventDefault(); } // 如果正在加购中,直接返回 if (this.isAddingToCart_) { return; } const quantity = invocation.args.quantity || 1; this.addToCart(quantity); }); } // 加购方法 async addToCart(quantity) { // 设置加购中状态 this.isAddingToCart_ = true; const productId = '83d89f1f-ac69-4ef0-b4fa-00f80ced4860'; const variantId = this.variant_id; const url = '/api/cart'; const reqBody = { product_id: productId, variant_id: variantId, quantity: quantity }; try { const data = await this.xhr_.fetchJson(url, { method: 'POST', body: reqBody }); // 触发加购成功提示 this.triggerAddToCartToast_(); return data; } catch (error) { error.then(err=>{ this.showToast_(err?.message || err?.errors?.[0] || 'Unknown error'); }) } finally { // 无论成功失败,都重置加购状态 this.isAddingToCart_ = false; } } showToast_(message) { const toastEl = document.querySelector("#apps-match-drawer-add_to_cart_toast"); if (toastEl) { SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast(message); }); } } // 触发加购成功提示 triggerAddToCartToast_() { // 如果主题有自己的加购提示,则不显示 const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy'); if (themeAddToCartToastEl) return; // 显示应用的加购成功提示 this.showToast_("Added successfully"); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomProductAutomatic);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() {} unmountCallback() {} setupAction_() { this.registerAction('showAddToCartToast', () => { const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy') if(themeAddToCartToastEl) return const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
Quantity
Shipping
/** @private {string} */ class SpzCustomAnchorScroll extends SPZ.BaseElement { static deferredMount() { return false; } constructor(element) { super(element); /** @private {Element} */ this.scrollableContainer_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.viewport_ = this.getViewport(); this.initActions_(); } setTarget(containerId, targetId) { this.containerId = '#' + containerId; this.targetId = '#' + targetId; } scrollToTarget() { const container = document.querySelector(this.containerId); const target = container.querySelector(this.targetId); const {scrollTop} = container; const eleOffsetTop = this.getOffsetTop_(target, container); this.viewport_ .interpolateScrollIntoView_( container, scrollTop, scrollTop + eleOffsetTop ); } initActions_() { this.registerAction( 'scrollToTarget', (invocation) => this.scrollToTarget(invocation?.caller) ); this.registerAction( 'setTarget', (invocation) => this.setTarget(invocation?.args?.containerId, invocation?.args?.targetId) ); } /** * @param {Element} element * @param {Element} container * @return {number} * @private */ getOffsetTop_(element, container) { if (!element./*OK*/ getClientRects().length) { return 0; } const rect = element./*OK*/ getBoundingClientRect(); if (rect.width || rect.height) { return rect.top - container./*OK*/ getBoundingClientRect().top; } return rect.top; } } SPZ.defineElement('spz-custom-anchor-scroll', SpzCustomAnchorScroll); const STRENGTHEN_TRUST_URL = "/api/strengthen_trust/settings"; class SpzCustomStrengthenTrust extends SPZ.BaseElement { constructor(element) { super(element); this.renderElement_ = null; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.xhr_ = SPZServices.xhrFor(this.win); const renderId = this.element.getAttribute('render-id'); SPZCore.Dom.waitForChild( document.body, () => !!document.getElementById(renderId), () => { this.renderElement_ = SPZCore.Dom.scopedQuerySelector( document.body, `#${renderId}` ); if (this.renderElement_) { this.render_(); } this.registerAction('track', (invocation) => { this.track_(invocation.args); }); } ); } render_() { this.fetchData_().then((data) => { if (!data) { return; } SPZ.whenApiDefined(this.renderElement_).then((apis) => { apis?.render(data); document.querySelector('#strengthen-trust-render-1539149753700').addEventListener('click',(event)=>{ if(event.target.nodeName == 'A'){ this.track_({type: 'trust_content_click'}); } }) }); }); } track_(data = {}) { const track = window.sa && window.sa.track; if (!track) { return; } track('trust_enhancement_event', data); } parseJSON_(string) { let result = {}; try { result = JSON.parse(string); } catch (e) {} return result; } fetchData_() { return this.xhr_ .fetchJson(STRENGTHEN_TRUST_URL) .then((responseData) => { if (!responseData || !responseData.data) { return null; } const data = responseData.data; const moduleSettings = (data.module_settings || []).reduce((result, moduleSetting) => { return result.concat(Object.assign(moduleSetting, { logos: (moduleSetting.logos || []).map((item) => { return moduleSetting.logos_type == 'custom' ? this.parseJSON_(item) : item; }) })); }, []); return Object.assign(data, { module_settings: moduleSettings, isEditor: window.self !== window.top, }); }); } } SPZ.defineElement('spz-custom-strengthen-trust', SpzCustomStrengthenTrust);

Personalization FAQs

Enter the requested text and/or upload your photo in the fields above. For the best print quality, use the original, highest-resolution image available and avoid screenshots, blurry photos, or social-media downloads. Images may be cropped slightly to fit the selected product size, so keep faces, text, and important details away from the edges. Please double-check all information before adding the item to your cart.

A digital proof is not provided automatically. To request one, leave a note at checkout or email us immediately after ordering with your order number. We will send the proof within 2 business days and begin production after your approval. Requesting a proof may extend the estimated delivery date, so please respond promptly.

Please contact us within 24 hours of placing your order. We will do our best to accommodate changes or cancellations, but they are only possible before production begins and cannot be guaranteed once your item has entered production.

Each item is made especially for you. Production normally takes 1–3 business days. The estimated delivery date shown on this page includes both production and shipping time. Tracking information will be emailed once your order ships. Orders requiring a proof or additional clarification may take longer.

If your item arrives damaged, defective, or different from the personalization details you submitted, please contact us as soon as possible with your order number and clear photos. Once confirmed, we will arrange a free replacement or another appropriate resolution. Because personalized items are made specifically for you, correctly produced items cannot be returned for change of mind, an incorrect size selection, or errors in customer-submitted details.

Custom Shower Curtain - Your Photo, Your Style

Choose us to create custom shower curtains with high-quality materials and precise HD printing. Send your photo or design — we’ll turn it into a unique, stylish curtain that lights up your bathroom.

📷 Print Anything You Love Artwork, pets, quotes, landscapes… turn any idea into a statement piece.
🌧️ Waterproof & Quick-Dry Water beads and rolls off to keep your bathroom floor clean and dry.
🧵 Premium Polyester Fabric Soft drape yet durable — tested to handle bathroom humidity.
🛡️ Mold & Mildew Inhibit High-quality fabric helps resist mold and mildew growth.
🪝 Rust-Resistant Grommets Metal grommets accommodate standard hooks (and decorative ones), smooth and sturdy.
🧼 Machine Washable Easy care — quick rinse or wipe, or toss into your next laundry load.

Specs & Care

Item Details
Material Expertly selected polyester fabric; soft drape, durable in moisture-rich bathrooms.
Waterproof Promotes water bead formation to prevent soaking and splashing.
Grommets Rust-resistant metal grommets; compatible with included or decorative hooks.
Care Machine washable; quick rinse or wipe after shower for easy maintenance.
Notes Manual measurement ±1–3 cm; colors may vary slightly due to screen display.

A simple way to refresh your bathroom — great for home or hotel use.

How to Customize

Step 1
Choose your size or variant (if applicable).
Step 2
Tap “Upload Your Photo”, attach your image or design.
Step 3
Add to cart and checkout.
Step 4
We optimize your art: crop, alignment, color tune.
Step 5
We print and ship — enjoy your new look!
PHOTO QUALITY MATTERS
The bigger the photo, the better the print result.

Design & Personalization

  • Upload anything: photos, quotes, vintage graphics, memorable landmarks, and more.
  • Prefer a collage or text on the curtain? Just leave a note with your order.
  • Unsure about layout? We’ll align it for the best visual impact.

Photo Help

Our Photo Enhancement Team can crop to fit, remove background, and add text — no design skills needed. If you want us to check the image quality first, email support@BlingPainting.com.

Why Customers Love It

  • Turns any bathroom into a stylish, personalized space.
  • Great gift for friends, family — or a treat for yourself.
  • Most customers say it’s the easiest way to refresh their bathroom in minutes.
  • Walk in, smile — every day starts better.

FAQ

What can I put on the curtain?
Anything you like — photos, artworks, quotes, patterns, or collages.

Can you help with editing?
Absolutely. We’ll crop to fit, remove backgrounds, add text, and optimize colors for print.

Is it waterproof and durable?
Yes. Premium polyester promotes water beading, resists soaking, and helps inhibit mold and mildew.

How do I clean it?
Quick rinse or wipe after shower; machine washable for deeper cleaning.

We want you to be satisfied with the products you buy from us. 

We have 24/7/365 ticket and email support. Please contact us at support@BlingPainting.com if you need any assistance.