Обертовий глобус у CSS


75

Я створюю ефект обертання землі в CSS. Я створив глобус у CSS:

body {
  background-color: #111;
}

#earth {
    width: 300px;
    height: 300px;
    background: url(https://web.archive.org/web/20150807125159if_/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>

Але воно зупиняється, а потім зображення скидається і починається спочатку. Я хочу, щоб він рухався плавно, не смикаючись. Дуже дякую!


2
Це чудовий ефект, але я був би обережним. Це досить нестабільно на Chrome 39.0.2171.95 м (навіть, звичайно, з виправленням) і створює помітне навантаження на центральний процесор.
Тім Медора

2
@TimMedora Я не знаю чому, але він працює дуже гладко у Firefox 34. На GC. це працює краще із зображенням невеликого розміру або з апаратним прискоренням (HW згідно зі значним збільшенням використання пам'яті). Дивіться тут глобус із меншим зображенням: посилання .
Прагматик

1
@TimMedora Я на цій версії Chrome, і це досить гладко.
AStopher

1
Прекрасний ефект! Працює дуже добре на моєму старому HW / SW (Chromium27 на PuppyLinux 5.2.8, який є вбудованим дистрибутивом на базі Ubuntu 10.04)
DocSalvager

1
Я ніколи раніше не бачив цього ефекту - це приголомшливо! Слава вам
Блейк Фредерік

Відповіді:


91

У background-position: 500px 0px;заміні 500px з 610px, який єbackground-size

body {
  background-color: #111;
}
#earth {
  width: 300px;
  height: 300px;
  background: url(https://web.archive.org/web/20150807125159if_/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>


5
«за», це було просте питання пропущення одного з пунктів позиції. Якщо ви проголосували, будь ласка, скажіть, чому відповідач може покращити відповідь.
Мауро

2
Я не хочу бути просто критиком, але, чи не повинна земля весь час обертатися в одному напрямку? У цій відповіді обертання зупиняється і починається назад, а потім зупиняється і перезапускається вперед
Чіапа

Ах, зараз набагато краще :)
chiapa

Дякую, що вказали. Я копіював вставку кодів браузера і помилково скопіював їх. У GC він працював і раніше, тому я не міг побачити проблему. Дякую. Чіапа та Каїдо .
Прагматик

46

Проблема в коді є те , що ImageSize ( 610px ) і анімації - й зміщення ( 500px ) відрізняється і при скиданні анімації це хміль (110px).

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

Бонусом 100% методу є те, що якщо ви можете скласти малюнок, вам не доведеться змінювати всі жорстко закодовані значення у вашому CSS, який, IMO, повинен бути найкращим методом.

Зверніть увагу: Здається, перехід від 0 до -100% створює стрибок. Оскільки нам потрібно, щоб обертання йшло в правильному напрямку, я спробував запустити 100% і перенести його на 0, але на даний момент зображення вже не існує.

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

Ось фрагмент, але зі 100% замість pixelvalue:
* Зверніть увагу: анімація все ще стрибала, але я не можу протестувати новий код, оскільки зображення більше не існує. Логіка працює, але ця реалізація, здається, не працює. Наступний код - це лише демонстрація з кодом TS.


4
Власне так було задумано. (+1)
Прагматик

11
Це продовжує стрибати з Китаю до Мексики в моєму браузері (Safari).
200_success

2
Це стрибає з Китаю до Мексики і для мене. FF 31.2.0 на RHEL 6
Holloway

4
Гей, це навіть не працює на FF 34.0.5 (Windows 8)! Ваше рішення працює лише на GC.

6
Для мене як вбудована, так і ціла сторінка стрибають. Але чому моя працює над Firefox? Це дивно.
Прагматик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.