1 / 21
0% OFF
Save £-16.99

Sheena Art -Butterfly (velvet cloth) Fairy Dust Drills full round/square diamond painting

£16.99
70 sold
Style Size
Qty 888888 in stock

🔥We Offer Free Shipping Worldwide

5D Diamond Painting Butterfly (Velvet Cloth) Fairy Dust Drills Full Round&Square Wall DIY Art Crafts Mosaic Picture Kit Home Decoration Gift

Feature:
If you want to make your home more beautiful and colorful, the diamond painting can help you add the gaiety decoration.
DIY painting, originality, painting and resin sequins, the resin sequins dazzling, unique luster, shining light, is the most popular DIY jewelry at present.

Colorful diamond drawing decorate your home.
Perfectly decorate your living room or bedroom to match and create the different styles, we are sure that you will like it.

DP Specification:
Material: Fairy Dust Drills Full Round&Square + Velvet cloth
Project type: 5D diamond painting
Color: as shown
Diamond type: Fairy Dust Drills Full Round&Square Drill
Canvas size:
Approx.35x35cm/13.78x13.78in (1cm=0.39in)
Approx.40X40cm/15.75X15.75in (1cm=0.39inches)
Approx.45x45cm/17.71x17.71in (1cm=0.39in)
Approx.50x50cm/19.69x19.69in (1cm=0.39inches)
Approx.60x60cm/23.62x23.62in (1cm=0.39inches)
Approx.70x70cm/27.56x27.56 (1cm=0.39inches)
Approx.80x80cm/31.49x31.49in (1cm=0.39inches)
Approx.90x90cm/35.43x35.43in (1cm=0.39inches)
Approx.100x100cm/39.37x39.37in (1cm=0.39inches)
Space: living room / bedroom / classroom / entrance

What does Fairy Dust Drill mean in Diamond painting?





What does Velvet Cloth mean in Diamond painting?


About Fairy Dust Drills Round Diamond 

About Fairy Dust Drills Square Diamond

DIY diamond painting steps:
1. Open the box, check the kits whether complete;
2. According to the color code, choose a color into the plate;If you paste the same color at the same time, you can increase the speed;
3. Find the symbols in picture, beginning paste until finish it;
4. When you finish it,put some books on top, let it more firmly;
5. Congratulations, you can go framed up and decorate your home now!

Preventive measures of DIY diamond painting:
1. Refer to the previous operation steps.
2. If you don\'t know what the color, please refer to the color chart.

Coodeals DP Tips:
We sell the resin diamonds, semi-finished products, not including frames! Diamond painting, only needs DIY sticking diamond.
This is DIY diamond painting. It\'s not finished. You need to do it yourself.

Note:
1. Due to the different monitor and light effect, the actual color of the item might be slightly different from the color showed on the pictures. Thank you!
2. Please allow 1-2cm measuring deviation due to manual measurement.

Package Content:
1 X Diamond Painting (rhinestone need to be pasted)
1set X Diamond Painting Tools (no frame)
1set X Drill Bags

 

