Как добавить два переходных преобразования, но одно за другим?

Я хочу добавить 2 переходных преобразования

Но я хочу начать второе преобразование после окончания первого преобразования

элемент должен идти в точку медленно и после этого он должен идти в другую точку

transform: translate(0%, 300%), translate(15%, -136%);

1 ответ

Решение

Вы не можете сделать это только с одним элементом, используя transition потому что, когда вы помещаете более одного перевода в преобразование, свойство преобразования в целом изменяется, а не одно за другим.

С чистым переходом CSS с использованием дополнительного элемента-обёртки:

Если вы добавите дополнительный элемент-обертку вокруг фактического элемента и поместите одно из преобразований в элемент-обертку, вы сможете добиться желаемого эффекта. Это также приведет к точному обратному эффекту при наведении (наведите тело и наведите курсор на приведенный ниже фрагмент).

.wrapper {
  position: relative;
  height: 100px;
  width: 100px;
  transition: all 1s 1s;
}
.content {
  position: absolute;
  height: 100%;
  width: 100%;
  border: 1px solid;
  transition: all 1s;
}
body:hover .content {
  transform: translate(15%, -136%);
  transition: all 1s 1s;
}
body:hover > .wrapper {
  transform: translate(0%, 300%);
  transition: all 1s;
}
body {
  min-height: 100vh;
}
<div class='wrapper'>
  <div class='content'>Some text</div>
</div>

Переход с небольшим количеством JS/jQuery без каких-либо дополнительных элементов:

Если вы добавите дополнительный элемент-обертку вокруг фактического элемента и поместите одно из преобразований в элемент-обертку, вы сможете добиться желаемого эффекта. Это также приведет к точному обратному эффекту при наведении (наведите тело и наведите курсор на приведенный ниже фрагмент).

$(document).ready(function() {
  var isHover; /* variable to track state */
  $('body').hover(function() {
    isHover = !isHover; /* invert the state */
    $('.content').css('transform', 'translate(0%, 300%)');
  }, function() {
    isHover = !isHover; /* invert the state */
    $('.content').css('transform', 'translate(0%, 300%)');
  });
  $('.content').on('transitionend', function() {
    if (isHover) {
      $('.content').css('transform', 'translate(0%, 300%) translate(15%, -136%)');
    } else {
      $('.content').css('transform', 'none');
    }
  });
});
.content {
  height: 100px;
  width: 100px;
  border: 1px solid;
  transition: all 1s;
}
body {
  min-height: 100vh;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='content'>Some text</div>


С анимацией и без лишних элементов:

Используя анимацию, это можно сделать, используя один элемент, но обратный эффект трудно достичь. Мы должны были бы написать дополнительный код для этого, и даже тогда это будет сложно.

.content {
  position: relative;
  height: 100px;
  width: 100px;
  border: 1px solid;
}
body:hover > .content {
  animation: move 1s forwards;
}
@keyframes move {
  0% {
    transform: none;
  }
  50% {
    transform: translate(0%, 300%);
  }
  100% {
    transform: translate(0%, 300%) translate(15%, -136%);
  }
}
body {
  min-height: 100vh;
}
<div class='content'>Some text</div>

Анимации с обратным эффектом:

Ниже приведен фрагмент, который производит обратный эффект также с использованием CSS-анимации. Но, как вы можете видеть, это немного сложно. Мы можем сделать это с помощью одной анимации, но она станет более сложной.

$(document).ready(function() {
  $('body').hover(function() {
    $('.content').css('transform', 'none');
    $('.content').removeClass('hover-out').addClass('hover-in');
  }, function() {
    $('.content').css('transform', 'translate(0%, 300%) translate(15%, -136%)'); /* as soon as an animation is removed, the element would snap back to original state, to avoid that we have to add final state via inline style */
    $('.content').removeClass('hover-in').addClass('hover-out');
  });
});
.content {
  height: 100px;
  width: 100px;
  border: 1px solid;
}
.hover-in {
  animation: hover-in 1s forwards;
}
.hover-out {
  animation: hover-out 1s forwards;
}
@keyframes hover-in {
  0% {
    transform: none;
  }
  50% {
    transform: translate(0%, 300%);
  }
  100% {
    transform: translate(0%, 300%) translate(15%, -136%);
  }
}
@keyframes hover-out {
  0% {
    transform: translate(0%, 300%) translate(15%, -136%);
  }
  50% {
    transform: translate(0%, 300%);
  }
  100% {
    transform: none;
  }
}
body {
  min-height: 100vh;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='content'>Some text</div>

Другие вопросы по тегам