Nota: Se você tiver o tema Dawn versão 2.5 e superior, este código não funcionará. Para código atualizado, verifique isto .
Você estreia o controle deslizante de produto do tema? Crie uma página de produto semelhante ao tema Debut.
Tenho trabalhado no controle deslizante de produto do tema Dawn e encontrei alguns problemas com ele. Uma coisa é que o contador numérico não faz sentido. Minha maneira de criar um controle deslizante de produto no tema Dawn é copiar o tema Debut.
Tenha uma página de produto de estreia em seu tema Dawn com botões de opção funcionais, zoom e controle deslizante de produto.
NOTA: Você precisa fazer login antes de ver o código.
Siga as instruções abaixo.
1. Vá para sua loja online > Temas > Ações > Editar código
2. Vá para a pasta Seção e abra main-product.liquid
3. Para simplificar as coisas, substituiremos o main-product.liquid
4. Vá para a pasta da seção e abra main-product.liquid."
5. Exclua o código dentro do arquivo, cole o código abaixo
|
{% comment %} theme-check-disable TemplateLength {% endcomment %} { |
6. Em seguida, precisamos criar um novo arquivo de ativos. Vá para a pasta Ativos e clique em “Adicionar um novo ativo”. Certifique-se de que seja um arquivo CSS. Chame-o de "controle deslizante de produto"
7. Abra o arquivo e cole o código abaixo e clique em SALVAR
| .slider-container { margem: 0 automático; largura: 90%; exibição: flexível; flex-flow: quebra de coluna; alinhar itens: centro; posição: relativa; } .imagem grande { largura: 100%; altura: 100%; posição: relativa; estouro: oculto; } .item de imagem grande { largura máxima: 100%; largura mínima: 50%; altura máxima: 100%; preenchimento: 0; posição: relativa; margem: 0 automático; } .xoomImage { posição: absoluta; superior: 0; esquerda: 0; } .item de imagem grande:not(:primeiro-filho){ exibição: nenhum !importante; } você { padding-inline-start: 0px! Importante; } componente deslizante { posição: relativa; exibição: bloco; largura:100%; } .slider-wrapper { exibição: flexível; justificar-conteúdo: centro; } .slider__slide { scroll-snap-align: iniciar; flex-encolher: 0; } .product-slider-box { flex-wrap: herdar; estouro-x: automático; scroll-snap-type: x obrigatório; comportamento de rolagem: suave; -webkit-overflow-scrolling: toque; margem inferior: 1rem; largura: 85%; exibição: flexível; índice z: 1; } .product-slider { altura: 100%; largura: 31,5%; preenchimento: 10px; display: bloco embutido; } .product-slider:not(:first-child){ margem esquerda: 1rem; } .slide-imagem { largura: 100%; ajuste ao objeto: capa; } .slider{ cor da barra de rolagem: rgb(var(--color-foreground)) rgba(var(--color-foreground), 0,04); -ms-estilo overflow: nenhum; largura da barra de rolagem: nenhuma; } .slider::-webkit-barra de rolagem { altura: 0,4rem; largura: 0,4rem; Mostrar nenhum; } .no-js.slider { -ms-estilo overflow: automático; largura da barra de rolagem: automático; } .no-js .slider::-webkit-scrollbar { exibição: inicial; } .slider::-webkit-scrollbar-thumb { cor de fundo: rgb(var(--color-foreground)); raio da borda: 0,4rem; borda: 0; } .slider::-webkit-scrollbar-track { plano de fundo: rgba(var(--color-foreground), 0,04); raio da borda: 0,4rem; } /*=== botões === */ .button-wrapper { altura: 100%; largura: 105%; posição: absoluta; exibição: flexível; justificar-conteúdo: espaço entre; alinhar itens: centro; } .slider-container::-webkit-scrollbar { Mostrar nenhum; } .botões deslizantes { exibição: flexível; alinhar itens: centro; justificar-conteúdo: centro; } .botão deslizante { cor: rgba(var(--cor-foreground), 0,75); fundo: transparente; fronteira: nenhuma; cursor: ponteiro; largura: 44px; altura: 44px; } .botão deslizante: não ([desativado]): passar o mouse { cor: rgb(var(--color-foreground)); } .botão deslizante .icon { altura: 1,2rem; } .botão deslizante[desativado] .icon { cor: rgba(var(--color-foreground), 0,3); } .botão deslizante--próximo .icon { margem direita: -0,2rem; transformar: girar (-90 graus) traduzirX (0,15rem); } .botão deslizante--anterior .icon { margem esquerda: -0,2rem; transformar: girar (90 graus) traduzirX (-0,15rem); } .botão deslizante--próximo:não([desativado]):hover .icon { transformar: girar (-90 graus) traduzirX (0,15rem) escala (1,07); } .botão deslizante--prev:not([desativado]):hover .icon { transformar: girar (90 graus) traduzirX (-0,15rem) escala (1,07); } /* botão de vídeo quando a imagem é do tipo vídeo */ .video-btn { largura: 100%; altura: 100%; posição: relativa; } .v-btn { topo: 2% !importante; esquerda: 2% !importante; } .ativo-thumb { borda: 3px branco sólido; contorno: 2px preto sólido; } /* ==== códigos personalizados na edição da página do produto ==== */ @media screen e (largura mínima: 750px) { .largura personalizada { preenchimento: 0 10% !importante; } } @media screen e (largura mínima: 990px) { .produto__media-wrapper { largura máxima: 50% !importante; largura: calc(50% - 1rem/2); } .produto__info-wrapper { preenchimento à esquerda: 5rem !importante; largura máxima: 50% !importante; largura: calc(50% - 1rem/2); } } /* ocultar modal */ #large-image > li:nth-child(1) > modal-opener > span { exibição: nenhum !importante; } #imagemgrande > li:nth-child(1) > abridor modal > botão { exibição: nenhum !importante; } #imagemgrande > li > abridor modal > div { preenchimento superior: 0 !importante; } #imagemgrande > li > abridor modal > div > img { estouro: oculto; posição: relativo! Importante; } |
8. Em seguida, precisamos ajustar o arquivo global.js na pasta Asset.
9. Ajustaremos o controle deslizante primeiro. Encontre o componente deslizante. Após " this.nextButton = this.querySelector('button[name="next"]');", cole o código abaixo. Veja a imagem e o vídeo para referência.
| this.productSlider = this.querySelector('.product-slider-box'); |
O código deve ficar assim:

10. Em seguida, precisamos encontrar e substituir a função onButtonClick(event) pelo código abaixo. Por favor, certifique-se de verificar o vídeo sobre isso para não excluir outras coisas.
| onButtonClick(evento) { event.preventDefault(); if (este.produtoSlider) { const slideScrollPosition = event.currentTarget.name === 'próximo'? this.slider.scrollLeft + (this.slider.clientWidth): this.slider.scrollLeft - (this.slider.clientWidth); this.slider.scrollTo({ esquerda: Math.floor(slideScrollPosition) }); this.currSlide = Math.round(slideScrollPosition / this.slider.clientWidth); if (this.currSlide === 0) { this.prevButton.setAttribute('desativado', verdadeiro); } outro { this.prevButton.removeAttribute('desativado'); } if (this.currSlide === this.totalPages / 3 ) { this.nextButton.setAttribute('desativado', verdadeiro); } outro { this.nextButton.removeAttribute('desativado'); } } outro { const slideScrollPosition = event.currentTarget.name === 'próximo'? this.slider.scrollLeft + this.sliderLastItem.clientWidth: this.slider.scrollLeft - this.sliderLastItem.clientWidth; this.slider.scrollTo({ esquerda: Math.floor(slideScrollPosition) }); } } |
O código deve ficar assim:

12. Último. Encontre VariantSelects e adicione o código em updateMedia(), antes de "window.setTimeout(()". Veja a imagem abaixo e o vídeo para obter instruções.
| const novoId = newMedia.dataset.mediaId; const newThumb = document.querySelector(`[data-thumb-id="${newId}"]`); const thumbLocate = newThumb["offsetLeft"]; document.querySelectorAll('.slide-image').forEach(thumb => polegar. classList.remove('active-thumb')); document.querySelector(`[data-thumb-id="${newId}"] > img`).classList.add('active-thumb'); const sliderBox = document.querySelector(".product-slider-box"); sliderBox.scrollTo({esquerda: polegarLocate}); ampliação(); |

É isso! Espero que não tenha sido muito difícil. Se sim, siga o vídeo. (",)
Atualização 08/11/21: Corrija o problema no Mozilla com a exibição da barra de rolagem. Acabei de excluir o CSS overflow no contêiner deslizante. Adicionado código para ocultar os botões sempre que as imagens variantes forem menores que três.
12 comentários
There’s a problem with the codes to add and replace, I think ?
Hi, thank you for this tutorial. I cannot add product in the cart. Required parameter missing or invalid: items. On the YouTube comments, I did the whole steps again twice since you did some changes to the code for the global.js, and I still have the same problem. I tried without variant, and still the same issue. No apps installed yet to interfere. Thank you