Почему слайдер карт l oop проходит только через первые 3, а не через оставшиеся карты? - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь реализовать идею из ручки, созданной Шамлой, на codepen по этой ссылке

Однако я заметил, что карты циклически проходят только первые 3 и не переходят к четвертый.

Я знаю это, вероятно, в javascript, но не могу понять, какая часть.

Я был бы признателен за помощь в получении карты для l oop всех предметов.

спасибо. пожалуйста, смотрите код ниже.

$(document).ready(function() {
  let sliderItem = $(".slider").children(".item.active");
sliderItem.prev(".item").css({
  left: -200
});

sliderItem.next(".item").css({
  right: -200
});
let i = $(".slider").children(".item");
let ind = 0;
$(".slider")
  .children(".item")
  .each(function() {
    $(this).attr("data-index", ind++);
  });
i.on("click", function(e) {
  const that = $(this);
  let dataIndex = that.data("index");
  $(".item").removeClass("active");
  that.addClass("active");
  i.each(function() {
    if ($(this).data("index") == dataIndex) {
      $(this).addClass("active");
      $(this).css({
        left: 0,
        right: 0,
        "z-index": 3
      });
      if (dataIndex == "1") {
        $(".item[data-index=2]").css({
          left: 0,
          right: -200,
          "z-index": 1
        });
        $(".item[data-index=0]").css({
          left: -200,
          right: 0,
          "z-index": 1
        });
      } else if (dataIndex == "0") {
        $(".item[data-index=2]").css({
          left: -200,
          right: 0,
          "z-index": 1
        });
        $(".item[data-index=1]").css({
          left: 0,
          right: -200,
          "z-index": 1
        });
      } else if (dataIndex == "2") {
        $(".item[data-index=1]").css({
          left: -200,
          right: 0,
          "z-index": 1
        });
        $(".item[data-index=0]").css({
          left: 0,
          right: -200,
          "z-index": 1
        });
      }
    }
  });
});

});
body {
  background: #c0b5f5;
}

.slider {
  width: 75%;
  height: 80%;
  position: absolute;
  margin: 0 auto;
  left: 0;
  right: 0;
  top: 50px;
}
.slider .item {
  height: 100%;
  width: 100%;
  position: absolute;
  background: #fff;
  border-radius: 10px;
  transition: all ease 0.7s;
  z-index: 1;
  left: 0;
  opacity: 0.7;
  transform: scale(0.8);
  right: 0;
  margin: 0 auto;
}
.slider .item.active {
  z-index: 2;
  opacity: 1;
  background: #fff;
  transform: scale(1);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='slider'>
  <div class='item'>
    1
  </div>
  <div class='item active'>
    2
  </div>
  <div class='item'>
    3
  </div>
  <div class='item'>
    4
  </div>
  <div class='item'>
    5
  </div>
  <div class='item'>
    6
  </div>
</div>

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Кажется, вы слишком усложняете свой код. Вы пытаетесь установить стиль каждого отдельного слайда для каждого активного индекса. Выполнение этого вручную может быть сложной и подверженной ошибкам задачей. Я бы посоветовал вам разрешить CSS выполнять тяжелую работу за вас.

Я познакомлю вас с двумя селекторами, с которыми вы, возможно, еще не знакомы, если вы пропустите этот бит. + (соседний селектор брака) выберет прямой элемент, который идет после знака плюс. И ~ (общий селектор братьев и сестер) выберет всех братьев и сестер после волнистой линии. Так, например.

h1 + p{
  ...
}

Это выберет p, которое приходит напрямую после h1 на том же уровне.

h1 ~ p {

}

Это выберет все p, которые идут после h1 на том же уровне. С помощью этих селекторов вы можете условно стилизовать свои элементы.

Таким образом, в вашем слайдере вы хотите, чтобы все элементы, которые идут до активного слайда, были расположены слева. Таким образом, мы устанавливаем CSS, чтобы каждый слайд имел позицию по умолчанию слева.

.item {
  left: -200px;
  right: 0;
}

Теперь слайд .active должен быть центрирован. Так что этот слайд потеряет левую и правую позиции.

.item.active {
  left: 0;
  right: 0;
}

И отсюда мы будем использовать селекторы. Мы хотим, чтобы все слайды, появившиеся после .active, переместились вправо. И мы делаем это с помощью селектора ~.

.item.active ~ .item {
  right: -200px;
  left: 0;
}

Теперь все ваши слайды должны быть оформлены правильно и не требовать JS, чтобы переместить их в правильное положение. В качестве завершающего штриха вам нужно будет скрыть все элементы, которые идут после элемента, который идет после элемента .active. Глоток, но зацените.

.item.active + .item ~ .item {
  opacity: 0;
  visibility: hidden;
}

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

Проверьте приведенный ниже фрагмент кода, чтобы увидеть его в действии. Также рассмотрите возможность использования непрозрачного фона, поскольку ваши элементы будут перекрываться. Так что оттенок, который имитирует прозрачность, будет так же хорошо.

Надеюсь, это поможет вам. Если я не уверен или у вас есть дополнительные вопросы, пожалуйста, дайте мне знать.

Удачи!

$(document).ready(function() {

  let $slider = $(".slider");
  let sliderItem = $slider.children(".item.active");
  let i = $slider.children(".item");
  let ind = 0;
  
  $slider
    .children(".item")
    .each(function() {
      $(this).attr("data-index", ind++);
    });
    
  i.on("click", function(e) {
    const that = $(this);
    let dataIndex = that.data("index");
    $(".item").removeClass("active");
    that.addClass("active");
  });

});
body {
  background: #c0b5f5;
}

.slider {
  width: 75%;
  height: 80%;
  position: absolute;
  margin: 0 auto;
  left: 0;
  right: 0;
  top: 50px;
}

.slider .item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  width: 100%;
  position: absolute;
  background: #ede9ff;
  border-radius: 10px;
  transition: all ease 0.7s;
  z-index: 1;
  left: 0;
  transform: scale(0.8);
  left: -200px;
  right: 0;
  margin: 0 auto;
  
}

.slider .item.active {
  left: 0;
  right: 0;
  z-index: 2;
  opacity: 1;
  background: #fff;
  transform: scale(1);
}

.slider .item.active ~ .item {
  left: 0;
  right: -200px;
}

.slider .item.active + .item ~ .item {
  opacity: 0;
  visibility: hidden;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='slider'>
  <div class='item'>
    1
  </div>
  <div class='item active'>
    2
  </div>
  <div class='item'>
    3
  </div>
  <div class='item'>
    4
  </div>
  <div class='item'>
    5
  </div>
  <div class='item'>
    6
  </div>
</div>
0 голосов
/ 29 января 2020

это из-за if cases. if cases не настраивается динамически для более чем 3 элементов на вашем слайдере. Что вы можете сделать, это просто добавить больше дел, если индекс выше 2. Если вы добавите этот код в последний случай, будет показан 4-й элемент. Вам понадобится алгоритм, который будет рассчитывать новые позиции всех других элементов слайда. Код, который вы предоставили, охватывает только 3 случая.

    ...

    else if(dataIndex=="2"){
            $(".item[data-index=1]").css({
              "left":-200,
              "right":0,
              "z-index":1,
            })
            $(".item[data-index=3]").css({
              "left":0,
              "right":-200,
              "z-index":1,
            })
    ...
...