Controle deslizante de imagem do produto para o tema Shopify Dawn - versão 2.4 e inferior

Product Image slider for Shopify Dawn theme - version 2.4 and lower
Isso funciona apenas com Dawn 2.4 e inferior. Confira neste vídeo como ver o link da versão do seu tema.
Você usou o tema Dawn e ficou desapontado por eles não terem um controle deslizante de produto?
Não se preocupe. Neste tutorial, criaremos um.
Recomendações: Também criei um código para transformar a página do produto Dawn como o tema Debut com um controle deslizante. Verifique link .
  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. Encontre o bloco <slider-component> e comente-o ou exclua-o se desejar

Comente colocando “<!--” antes do componente deslizante e “-->” após o componente deslizante. O código deve ficar como abaixo

<!-- <slider-component> </slider-component> -->

4. Antes do <slider-component> comentado, adicione o código abaixo

<div class="slider-container" >
{{ section.id }}
{{ "accessibility.skip_to_product_info" | t }}
</a>
<ul class="imagemgrande" id="imagemgrande">
{%- for media in product.media -%}
<li class="item de imagem grande produto__item de mídia grid__item slider__slide
{% if media.media_type != 'image' %} hide-modal {% endif %} "
data-media-id=" {{ section.id }} - {{ media.id }} ">
{% render 'product-thumbnail', media: media, position: forloop.index, loop: section.settings.enable_video_looping, modal_id: section.id, xr_button: true %}
</li>
{%- endfor -%}
</ul>

<componente deslizante>
<ul class="product-slider-box slider" role="list">

{%- assign variant_images = product.images| where: 'attached_to_variant?', true | map: 'src' -%}

{%- for media in product.media -%}
<li class="product-slider slider__slide" onclick="newLargeImage(this)" data-media-id=" {{ section.id }} - {{ media.id }} "

{% if section.settings.hide_variants and variant_images contains media.src %} style="display: none;" {% endif %} >

{% if media.media_type == 'video' %}
<div class="video-btn" style="display: bloco" >
<span class="product__media-icon motion-reduce v-btn" aria-hidden="true">
{%- liquid
case media.media_type
when 'video' or 'external_video'
render 'icon-play'
when 'model'
render 'icon-3d-model'
else
render 'icon-zoom'
endcase
-%}
</span>
<img class="imagem-slide"
src=" {{ media.preview_image | img_url: 'large' }} "
alt=" {{media.alt }} ">
</div>
{% else %}
<img class="imagem-slide"
src=" {{ media.preview_image | img_url: 'large' }} "
alt=" {{ media.alt}} ">
{% endif %}
</li>
{% endfor %}
</ul>
<div class="slider-buttons {% if product.media.size < 5 %} oculto {% endif %} " style="display: flex">
<button type="button" class="slider-button slider-button--prev maior-slider" name="anterior" aria-label=" {{ 'accessibility.previous_slide' | t }} "> {% render 'icon-caret' %} </button>
<div class="slider-counter caption">
<span class="slider-counter--current">1</span>
<span aria-hidden="true"> / </span>
<span class="visually-hidden"> {{ 'accessibility.of' | t }} </span>
<span class="slider-counter--total"> {% if section.settings.hide_variants %} {{ product.media.size | minus: variant_images.size | plus: 1 }} {% else %} {{ product.media.size }} {% endif %} </span>
</div>
<button type="button" class="slider-button slider-button--next large-slider" name="next" aria-label=" {{ 'accessibility.next_slide' | t }} "> {% render 'icon-caret' %} </button>
</div>
</slider-component>
</div>



5. Na parte superior cole o código abaixo e clique em SALVAR

<roteiro>

janela.onload = (evento) => {
document.querySelector("li:nth-child(1) > img").classList.add('active-thumb');
};

