Вращающийся глобус в CSS

Я создаю вращающийся эффект земли в CSS. Я создал глобус в CSS:

body {
  background-color: #111;
}

#earth {
    width: 300px;
    height: 300px;
    background: url(http://www.noirextreme.com/digital/Earth-Color4096.jpg);
    border-radius: 50%;
    background-size: 610px;
    box-shadow: inset 8px 36px 80px 36px rgb(0, 0, 0),
    inset -6px 0 12px 4px rgba(255, 255, 255, 0.3);
    animation-name: rotate;
    animation-duration: 12s;
    animation-iteration-count: infinite;
    animation-timing-function: linear;
    -webkit-animation-name: rotate;
    -webkit-animation-duration: 12s;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-timing-function: linear;
}

@keyframes rotate {
    from { background-position: 0px 0px; }
    to { background-position: 500px 0px; }
}
@-webkit-keyframes rotate {
    from { background-position: 0px 0px; }
    to { background-position: 500px 0px; }
}
<div id="earth"></div>

Ответ 1

В background-position: 500px 0px; заменить 500px на 610px, который является background-size

body {
  background-color: #111;
}
#earth {
  width: 300px;
  height: 300px;
  background: url(http://www.noirextreme.com/digital/Earth-Color4096.jpg);
  border-radius: 50%;
  background-size: 610px;
  box-shadow: inset 8px 36px 80px 36px rgb(0, 0, 0), inset -6px 0 12px 4px rgba(255, 255, 255, 0.3);
  animation-name: rotate;
  animation-duration: 12s;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
  -webkit-animation-name: rotate;
 -webkit-animation-duration: 12s;
 -webkit-animation-iteration-count: infinite;
 -webkit-animation-timing-function: linear;
}
@keyframes rotate {
  from {
    background-position: 0px 0px;
  }
  to {
    background-position: 610px 0px;
  }
}
@-webkit-keyframes rotate {
  from {
    background-position: 0px 0px;
  }
  to {
    background-position: 610px 0px;
  }
}
<div id="earth"></div>

Ответ 2

Проблема в вашем коде заключается в том, что размер изображения (610px) и смещение анимации ( 500 пикселей) различаются, а в reset анимации он перескакивает (110 пикселей).

Простой трюк, который мне нравится использовать вместо определения смещения анимации в пикселе: Определить его в процентах.
Вместо того, чтобы сообщать ему переместить 610px, я говорю, чтобы он переместил 100%.

Бонус 100% -го метода заключается в том, что если вы уменьшаете изображение, вам не нужно изменять все жестко заданные значения в вашем CSS, что, ИМО, должно быть предпочтительным методом.

Обратите внимание: кажется, что переход от 0 до -100% создает прыжок. Поскольку нам нужно, чтобы вращение двигалось в правильном направлении, я попытался запустить 100% и переместить его в 0, но в этот момент изображение больше не существует.

@keyframes rotate {
   from { background-position:  100%  0; }
   to {   background-position:    0   0; }
}

Вот фрагмент, но с 100% вместо пиксельного значения:
* Обратите внимание: анимация все еще прыгала, но я не могу протестировать новый код, потому что изображение больше не существует. Логика работает, но этой реализации, похоже, не так. Следующий код - это только демонстрация с кодом TS.

body {
  background-color: #111;
}
#earth {
  width: 300px;
  height: 300px;
  background: url(http://www.noirextreme.com/digital/Earth-Color4096.jpg);
  border-radius: 50%;
  background-size: 610px;
  box-shadow: inset 8px 36px 80px 36px rgb(0, 0, 0), inset -6px 0 12px 4px rgba(255, 255, 255, 0.3);
  animation-name: rotate;
  animation-duration: 12s;
  animation-iteration-count: infinite;
  animation-timing-function: linear;
}
@keyframes rotate {
   from { background-position:  100%  0; }
   to {   background-position:    0   0; }
}
<div id="earth"></div>