Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Слайдер и display:none (https://javascript.ru/forum/misc/73023-slajjder-i-display-none.html)

Noonf 14.03.2018 17:35

Слайдер и display:none
 
Вложений: 2
Здравствуйте! Помогите решить проблему. Есть слайдер который отображается только при нажатии на определенный div. Так как плагин не особо дружит с display:none было не мало проблем. В целом слайдер работает, но главной проблемой стало не отображение самих слайдов (изображений). Заметил, что если нажать на поле слайда, то через несколько секунд слайды появляются и все работает. Частично решил проблему через автоплей, но иногда все же не срабатывает. Приложу скрины для наглядности. Заранее благодарен!

P.S. На просторах инета нашел решение с помощью вот такой строчки $(".slider").slick('reinit');
Но мне не помогло, хотя возможно не туда вставлял )

Вот html слайдера

<article class="product_slider_1">
				<img src="images/product_slider_1/slide_1.png" alt="Картинка слайдера 1" class="slide_img_product">
				<img src="images/product_slider_1/slide_2.png" alt="Картинка слайдера 2" class="slide_img_product">
				<img src="images/product_slider_1/slide_3.png" alt="Картинка слайдера 3" class="slide_img_product">
				<img src="images/product_slider_1/slide_4.png" alt="Картинка слайдера 4" class="slide_img_product">
				<img src="images/product_slider_1/slide_5.png" alt="Картинка слайдера 5" class="slide_img_product">
				<img src="images/product_slider_1/slide_6.png" alt="Картинка слайдера 6" class="slide_img_product">
				<img src="images/product_slider_1/slide_7.png" alt="Картинка слайдера 7" class="slide_img_product">
				<img src="images/product_slider_1/slide_8.png" alt="Картинка слайдера 8" class="slide_img_product">
				<img src="images/product_slider_1/slide_9.png" alt="Картинка слайдера 9" class="slide_img_product">
				<img src="images/product_slider_1/slide_10.png" alt="Картинка слайдера 10" class="slide_img_product">
				<img src="images/product_slider_1/slide_11.png" alt="Картинка слайдера 11" class="slide_img_product">
				<img src="images/product_slider_1/slide_12.png" alt="Картинка слайдера 12" class="slide_img_product">
			</article>



и js

$('.product_slider_1').slick({
    autoplay: true,
    autoplaySpeed: 200,
    speed: 1500,
    slidesToShow: 4
});

рони 14.03.2018 18:16

Noonf,
$('определенный div').show();
$('.product_slider_1').slick(...);
$('определенный div').hide();

Noonf 14.03.2018 19:20

Хм, я если вставляю эти строки, то у меня все слайдеры слетают )

рони 14.03.2018 19:30

Noonf,
где код?

Noonf 14.03.2018 19:38

Сори, не понял вопроса. Где его расположение или скинуть сюда ? )

рони 14.03.2018 19:40

Noonf,
скинуть сюда то, что вы написали по предложенному решению.

рони 14.03.2018 19:42

Noonf,
или структуру скрытого блока

Noonf 14.03.2018 19:48

Вот, я пропустил фигурную скобку и поэтому все слетало. Но почему-то не помогло, слайды все равно появляются только после движения слайдера, а иногда только после нажатия.

$('.product_1').show();
$('.product_slider_1').slick({
autoplay: true,
autoplaySpeed: 200,
speed: 1500,
slidesToShow: 4
});
$('.product_1').hide();

рони 14.03.2018 19:51

Noonf,
$(window).on("load", function() {
$('селектор_скрытого_блока').show();  // $('селектор_скрытого_блока').css('display', '');
$('.product_slider_1').slick({
    autoplay: true,
    autoplaySpeed: 200,
    speed: 1500,
    slidesToShow: 4
});
$('селектор_скрытого_блока').hide();  // $('селектор_скрытого_блока').css('display', 'none');
});

рони 14.03.2018 19:54

Noonf,
код функции кнопки открытия?

Noonf 14.03.2018 20:00

Сделал по последнему решению и блок слайдера не появляется совсем.

Вот код открытия

jQuery('.product_1').click(function(){
jQuery('.product_slider_1').addClass('active');
jQuery('.bg_slider').addClass('active');

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_1').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});
});

Noonf 14.03.2018 20:01

.product_slider_1 это и есть селектор скрытого блока

рони 14.03.2018 20:05

Noonf,
jQuery(window).on("load", function() {
jQuery('.product_slider_1')
.addClass('active')
.slick({
    autoplay: true,
    autoplaySpeed: 200,
    speed: 1500,
    slidesToShow: 4
})
.removeClass('active');
});

Noonf 14.03.2018 20:08

Все супер! Спасибо огромное!! Наверное сразу нужно было скинуть код открытия, я про него забыл совсем. Спасибо еще раз!

Noonf 14.03.2018 20:37

Рони, столкнулся с еще одной проблемой, помогите если не сложно ) Дело в том, что таких слайдеров у меня 5 шт., для всех прописал тот код который вы написали. При первом открытии любого из них все отлично срабатывает, а вот при открытии следующего этот код как будто игнорируется и работает по старому (с задержкой или после клика). Пробовал добавить общий класс для всех и прописать его в этот код, не помогло