função novaImagemGrande(x) {
deixe clickedImage = x.dataset.mediaId;
const newImage = document.querySelector(`[data-media-id="${clickedImage}"]`);
const parentData = newImage.parentElement;

parentData.prepend(newImage);
newImage.style.display = "bloquear";

document.querySelectorAll('.slide-image')
.forEach(thumb => polegar. classList.remove('active-thumb'));
const sliderComp = document.querySelector("componente deslizante");

document.querySelector(`[data-media-id="${clickedImage}"] > img`).classList.add('active-thumb');
};
</script>

6. Vejo que o componente-slider.css também está sendo usado para seções multicolunas, portanto, temos que criar um novo arquivo .css. Vá para a pasta Ativos, clique em 'criar novo ativo' e crie um espaço em branco. Nomeie o arquivo como 'produto deslizante'. O arquivo deve aparecer como abaixo

produto-slider.css

7. Agora abra a pasta CSS criada e cole o código abaixo.

.slider-container {
margem: 0 automático;
largura: 100%;
estouro: automático;
exibição: flexível;
flex-flow: quebra de coluna;
alinhar itens: centro;
posição: relativa;
}

.imagem grande {
largura: 100%;
posição: relativa;
estouro: oculto;
}


.item de imagem grande {
largura máxima: 100%;
largura mínima: 50%;
altura máxima: 100%;
preenchimento: 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__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: 100%;
exibição: flexível;
}

.product-slider {
altura: 100%;
largura: 23%;
display: bloco embutido;
}

.product-slider:not(:first-child){
margem esquerda: 1rem;
}

.slide-imagem {
largura: 100%;
altura: 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;
}

.contador deslizante {
margem: 0 1,2rem;
}

.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: 0,6rem;
}

.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;
}

.hide-modal abridor modal {
Mostrar nenhum;
}

.ativo-thumb {
opacidade: 1 !importante;
borda: sólido 2px var(--gradient-base-accent-1);
dimensionamento de caixa: caixa de borda;
}

.slide-imagem {
opacidade: 0,5;

}


8. Em seguida, volte para o produto principal.líquido. Na parte superior, comente este código. Você também pode simplesmente excluí-lo. Para comentar, coloque (<!-- ) antes do código e (--->) depois. Assim como fizemos no componente deslizante. O código deve ficar assim.

<!-- {{ 'component-slider.css' | asset_url | stylesheet_tag }} -->

adicione isso depois.

{{ 'product-slider.css' | asset_url | stylesheet_tag }}

9. Precisamos ir para a pasta Asset novamente e abrir global.js. Encontre o componente deslizante. Como o componente slider é um código global, ou seja, algumas seções também usam o mesmo código. Temos que adicionar uma instrução if. Desconsidere o vídeo referente a esta seção em global.js.

No construtor SliderComponent adicione o código abaixo.

this.productSlider = this.querySelector('.product-slider-box');

10. Na função initPages precisamos alterar o totalPages. Substitua o código abaixo:

this.totalPages = sliderItemsToShow.length - this.slidesPerPage + 1;

 com isso

if (this.productSlider) { this.totalPages = sliderItemsToShow.length - this.slidesPerPage + 4} else {
this.totalPages = sliderItemsToShow.length - this.slidesPerPage + 1;
}

11. Por último, na função de atualização precisamos alterar a currentPage, alterar 1 para 4. Substitua o código abaixo e clique em SALVAR

this.currentPage = Math.round(this.slider.scrollLeft / this.sliderLastItem.clientWidth) + 1;

para isso

if (this.productSlider) {this.currentPage = Math.round (this.slider.scrollLeft / this.sliderLastItem.clientWidth) + 4} else {
this.currentPage = Math.round(this.slider.scrollLeft / this.sliderLastItem.clientWidth) + 1;
}

O código global.js deve ficar assim:

