【问题标题】:Rotating globe in CSSCSS中的旋转地球
【发布时间】:2015-03-03 02:45:41
【问题描述】:

我正在 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>

但它会停止,然后图像重置并重新开始。我希望它平稳移动而不会抽搐。非常感谢!

【问题讨论】:

  • 这是一个简洁的效果,但我会谨慎使用它。它在 Chrome 39.0.2171.95 m 上相当不稳定(当然,即使有修复)并在 CPU 上造成明显的负载。
  • @TimMedora 我不知道为什么,但它在 Firefox 34 上运行非常顺利。在 GC 上。它适用于小尺寸图像或硬件加速(HW acc 显着增加内存使用)。在此处查看图片较小的地球仪:link.
  • @TimMedora 我在那个 Chrome 版本上,非常流畅。
  • 效果不错!在我的旧硬件/软件上运行良好(PuppyLinux 5.2.8 上的 Chromium27,它是基于 Ubuntu 10.04 的全内存发行版)
  • 我以前从未见过这种效果——太棒了!向你致敬

标签: html css css-animations


【解决方案1】:

您的代码中的问题是图像大小 (610px) 和动画的偏移量 (500px) 不同,并且在重置动画时它会跳跃 (110px)。

我喜欢用一个简单的技巧来代替以像素为单位定义动画偏移:以百分比定义它
我没有告诉它移动 610 像素,而是告诉它移动 100%

100% 方法的好处是,如果您可以调整图片,则不必更改 CSS 中的所有硬编码值,IMO 应该是首选方法。

请注意:从 0 到 -100% 的移动似乎会产生一个跃点。因为我们需要向正确的方向旋转,所以我尝试从 100% 开始并将其移动到 0,但此时图像不再存在。

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

这是 sn-p,但使用 100% 而不是像素值:
* 请注意:动画仍然跳跃,但我无法测试新代码,因为图像不再存在。逻辑有效,但这个实现似乎没有。下面的代码只是一个带有TS代码的demo。

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;
}
@keyframes rotate {
   from { background-position:  100%  0; }
   to {   background-position:    0   0; }
}
<div id="earth"></div>

【讨论】:

  • 实际上这就是它的本意。 (+1)
  • 这在我的浏览器 (Safari) 上不断从中国跳到墨西哥。
  • 我也从中国跳到墨西哥。 RHEL 6 上的 FF 31.2.0
  • 嘿,它甚至无法在 FF 34.0.5 (Windows 8) 上运行!您的解决方案仅适用于 GC。
  • 对我来说嵌入式和整页都在跳跃。但为什么我的工作在 Firefox 上?这很奇怪。
【解决方案2】:

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>

【讨论】:

  • 赞成,这是一个简单的问题,错过了一个职位项目,如果您反对,请说明原因,以便回答者可以改进答案。
  • 我并不是想成为一个批评家,但是,地球不应该一直在同一个方向旋转吗?在这个答案中,旋转停止并向后开始,然后停止并向前重新开始
  • 啊,现在好多了:)
  • 感谢您的指出。我正在复制粘贴浏览器特定代码并错误地复制了它。在 GC 中它也很早就工作得很好,所以我看不到问题所在。谢谢。 恰帕凯多
猜你喜欢
  • 2018-04-18
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多