CSS-анимация следующего и предыдущего клипа

Следуя связанному вопросу, который я разместил на прошлой неделе, я создал пользовательскую карусель который использует clip-path для предоставления фрагмента следующего и предыдущего слайдов. В настоящее время это работает функционально, но теперь мне нужно применить некоторые анимации при отображении/скрытии слайдов.

В связанном вопросе требовалась только функция «следующий слайд», и было предложено решение обрезать «активный» слайд. Однако теперь, поскольку нам нужно сделать следующий и предыдущий слайды, я вместо этого применил клип к следующему и предыдущему слайдам. Код следующим образом:

$(document).ready(function() {
  $('.slide').click(function() {
    var current = $(this);
    var prev = current.prev('.slide');
    var next = current.next('.slide');

    $('.slide').removeClass('active next prev');

    if (current.hasClass('prev')) {
      current.addClass('active').removeClass('prev');
    } else {
      current.addClass('active').removeClass('next');
    }

    if (prev.length) {
      prev.addClass('prev');
    } else {
      $('.slide:last').addClass('prev');
    }

    if (next.length) {
      next.addClass('next');
    } else {
      $('.slide:first').addClass('next');
    }
  });
});
* {
  margin: 0;
  padding: 0;
}

html,
body {
  height: 100%;
  width: 100%;
}

.banners {
  position: relative;
  background: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  margin: 0 auto;
}

.slide {
  display: block;
  height: 100%;
  width: 100%;
  position: absolute;
  overflow: hidden;
  text-align: center;
  z-index: 1;
}

.slide.active {
  z-index: 2;
}

.slide.next {
  clip-path: polygon(100% 100%, 55% 100%, 100% 67%);
}

.slide.prev {
  clip-path: polygon(44% 0, 0 30%, 0 0);
}

.slide.next,
.slide.prev {
  z-index: 3;
  cursor: pointer;
}

.slide .image {
  height: 100%;
  overflow: hidden;
  background-size: cover;
  background-repeat: no-repeat;
  background-position: center;
  position: relative;
}

.content {
  color: #FFF;
  display: inline-block;
  vertical-align: middle;
  font-family: arial;
  text-transform: uppercase;
  font-size: 24px;
}