É isso! Você acabou de transformar a página do produto do tema Dawn. Deixe-me saber se você tiver dúvidas ou problemas com o código para que possamos corrigi-lo e ter um código atualizado. (",)

Atualização 22/09/21: acabo alterando o código no Asset/global.js para não quebrarmos o componente slider se usarmos na outra seção

Eu mudo o código CSS e removo o observador de redimensionamento. A imagem grande terá a mesma altura do item de imagem grande.

Atualização 23/09/21: Corrigidos problemas de falta de duas imagens grandes e controle deslizante. Código atualizado para usar o recurso hide_variants

Atualização 25/09/21: Correção do problema com o desaparecimento da miniatura ao adicionar uma seção que usa um componente deslizante. Atualizado o código na etapa 4.

Atualização 26/09/21: Adicionado um botão de reprodução de vídeo quando a imagem em miniatura é um vídeo

Atualização 30/09/21: Corrija o problema relacionado ao botão de vídeo. Reposicione os códigos do video-btn e adicione alguns códigos css

Atualização 01/10/21: Corrigido o problema de empilhamento de imagens grandes no celular. Adicionei um resizeObserver no Javascript para corrigir o problema de grandes lacunas entre a imagem grande e o controle deslizante. Se você não quiser, basta deletar o código

Atualização 03/10/21: Adicionado overflow: oculto em CSS de imagem grande. Eu recomendaria não ter imagens de produtos com altura extrema como imagem de primeira variante. Também foi adicionado algum CSS para que, quando ativa, a imagem em miniatura tenha uma caixa de borda e a opacidade seja 1. Veja o código em verde. A cor da borda da miniatura depende do seu var(--gradient-base-accent-1) .

Atualização 04/10/21: Altere o v-btn no arquivo product-slider.css devido a um problema ao ter um vídeo móvel

Atualização 10/10/21: Sei que resolvi o problema de espaço entre a imagem grande e o controle deslizante. Eu removi o resizeObserver e também o preenchimento inferior da imagem grande para corrigir isso. Eu atualizei o código

Atualização 11/10/21: alterei a forma como a borda e a opacidade são aplicadas. Por favor, veja o código verde destacado

Atualização 15/10/21: adicionei uma função onload para que quando a janela carregasse a primeira imagem da miniatura obtivesse a propriedade ativa. O código é rosa.

Também foi adicionado um código para quem ainda deseja a opção de ocultar as variantes quando as variantes forem selecionadas. (NOTA: este é o código original do Dawn). Veja o código em azul.

46 comentários

Code works perfect but i didn’t want to show product thumbnail slider in mobile. i want to just turn product image area into slider. How can i do it ?

muhammad asad ullah baig

For all the people is asking about the large image having a side navigation bar. It is possible, but needed to do more CSS and javascript customizations

Made4Uo

Hi @FABIÁN,

Thank you for that. Do you mean collection slider for your home page. Please check the DAWN theme tutorials at the home page

Made4Uo

Amazing piece of code.

Just a little errata on step 6.
You mention “folder” instead of “file”.

Is there a way to add slider elements? Like arrows to navigate through images.

Fabián

hi, how to change the slider and the large image to show Horizontal. now the slider is under the large image. I want to let the slider to show on the left of the large image or right. thank you.

victor

Thank you so much for the informative video. IT WORKED! Is there any way the pictures can be to the side instead of the bottom of the picture?

Albert

Hi,
Thanks for this imp article.

But color variant image change feature does not work.

Any suggestions ?

Thanks

Test den

How would you make the images in the slider the same size / ratio of the first picture so they all show uniform.

Rochelle Harris

@Ikhlaque I hope you follow the global.js code instruction
@Larry Evans I do have this https://made4uo.com/blogs/dawn-theme-tweaks-and-trick/convert-dawn-to-debut-product-page. Dots for me is redundant to be honest when it comes to product page. Since you are calling stuff three times already, adding the dots would potentially have risk on breaking the code
@Barry Somebody was asking me that, stay tuned
@Syam Sundar. Please message me in “Chat with us.” I can do the code for you

Made4Uo

It did not work for me. Please help

Shyam Sundar
« Anterior 1 2 3 4 5 Próximo »

Deixe um comentário