【问题标题】:Can't smoothly animate flexbox-direction [duplicate]无法平滑地为 flexbox-direction 设置动画 [重复]
【发布时间】:2019-05-31 22:15:35
【问题描述】:

我在悬停时改变 flex-direction,但我希望它应该顺利完成,但它在改变方向时会产生冲击或颠簸。 我也使用了过渡和动画,但它仍然显示错误。

.a {
   display:flex;
   flex-direction:column;
   transition:all 1 s linear;
 }
.a::hover {
   flex-direction:column-reverse;
   color: blue;
 }

【问题讨论】:

  • 显示什么错误?
  • 这在改变 flex-direction 时很麻烦

标签: css flexbox css-transitions


【解决方案1】:

flex-direction 不是animatable

您无法从一个值平滑过渡到另一个值。因此,您需要使用上面链接中的任何属性来制作不同的动画。

注意:如果您希望您的动画在任何设备上都轻巧流畅,您应该尝试仅使用 transformopacity 制作动画(大多数动画都可以使用这些两个人)。


但是,有一个解决方案通常适用于非动画属性。它涉及以下步骤:

  1. 制作一个不可见的元素克隆,将要设置动画的属性更改为新值,宽度和高度相同,并将其放置在与原始元素相同的位置。
  2. 使用translate 将涉及的元素从其当前位置动画到克隆中的位置
  3. 用克隆替换原始(并使克隆可见)。

【讨论】:

    【解决方案2】:

    快速的谷歌搜索给出了this result(不是我的),这似乎通过一些额外的 javascript 和 TweenLite 库的使用来实现您的目标。主要逻辑位于layout()函数中:

    function layout() {
    
        group.classList.toggle("reorder");  
    
        for (var i = 0; i < total; i++) {
    
            var box = boxes[i];
    
            var lastX = box.x;
            var lastY = box.y;   
    
            box.x = box.node.offsetLeft;
            box.y = box.node.offsetTop;
    
            // Continue if box hasn't moved
            if (lastX === box.x && lastY === box.y) continue;
    
            // Reversed delta values taking into account current transforms
            var x = box.transform.x + lastX - box.x;
            var y = box.transform.y + lastY - box.y;  
    
            // Tween to 0 to remove the transforms
            TweenLite.fromTo(box.node, 0.5, { x, y }, { x: 0, y: 0, ease });    
        } 
    }
    

    对于 flex 布局中的每个元素,它采用最后的 x 和 y 坐标,以及布局方向改变后的当前坐标,并基于这两个,动画过渡并使用 transform css 属性。

    【讨论】:

    • 亲爱的用户,我只是个学生,但请告诉我添加该脚本的正确方法
    • 亲爱的用户,我只是一个学生,但请告诉我添加该脚本的正确方法。我还没有添加任何脚本,所以如果你告诉我这对我有好处。(谢谢)
    猜你喜欢
    • 2012-12-03
    • 2023-03-13
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2016-06-27
    相关资源
    最近更新 更多