Firefox CSS Animation Smoothing (sub-pixel smoothing)

后端 未结 2 1565
礼貌的吻别
礼貌的吻别 2020-12-30 05:24

I\'m creating a CSS keyframe animation to have an element appear as if it is casually/slowly floating around a bit. It\'s nested in parents, one which uses translateX() to

相关标签:
2条回答
  • 2020-12-30 06:05

    The rendering engines for each browser is obviously different. Firefox does not implement an anti-aliasing effect on CSS animations. This does not inherently make it better or worse, it just depends on what you are animating. Linear transitions can appear undesirably blurred in Chrome for example.

    It appears what you would like to achieve is to have an anti-aliased/sub-pixel smoothed transitions. We can't change the way the engine renders but we can manipulate the animation to appear softer to the end user.


    ALL IS NOT LOST

    I have modified your answer and rendered a smoother version next to your original. This should appear softer when viewed in Firefox.

    CLICK FOR COMPARISON

    Techniques used for this effect:

    • Linear transitions instead of ease.
    • Box-shadow on animated object. (Softened edge helps create fake AA effect).
    • Rotate object. Adding the smallest rotate helps to better utilised the rendering engine.

    CSS

    #parent {
        width: 50%;
        float:left;
        height: 326px;
        background-color: yellow;
        background: url(http://paint.net.amihotornot.com.au/Features/Effects/Plugins/Render/Grid_CheckerBoard_Maker/Grid_CheckerBoard_Maker.Paint.NET.001.png) top center repeat;
    }
    #child {
        position: absolute;
        top: 75px;
        left: 150px;
        width: 100px;
        height: 100px;
        background-color: black;
        box-shadow:0 0 1px rgba(0,0,0,0.7);
        animation: range-y 10s infinite linear;
        -webkit-animation: range-y 10s infinite linear;
    }
    #move-x { 
        animation: range-x 10s infinite linear; 
        -webkit-animation: range-x 10s infinite linear;
    }
    #move-y { 
        animation: range-y 15s infinite linear; 
        -webkit-animation: range-y 15s infinite linear;
    }
    @keyframes range-x {
        0%   {transform: translateX(0);}
        30%  {transform: translateX(-8px) rotate(0.02deg);}
        50%  {transform: translateX(1px) rotate(0deg);}
        65%  {transform: translateX(6px) rotate(0.02deg);}
        80%  {transform: translateX(0px) rotate(0deg);}
        89%  {transform: translateX(-3px) rotate(0.02deg);}
        100% {transform: translateX(0) rotate(0deg);}
    }
    @keyframes range-y {
        0%   {transform: translateY(0);}
        20%  {transform: translateY(13px) rotate(0.02deg);}
        35%  {transform: translateY(-1px) rotate(0deg);}
        70%  {transform: translateY(-14px) rotate(0.02deg);}
        90%  {transform: translateY(2px) rotate(0deg);}
        100% {transform: translateY(0) rotate(0.02deg);}
    }
    @-webkit-keyframes range-x {
        0%   {transform: translateX(0);}
        30%  {transform: translateX(-8px) rotate(0.02deg);}
        50%  {transform: translateX(1px) rotate(0deg);}
        65%  {transform: translateX(6px) rotate(0.02deg);}
        80%  {transform: translateX(0px) rotate(0deg);}
        89%  {transform: translateX(-3px) rotate(0.02deg);}
        100% {transform: translateX(0) rotate(0deg);}
    }
    @-webkit-keyframes range-y {
        0%   {transform: translateY(0);}
        20%  {transform: translateY(13px) rotate(0.02deg);}
        35%  {transform: translateY(-1px) rotate(0deg);}
        70%  {transform: translateY(-14px) rotate(0.02deg);}
        90%  {transform: translateY(2px) rotate(0deg);}
        100% {transform: translateY(0) rotate(0.02deg);}
    }
    

    FINAL WORD

    You can still tweak the effects a little either way to fit your requirements. It's not perfect but I hope it helps soften the end effect for your actual animation.

    0 讨论(0)
  • 2020-12-30 06:09

    Use a small amount of rotation with the transformation. This forces Firefox to avoid the optimization and resample the image on every frame.

    @keyframes optimized {
      0%{
        transform: translateX(0%);
      }
      100%{
        transform: translateX(200px);
      }
    }
    
    @keyframes subpixel {
      0%{
        transform: translateX(0%) rotate(0.1deg);
      }
      100%{
        transform: translateX(200px) rotate(0.1deg);
      }
    }
    
    div{
      width:5px;
      height:50px;
      background-color: red;
      animation-duration:30s;
      animation-iteration-count: infinite;
      animation-direction:alternate;
      animation-timing-function:linear;
    }
    
    .optimized{
      animation-name: optimized;
      margin-bottom:1px;
    }
    
    .subpixel{
      animation-name: subpixel;
    }
    <div class="optimized">
    </div>
    <div class="subpixel">
    </div>

    0 讨论(0)
提交回复
热议问题