Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отслеживание второго активного слайда (https://javascript.ru/forum/misc/69573-otslezhivanie-vtorogo-aktivnogo-slajjda.html)

sergey24 04.07.2017 02:55

Отслеживание второго активного слайда
 
Имеется слайдер owl carousel 1.3 с 6 слайдами. Отображаются по 3. Активные слайды имеют класс active. Каким образом можно отследить второй активный слайд и применять css только к нему (требуется прописать display:block для кнопки внутри слайда)? Через nth-child работает почти как надо, но он слайды считает только при загрузке страницы, при перелистывании слайдов css не обновляет.

<script type="text/javascript">
$(document).ready(function() {  
$(".owl-zk").owlCarousel({
items:3,
addClassActive:true,
navigation: true,
navigationText: ['<img src="/left.png" alt="" />', '<img src="/right.png" alt="" />'],
pagination: false
});
});</script>

j0hnik 04.07.2017 04:38

Может селектор неправильно присваиваете? попробуйте вместо "nth-child" "nth-of-type"

laimas 04.07.2017 05:25

Цитата:

Сообщение от sergey24
Имеется слайдер owl carousel

А он имеет API, в котором есть события, в которых можно получать разную информацию.

$(selector).owlCarousel({
   options 
}).on('translated.owl.carousel', function(e) {
   e.item.index - индекс текущего слайдера
})

sergey24 04.07.2017 05:47

j0hnik,
Не работает:)
laimas,
Читал документацию, сейчас пытаюсь присвоить стиль к активному элементу:)

laimas 04.07.2017 06:44

sergey24,
активный, это, по идее, индекс слайдера с нулевой позицией относительно окна слайдера, но от общего числа слайдов. А если из группы трех взять второй, это выделить средний, надо полагать? Поэтому не текущий активный нужен, а текущий + 1.

sergey24 04.07.2017 08:42

laimas,
Всё очень плохо:write:

рони 04.07.2017 09:20

sergey24,
скачайте новую версию owlCarousel тогда можно будет сделать с помощью api которое показал laimas,
только немного уточнить его код. выборка нужна не по индексу слайдера а по фильтрации активных блоков
https://owlcarousel2.github.io/OwlCarousel2/

рони 04.07.2017 09:23

Цитата:

Сообщение от j0hnik
Может селектор неправильно присваиваете? попробуйте вместо "nth-child" "nth-of-type"

есть несколько блоков три из них имеют класс "active" как выбрать второй активный с помощью css?

laimas 04.07.2017 09:24

Цитата:

Сообщение от sergey24
Всё очень плохо

что именно не известно, но думаю, что той информации, которой обладает каждое событие слайдера вполне достаточно для решения пробелмы.

laimas 04.07.2017 09:26

Цитата:

Сообщение от рони
выборка нужна не по индексу слайдера а по фильтрации активных блоков

А индекс разве не дает нужного?

sergey24 04.07.2017 09:35

Может кодом кто-нибудь помочь?:(

рони 04.07.2017 09:39

laimas,
количество блоков всегда разное(клоны слева и справа про запас) , api говорит показываю блок 1 , а по порядку блок в этот момент или 3 или 7

рони 04.07.2017 09:40

Цитата:

Сообщение от sergey24
Может кодом кто-нибудь помочь?

Цитата:

Сообщение от рони
скачайте новую версию owlCarousel

:-?

laimas 04.07.2017 09:44

Цитата:

Сообщение от рони
количество блоков всегда разное

странно, тогда смысла информации об индексе нет. Коли задается в нем параметр items, значит API должен учитывать и корректировать индекс текущего по режиму отображения.

laimas 04.07.2017 09:46

Цитата:

Сообщение от sergey24
Может кодом кто-нибудь помочь?

Может взять другой слайдер в котором активный это средний с большим размером относительно других. Вообще этих слайдеров развелось, хоть отстреливай, выбор богатый. )

рони 04.07.2017 09:51

Цитата:

Сообщение от laimas
тогда смысла информации об индексе нет

есть!!! всегда можно отследить какой блок показывается и вывести именно для него например описание

laimas 04.07.2017 09:55

Цитата:

