Carrossel de imagens exclusivo para celulares

Neste tutorial veremos como ter um carrossel de imagens na página inicial que aparecerá somente em celulares.

Essa necessidade pode surgir quando um único carrossel de imagens não é o suficiente para  computadores e celulares, quando o design das imagens utilizadas não se adapta bem às duas telas de tamanhos diferentes.

Neste caso teremos 2 carrosséis, um principal (que é o que já tínhamos) e outro para celulares.

.

HTML

1. A primeira coisa que temos que fazer é modificar o snipplet que usamos para o carrossel, home-slider.tpl, e deixá-lo pronto para usar o mesmo código, mas com pequenas diferenças entre sua versão principal e a versão para celulares.

{% set has_main_slider = settings.slider and settings.slider is not empty %}
{% set has_mobile_slider = settings.toggle_slider_mobile and settings.slider_mobile and settings.slider_mobile is not empty %}

{% if not mobile %}
<div class="js-home-main-slider-container {% if not has_main_slider %}hidden{% endif %}">
{% endif %}
    <div class="{% if mobile %}js-home-mobile-slider{% else %}js-home-main-slider{% endif %}-visibility section-slider {% if has_main_slider and has_mobile_slider %}{% if mobile %}d-md-none{% else %}d-none d-md-block{% endif %}{% elseif not settings.toggle_slider_mobile and mobile %}hidden{% endif %}">
        <div class="js-home-slider{% if mobile %}-mobile{% endif %} nube-slider-home swiper-container">
            <div class="swiper-wrapper">
                {% if mobile %}
                    {% set slider = settings.slider_mobile %}
                {% else %}
                    {% set slider = settings.slider %}
                {% endif %}
                {% for slide in slider %}
                    <div class="swiper-slide slide-container">
                        {% if slide.link %}
                            <a href="{{ slide.link }}" aria-label="{{ 'Carrusel' | translate }} {{ loop.index }}">
                        {% endif %}
                        {% set has_text =  slide.title or slide.description or slide.button %}
                            <div class="js-slider-slide slider-slide">
                                {% set load_big_image = loop.first and ((has_main_slider and not has_mobile_slider) or (has_mobile_slider and mobile)) %}
                                <img {% if load_big_image %}src="{{ slide.image | static_url | settings_image_url('1080p') }}" class="slider-image"{% else %}src="{{ slide.image | static_url | settings_image_url('tiny') }}" data-src="{{ slide.image | static_url | settings_image_url('1080p') }}" class="slider-image blur-up swiper-lazy" data-sizes="auto"{% endif %} alt="{{ 'Carrusel' | translate }} {{ loop.index }}"/>
                                {% if has_text %}
                                    <div class="swiper-text swiper-{{ slide.color }}">
                                        {% if slide.description and settings.theme_variant == 'rounded' %}
                                            <div class="swiper-description mb-1">{{ slide.description }}</div>
                                        {% endif %}
                                        {% if slide.title %}
                                            <div class="swiper-title">{{ slide.title }}</div>
                                        {% endif %}
                                        {% if slide.description and settings.theme_variant == 'squared' %}
                                            <div class="swiper-description mt-4">{{ slide.description }}</div>
                                        {% endif %}
                                        {% if slide.button and slide.link %}
                                            <div class="btn btn-line btn-small swiper-btn mt-4">{{ slide.button }}</div>
                                        {% endif %}
                                    </div>
                                {% endif %}
                            </div>
                        {% if slide.link %}
                            </a>
                        {% endif %}
                    </div>
                {% endfor %}
            </div>
            <div class="js-swiper-home-control js-swiper-home-pagination{% if mobile %}-mobile{% endif %} swiper-pagination swiper-pagination-white"></div>
            <div class="js-swiper-home-control js-swiper-home-prev{% if mobile %}-mobile{% endif %} swiper-button-prev">{% include "snipplets/svg/chevron-left.tpl" with {svg_custom_class: "svg-inline--fa fa-w-8 fa-lg svg-icon-text"} %}</div>
            <div class="js-swiper-home-control js-swiper-home-next{% if mobile %}-mobile{% endif %} swiper-button-next">{% include "snipplets/svg/chevron-right.tpl" with {svg_custom_class: "svg-inline--fa fa-w-8 fa-lg svg-icon-text"} %}</div>
        </div>
    </div>
{% if not mobile %}
</div>
{% endif %}

2. Em seguida, vamos mudar como incluímos este snipplet no template home.tpl para que fique da seguinte maneira:

{% set has_mobile_slider = settings.toggle_slider_mobile and settings.slider_mobile and settings.slider_mobile is not empty %}

<section data-store="slider-main">
    {% include 'snipplets/home/home-slider.tpl' %}
    {% if has_mobile_slider %}
        {% include 'snipplets/home/home-slider.tpl' with {mobile: true} %}
    {% endif %}
</section>