.spanner {
  vertical-align: middle;
  width: 0;
  height: 100%;
  display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="banners">
  <div class="slide active">
    <div class="image" style="background-image: url('http://imageshack.com/a/img924/2127/SNvipw.jpg');">
      <div class="content">
        Slide 1
      </div>
      <div class="spanner"></div>
    </div>
  </div>

  <div class="slide next">
    <div class="image" style="background-image: url('http://imageshack.com/a/img922/6240/GzBaZq.jpg');">
      <div class="content">
        Slide 2
      </div>
      <div class="spanner"></div>
    </div>
  </div>

  <div class="slide prev">
    <div class="image" style="background-image: url('http://imageshack.com/a/img924/227/XRZGsI.jpg');">
      <div class="content">
        Slide 3
      </div>
      <div class="spanner"></div>
    </div>
  </div>
</div>

Вот JSFiddle всего приведенного выше кода: https://jsfiddle.net/795f88nm/

Как вы увидите, карусель работает нормально. Мне просто нужно добавить анимацию следующим образом:

  • При нажатии на следующий слайд (нижний правый угол) он должен постепенно открывать слайд вверх. «Новый» следующий слайд должен постепенно появляться из нижнего угла.
  • При нажатии на предыдущий слайд (верхний левый угол) он должен постепенно открывать слайд вниз. «Новый» предыдущий слайд должен постепенно появляться из верхнего угла.

Я не очень хорошо делаю анимацию, поэтому мог бы помочь с этим.


person MAXIM    schedule 18.07.2017    source источник
comment
что-то вроде jsfiddle.net/darjiyogen/795f88nm/1   -  person yogen darji    schedule 18.07.2017
comment
@yogendarji нет - пожалуйста, посмотрите изображение в моем посте (только что добавил).   -  person MAXIM    schedule 18.07.2017


Ответы (1)


В основном вы можете использовать animation с вашим clip-path

$(document).ready(function() {
  $('.slide').click(function() {
    var current = $('.slide.active');
    var prev = $('.slide.prev');
    var next = $('.slide.next');

    if ($(this).hasClass('prev')) {
      prev.removeClass('prev').addClass('next');
      current.removeClass('active').addClass('prev');
      next.removeClass('next').addClass('active');
    } else if ($(this).hasClass('next')) {
      next.removeClass('next').addClass('prev');
      current.removeClass('active').addClass('next');
      prev.removeClass('prev').addClass('active');
    }

  });

});
* {
  margin: 0;
  padding: 0;
}

html,
body {
  height: 100%;
  width: 100%;
}

.banners {
  position: relative;
  background: #000;
  width: 100%;
  height: 100%;
  overflow: hidden;
  margin: 0 auto;
}

.slide {
  display: block;
  height: 100%;
  width: 100%;
  position: absolute;
  overflow: hidden;
  text-align: center;
  z-index: 1;
}

.slide.active {
  z-index: 2;
  transition: all 2s ease;
}

.slide.next {
  transition: all 2s ease;
  clip-path: polygon(100% 100%, 55% 100%, 100% 67%);
  animation: polygons_next 2s alternate;
}

.slide.prev {
  transition: all 2s ease;
  clip-path: polygon(44% 0, 0 30%, 0 0);
  animation: polygons_prev 2s alternate;
}

@keyframes polygons_next {
  0% {
    clip-path: polygon(100% 100%, 100% 100%, 100% 100%);
  }
  100% {
    clip-path: polygon(100% 100%, 55% 100%, 100% 67%);
  }
}

@keyframes polygons_prev {
  0% {
    clip-path: polygon(100% 0, 0 100%, 0 0);
  }
  100% {
    clip-path: polygon(44% 0, 0 30%, 0 0);
  }
}

.slide.next,
.slide.prev {
  z-index: 3;
  cursor: pointer;
}

.slide .image {
  height: 100%;
  overflow: hidden;
  background-size: cover;
  background-repeat: no-repeat;
  background-position: center;
  position: relative;
}

.content {
  color: #FFF;
  display: inline-block;
  vertical-align: middle;
  font-family: arial;
  text-transform: uppercase;
  font-size: 24px;
}

.spanner {
  vertical-align: middle;
  width: 0;
  height: 100%;
  display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="banners">
  <div class="slide prev">
    <div class="image" style="background-image: url('http://imageshack.com/a/img924/2127/SNvipw.jpg');">
      <div class="content">
        Slide 1
      </div>
      <div class="spanner"></div>
    </div>
  </div>

  <div class="slide active">
    <div class="image" style="background-image: url('http://imageshack.com/a/img922/6240/GzBaZq.jpg');">
      <div class="content">
        Slide 2
      </div>
      <div class="spanner"></div>
    </div>
  </div>

  <div class="slide next">
    <div class="image" style="background-image: url('http://imageshack.com/a/img924/227/XRZGsI.jpg');">
      <div class="content">
        Slide 3
      </div>
      <div class="spanner"></div>
    </div>
  </div>
</div>

person yogen darji    schedule 18.07.2017
comment
Хорошая работа @yogen! Почти все, анимация не совсем плавная, просто прыгает. - person MAXIM; 18.07.2017
comment
@GSTAR, да, для плавной анимации по-прежнему требуется несколько изменений свойства анимации. - person yogen darji; 18.07.2017
comment
Не беспокойтесь, я немного поиграю с анимацией. Еще одна вещь заключается в том, что при нажатии на предыдущий слайд он должен анимироваться сверху вниз. Вы знаете, как этого можно добиться? - person MAXIM; 18.07.2017
comment
@GSTAR Вы можете установить еще один класс, чтобы определить направление и создать другой путь клипа анимации для этого набора. Возможно, это поможет создать путь bennettfeely.com/clippy. - person yogen darji; 18.07.2017
comment
Спасибо Йоген. Мне удалось это сделать, добавив в контейнер класс, который отслеживает, в каком направлении последний раз перемещался ползунок, то есть вперед или назад. Затем, используя этот класс, я смог нацелиться на два новых класса, которые выполняют анимацию вниз. - person MAXIM; 18.07.2017