Сообщение от рони
всегда можно отследить какой блок показывается и вывести именно для него например описание

То есть, если брать во внимание ранее вами высказанное и отображении трех слайдеров в окне, нельзя получается в таком режиме "всегда можно узнать", так как не на того нарвемся. :) Да и деление по модулю никто не отменял.

Что-то тут не сходится, надобности никогда в этом не было, но как нибудь спецом проверю индекс текущего и его класс.

рони 04.07.2017 10:01

laimas,
не понимаю, что вы написали

sergey24 04.07.2017 10:06

рони,
Обновился до 2 версии. Сейчас буду копать код, который предоставил laimas.

рони 04.07.2017 10:09

laimas,
вероятно event.page.index нужен а не event.item.index

рони 04.07.2017 10:12

owlCarousel css для центрального блока
 
sergey24,
вариант без индекса
центральный блок красный, css строка 42
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/owl.carousel.js"></script>
      <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.carousel.css">
      <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.theme.default.css">
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.theme.green.css" />
  <style type="text/css">
    .owl-carousel .item {
    height: 10rem;
    background-color: #4DC7A0;
    padding: 1rem;
    position:relative;
}
.owl-carousel .owl-prev{
   position:absolute;
   top:0; left:0;
   display:block;
   height:99%;
   width:90px;
  background-color: #FF00FF;
}
.owl-carousel .owl-next{
   position:absolute;
   top:0; right:0;
   display:block;
   height:99%;
   width:90px;
    background-color: #FF00FF;
}


.prev:after, .next:after{
  content: attr(class);
}

.prev,.next{
  display: inline-block;
}
.red .item{
   background-color:  #FF0000;
}
  </style>

  <title>Owl Carousel 2.1.0 Responsive by Geyan</title>
<script>

$(function() {
    $(".owl-carousel").owlCarousel({  loop: true,
        startPosition: -1,
        items: 3,
        nav: true,
        navText: ['<img src="/left.png" alt="" />', '<img src="/right.png" alt="" />'],
        dots: false
    }).on("translated.owl.carousel", setCls);

    function setCls() {
        $(".owl-item").removeClass("red").filter(".active").eq(1).addClass("red")
    }
    setCls()
});

</script>


</head>

<body>
  <div class="owl-carousel">
    <div class="item">
        <h4>1</h4>
    </div>
    <div class="item">
        <h4>2</h4>
    </div>
    <div class="item">
        <h4>3</h4>
    </div>
    <div class="item">
        <h4>4</h4>
    </div>
    <div class="item">
        <h4>5</h4>
    </div>
    <div class="item">
        <h4>6</h4>
    </div>
    <div class="item">
        <h4>7</h4>
    </div>
    <div class="item">
        <h4>8</h4>
    </div>
    <div class="item">
        <h4>9</h4>
    </div>
    <div class="item">
        <h4>10</h4>
    </div>
    <div class="item">
        <h4>11</h4>
    </div>
    <div class="item">
        <h4>12</h4>
    </div>
</div>

</body>

</html>

laimas 04.07.2017 10:13

Цитата:

Сообщение от рони
количество блоков всегда разное(клоны слева и справа про запас) , api говорит показываю блок 1 , а по порядку блок в этот момент или 3 или 7

Цитата:

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


Три элемента в отображении:

Если верить первому утверждению, то индекс в данном случае бесполезен, как он будет бесполезен и для второго утверждения.

Если верить второму утверждению, то нет проблем, при этом не важно сколько слайдеров в отображении. То есть то, что первое в блоке, это текущий индекс. Кроме этого есть информация и о страницах, включая и о текущей, не думаю что этого мало и надо шарить фильтром по классу среди всех элементов.

рони 04.07.2017 10:25

Owl Carousel центральный блок и event.item.index
 
laimas,
ок! не очень понимаю ваши обьяснения, но был неправ,
event.item.index использовать можно.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/owl.carousel.js"></script>
      <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.carousel.css">
      <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.theme.default.css">
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.2.1/assets/owl.theme.green.css" />
  <style type="text/css">
    .owl-carousel .item {
    height: 10rem;
    background-color: #4DC7A0;
    padding: 1rem;
    position:relative;
}
.owl-carousel .owl-prev{
   position:absolute;
   top:0; left:0;
   display:block;
   height:99%;
   width:90px;
  background-color: #FF00FF;
}
.owl-carousel .owl-next{
   position:absolute;
   top:0; right:0;
   display:block;
   height:99%;
   width:90px;
    background-color: #FF00FF;
}