рони 14.03.2018 20:49

Цитата:

Сообщение от Noonf
Вот код открытия

jQuery('.product_1').click(function(){
jQuery('.product_slider_1').addClass('active');
jQuery('.bg_slider').addClass('active');

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_1').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});
});

это бред какой-то, может это сначала исправить?
не назначают клик в клике, если нет задачи убить браузер.

Noonf 14.03.2018 20:54

Понял, спасибо! Это поправил

jQuery('.product_1').click(function(){
jQuery('.product_slider_1').addClass('active');
jQuery('.bg_slider').addClass('active');
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});

рони 14.03.2018 21:46

Noonf,
проблема осталась?

Noonf 14.03.2018 21:53

Да, к сожалению

рони 14.03.2018 22:05

Noonf,
добавьте так
jQuery('.product_1').click(function(){
jQuery('.product_slider_1').addClass('active').slick('reInit') ;
jQuery('.bg_slider').addClass('active');
});

Noonf 14.03.2018 22:29

Добавил, только поменял местами строчки т.к. .bg_slider (затемнение) срабатывал только при повторном нажатии

jQuery('.product_1').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_1').addClass('active').sli ck('reInit') ;
});

Проблема стала проявляться реже, примерно 1 раз из 5

рони 14.03.2018 22:40

Noonf,
у вас все слайдеры открываются одновременно?

Noonf 14.03.2018 22:43

нет, открывается только один

Noonf 14.03.2018 22:47

Вот так прописано для всех пяти слайдеров

jQuery('.product_1').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_1').addClass('active').sli ck('reInit') ;
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_1').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});



jQuery('.product_2').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_2').addClass('active').sli ck('reInit') ;
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_2').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});



jQuery('.product_3').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_3').addClass('active').sli ck('reInit') ;
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_3').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});



jQuery('.product_4').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_4').addClass('active').sli ck('reInit') ;
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_4').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});



jQuery('.product_5').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_5').addClass('active').sli ck('reInit') ;
});

jQuery('.bg_slider').click(function(){
jQuery('.product_slider_5').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});

Noonf 14.03.2018 22:49

А этот код общий для всех

jQuery(window).on("load", function() {
jQuery('.product_slider')
.addClass('active')
.slick({
autoplay: true,
autoplaySpeed: 500,
speed: 1000,
slidesToShow: 4
})
.removeClass('active');
});

рони 14.03.2018 23:10

Noonf,
много кода ... много лишнего кода ...

Noonf 14.03.2018 23:21

Понял, закрытие слайдера сократил вот так

jQuery('.bg_slider').click(function(){
jQuery('.product_slider').removeClass('active');
jQuery('.bg_slider').removeClass('active');
});

рони 14.03.2018 23:34

Noonf,
форум - поиск - открывашка

Noonf 15.03.2018 00:46

Прописал открытие вот так, правда пока только для одного ) Но проблема осталась


window.addEventListener("DOMContentLoaded", function() {
var btn = document.querySelectorAll("[data-id]"),
block = document.querySelectorAll(".product_slider_1");
[].forEach.call(btn, function(item, k) {
item.dataset.text = item.textContent;
var id = item.dataset.id;
item.addEventListener("click", function(event) {
event.preventDefault();
[].forEach.call(block, function(el, i) {
if (el.id == id) {
el.classList.product_slider("active");
el.classList.contains("active") && block[0].classList.remove("active")
}
else el.classList.add("active");
});
})
})
});

рони 15.03.2018 00:54

Noonf,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Noonf 15.03.2018 00:56

Извиняюсь, вот

window.addEventListener("DOMContentLoaded", function() {
    var btn = document.querySelectorAll("[data-id]"),
        block = document.querySelectorAll(".product_slider_1");
    [].forEach.call(btn, function(item, k) {
        item.dataset.text = item.textContent;
        var id = item.dataset.id;
        item.addEventListener("click", function(event) {
            event.preventDefault();
            [].forEach.call(block, function(el, i) {
                if (el.id == id) {
                  el.classList.product_slider("active");
                  el.classList.contains("active") && block[0].classList.remove("active")
                }
                else el.classList.add("active");
            });
        })
    })
});

Noonf 15.03.2018 00:58

Я сейчас попробовал в старый код вместо "reInit" вставить 'reinit' и все стало замечательно работать без багов

jQuery('.product_1').click(function(){
jQuery('.bg_slider').addClass('active');
jQuery('.product_slider_1').addClass('active').slick('reinit') ;
});

Noonf 15.03.2018 00:59

Наверно так и оставлю ) Спасибо Вам огромное за терпение и помощь!! )

рони 15.03.2018 01:00

Noonf,
:)

рони 15.03.2018 01:03

Noonf,
лучше делать макет, минимальный html css js, гадание что у вас и как усложняет поиск решения.

Noonf 15.03.2018 01:07

Понял, учту на будущее. Я уже думал скинуть Вам макет этого фрагмента, но решил что это будет сверхнаглость :)


Часовой пояс GMT +3, время: 18:55.