Отскок анимации на масштабированном объекте - PullRequest
0 голосов
/ 21 января 2019

Как лучше всего иметь масштаб объекта, а затем выполнить анимацию отскока при этом коэффициенте масштабирования, прежде чем вернуться к исходному коэффициенту масштабирования. Я понимаю, что мог бы сделать что-то вроде масштабирования до 2,2, затем до 1,8, затем до 2,0, но я ищу способ, при котором вам просто нужно выполнить анимацию отскока для масштабного коэффициента, потому что мой масштабный коэффициент изменится.

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

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

function myFunction() {
            var image = document.getElementById('test');
            image.style.WebkitTransform = ('scale(2,2)');
            image.classList.remove('bounce');
            image.offsetWidth = image.offsetWidth;
            image.classList.add('bounce') ;
        }
        
div#test  {
        position:relative;
        display: block;
        width: 50px;
        height: 50px;
        background-color: blue;
        margin: 50px auto;
        transition-duration: 1s;
        
    }
            
    .bounce {
        animation: bounce 450ms;
        animation-timing-function: linear;
    }

@keyframes bounce{
  25%{transform: scale(1.15);}
  50%{transform: scale(0.9);}
  75%{transform: scale(1.1);}
  100%{transform: scale(1.0);}
}
<div id='test'> </div> 

<button class = 'butt' onclick = 'myFunction()'>FIRST</button>

Ответы [ 2 ]

0 голосов
/ 21 января 2019

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

Тогда вам просто нужно включить анимацию после задержки, равной продолжительности перехода:

btn.onclick = e => {
  // in order to have two directions, we need to be a bit verbose in here...
  const test = document.querySelector('.test');
  const classList = test.classList;
  const state = classList.contains('zoomed-in');
  // first remove previous
  classList.remove('zoomed-' + (state ? 'in' : 'out'));
  // force reflow
  test.offsetWidth;
  // set new one
  classList.add('zoomed-' + (state ? 'out' : 'in'));
};
div.test {
  position: relative;
  display: inline-block;
  margin: 50px 50px;
}
div.test div{
  width: 100%;
  height: 100%;
  transition: transform 1s;
}
div.test.zoomed-in .scaler {
  transform: scale(2);
}
div.test.zoomed-in .bouncer,
div.test.zoomed-out .bouncer {
  animation: bounce .25s 1s;/* transition's duration delay */
}



div.test .inner {
  background-color: blue;
  width: 50px;
  height: 50px;
}


@keyframes bounce {
  0% {
    transform: scale(1.15);
  }
  33% {
    transform: scale(0.9);
  }
  66% {
    transform: scale(1.1);
  }
  100% {
    transform: scale(1.0);
  }
}
<div class="test">
  <div class="scaler">
    <div class="bouncer">
      <div class="inner"></div>
    </div>
  </div>
</div>

<button id="btn">toggle zoom</button>
0 голосов
/ 21 января 2019

Вы можете попробовать использовать переменную CSS, чтобы сделать масштабный коэффициент динамическим в ключевом кадре:

function myFunction(id,s) {
  var image = document.querySelectorAll('.test')[id];
  image.style.setProperty("--s", s);
  image.classList.remove('bounce');
  image.offsetWidth = image.offsetWidth;
  image.classList.add('bounce');
}
div.test {
  display: inline-block;
  width: 50px;
  height: 50px;
  background-color: blue;
  margin: 50px;
  transform:scale(var(--s,1));
}

.bounce {
  animation: bounce 450ms;
  animation-timing-function: linear;
}

@keyframes bounce {
  25% {
    transform: scale(calc(var(--s,1) + 0.2));
  }
  50% {
    transform: scale(calc(var(--s,1) - 0.1));
  }
  75% {
    transform: scale(calc(var(--s,1) + 0.1));
  }
  100% {
    transform: scale(var(--s,1));
  }
}
<div class='test'> </div>
<div class='test'> </div>
<div class='test'> </div>
<div>
<button class='butt' onclick='myFunction(0,"2")'>first</button>
<button class='butt' onclick='myFunction(1,"3")'>Second</button>
<button class='butt' onclick='myFunction(2,"0.5")'>third</button>
<button class='butt' onclick='myFunction(1,"1")'>second again</button>
</div>
...