.prev:after, .next:after{
  content: attr(class);
}

.prev,.next{
  display: inline-block;
}
.red .item{
   background-color:  #FF0000;
}
  </style>

  <title>Owl Carousel 2.1.0 Responsive by Geyan</title>
<script>

$(function() {
    $(".owl-carousel").owlCarousel({
        items: 3,
        nav: true,
        navText: ['<img src="/left.png" alt="" />', '<img src="/right.png" alt="" />'],
        dots: false
    }).on("translated.owl.carousel", setCls);

    function setCls(event) {
        var num = event && event.item ? event.item.index + 1 : 1 ;
        $(".owl-item").removeClass("red").eq(num).addClass("red")
    }
    setCls()
});

</script>


</head>

<body>
  <div class="owl-carousel">
    <div class="item">
        <h4>1</h4>
    </div>
    <div class="item">
        <h4>2</h4>
    </div>
    <div class="item">
        <h4>3</h4>
    </div>
    <div class="item">
        <h4>4</h4>
    </div>
    <div class="item">
        <h4>5</h4>
    </div>
    <div class="item">
        <h4>6</h4>
    </div>
    <div class="item">
        <h4>7</h4>
    </div>
    <div class="item">
        <h4>8</h4>
    </div>
    <div class="item">
        <h4>9</h4>
    </div>
    <div class="item">
        <h4>10</h4>
    </div>
    <div class="item">
        <h4>11</h4>
    </div>
    <div class="item">
        <h4>12</h4>
    </div>
</div>

</body>

</html>

laimas 04.07.2017 10:32

Цитата:

Сообщение от рони
не очень понимаю ваши обьяснения

тем не менее это то, о чем я так долго говорил. )

Следующий шаг - все это фигня, на повестке дня стоит слайдер, в котором, при изменении, активный слайд рассыпается на частицы спадающие вниз или рассыпается на частицы сторона противоположная движению с постепенным размытием, аки хвост за кометой. Пока идею не запатентовал можно предлагать решения, если конечно комп от такого слайдера не скиснет. :)

рони 04.07.2017 10:38

Цитата:

Сообщение от laimas
Следующий шаг - все это фигня, на повестке дня стоит слайдер, в котором, при изменении, активный слайд рассыпается на частицы спадающие вниз

пойду поищу на форуме у рони где-то было :lol:

laimas 04.07.2017 10:40

Цитата:

Сообщение от рони
пойду поищу на форуме

уже готово!!! Блин, думал патент продать да самолет купить, опоздал. :)

laimas 04.07.2017 10:44

рони,
кстати, надо обрабатывать событие начала трансляции, убирая класс у активного слайда, иначе "моргает", не кажется?

рони 04.07.2017 10:45

слайдер падающие блоки
 
Цитата:

Сообщение от laimas
на повестке дня стоит слайдер, в котором, при изменении, активный слайд рассыпается на частицы спадающие вниз

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
    #slider{
      position: relative;
      width: 500px;
      height: 300px;
      background-color: #000000;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    #slider div{
      margin: 0;
      padding: 0;
      position: absolute;
      background-color: #0000FF;
      background-repeat: no-repeat;

    }

 </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js">
</script>
  <script>
$(function() {
    var slider = $("#slider");
    var height = slider.height();
    var width = slider.width();

    function load_img(next, src, x, y) {
        var w = width / x | 0;
        var h = height / y | 0;
        slider.height(height = h * y);
        slider.width(width = w * x);
        slider.css({
            backgroundSize: width + "px " + height + "px",
            backgroundImage: "url(" + next + ")"
        });
        var n = 0,
            arr = Array(x * y);
        $.each(arr, function(i, el) {
            !n && y--;
            arr[i] = $("<div>", {
                css: {
                    left: n * w,
                    top: y * h,
                    width: w,
                    height: h,
                    backgroundImage: "url(" + src + ")",
                    backgroundPosition: -n * w + "px " + -y * h + "px",
                    backgroundSize: width + "px " +
                        height + "px"
                }
            }).prependTo(slider);
            n = ++n % x
        });
        return arr
    }





    function show(arr) {

$.when.apply(null, arr.map(function(el) {
    var time =  Math.floor(Math.random() * 1000+800);
    return  el.css({
            "z-index": 100
        }).delay(time).animate({
            top: height
        }, {
            easing: "easeOutCirc",
            duration: 1200})
})

      ).done(function() {
         arr.forEach( function(el) {
                el.remove()
        });

      setTimeout(go, 1000);
        });



    }
  var arrSrc = ["http://wallpapershome.ru/images/pages/pic_h/7086.jpg", "http://wallpapershome.ru/images/pages/pic_h/8983.jpg", "http://www.kinomania.ru/images/wallpapers_film/w1920x1080_15585.jpg"];
  function preload(arr,foo)
  { var count = 0;
    function l() {
    if(++count == arr.length) foo();
  }
    return arr.map(function(src) {
    var img = new Image();
    img.onload = l;
    img.src = src;
    return img

})
  }



    function go() {

        var arr = load_img(arrSrc[1].src, arrSrc[0].src, 25, 15);
        show(arr);
         arrSrc.push(arrSrc.shift());
    }
    arrSrc = preload(arrSrc,go);

});
  </script>
</head>

<body>
<div id="slider"></div>

</body>
</html>

рони 04.07.2017 10:48

Цитата:

Сообщение от laimas
кстати, надо обрабатывать событие начала трансляции, убирая класс у активного слайда, иначе "моргает", не кажется?

что за кнопка у ТС неизвестно, display:block может моргать не будет.

laimas 04.07.2017 10:53

рони,
все таки есть надежда прикупить самолет. :D Это не частицы, физика частиц, это иное. Хотя, например, в 3D моделировании частицей может быть и объект. Я имел ввиду элементарные частицы, вплоть до пикселя. Неужто не наблюдали как комета рассыпается? :)

А это просто эффект, но тормоза уже наблюдаются. ;)

рони 04.07.2017 10:57

laimas,
нашёл ссылку :dance: там ещё вариант, с данным алгоритмом.
слайдер блоками с opacity

рони 04.07.2017 11:01

Цитата:

Сообщение от laimas
Это не частицы

разбей на пикселы строка 114 пост №28
var arr = load_img(arrSrc[1].src, arrSrc[0].src, 25, 15);
останови комп :lol:

laimas 04.07.2017 11:05

Нет рони, это не то. Сперва откалываются большие куски, потом они распадаются на более мелкие, и так до самых малых частиц. Скорости их будут различны, физика поведения тоже, и чем далее от объекта, тем более "размазан" хвост.

Не потянет такого слайдера даже мой восьмиядерный комп в режиме реального времени. :)

А смена цвета у активного слайда все равно будет заметна, так как он движется с тем же цветом, что будет назначен в конце движения другому. Надо при начале движения удалять цвет у активного.

sergey24 04.07.2017 14:30

рони,
laimas,
Спасибо большое Вам за помощь, всё работает!

sergey24 04.07.2017 14:38

рони,
Маленькая проблемка.
При загрузке сайта, если включен "loop", то класс присваивается клонированному слайду, можно ли как-то подправить?

рони 04.07.2017 14:41

Цитата:

Сообщение от sergey24
то класс присваивается ему,

ему это кто?

sergey24 04.07.2017 14:42

рони,
Цитата:

Сообщение от sergey24
то класс присваивается клонированному слайду


рони 04.07.2017 14:48

sergey24,
пост 21 работает , запустите код там снова, добавил loop

рони 04.07.2017 14:49

sergey24,
startPosition - уточните сами если нужно

sergey24 04.07.2017 15:10

рони,
Если отрицательный startPosition писать, то слайдер клонов не трогает, а переходит в конец списка. В 21 посте при загрузке отлично всё срабатывает и ставит куда надо стиль, но если листаем влево, то и стиль присваивается левому (из 3) слайду. Если листаем вправо, то правому:) Сейчас соединить пытаюсь:)


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