css3微调器上的抽搐动画

Posted

技术标签:

【中文标题】css3微调器上的抽搐动画【英文标题】:Jerking animation on css3 spinner 【发布时间】:2015-06-28 08:49:31 【问题描述】:

我发现了一个有吸引力的微调器(CSS3、SCSS):http://codepen.io/weaintplastic/pen/qEMZbx。

@for $i from 1 through 6 
    @keyframes preload-show-#$i
        from
            transform: rotateZ(60* $i + deg) rotateY(-90deg) rotateX(0deg);
            border-left-color: #9c2f2f;
        
    
    @keyframes preload-hide-#$i
        to
            transform: rotateZ(60* $i + deg) rotateY(-90deg) rotateX(0deg);
            border-left-color: #9c2f2f;
        
    

    @keyframes preload-cycle-#$i

        $startIndex: $i*5;
        $reverseIndex: (80 - $i*5);

        #$startIndex * 1%
            transform: rotateZ(60* $i + deg) rotateY(90deg) rotateX(0deg);
            border-left-color: #9c2f2f;
        
        #$startIndex + 5%,
        #$reverseIndex * 1%
            transform: rotateZ(60* $i + deg) rotateY(0) rotateX(0deg);
            border-left-color: #f7484e;
        

        #$reverseIndex + 5%,
        100%
            transform: rotateZ(60* $i + deg) rotateY(90deg) rotateX(0deg);
            border-left-color: #9c2f2f;
        
    


@keyframes preload-flip
    0%
        transform: rotateY(0deg) rotateZ(-60deg);
    
    100%
        transform: rotateY(360deg) rotateZ(-60deg);
    


body
  background: #efefef;


.preloader
  position: absolute;
  top: 50%;
  left: 50%;
    font-size: 20px;
    display: block;
    width: 3.75em;
    height: 4.25em;
    margin-left: -1.875em;
  margin-top: -2.125em;
    transform-origin: center center;
    transform: rotateY(180deg) rotateZ(-60deg);

    .slice
        border-top: 1.125em solid transparent;
        border-right: none;
        border-bottom: 1em solid transparent;
        border-left: 1.875em solid #f7484e;
        position: absolute;
        top: 0px;
        left: 50%;
        transform-origin: left bottom;
        border-radius: 3px 3px 0 0;
    

    @for $i from 1 through 6 
      .slice:nth-child(#$i)  
        transform: rotateZ(60* $i + deg) rotateY(0deg) rotateX(0);
        animation: .15s linear .9 - $i*.08s preload-hide-#$i both 1;
      
    


    &.loading
        animation: 2s preload-flip steps(2) infinite both;
        @for $i from 1 through 6 
          .slice:nth-child(#$i)  
            transform: rotateZ(60* $i + deg) rotateY(90deg) rotateX(0);
            animation: 2s preload-cycle-#$i linear infinite both;
          
        
    


<div class="preloader loading">
  <span class="slice"></span>
  <span class="slice"></span>
  <span class="slice"></span>
  <span class="slice"></span>
  <span class="slice"></span>
  <span class="slice"></span>
</div>

但它在动画中间有一个抽搐的时刻(故障):六边形的底部向右移动一两个像素。

我拍下了这一刻的视频:youtu.be/_TwDuxME8wc。

我试图自己修复它,但我没有足够的技能。 你能提示如何修复它吗? 谢谢!

【问题讨论】:

我认为这是您的计算机的问题,因为在我的计算机上看起来不错。 我拍下了这一刻的视频:youtu.be/_TwDuxME8wc 这根本不是生涩的,它应该看起来像这样。它将三角形一块一块地向外折叠,然后向内折叠...... 你可以增加视频的大小,看看,在动画的中间时刻,六边形底部向右移动一两个像素。 我也看到了故障。我的强迫症不喜欢它。 【参考方案1】:

您使用了很多em 测量值,这会产生很多十进制像素值。重要的是您只有整数值以避免这些故障。

如果您采用@Nick Barlett 的解决方案并将.preloader 的字体大小从20px 更改为24px,您将摆脱十进制值。看到这支笔:http://codepen.io/pstenstrm/pen/mJJpvP

这当然也会使加载器更大,因此您可能需要将em 值更改为px

【讨论】:

你是完美的!谢谢!【参考方案2】:

将预加载翻转上的 100% 状态更改为 rotateZ(64deg)

@keyframes preload-flip
    0%
        transform: rotateY(0deg) rotateZ(-60deg);
    
    100%
        transform: rotateY(360deg) rotateZ(-64deg);
    

不过,整体角度似乎存在更大的问题,因为钢笔一开始就有点歪斜。

【讨论】:

是的,它没有那个故障,但有另一个故障。也许不那么引人注目。能否顺利实施? 原版有这个故障(歪斜)。修复它需要一些工作,以便它开始时不会歪斜,可以尝试稍后再看一下。 你好,也许,你能看一下吗?我仍然不知道如何解决它。谢谢!【参考方案3】:

@pstenstrm 的解决方案出色地解决了故障问题,+1。

但它引入了另一个问题:

在 Firefox 中(仅?),有一个丑陋的左上角三角形的锯齿状边框

要解决这个问题,只需给三角形添加一个透明的轮廓:

.slice
  outline: 1px solid transparent;

查看演示以查看最终结果:

Running demo

【讨论】:

你能解释一下区别吗?我在浏览器中看不到它。 在接受的 anwser 的演示中(在 Firefox 中),在整个六边形解构自身的过程中(从满到空),您可以在顶部看到一个锯齿状的右边框左三角。试试看,超级烦。我需要修复它:)

以上是关于css3微调器上的抽搐动画的主要内容,如果未能解决你的问题,请参考以下文章

Gtk3和开罗动画抽搐

创建应用程序按钮未生成应用程序,卡在微调器上

当 CAAnimationGroup 的执行完成时,它会回到初始动画序列,并带有抽搐效果

如何使用 jQuery 同步 CSS3 动画事件和事件监听器

a:hover 上的 CSS3 动画

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