cssanimationbackground-imagesubpixel

Animate CSS background-position with smooth results (sub-pixel animation)


I'm trying to animate the background-position of a div, slowly, but without it having jerky movement. You can see the result of my current efforts here:

http://jsfiddle.net/5pVr4/2/

@-webkit-keyframes MOVE-BG {
    from {
        background-position: 0% 0%
    }
    to { 
        background-position: 187% 0%
    }
}

#content {
    width: 100%;
    height: 300px;
    background: url(http://www.gstatic.com/webp/gallery/1.jpg) 0% 0% repeat;
    text-align: center;
    font-size: 26px;
    color: #000;

    -webkit-animation-name: MOVE-BG;
    -webkit-animation-duration: 100s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-iteration-count: infinite;
}

I have been at this for hours and can't find anything that will animate slowly and smoothly at a sub-pixel level. My current example was made from the example code on this page: http://css-tricks.com/parallax-background-css3/

The smoothness of animation I'm after can be seen on this page's translate() example:

http://css-tricks.com/tale-of-animation-performance/

If it can't be done with the background-position, is there a way to fake the repeating background with multiple divs and move those divs using translate?


Solution

  • Checkout this example:

    #content {
      height: 300px;
      text-align: center;
      font-size: 26px;
      color: #000;
      position:relative;
    }
    .bg{
      position: absolute;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      z-index: -1;
      background: url(http://www.gstatic.com/webp/gallery/1.jpg) 0% 0% repeat;
      animation-name: MOVE-BG;
      animation-duration: 100s;
      animation-timing-function: linear;
      animation-iteration-count: infinite;
    }
    @keyframes MOVE-BG {
       from {
         transform: translateX(0);
       }
       to { 
         transform: translateX(-187%);
       }
    }
    <div id="content">Foreground content
      <div class="bg"></div>
    </div>

    http://jsfiddle.net/5pVr4/4/