🔥Last day 50% OFF - 🌈12-Color Temporary Hair Chalk Applicator Set

$29.99 $59.99 Save $30.00
Sold 999
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ class SpzCustomDiscountCodeModel extends SPZ.BaseElement { constructor(element) { super(element); // 复制按钮和内容的类名 this.copyBtnClass = "discount_code_btn" this.copyClass = "discount_code_value" } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { // 初始化服务 this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } /** * 渲染优惠码组件 * @param {Object} data - 渲染数据 */ doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, Object.assign(this.getDefaultData(), data) ) .then((el) => { this.clearDom(); this.element.appendChild(el); // 绑定复制代码功能 this.copyCode(el, data); }); } /** * 获取渲染模板 * @param {Object} data - 渲染数据 */ getRenderTemplate(data) { const renderData = Object.assign(this.getDefaultData(), data); return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); return el; }); } /** * 清除DOM内容 */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * 获取默认数据 * @returns {Object} 默认数据对象 */ getDefaultData() { return { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), image_domain: this.win.SHOPLAZZA.image_domain, copyBtnClass: this.copyBtnClass, copyClass: this.copyClass } } /** * 复制优惠码功能 * @param {Element} el - 当前元素 */ copyCode(el) { const copyBtnList = el.querySelectorAll(`.${this.copyBtnClass}`); if (copyBtnList.length > 0) { copyBtnList.forEach(item => { item.onclick = async () => { // 确保获取正确的元素和内容 const codeElement = item.querySelector(`.${this.copyClass}`); if (!codeElement) return; // 获取纯文本内容 const textToCopy = codeElement.innerText.trim(); // 尝试使用现代API,如果失败则使用备用方案 try { if (navigator.clipboard && navigator.clipboard.writeText) { await navigator.clipboard.writeText(textToCopy); } else { throw new Error('Clipboard API not available'); } // 显示复制成功提示 this.showCopySuccessToast(textToCopy, el); } catch (err) { console.error('Modern clipboard API failed, trying fallback...', err); // 使用备用复制方案 this.fallbackCopy(textToCopy, el); } const discountId = item.dataset["discountId"]; // 跳转决策: is_redirection + link(可选覆盖) const setting = { is_redirection: item.dataset["redirection"] === "true", link: item.dataset["link"], }; const landingUrl = `/promotions/discount-default/${discountId}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element)) { this.win.open(finalUrl, '_blank', 'noopener'); } } }) } } /** * 使用 execCommand 的复制方案 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ fallbackCopy(codeText, el) { const textarea = this.win.document.createElement('textarea'); textarea.value = codeText; // 设置样式使文本框不可见 textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; // 添加 readonly 属性防止移动端虚拟键盘弹出 textarea.setAttribute('readonly', 'readonly'); this.win.document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { this.win.document.execCommand('copy'); // 显示复制成功提示 this.showCopySuccessToast(codeText, el); } catch (err) { console.error('Copy failed:', err); } this.win.document.body.removeChild(textarea); } /** * 创建 Toast 元素 * @returns {Element} 创建的 Toast 元素 */ createToastEl_() { const toast = document.createElement('ljs-toast'); toast.setAttribute('layout', 'nodisplay'); toast.setAttribute('hidden', ''); toast.setAttribute('id', 'discount-code-toast'); toast.style.zIndex = '1051'; return toast; } /** * 挂载 Toast 元素到 body * @returns {Element} 挂载的 Toast 元素 */ mountToastToBody_() { const existingToast = this.win.document.getElementById('discount-code-toast'); if (existingToast) { return existingToast; } const toast = this.createToastEl_(); this.win.document.body.appendChild(toast); return toast; } /** * 复制成功的提醒 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ showCopySuccessToast(codeText, el) { const $toast = this.mountToastToBody_(); SPZ.whenApiDefined($toast).then(toast => { toast.showToast("Discount code copied !"); this.codeCopyInSessionStorage(codeText); }); } /** * 复制优惠码成功后要存一份到本地存储中,购物车使用 * @param {string} codeText - 要复制的文本 */ codeCopyInSessionStorage(codeText) { try { sessionStorage.setItem('other-copied-coupon', codeText); } catch (error) { console.error(error) } } } // 注册自定义元素 SPZ.defineElement('spz-custom-discount-code-model', SpzCustomDiscountCodeModel);
/** * Custom discount code component that handles displaying and managing discount codes * @extends {SPZ.BaseElement} */ class SpzCustomDiscountCode extends SPZ.BaseElement { constructor(element) { super(element); // API endpoint for fetching discount codes this.getDiscountCodeApi = "\/api\/storefront\/promotion\/code\/list"; // Debounce timer for resize events this.timer = null; // Current variant ID this.variantId = "dcbf1061-b469-4c2b-a016-3e4f5a4de0d0"; // Store discount code data this.discountCodeData = {} } /** * Check if layout is supported * @param {string} layout - Layout type * @return {boolean} */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** * Initialize component after build */ buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // Bind methods to maintain context this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } /** * Setup component when mounted */ mountCallback() { this.getData(); // Add event listeners this.viewport_.onResize(this.resize); this.win.document.addEventListener('dj.variantChange', this.switchVariant); } /** * Cleanup when component is unmounted */ unmountCallback() { this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } /** * Handle resize events with debouncing */ resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { if (appDiscountUtils.inProductBody(this.element)) { this.render(); } else { this.renderSkeleton(); } }, 200); } /** * Handle variant changes * @param {Event} event - Variant change event */ switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == 'f4380438-6b4c-4040-920f-f74a6d871771' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } /** * Fetch discount code data from API */ getData() { if (appDiscountUtils.inProductBody(this.element)) { const reqBody = { product_id: "f4380438-6b4c-4040-920f-f74a6d871771", variant_id: this.variantId, product_type: "default", } if (!reqBody.product_id || !reqBody.variant_id) return; this.discountCodeData = {}; this.win.fetch(this.getDiscountCodeApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { let data = await response.json(); if (data.list && data.list.length > 0) { data.list[0].product_setting.template_config = JSON.parse(data.list[0].product_setting.template_config); // Format timestamps to local timezone const zone = this.win.SHOPLAZZA.shop.time_zone; data.list = data.list.map(item => { if(+item.ends_at !== -1) { item.ends_at = appDiscountUtils.convertTimestampToFormat(+item.ends_at, zone); } item.starts_at = appDiscountUtils.convertTimestampToFormat(+item.starts_at, zone); return item; }); } this.discountCodeData = data; this.render(); } else { this.clearDom(); } }).catch(err => { console.error("discount_code", err) this.clearDom(); }); } else { this.renderSkeleton(); } } /** * Clear component DOM except template */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * Render discount codes with formatted dates */ render() { // Render using discount code model SPZ.whenApiDefined(document.querySelector('#spz_custom_discount_code_model')).then(renderApi => { renderApi.doRender_({ discountCodeData: this.discountCodeData }) }).catch(err => { this.clearDom(); }) } renderSkeleton() { // Render template for non-product pages this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile() }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) .catch(err => { this.clearDom(); }); } } // Register custom element SPZ.defineElement('spz-custom-discount-code', SpzCustomDiscountCode);
Buy More, Save More:  1 set (12 colors)
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

🌈 Instant Hair Color Transformation

Create fun, colorful hair in just minutes — without permanent dye.

Express your creativity with vibrant temporary hair colors. Add highlights, rainbow streaks, or playful styles whenever you want — and simply wash it out when you're ready for a new look.

✨ 12 bright colors to choose from
✨ Easy clip-in application
✨ Temporary & washable
✨ Perfect for parties, photos & events

🌈 12 vibrant color options

Mix, match & create your own style

Choose your favorite shades or combine multiple colors to create unique hairstyles that match your mood, outfit, or special event.

✓ Includes 12 different vibrant colors
✓ Create solid colors or rainbow effects
✓ Perfect for highlights and streaks
✓ Match colors with costumes and clothing
✓ Great for festivals, holidays, and parties

🖐️ Easy clip-in application

Color each strand with more control

Simply place a section of hair inside the applicator, press gently, and glide downward. The compact design helps you apply color exactly where you want it.

✓ No mixing or brushes required
✓ Easy control for precise highlights
✓ Works on small or wider sections of hair
✓ Less messy than loose chalk pieces

⏱️ Quick temporary hair transformation

A fresh new look in just minutes

Whether you're heading to a birthday party, festival, concert, cosplay event, or just want to try something new, this temporary hair chalk lets you transform your hairstyle instantly — without permanent dye.

✓ Color your hair in just minutes
✓ No bleaching or permanent color required
✓ Switch colors for different outfits
✓ Great for last-minute styling
✓ Try new shades before committing to permanent dye

🎨 Buildable color intensity

From soft highlights to bold color

Customize your style by applying one layer for a subtle tone or multiple layers for brighter, more vibrant color. Mix different shades for a unique personal look.

✓ Soft or bold color intensity
✓ Layer on more for stronger results
✓ Blend multiple shades together
✓ Great for hair tips or full sections
✓ Create your own colorful style

🧼 Easy to wash out

Enjoy color today. Back to normal tomorrow.

Unlike permanent hair dye, this temporary chalk lets you enjoy colorful hairstyles whenever you want. Simply wash your hair with shampoo when you're ready to remove the color.

✓ Temporary hair color
✓ Washes out with shampoo
✓ No long-term commitment
✓ Great for weekend styling
✓ Easy to change whenever you want

🎉 Perfect for all fun occasions

Make every event more colorful

Perfect for anyone who loves to express their creativity. Whether you're dressing up for a special event or just adding a pop of color to your everyday style, this set is ready whenever inspiration strikes.

🎂 Birthday parties
🎃 Halloween costumes
🎵 Music festivals
📸 Photo shoots
🎭 Cosplay & performances
🎁 Fun gifts for friends & family

How to use

Easy application in 4 steps

Step 1
Start with clean, dry or slightly damp hair and separate the section you want to color.

Step 2
Place the strand inside the applicator, press gently, and pull downward along the direction of the hair.

Step 3
Repeat until you achieve your desired color intensity, then let the hair dry before styling.

Step 4
Wash thoroughly with shampoo when you're ready to remove the color.

⭐ What our customers are saying

⭐⭐⭐⭐⭐

Emily R.

"My daughter really loved choosing different colors. The applicator tools were easy to use, and the pink and green looked amazing!"

⭐⭐⭐⭐⭐

Madison L.

"We used these for a costume party and created colorful streaks in just minutes. So much easier than traditional hair dye."

⭐⭐⭐⭐⭐

Sarah K.

"The variety of colors is fantastic. Applying multiple layers of the chalk made the colors even brighter, and everything washed out easily afterward."

📦 Product Specifications

Everything you need to know

Product Type:
Temporary hair chalk applicator set

Main Function:
Temporary coloring, highlights, streaks, and creative hair styling

Number of Colors:
12 different vibrant colors

Available Colors:
Pink, green, blue, purple, red, orange, yellow, and other colorful shades

Product Format:
Solid hair chalk in compact clip applicators

Color Finish:
Bright temporary pigmentation

Coverage Style:
Targeted and buildable color application

Application Areas:
Hair lengths, front sections, tips, and selected strands

Recommended Hair Condition:
Clean, dry, or slightly damp hair

Removal Method:
Wash thoroughly with shampoo

Suitable For:
Adults, teenagers, families, performers, costume users, and creative styling enthusiasts

Perfect For:
Birthdays, Halloween, festivals, concerts, school events, holidays, parties, and photo shoots

Package Includes:
12 temporary hair chalk applicator tools


❓ Frequently Asked Questions

How many colors are included?
Is the color permanent?
How do I apply the hair chalk?
Does it work on dark hair?
Should my hair be wet or dry?
Will the color transfer?
How do I remove the color?
Can children use this product?


🌈 Ready to create your next colorful look?

12 colors. Endless styles. Zero commitment.

Bring your creativity to life with instant temporary hair color. Perfect for parties, photos, festivals, and everyday fun.