当前值的纯 CSS 变换比例

Posted

技术标签:

【中文标题】当前值的纯 CSS 变换比例【英文标题】:Pure CSS transform scale from current value 【发布时间】:2014-04-16 09:49:28 【问题描述】:

当对元素应用 CSS 缩放变换时,是否可以将 'from' 值设置为当前缩放?

例如,考虑以下 2 个 CSS 关键帧,用于应用单独的增长和收缩动画变换:

@-webkit-keyframes grow

    from  -webkit-transform: scale(0,0); 
    to  -webkit-transform: scale(1,1); 


@-webkit-keyframes shrink

    from  -webkit-transform: scale(1,1); 
    to  -webkit-transform: scale(0,0); 

这将成功地缩放它应用到的元素,但总是从 0 到 1(反之亦然)。如果在 grow 关键帧完成之前应用了 shrink 关键帧,则它具有在变换开始之前将比例“跳跃”到 0 的效果。

你可以在这个jsFiddle showing CSS scale transform on mouseover看到这个效果

请注意,如果您将鼠标悬停在黑色方块上然后快速将鼠标移出,则缩放变换不平滑。

我基本上追求的是以下内容:

@-webkit-keyframes grow

    from  -webkit-transform: CURRENT_SCALE; 
    to  -webkit-transform: scale(1,1); 

【问题讨论】:

不可能单独使用 CSS (AFAIK)。 css-tricks.com/… 描述了一些通过 javascript 获取当前值的技术,也许你可以适应它。 这确实可以使用过渡而不是动画。请参阅jsfiddle.net/G6wME/2 - 从下面的@enguerranws js fiddle 分叉。 【参考方案1】:

您的动画使元素在悬停时从 0% 缩放到 100%,在 mouseOut 时从 100% 到 0%。

我认为在这种情况下,解决方案可能是根据元素的起点设置元素的基本比例

#output

  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: #FF0000;
  display: inline-block;
   -ms-transform: scale(0,0);
    transform: scale(0,0);  
   -webkit-transform: scale(0,0);  

在这种情况下,我强烈建议使用纯 CSS 解决方案,在 :hover 上使用过渡:http://jsfiddle.net/bg6aj/21/

你不会有任何“跳跃”效果:

#output

  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: #FF0000;
  display: block;
   -ms-transform: scale(0,0);
    transform: scale(0,0);  
   -webkit-transform: scale(0,0);  
    transition: all .2s;  
   -webkit-transition: all .2s; 


#touchPad:hover + #output 
   -ms-transform: scale(1,1);
    transform: scale(1,1);  
   -webkit-transform: scale(1,1);

此时,您将不再有跳跃效果。 然后:我们可以做类似的事情:

@-webkit-keyframes grow

    from  -webkit-transform: scale(0,0); 
    to  -webkit-transform: scale(1,1); 

答案:很简单:

@-webkit-keyframes grow

    0%  -webkit-transform: scale(1,1); 
    50%  -webkit-transform: scale(0,0); 
    100%  -webkit-transform: scale(1,1); 

这意味着:取我的元素(因为缩放默认为 100%),在动画的 50% 处以 0% 的比例渲染它,然后以 100% 的比例返回。尝试设置类似 current_scale 的东西没有意义。

考虑到这一点,我肯定会选择 Transition 解决方案。

【讨论】:

这似乎根本没有解决解决方案 - 建议的代码将简单地将元素设置为初始 0 比例状态,但不会改变任何实际的转换行为。 如果你使用 CSS 过渡,你不会有任何跳跃效果,这是你的问题的一部分。让我想想另一部分。 你试过类似的东西吗:@-webkit-keyframes grow 0% -webkit-transform: scale(1,1); 50% -webkit-transform: scale(0,0); 100% -webkit-transform: scale(1,1); ? (更新了我的答案) 谢谢,过渡解决方案似乎确实是我们所需要的。您能否展示如何通过 JS 事件而不是 :hover 选择器来应用它?与此类似的东西(不起作用)jsfiddle.net/bg6aj/27 另外,使用建议的 3 阶段关键帧只会产生全尺寸,然后没有尺寸,然后再次全尺寸的效果?

以上是关于当前值的纯 CSS 变换比例的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS3 变换比例缩放一个点

CSS 动画比例变换在 Firefox 中开始模糊

具有变换比例 CSS 属性的卡片块在悬停时失去其边界半径

带有变换的 CSS3 动画会导致 Webkit 上的元素模糊

计算机图像处理之形状变换

变换上的 CSS3 动画:旋转。获取旋转元素当前度数的方法?