Анимация положения фона CSS с плавными результатами (субпиксельная анимация)

Я пытаюсь анимировать фоновое положение div медленно, но без рывков. Вы можете увидеть результат моих текущих усилий здесь:

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;
}

Я занимаюсь этим уже несколько часов и не могу найти ничего, что могло бы медленно и плавно анимироваться на субпиксельном уровне. Мой текущий пример был создан из кода примера на этой странице: http://css-tricks.com/parallax-background-css3/

Плавность анимации, которую я ищу, можно увидеть на примере этой страницы с translate():

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

Если это невозможно сделать с фоновой позицией, есть ли способ подделать повторяющийся фон с несколькими div и переместить эти div с помощью перевода?


person Jayden Lawson    schedule 13.01.2014    source источник
comment
вы знаете, что это работает только в браузерах webkit, верно?   -  person php_nub_qq    schedule 13.01.2014
comment
@php_nub_qq да, и перевод более совместим. Например. w3schools.com/css/css3_2dtransforms.asp   -  person Jayden Lawson    schedule 13.01.2014


Ответы (3)


Проверьте этот пример:

#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/

person Slawa Eremin    schedule 13.01.2014
comment
оба ответа здесь не гладкие. они иногда немного отстают. мне нужна полностью плавная прокрутка... hw acc с 3d или Z ничего не делает, и никакой другой хитрый css-attr не сглаживает ситуацию. можно ли как-нибудь? - person Guntram; 02.06.2015
comment
Ключевым преимуществом анимации CSS3 по сравнению с анимацией, управляемой сценарием, является производительность (аппаратное ускорение) и предсказуемость (браузер контролирует и, таким образом, оптимизирует процесс). Кроме того, обновлена ​​страница результатов, чтобы сделать ее кроссбраузерной: jsfiddle.net/5pVr4/505. - person Oriol; 24.07.2015
comment
@SlawaEremkin, решения отлично работают, если вы хотите дважды повторить одно изображение, чтобы создать иллюзию бесконечности. Однако этот метод не будет работать для шаблона фонового изображения. Хотелось бы такой же эффект, но с рисунком. Текущее CSS-решение дергается, анимируя положение фона с помощью CSS-перехода. - person Awin; 20.07.2017

Анимация background-position вызовет некоторые проблемы с производительностью. Браузеры будут намного дешевле анимировать свойства преобразования, включая перевод.

Вот пример использования перевода для анимации бесконечного слайда (без префиксов):

http://jsfiddle.net/brunomuller/5pVr4/504/

@-webkit-keyframes bg-slide {
    from { transform: translateX(0); }
    to { transform: translateX(-50%); }
}

.wrapper {
    position:relative;
    width:400px;
    height: 300px;
    overflow:hidden;
}

.content {
    position: relative;
    text-align: center;
    font-size: 26px;
    color: #000;
}

.bg {
    width: 200%;
    background: url(http://www.gstatic.com/webp/gallery/1.jpg) repeat-x;
    position:absolute;
    top: 0;
    bottom: 0;
    left: 0;
    animation: bg-slide 20s linear infinite;
}
person Bruno Muller    schedule 23.07.2015
comment
Привет, Бруно, как я могу отредактировать это, чтобы двигаться также по диагонали? то есть справа налево, как сейчас, плюс немного по диагонали в том же направлении? - person user2513846; 10.03.2016
comment
Вы можете сделать что-то вроде этого: jsfiddle.net/5pVr4/723 Я использую квадратный шаблон и анимация одного элемента, поэтому диагональная анимация будет одинаковой по горизонтали и по вертикали. Если вы хотите, чтобы он двигался быстрее по горизонтали и медленнее по вертикали, вы можете вложить элементы и использовать разные тайминги для каждого из них. Другой возможностью является использование шаблона с другим соотношением сторон. - person Bruno Muller; 10.03.2016

Вы должны немного изменить свой HTML и CSS

Рабочая демонстрация

HTML

<div id="wrapper">
    <div id="page">
    Foreground content
</div>

<div id="content"> </div>
</div>

CSS

@-webkit-keyframes MOVE-BG {
    from { left: 0; }
    to { left: -2000px; }
}

#wrapper {
    position:relative;
    width:800px;
    height: 300px;
    overflow:hidden;
}

#page {
    text-align: center;
    font-size: 26px;
    color: #000;
}

#content {
    width: 2000px;
    height: 300px;
    background: url(http://www.gstatic.com/webp/gallery/1.jpg) 0% 0% repeat;
    position:absolute;
    top: 0;
    left: 0;
    z-index:-1;
    -webkit-animation-name: MOVE-BG;
    -webkit-animation-duration: 100s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-iteration-count: infinite;
}
person Surjith S M    schedule 13.01.2014
comment
К сожалению, результат выглядит очень отрывисто. Спасибо за публикацию решения, хотя. - person Jayden Lawson; 19.08.2014