【问题标题】:Counter transform in css animationcss动画中的反变换
【发布时间】:2019-03-29 18:18:46
【问题描述】:

在某些界面中,我想做动画。由于 transform 属性比其他 CSS 属性更优化,所以我将使用它。

with transform: scale() : 当元素纵横比不变时,没问题。当比例应该改变时,我找到的解决方案是放置一个容器,并在这个容器中放置一个内部。然后将反向变换应用于内部块,以便在动画期间和之后保持比例。

我做了一支笔来测试这个想法,它可以工作,但是在动画过程中出现了一个问题:内部块在动画过程中看起来被拉伸了。我不明白为什么动画时间是一样的,而且缓动是线性的。

https://codepen.io/AdamElio/pen/PabejP

(点击菜单切换动画)

document.querySelector('#menu').addEventListener('click', function() {
    this.classList.toggle('collapsedd')
});
#menu {
  margin: 30px;
  padding: 15px;
  background: white;
  width: 150px;
  overflow: hidden;
  transform-origin: top center;
  transition: transform .5s linear;
}

#menu.collapsedd {
  transform: scaleY(.2);
}

#menu .inner {
  transition: transform .5s linear;
  transform-origin: top center;
}

#menu.collapsedd .inner {
  transform: scaleY(5);
}

#menu .inner ul {
  padding: 0;
  margin: 0;
  list-style: none;
}
<nav id="menu">
  <div class="inner">
    <h5>Menu</h5>
    <ul>
      <li>Link 1</li>
      <li>Link 2</li>
      <li>Link 3</li>
      <li>Link 4</li>
    </ul>
  </div>
</nav>

<div id="transform"></div>

【问题讨论】:

    标签: html css animation transition easing


    【解决方案1】:

    发生这种情况是因为在转换发生时计数器转换不一样。考虑到您的示例,容器将从scaleY(0.2) 变为scaleY(1),而子容器将从scaleY(5) 变为scaleY(1)

    在过渡结束和开始时,这将起作用,导致容器和子变换将“取消”:

    • 开始:0.2 * 5 = 1
    • 结束:1 * 1 = 1

    但过渡的中间步骤并非如此。例如,当转换完成 50% 时:

    • 容器比例Y:0.2 + (1 - 0.2) * 0.5 = 0.6
    • 儿童量表Y:5 + (1 - 5) * 0.5 = 3
    • 容器刻度 Y * 子刻度 Y:0.6 * 3 = 1.8

    查看下图,了解该比例如何变化:

    紫线表示过渡时child的scaleY,蓝线表示容器的scaleY,深黄线表示容器的scaleY * child scaleY

    因此,为了在转换过程中真正取消容器变换,您需要使用一个缓动函数来保存整个转换过程中的表达式container scale * child scale = 1。这不是一件容易的事。

    【讨论】:

    • 水晶解释清楚详细。那么,您有什么建议以更简单的方式实现这一目标吗?
    【解决方案2】:

    我认为是因为这条线:

    #menu.collapsedd .inner {
      transform: scaleY(5);
    }
    

    添加 collapsedd 后,您将内容的 Y 缩放为 5,尝试将该值更改为 1,或者只是不对内部 div 进行缩放。你可以使用不透明度或其他东西来淡出它吗?

    【讨论】:

    • 这个菜单是一个简单的例子。我并不是要专门解决这个问题,而是更多地能够进行逆变换以保持一般的比率。我缩放内部 5 倍,因为容器被缩放到 1/5。
    • 我明白了,我不是 100% 确定总体目标是什么,但注释掉内部 div 上的变换会使所有内容都缩放在一起,但在动画结束时你只是压扁了看文字。 /* #menu.collapsedd .inner { transform: scaleY(5); } */
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多