【问题标题】:Create animation with css gradient and javascript使用 css 渐变和 javascript 创建动画
【发布时间】:2016-01-28 21:28:51
【问题描述】:

我正在开发一个允许我们扫描 rfid 标签的 cordova 应用程序。根据 RSSI 信号强度,我需要显示一个条形图,显示 rfid 标签的距离。离标签越近,条形就越高,走得越远,条形就越小。我构建了以下plunkr,我认为我可以使用它。不幸的是,动画不是很流畅,在移动应用程序上速度很慢。我认为问题在于我正在显示/隐藏带有超时的 div 以模拟动画。我想我可能需要更改它以使用带有渐变的 css 动画。但是我对如何做到这一点不是很熟悉,如果说我只想显示栏的一小部分,我不知道如何隐藏部分渐变。非常感谢任何有关如何执行此操作的建议。

更新:我已经上传了我想要实现的视频。不幸的是,我无法将其上传到 SO。当我阅读标签时,动画会发生变化。所以我可以来回移动标签,并基于它应该改变栏。

https://www.dropbox.com/s/9bd421fhqvt9v5g/gradient-bar-demo.mov?dl=0

【问题讨论】:

  • 你能展示一个你想要实现的模型吗?从描述中并不能完全清楚您希望此动画如何工作。它多久更新一次?条形大小和渐变是否都发生了变化?他们如何改变?颜色会改变吗?等等……
  • @TinMonkey 请在保管箱位置查看视频。非常感谢。

标签: javascript css angularjs cordova ionic


【解决方案1】:

您可以使用 javascript 为高度设置动画,使用 css 为渐变设置动画。我在鼠标悬停时在这里更新,但你可以让它随着每次扫描输入而更新并完成同样的事情。你只需要为你想要的任何其他渐变变化设置更多的 css 类。

var min = 15;
var max = 100
function randPercent(){
  return Math.floor(Math.random()*(max-min+1)+min);
}


$( ".statusBar" ).mouseover(function(){

  var barSize = randPercent();

  if (barSize > 50) {
    $(this).addClass('close');
  } else {
    $(this).removeClass('close');
  }

  $(this).animate({
    height: barSize+'%'
    },300
  );
  
});
.wrapper {
  height:100px;
  position:relative;
}
.statusBar {
  width:50px;
  min-height:10px;
  border:1px solid black;
  position:absolute;
  bottom:0;
}
.bg {
  -webkit-transition: background 1s ;
  -moz-transition: background 1s ;
  -ms-transition: background 1s ;
  -o-transition: background 1s ;
  transition: background 1s ;

  background: rgb(71,234,46);

}

.bg.close {
  background: rgb(247,247,49);

}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrapper">
  <div class="statusBar  bg"></div>
</div>

【讨论】:

  • 非常感谢。如果没有 jquery,我能达到同样的效果吗?
  • 我没有尝试过没有框架的 javascript 动画,但是由于框架本身是用 javascript 编写的,所以当然可以。另外..在对此进行了更多测试之后..看起来渐变动画效果不佳..纯色可以很好地进行淡入淡出过渡,从而产生相同的效果。
  • 一幅图像会出现与我假设的渐变相同的问题。它只会切换而不是动画。可以使用动画而不是过渡来使用 css 动画渐变。
  • 更新为显示纯色..如果你为每 20% 的跳跃使用不同的颜色,它仍然会根据强度而变化,看起来很酷。
  • 您可以使用background-position 为渐变设置动画。同样使用transform: scale() 可能在性能方面比高度更好。
【解决方案2】:

为了获得更好的性能,最好是动画比例而不是高度。 Source(动画性能的好文章)。

下面是一个示例,说明您可以如何做到这一点。它并不完美,但希望它能给你一个好的起点。

var input = document.querySelector('input');

input.addEventListener('input', function() {
    var value = this.value / 100;
    var bar = document.querySelector('.meter-bar');
    
    bar.style.transform = 'scaleY(' + value + ')';
    // Adjust background size to account for the scale change, there is probably a better solution
    bar.style.backgroundSize = '200px ' + (300 / value) + 'px';
});
input {
    width: 200px;
}

.meter {
    width: 200px;
    height: 300px;
    margin-top: 20px;
    background-color: #e5e5e5;
}

.meter-bar {
    width: 100%;
    height: 100%;
    background-color: #333;
    background-image: linear-gradient(to top, #64b572 0%, #9fc63d 50%, #f63908 100%);
    background-size: 200px 0;
    background-position: bottom;
    transform-origin: bottom;
    transform: scaleY(0);
    transition: transform 1s ease, background-size 1s ease;
    opacity: 0.8;
}
<input type="range" min="0" max="100" step="1" value="0">
    
<div class="meter">
    <div class="meter-bar">
    </div>
</div>

【讨论】:

  • 这太棒了。它使用 ionic 框架在浏览器和 plunker 上运行良好。不幸的是,它不能在移动设备上正常工作。它不光滑。我试图找出这是否与我的代码或离子有关。这是plunker:embed.plnkr.co/d6rC1e/preview
  • 我可以确认该代码不适用于 ionic。不过,它在浏览器上效果很好。以下是它在设备上的外观:dropbox.com/s/6v4qhgets9ni3c8/animated-bar.mov?dl=0
  • 嗯不确定抱歉,我从未使用过 Ionic。哦,对不起,我忘了说确保你添加了浏览器前缀!这可能是问题所在。
  • 好的。我会试试的。将您的回复标记为答案,因为它帮助我找出了问题并且是最容易使用的。
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多