You May Also Like Don't Like These?
const TAG = 'spz-custom-add-to-cart'; class SpzCustomAddToCart extends SPZ.BaseElement { constructor(element) { super(element); this.plugin_timestamp = Date.now(); this.defaultColorConfig = { module_bg: "#FFFFFF", button_bg: "#E84926", button_color: "#FFFFFF", text_color: "#202020", price_color: "#E84926", border_color: "#E6E6E6", border_bg: "#FFFFFF", round_size: '4' }; this.config = this.defaultColorConfig; this.originStickyTop = 0; this.qty = 1; this.variantId = this.element.getAttribute('variant-id'); this.trackMap = { qty: this.trackQty.bind(this), variant: this.trackVariant.bind(this), addToCart: this.trackAddtoCart.bind(this), atcView: this.trackAtcView.bind(this), } this.isHasView = false; this.isFirstUpdateVariant=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.locale_ = SPZServices.localeFor(this.win); this.hasGlobalAtcListener = !!document.querySelector('#add-cart-event-proxy'); this.setupAction_(); } mountCallback() { // 初始化 this.init(); } async init() { // 如果不是详情页,不需要执行后面js if (window.SHOP_PARAMS.template_type !== '1') return; await this.setLocale(); this.handleIsRender(); this.bingEvents(); } bingEvents() { // 设备切换 重新渲染 window.addEventListener('resize', SPZCore.Types.debounce( this.win, (invocation) => { // 关闭弹窗, 解决切换屏幕尺寸不能滚动的问题 this.triggerEvent_('closeShopModal'); this.config = { ...this.config, isMobile: window.innerWidth < 768 ? true : false, position: window.innerWidth < 768 ? 'down' : this.config.display_position }; this.renderAddToCart(); }, 200 )) } // 获取多语言 async setLocale() { let data; try { //多语言 data = await this.locale_.i18n(['product', 'products']); } catch (error) { console.error(error); } this.i18n = { 'sold_out': 'Sold out', 'add_to_cart': 'Add to cart', 'unavailable': 'Unavailable', 'product_unavailable': 'Product is unavailable.', ...data?.product?.product_detail, ...data?.products?.product, } } getProductData() { let pJson = document.querySelector('#product-json'); if (pJson) { return JSON.parse(pJson.innerHTML)?.product; } else if (typeof $ === 'function') { return $(document).data('djproduct')?.product; } return undefined; } getAddCartBtn() { return document.querySelector('[data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="buyNow"], [data-section-type="product_detail"] [role="buyNow"], [data-section-type="product"] [data-click="addToCart"], [data-section-type="product"] [role="addToCart"], [data-section-type="product"] [data-click="buyNow"], [data-section-type="product"] [role="buyNow"]'); } handleObserver() { if(this.config.trigger_condition == 'theme_hidden') { const $addCartBtn = this.getAddCartBtn(); if($addCartBtn) { // 配置了加购/购买按钮; 设置按钮为observer观察目标 $addCartBtn.setAttribute('id', 'app-atc-need-sticky-buttons') } } } findAncestor(node, selector) { while (node) { if (node.querySelector(selector)) { return node; } node = node.parentElement; } return null; } getThemeProductInfoForm() { let $themeForm = ''; const $themeProductInfo = document.querySelector('[data-section-type="product_detail"], [data-section-type="product"]'); $themeForm = $themeProductInfo?.querySelector('form'); return $themeForm; } // 获取主题商品加购数量 getThemeQuantity() { let $themeForm = this.getThemeProductInfoForm(); if($themeForm) { const formData = new FormData($themeForm); const quantity = formData.get('quantity'); return quantity; } else { return null; } } getThemeInitVariantsData() { const $themeForm = this.getThemeProductInfoForm(); const formData = new FormData($themeForm); } // 获取主题初始表单数据 getThemeProductFormData = () => { const $themeForm = this.getThemeProductInfoForm(); if($themeForm) { const form_data = new FormData($themeForm); const form_data_format = {} for (const [key, value] of form_data) { form_data_format[key] = value; } return form_data_format; } else { return null; } } brightnessByColor(c) { let color = '' + c, isHEX = c.indexOf('#') == 0, isRGB = c.indexOf('rgb') == 0; let r, g, b; if (isHEX) { var m = color.substr(1).match(color.length == 7 ? /(\S{2})/g : /(\S{1})/g); if (m) { (r = parseInt(m[0], 16)), (g = parseInt(m[1], 16)), (b = parseInt(m[2], 16)); } } if (isRGB) { const m = color.match(/^rgba\((\d+),\s*(\d+),\s*(\d+),(\d+)\)$/); if (m) { (r = m[1]), (g = m[2]), (b = m[3]); } } if (typeof r != 'undefined') return (r * 299 + g * 587 + b * 114) / 1000; }; getSelectedVariant() { const product = this.getProductData(); return product.variants.find(item => item.id == this.variantId); } setSelectedOption(product) { const selectedVariant = this.getSelectedVariant(); const productData = Object.assign({}, product); // 处理下拉选项 productData?.options?.forEach(option => { option.selectList = []; option.values?.forEach(value => { let selectStatus = ''; selectedVariant?.options?.forEach(item => { if(item.name == option.name && item.value == value) { selectStatus = 'checked'; } }) option.selectList.push({name: option.name, value: value, checked: selectStatus}); }) }) return productData; } getSelectedSkuText() { const selectVariant = this.getSelectedVariant(); if(!selectVariant) { return ''; } const selectList = selectVariant.options; for (var i = 0; i < selectList.length; i++) { selectList[i].value = selectVariant[`option${i + 1}`]; } const selectedSkuText = selectList .map( item => { return item.value; }) .join('/'); return selectedSkuText; } // 是否展示 加购弹窗 getIsButtonClickInfo() { const product = this.getProductData(); const isMultipleProduct = product.available && !product.has_only_default_variant; // 多款式商品 const isButtonClickInfo = this.config.isMobile && (this.config.style_mobile === "mb_simple" || this.config.style_mobile === "mb_circle") && this.config.button_click_mobile === 'info' && isMultipleProduct; return isButtonClickInfo; } // 是否跟随主题的加购数量 isFollowThemeQty (移动端 simple、circle模版、 PC端 simple模版加购数量从主题获取) getIsFollowThemeQty() { const followThemeQtyMobile = (this.config.style_mobile === "mb_simple" || this.config.style_mobile === "mb_circle") && this.config.isMobile; const followThemeQtyPc = this.config.style === "simple" && !this.config.isMobile; const isFollowThemeQty = (followThemeQtyPc || followThemeQtyMobile) ? true : false; return isFollowThemeQty; } getBannerRenderData() { const product = this.getProductData(); // 当前选中变体 const selectedVariant = this.getSelectedVariant(); // 变体options下拉列表数据处理 const productData = this.setSelectedOption(product); // 选中的sku文案 const selectedSkuText = this.getSelectedSkuText(); // 是否展示 加购弹窗 const is_button_click_info = this.getIsButtonClickInfo(); // 主题是否有配置加购/购买按钮 const isHasAddCartBtn = this.getAddCartBtn() ? true : false; // 加购数量是否跟随主题 const isFollowThemeQty = this.getIsFollowThemeQty(); // 浅色背景颜色配置 const brightness = this.brightnessByColor(this.config.module_bg); const isDarkBg = brightness < 115; const renderData = { product: { ...productData, config: {...this.config}, selectedVariant, selectedSkuText, }, config: this.config, qty: this.qty, variant: selectedVariant, selectedVariant, selectedSkuText, is_button_click_info, isDarkBg, isHasAddCartBtn, isFollowThemeQty, i18n: this.i18n, hasGlobalAtcListener: this.hasGlobalAtcListener }; return renderData; } // render add_to_cart async renderAll() { const renderData = this.getBannerRenderData(); this.triggerEvent_('renderBanner', renderData); } getConfigData() { return fetch(`/api/add-to-cart-config`).then(res => { return res.json(); }); } async getConfig() { if(!this.config.hasOwnProperty('open_status')) { const res = await this.getConfigData(); if (res.state === 0 && res.data.open_status) { // config数据转化 this.transConfigData(res.data); } } return this.config; } transConfigData(data) { const resConfig = data; this.config = { ...this.config, ...resConfig, isMobile: window.innerWidth < 768 ? true : false, position: window.innerWidth < 768 ? 'down' : resConfig.display_position }; // 颜色跟随系统时 if(resConfig.color_setting === 'default' || resConfig.color_setting === 'theme') { this.config = { ...this.config, ...this.defaultColorConfig } } } // 是否应用到商店 async handleIsRender() { const res = await this.getConfigData(); if (res.state === 0 && res.data.open_status) { // config数据转化 this.transConfigData(res.data); this.handleObserver(); // 渲染加购内容 this.renderAddToCart(); } } renderAddToCart() { const product = this.getProductData(); if (product.product_type === 'gift_card') return ; if (!product.available) return; this.renderAll(); } // 选择变体 上报 trackVariant() { const product = this.getProductData(); window.sa && sa.track('plugin_atc_variant_click', { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile }); } // 更改数量上报 trackQty() { const product = this.getProductData(); window.sa && sa.track('plugin_atc_qty_click', { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile }); } // 加购上报 trackAddtoCart() { const product = this.getProductData(); let properties = ''; let source = 'atc'; if (this.config.button_action === 'checkout') { source = 'buy_now'; } const obj = { product_id: product.id, style: this.config.style, style_mobile: this.config.style_mobile, button_action: this.config.button_action, plugin_timestamp: this.plugin_timestamp }; const options = { product_id: product.id, variant_id: this.variantId, quantity: this.qty, source, variant: this.getSelectedVariant(), product: product, process: (window.SHOP_PARAMS.product_settings || {}).add_to_cart_process, properties: properties } // 注册曝光参数到add_to_cart事件 window.spzutm && window.spzutm.registerParams('add_to_cart', { add_to_cart: JSON.stringify(obj) }); window.sa && sa.track('plugin_atc_button_click', obj); this.trackHookAddTocart(); } trackAtcView() { const product = this.getProductData() if(!this.isHasView) { sa.track('plugin_atc_view', { product_id: product.id, button_action: this.config.button_action, style: this.config.style, style_mobile: this.config.style_mobile, plugin_timestamp: this.plugin_timestamp }); this.isHasView = true; } } trackHookAddTocart(options) { //FLASH及之后主题trigger事件上报采用HOOK window.djInterceptors && window.djInterceptors.track && window.djInterceptors.track.use({ event: 'dj.addToCart', params: { id: options.product_id, number: options.quantity, childrenId: options.variant.id, item_price: options.variant.price, name: options.product.title, type: options.variant.type ? options.variant.type : options.product.type, properties: properties, quantity: options.quantity, variant_id: options.variant.id, product_id: options.product_id, source: 'atc', process: options.process }, once: true }); } // 加购弹窗 renderShopModal_() { const renderData = this.getBannerRenderData(); this.triggerEvent_('showAddToCartModal', renderData); } showSuccessToast() { this.triggerEvent_('showAddToCartToast'); } updateSelectVariant = async(selectedVariant, product) => { const configData = await this.getConfig(); const productData = this.setSelectedOption(product); const selectedSkuText = this.getSelectedSkuText(); const renderData = { ...productData, selectedVariant, config: configData, selectedSkuText }; this.triggerEvent_('variantChange', renderData); const renderBannerData = this.getBannerRenderData(); if(renderBannerData.is_button_click_info && this.config.style_mobile === "mb_circle") { this.triggerEvent_('renderBannerClickInfo', renderBannerData); } } getUrlVariantId() { const urlParams = new URLSearchParams(window.location.search); const variantId = urlParams.get('variant'); return variantId; } // 商详页变体切换 djVariantChange(detail) { const product = this.getProductData(); // 是否为商详页当前商品 const isDetailProduct = product?.id === detail?.product?.id; if(!detail || !isDetailProduct) { return; } const selectVariant = detail.selected; // 更新变体id const variantId = selectVariant.id; const oldVariantId = this.variantId; if(variantId) { this.triggerEvent_('renderSelectedVariant'); if(oldVariantId !== variantId || !this.isFirstUpdateVariant) { this.isFirstUpdateVariant = true; this.variantId = variantId; this.updateSelectVariant(selectVariant, detail.product); } } else if(!variantId){ // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.triggerEvent_('renderBannerNoSelectedVariant', { product: detail.product }); } } } // 不展示变体的模版 isHiddenVariantsTemplate() { return ((this.config.style_mobile === 'mb_circle' || this.config.style_mobile === 'mb_simple') && this.config.isMobile) || (this.config.style === 'simple' && !this.config.isMobile); } // 主题未选中变体 isUnSelectedThemeVariants() { // 不展示变体的模版 const formData = this.getThemeProductFormData(); return (formData && formData.hasOwnProperty('variant_id') && (!formData.variant_id || formData.variant_id === 'undefined')); } // 禁用加购 disabledAtc() { // 不展示变体的模版 const isHiddenVariantsTemplate = this.isHiddenVariantsTemplate(); const isUnSelectedThemeVariant = this.isUnSelectedThemeVariants(); return isHiddenVariantsTemplate && isUnSelectedThemeVariant; } // 滚动至主题变体处 scrollToThemeVariant() { const themeFormEl = this.getThemeProductInfoForm(); if(themeFormEl) { this.triggerEvent_('showUnSelectedVariantTips'); setTimeout(() => { themeFormEl.scrollIntoView({ behavior: 'smooth' }); }, 1000); } } async setupAction_() { // 上报处理 this.registerAction('saTrack', async(invocation) => { const data = invocation.args; // this.trackMap[data.type]?.(); }) // 更新variantId this.registerAction('updateVriantId', async(invocation) => { const data = invocation.args.data; if(data.variant_id && data.variant_id != 'undefined') { this.variantId = data.variant_id; } }) // 渲染弹窗加购&购买按钮 this.registerAction('renderShopModal', async(invocation) => { this.renderShopModal_(); }) this.registerAction('bannerExtraRender', async(invocation) => { const renderData = this.getBannerRenderData(); if(renderData.is_button_click_info && this.config.style_mobile === "mb_circle") { this.triggerEvent_('renderBannerClickInfo', renderData); } }) // 加购数量同步 this.registerAction('handleAddToCart', async(invocation) => { // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.scrollToThemeVariant(); return; } const quantity = this.getThemeQuantity(); if(this.config.button_action === "checkout" ) { this.triggerEvent_('updateQty', { quantity: Number(quantity) || this.qty }); this.triggerEvent_('handleBuyNow'); } else { this.triggerEvent_('updateQty', { quantity: Number(quantity) || this.qty }); this.triggerEvent_('handleAtc'); } }) // 渲染弹窗加购&购买按钮 this.registerAction('handleFixedBanner', async(invocation) => { // 固定定位时, 触发ljs-sticky 组件showSticky方法,展示banner if(this.config.trigger_condition == 'fixed') { this.triggerEvent_('showBanner'); // this.trackAtcView(); } }) this.registerAction('handleVariantsRender', async(invocation) => { const data = invocation.args.data; // 主题未选中变体 const isDisabledAtc = this.disabledAtc(); if(isDisabledAtc) { this.triggerEvent_('renderBannerNoSelectedVariant', { product: data }); return; } this.triggerEvent_('renderSelectedVariant', { product: data }); this.triggerEvent_('variantChange', data); }) this.registerAction('handleShowErrorToast', async(invocation) => { const data = invocation.args.data; if(data?.message) { this.triggerEvent_('showAtcErrorToast', data); } }) } 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.LOGIC; } } SPZ.defineElement(TAG, SpzCustomAddToCart)
const TAG = "spz-custom-announcement"; const DISPLAY_TYPE = { ANNOUNCEMENT: "PTT_BANNER" // 公告栏 }; const API = { LIST: `/api/storefront/promotion/placement/list`, // 获取公告栏列表 REPORT: `/api/storefront/promotion/placement/data/report` // 上报数据 }; const DISPLAY_DEVICE = { PC_AND_MOBILE: "PD_PC_MOBILE", // PC和移动端 PC: "PD_PC", // PC MOBILE: "PD_MOBILE" // 移动端 }; const REPORT_EVENT = { CLICK: "PE_CLICK", // 点击事件 IMPRESSION: "PE_IMPRESSION" // 曝光事件 }; const POSITION = { TOP: "PP_TOP", // 顶部 BOTTOM: "PP_BOTTOM" // 底部 } const MODE = { FIXED: "PM_FIXED", // 固定 NORMAL: "PM_SCROLLING" // 滚动 } const THEME_NAME = window.SHOPLAZZA.theme.merchant_theme_name; class SpzCustomAnnouncement extends SPZ.BaseElement { constructor(element) { super(element); this.announcementList_ = []; // 公告栏数据 } 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.fetchData_(); this.createAnnouncementDom_(); this.listenCartChange_(); } fetchData_(type = '') { const id = window.SHOPLAZZA.meta.page.template_type === 51 ? window.SHOPLAZZA.meta.page.resource_id : 0; return this.xhr_.fetchJson(API.LIST, { method: 'POST', body: { page_id: window.SHOPLAZZA.meta.page.template_type, placement_type: DISPLAY_TYPE.ANNOUNCEMENT, discount_id: id } }).then((res) => { this.announcementList_ = res.list || []; if (this.announcementList_.length > 0) { this.announcementList_.forEach((item) => { item.config = JSON.parse(item.config); }); } if(type === 'cartChange') { this.announcementList_.forEach((item) => { this.updateText_(item); }); } else { this.doRender_(this.announcementList_); } }).catch((error) => { console.error(error); }) } doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, { list: this.announcementList_ }) .then((el) => { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); this.element.appendChild(el); }) .then(() => { this.announcementList_.forEach((item) => { this.showAnnouncement_(item); }); }).then(() => { this.handleThemeCompatibility_(); }); } // 更新文案 updateText_(item) { const announcement = document.querySelector(`#announcement-${item.id}`); const announcementText = announcement.querySelectorAll('.announcement_text'); const textArr = item.config.text_discount.replace_texts; const textDom = textArr.map((text) => { return `${text}`; }).join(','); announcementText.forEach((text) => { text.innerHTML = textDom; }); } // 创建公告栏dom createAnnouncementDom_() { const isHero = /Hero/.test(THEME_NAME); const isEva = /Eva/.test(THEME_NAME); const headerEl = document.querySelector('[data-section-type="header"]'); const headerSticky = headerEl && SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; // 创建滚动的底部公告栏 const announcementBottomContainer = document.createElement('div'); announcementBottomContainer.className = 'announcement__container_bottom bootstrap'; document.body.appendChild(announcementBottomContainer); // 创建固定的底部公告栏 const announcementBottomSticky = document.createElement('ljs-sticky'); announcementBottomSticky.className = 'announcement__container_bottom-sticky'; announcementBottomSticky.setAttribute('layout', 'container'); announcementBottomSticky.setAttribute('position', 'bottom'); announcementBottomSticky.style.position = 'fixed'; announcementBottomSticky.style.bottom = '0'; announcementBottomSticky.style.left = '0'; announcementBottomSticky.style.right = '0'; announcementBottomSticky.style.zIndex = '1030'; document.body.appendChild(announcementBottomSticky); const announcementTopContainer = document.createElement('div'); announcementTopContainer.classList.add('announcement__container_top'); if (isHero) { announcementTopContainer.classList.add('announcement__container_top_zIndex_1030'); } announcementTopContainer.classList.add('bootstrap'); document.body.insertBefore(announcementTopContainer, document.body.children[0]); const announcementTopFixedContainer = document.createElement('div'); announcementTopFixedContainer.classList.add('announcement__container_top-fixed'); if (isHero) { announcementTopFixedContainer.classList.add('announcement__container_top_zIndex_1030'); } announcementTopFixedContainer.classList.add('bootstrap'); const insertBeforeElement = headerSticky ? headerEl : document.body; insertBeforeElement.insertBefore(announcementTopFixedContainer, insertBeforeElement.children[0]); if (isEva) { const evaHeader = document.querySelector('header.header'); const isEvaMaskHeader = evaHeader && SPZCore.Dom.computedStyle(this.win, evaHeader).position === 'absolute'; let fixedBannerTopContainer = document.querySelector('.announcement__container_top-fixed'); if (isEvaMaskHeader) { if (fixedBannerTopContainer) { fixedBannerTopContainer.remove(); } const newBanner = document.createElement('div'); newBanner.className = 'announcement__container_top-fixed bootstrap'; document.body.insertBefore(newBanner, document.body.firstChild); fixedBannerTopContainer = newBanner; } else { if (!headerEl) return; const observer = new MutationObserver(() => { const isSticky = SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; if (!isSticky) return; const isTopFixedAnnouncementInHeader = headerEl.querySelector('.announcement__container_top-fixed'); if (isTopFixedAnnouncementInHeader) return; const announcementTopFixedContainer = document.querySelector('.announcement__container_top-fixed'); if (announcementTopFixedContainer) { announcementTopFixedContainer.remove(); headerEl.insertBefore(announcementTopFixedContainer, headerEl.children[0]); observer.disconnect(); } }); observer.observe(headerEl, { attributes: true, attributeFilter: ['style', 'class'] }); } if (headerSticky && !isEvaMaskHeader && fixedBannerTopContainer) { fixedBannerTopContainer.style.position = 'relative'; fixedBannerTopContainer.style.zIndex = '29'; } } } // 展示公告栏 showAnnouncement_(item) { const announcement = document.querySelector(`#announcement-${item.id}`); const announcementBottomContainer = document.querySelector('.announcement__container_bottom'); const announcementBottomSticky = document.querySelector('.announcement__container_bottom-sticky'); const announcementTopContainer = document.querySelector('.announcement__container_top'); const announcementTopFixedContainer = document.querySelector('.announcement__container_top-fixed'); const isPC = this.viewport_.getWidth() >= 960; const isMobile = this.viewport_.getWidth() < 960; const isMatchPCDevice = item.device === DISPLAY_DEVICE.PC_AND_MOBILE || item.device === DISPLAY_DEVICE.PC; const isMatchMobileDevice = item.device == DISPLAY_DEVICE.PC_AND_MOBILE || item.device === DISPLAY_DEVICE.MOBILE; if((isPC && isMatchPCDevice) || (isMobile && isMatchMobileDevice)) { if (item.position === POSITION.BOTTOM) { if(item.mode === MODE.FIXED) { announcementBottomSticky && announcementBottomSticky.appendChild(announcement); } else { announcementBottomContainer && announcementBottomContainer.appendChild(announcement); } } else { if (item.mode === MODE.FIXED) { announcementTopFixedContainer && announcementTopFixedContainer.appendChild(announcement); } else { announcementTopContainer && announcementTopContainer.appendChild(announcement); } } this.reportData({ placement_id: item.id, event: REPORT_EVENT.IMPRESSION }); } } // 处理主题兼容 handleThemeCompatibility_() { try { const isBoost = /Boost/.test(THEME_NAME); const isHyde = /Hyde/.test(THEME_NAME); const isEva = /Eva/.test(THEME_NAME); const boostHeader = document.querySelector('.boost-header'); const fixedBannerTopContainer = document.querySelector('.announcement__container_top-fixed'); const notFixedBannerTopContainer = document.querySelector('.announcement__container_top'); const headerEl = document.querySelector('[data-section-type="header"]'); const headerSticky = headerEl && SPZCore.Dom.computedStyle(this.win, headerEl).position === 'sticky'; const header = document.querySelector('.header__fixed') || document.querySelector('.header__wrapper'); const headerFixed = header && SPZCore.Dom.computedStyle(this.win, header).position === 'fixed'; const handleScroll = SPZCore.Types.throttle(this.win, () => { if (isHyde) { if (header && headerSticky) { header.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } } if (isEva) { const evaHeader = document.querySelector('header.header'); const isEvaMaskHeader = evaHeader && SPZCore.Dom.computedStyle(this.win, evaHeader).position === 'absolute'; if (!isEvaMaskHeader) return; if (evaHeader.classList.contains('header__fixed')) { evaHeader.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } if(document.documentElement.scrollTop === 0) { evaHeader.style.marginTop = '0'; } } if (headerSticky) return; if (headerFixed) { header.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { const observer = new MutationObserver((mutationsList, observer) => { for (const mutation of mutationsList) { if (mutation.type === 'childList' && fixedBannerTopContainer.childElementCount > 0) { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; observer.disconnect(); // 停止观察 break; } } }); // 开始观察 fixedBannerTopContainer 的子节点变化 observer.observe(fixedBannerTopContainer, { childList: true, subtree: true }); // 初始检查 if (fixedBannerTopContainer.childElementCount > 0) { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } if(header) { header.style.marginTop = '0'; } } if (isBoost) { fixedBannerTopContainer.style.zIndex = '1031'; if (boostHeader && boostHeader.classList.contains('header__fixed')) { boostHeader.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } else { notFixedBannerTopContainer.style.marginTop = `${fixedBannerTopContainer.offsetHeight}px`; } } }, 16); window.addEventListener('scroll', handleScroll); window.dispatchEvent(new Event('scroll')); } catch (error) { console.error('error', error); } } // 上报数据 async reportData(data) { // 如果是主题编辑器则不用处理 if(window.top !== window.self) { return; } this.xhr_.fetchJson(API.REPORT, { method: "POST", body: { placement_id: data.placement_id, event: data.event } }); } // 监听购物车变化事件dj.cartChange listenCartChange_() { SPZUtils.Event.listen(document, 'dj.cartChange', (event) => { this.fetchData_('cartChange'); }); } setupAction_() { this.registerAction('handleClose', (invocation) => { const data = invocation.args; const id = data.id; const announcement = document.querySelector(`#announcement-${id}`); announcement && SPZCore.Dom.removeElement(announcement); window.dispatchEvent(new Event('scroll')); }); this.registerAction('handleJumpLink', (invocation) => { const data = invocation.args; if(!data.show_url) return; data.url && window.open(data.url, data.open_new_window ? '_blank' : '_self'); this.reportData({ placement_id: data.id, event: REPORT_EVENT.CLICK }); }); } 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, SpzCustomAnnouncement);
Butterfly (velvet cloth) Fairy Dust Drills full round/square diamond painting