web-dev-qa-db-ja.com

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>

ただし、停止してから画像がリセットされて再び起動します。けいれんせずにスムーズに移動したいです。ありがとうございます!

73
user4420272

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>
91
The Pragmatick

コードの問題は、画像サイズ(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%です。
*注:アニメーションは引き続きホップしますが、画像が存在しないため、新しいコードをテストできません。ロジックは機能しますが、この実装は機能していないようです。次のコードは、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>
46
Martijn