3. Se tivermos um tpl que pré-carregue as imagens do carrossel que tínhamos até hoje, teremos que modificá-lo para priorizar o carregamento das imagens do carrossel para celulares. Este snipplet é chamado de preload-images.tpl, se ainda não o tivermos, vamos criá-lo da seguinte maneira:

{% set has_main_slider = settings.slider and settings.slider is not empty %}
{% set has_mobile_slider = settings.toggle_slider_mobile and settings.slider_mobile and settings.slider_mobile is not empty %}


{% if has_mobile_slider %}
    {% set slider = settings.slider_mobile %}
{% else %}
    {% set slider = settings.slider %}
{% endif %}

{% if has_main_slider or has_mobile_slider %}
    {% for slide in slider %}
        {% if loop.first %}
            <link rel="preload" as="image" href="{{ slide.image | static_url | settings_image_url('1080p') }}">
        {% endif %}
    {% endfor %}
{% endif %}

E, em seguida, inclua-o no head da loja:

{# Preload of first image of Slider to improve LCP #}
{% if template == 'home'%}
    {% snipplet 'preload-images.tpl' %}
{% endif %}

CSS

Para este carrossel vamos adicionar helper classes em seu layout. Você pode seguir este pequeno tutorial para fazer isso (é só copiar e colar algumas classes, não leva mais de 1 minuto).

Também nesta funcionalidade, vamos utilizar o plugin de JavaScript Swiper. Para ver como adicioná-lo, você pode ver este pequeno artigo.

JS

⚠️ A partir do dia 30 de janeiro de 2023, a biblioteca jQuery será removida do código de nossas lojas, portanto, a função "$" não poderá ser utilizada.

Una vez que tengamos Swiper en nuestra tienda, ya podemos ubicar el JS del carrusel que teníamos hasta hoy dentro del archivo store.js.tpl y debajo agregar el nuevo script que aplica al nuevo carrusel.

Assim que tivermos o Swiper em nossa loja, podemos colocar o JS do carrossel que tínhamos até hoje dentro do arquivo store.js.tpl, e abaixo, adicionar o novo script que se aplica ao novo carrossel.

var homeMobileSwiper = null;
var preloadImagesValue = false;
var lazyValue = true;
var loopValue = true;
var watchOverflowValue = true;
var paginationClickableValue = true;

createSwiper(
    '.js-home-slider-mobile',
    {
        lazy: lazyValue,
        preloadImages: preloadImagesValue,
        {% if settings.slider_mobile | length > 1 %}
            loop: loopValue,
        {% endif %}
        autoplay: slider_autoplay,
        watchOverflow: watchOverflowValue,
        pagination: {
            el: '.js-swiper-home-pagination-mobile',
            clickable: paginationClickableValue,
        },
        navigation: {
            nextEl: '.js-swiper-home-next-mobile',
            prevEl: '.js-swiper-home-prev-mobile',
        },
    },
    function(swiperInstance) {
        homeMobileSwiper = swiperInstance;
    }
);

Configurações

No arquivo config/settings.txt vamos adicionar um checkbox para poder ativar ou desativar o novo carrossel, bem como a galeria onde podemos fazer upload de imagens; tudo na seção Personalize seu design atual no Administrador nuvem.

Dentro da seção da página inicial, se já tínhamos outro carrossel, adicionamos o seguinte:

checkbox
    name = toggle_slider_mobile
    description = Cargar otras imágenes para celulares
subtitle
    subtitle = <span data-toggle-info='show-on_slider_mobile-active'>Imágenes para celulares</span>
gallery
    name = slider_mobile
    gallery_image = Agregar imagen
    gallery_link = [Opcional] Página web a la que quieres que te lleve la imagen al hacer click
    gallery_width = 500
    gallery_height = 550

E pouco antes da galeria carrossel principal, sugerimos adicionar :

subtitle
    subtitle = <span data-toggle-info='show-on_slider_mobile-active'>Imágenes para computadoras</span>

Traduções

Nesta etapa, adicionamos os textos para as traduções no arquivo config/translations.txt

es "Cargar otras imágenes para celulares"
pt "Carregar outras imagens para celulares"
es_mx "Cargar otras imágenes para celulares"

es "<span data-toggle-info='show-on_slider_mobile-active'>Imágenes para computadoras</span>"
pt "<span data-toggle-info='show-on_slider_mobile-active'>Imagens para computadores</span>"
es_mx "<span data-toggle-info='show-on_slider_mobile-active'>Imágenes para computadoras</span>"

es "<span data-toggle-info='show-on_slider_mobile-active'>Imágenes para celulares</span>"
pt "<span data-toggle-info='show-on_slider_mobile-active'>Imagens para celulares</span>"
es_mx "<span data-toggle-info='show-on_slider_mobile-active'>Imágenes para celulares</span>"

Ativação

Finalmente, você pode ativar o novo carrossel no Painel nuvem, na seção Personalizar seu design atual na Página inicial > Banners rotativos: