【问题标题】:Why cannot CSS transform-origin and transform be transited together?为什么 CSS 的 transform-origin 和 transform 不能一起过渡?
【发布时间】:2020-03-10 15:12:21
【问题描述】:

这是一个演示:https://jsfiddle.net/simonmysun/xowyzvus/15/

(将附加代码)

在我的浏览器中,第三次过渡并不顺利。它在最后一次闪烁到目标。似乎它首先在转换期间忽略了变换原点,但在最后应用了它。为什么会这样?

附:浏览器可能会产生不同的结果。在我的 Windows 10 设备上,Chrome 75 在过渡结束时闪烁,在 Firefox 70 中它在颤抖,而在 Edge 41 中没有任何反应。

HTML:

<h2>Transited: CSS transform</h2>
<div class="container"><div id="box1"></div></div>
<h2>Transited: CSS transform-origin</h2>
<div class="container"><div id="box2"></div></div>
<h2>Transited: CSS transform and transform-origin</h2>
<div class="container"><div id="box3"></div></div>

CSS:

.container {
  width: 300px;
  height: 300px;
  overflow: hidden;
}
#box1, #box2, #box3 {
  width: 300px;
  height: 300px;
  background-color: white;
  background-size: 30px 30px;
  background-position: -8px -8px;
  background-image: linear-gradient(transparent 50%, rgba(200, 0, 0, 0.5) 50%, rgba(200, 0, 0, 0.5)), linear-gradient(90deg, transparent 50%, rgba(200, 0, 0, 0.5) 50%, rgba(200, 0, 0, 0.5));
  transform: translate(0px, 0px) scale(1.5);
  transform-origin: 0px 0px;
}
#box1 {
  transition: transform 1000ms, transform-origin 1000ms;
}
#box2 {
  transition: transform 1000ms, transform-origin 1000ms;
}
#box3 {
  transition: transform 1000ms, transform-origin 1000ms;
}

Javascript:

var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
var box3 = document.getElementById('box3');
var transform = {
    x: 0,
  y: 0,
  scale: 1.5,
  ox: 0,
  oy: 0
};
box1.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
box1.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
box2.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
box2.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
box3.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
box3.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
setInterval((function(){
    var step = 0;
    var steps = [{
    x: -100,
    y: -100,
    scale: 2,
    ox: -100,
    oy: -100,
  }, {
    x: -200,
    y: -100,
    scale: 2,
    ox: -200,
    oy: -100,
  }, {
    x: -200,
    y: -200,
    scale: 2,
    ox: -200,
    oy: -200,
  }, {
    x: -100,
    y: -200,
    scale: 2,
    ox: -100,
    oy: -200,
  }];
    return function() {
    transform = steps[step];
    step += 1;
    step %= 4;
    // box1.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
        box1.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
    box2.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
        // box2.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
    box3.style.transformOrigin = `${transform.ox}px ${transform.oy}px`;
        box3.style.transform = `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`;
  }
})(), 1500);

【问题讨论】:

    标签: javascript css css-transitions css-transforms


    【解决方案1】:
    1. 您永远不应该将all 用作transition 属性,因为它会循环遍历所有动画属性。请改用transform

    2. 如果您真的想使用 javascript 制作动画,您需要在每次屏幕刷新时更新的内容。 requestAnimationFrame 是您所需要的,因为 setIntervalsetTimeout 可以在屏幕重绘期间激活,从而使动画“跳跃”。

    【讨论】:

    • 感谢您的回答。但是为什么 css 转换也不应该起作用呢?
    • transition: all 1000ms 应该是 transition: transform 1000ms。 :)
    • 另外,我猜你想要做一些动态的事情,比如用户点击#box中的一个点,然后你动画到那个点。否则,使用 CSS 的关键帧动画 css-tricks.com/snippets/css/keyframe-animation-syntax 代替所有的 javascript 代码。
    • 我理解并注意到requestAnimationFrame 和 CSS 关键帧动画会起作用。但是,当 transition: all 1000mstransition: transform 1000ms 不能修复它时。即使transition: transform 1000ms, transform-orgin 1000ms 也无济于事。为什么 CSS 关键帧动画可以正常工作,但过渡却不行?谢谢
    • 因为我在第 2 点中写的内容。两者都可能导致动画滞后。
    猜你喜欢
    • 2011-03-18
    • 2021-08-07
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多