可以在 flex-direction 属性上使用 CSS 动画或过渡吗?

Posted

技术标签:

【中文标题】可以在 flex-direction 属性上使用 CSS 动画或过渡吗?【英文标题】:Can CSS animate or transition be used on the flex-direction property? 【发布时间】:2017-04-12 20:32:57 【问题描述】:

如果有序列表在小屏幕上使用flex-direction: column,在大屏幕上使用flex-direction: row,CSS3 动画或过渡是否可以在媒体查询之间为flex-direction 属性设置动画?

初始页面设置

html 
  box-sizing: border-box;

*,
*:before, *:after 
  box-sizing: inherit;

body 
  font-size: 100%;

ol 
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 1rem 2rem;

ol a 
  display: block;
  padding: 1rem;
  text-decoration: none;
  border-bottom: 1px solid blue;

@media (min-width: 400px) 
  ol 
    display: flex;
    flex-direction: row;
    justify-content: space-around;
  
  ol a 
    display: block;
  
<ol>
  <li><a href="">Nav 1</a></li>
  <li><a href="">Nav 2</a></li>
  <li><a href="">Nav 3</a></li>
  <li><a href="">Nav 4</a></li>
</ol>

http://codepen.io/anon/pen/oYGexa

JavaScript 中的类似动画

'use strict';
console.clear();
var group = document.querySelector('.group');
var nodes = document.querySelectorAll('.box');
var total = nodes.length;
var ease = Power1.easeInOut;
var boxes = [];
for (var i = 0; i < total; i++) 
    if (window.CP.shouldStopExecution(1)) 
        break;
    
    var node = nodes[i];
    TweenLite.set(node,  x: 0 );
    boxes[i] = 
        transform: node._gsTransform,
        x: node.offsetLeft,
        y: node.offsetTop,
        node: node
    ;

window.CP.exitedLoop(1);
group.addEventListener('mouseenter', layout);
group.addEventListener('mouseleave', 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;
        if (lastX === box.x && lastY === box.y)
            continue;
        var x = box.transform.x + lastX - box.x;
        var y = box.transform.y + lastY - box.y;
        TweenLite.fromTo(box.node, 0.5, 
            x: x,
            y: y
        , 
            x: 0,
            y: 0,
            ease: ease
        );
    
body 
  color: #333;
  padding: 10px 24px;


h1 
  font-weight: normal;
  font-size: 24px;


.group 
  width: 600px;
  height: 600px;
  padding: 4px;
  background: #ddd;
  display: flex;
  flex-direction: row;


.box 
  margin: 4px;
  padding: 8px;
  font-size: 18px;
  width: 126px;
  height: 126px;

.box:nth-child(1) 
  background: rgba(63, 81, 181, 0.6);

.box:nth-child(2) 
  background: rgba(103, 58, 183, 0.6);

.box:nth-child(3) 
  background: rgba(33, 150, 243, 0.6);

.box:nth-child(4) 
  background: rgba(0, 188, 212, 0.6);


.group.reorder 
  flex-direction: column;
  align-items: center;
<h1>Hover to change flex direction</h1>

<div class="group">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
</div>

https://codepen.io/osublake/pen/eJGrPN?editors=0010

【问题讨论】:

【参考方案1】:

不,只有使用兼容单位的量化值的属性才能在其中两个值之间转换,例如测量值和颜色。

【讨论】:

【参考方案2】:

答案是否定的。 flex-direction 不是 CSS 中的动画属性。

来源:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties

【讨论】:

【参考方案3】:

你不能喜欢已经anwserd,但是有tweenlite

TweenLite.ticker.addEventListener("tick", () => dirty && layout());

这里有一个例子Codepen。

【讨论】:

一个简单的示例代码展示如何为 flex-direction 设置动画怎么样?【参考方案4】:

如前所述,flex-direction 不能直接设置动画,并且浏览器“不知道”如何在这种过渡期间直观地插入弹性项目的位置。但是您可以通过转换转换和在 transitionend 事件上更改 flex-direction 来模拟这种转换(一个快速演示来说明这个想法:http://codepen.io/SelenIT/pen/ZBXrXV/)。

【讨论】:

以上是关于可以在 flex-direction 属性上使用 CSS 动画或过渡吗?的主要内容,如果未能解决你的问题,请参考以下文章

第2节 讲解flex布局容器?六?属性之flex-direction

flex 布局

flex弹性布局属性详解!

弹性盒子的容器属性

web移动端开发-flex布局父项常见属性超详解(附图解)

使用弹性基础时弹性项目溢出[重复]