首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态变化动画速度

动态变化动画速度
EN

Stack Overflow用户
提问于 2017-02-10 02:38:08
回答 1查看 1.1K关注 0票数 1

为了教自己javascript (以及在天文学领域获得/提供更多的洞察力),我正在建立一个显示太阳和月亮相对位置的页面。现在,太阳和月亮的移动速度仍然是固定的,但我真的想让这个动态用户通过输入字段定义。所以,最初的速度是'30',用户可以加快速度或减慢速度。显然,太阳和月亮的比率必须保持不变。我尝试了很多东西(见代码中的一些遗物,但我无法让它工作。)

谁有更多的javascript经验可以帮助我这样做?此外,我注意到CPU的使用率在这个动画中变得非常高。是否有简单的步骤来提高这个脚本的效率?

代码语言:javascript
复制
var dagen = 0;
function speed($this){
	var speedSetting = $this.value;
    //alert(speedSetting);
	//return per;
}
function periode(bolletje, multiplier=30){
	if (bolletje == 'zon'){var per = (multiplier*24/2);}
    if (bolletje == 'maan'){var per = (multiplier*24*29.5/2);}
    return per;
}
function step(delta) {
  elem.style.height = 100*delta + '%'
}
function animate(opts) {
  var start = new Date 
  var id = setInterval(function() {
    var timePassed = new Date - start
    var progress = timePassed / opts.duration
    if (progress > 1) progress = 1
    var delta = opts.delta(progress)
    opts.step(delta)
    if (progress == 1) {
      clearInterval(id)
    }
  }, opts.delay || 10)
   
}
function terugweg(element, delta, duration) {
    var to = -300;
    var bolletje = element.getAttribute('id');
    per = periode(bolletje);
	document.getElementById(bolletje).style.background='transparent';
	animate({
		delay: 0,
		duration: duration || per,
		//1 sec by default
		delta: delta,
		step: function(delta) {
		  element.style.left = ((to*delta)+300) + "px"   
		}
	});
    if(bolletje == 'zon'){
    	dagen ++;
    }
    bolletje = element;
    document.getElementById('dagen').innerHTML = dagen;
    //setInterval(function (element) {
    setTimeout(function (element) {
		move(bolletje, function(p) {return p})
	}, per);
}
function move(element, delta, duration) {
	var to = 300;
	var bolletje = element.getAttribute('id');
    per = periode(bolletje);
    document.getElementById(bolletje).style.background='yellow';
	animate({
		delay: 0,
		duration: duration || per, 
		//1 sec by default
		delta: delta,
		step: function(delta) {
		  element.style.left = to*delta + "px"   
		}
	});
    bolletje = element;
	//setInterval(function (element) {
    setTimeout(function (element) {
		terugweg(bolletje, function(p) {return p})
	}, per);
}
代码语言:javascript
复制
hr{clear: both;}
form{display: block;}
form label{width: 300px; float: left; clear: both;}
form input{float: right;}
.aarde{width: 300px; height: 300px; border-radius: 150px; background: url('https://domain.com/img/aarde.png');}
#zon{width: 40px; height: 40px; background: yellow; border: 2px solid yellow; border-radius: 20px; position: relative; margin-left: -20px; top: 120px;}
#maan{width: 30px; height: 30px; background: yellow; border: 2px solid yellow; border-radius: 16px; position: relative; margin-left: -15px; top: 115px;}
代码语言:javascript
复制
<form>

<div onclick="move(this.children[0], function(p) {return p}), move(this.children[1], function(p) {return p})" class="aarde">
<div id="zon"></div>
<div id="maan"></div>

</div>

Dagen: <span id="dagen">0</span>

</form>


<form>

<label><input id="snelheid" type="range" min="10" max="300" value="30" oninput="speed(this)">Snelheid: <span id="snelheidDisplay">30</span></label>

</form>

EN

回答 1

Stack Overflow用户

发布于 2017-02-10 03:04:43

首先,在速度输入标签中将onlick更改为oninput

代码语言:javascript
复制
<input id="snelheid" type="number"  value="30" oninput="speed(this)">

在您的speed()函数中,设置multiplier = $this.valuemultiplier应该是全球性的:

代码语言:javascript
复制
var multiplier = 30;
function speed($this){
  console.log($this.value);
    multiplier = $this.value;
    //alert(speedSetting);
    //return per;
}
function periode(bolletje){
    if (bolletje == 'zon'){var per = (multiplier*24/2);}
    if (bolletje == 'maan'){var per = (multiplier*24*29.5/2);}
    return per;
}

下面是一个例子:https://jsfiddle.net/do4n9L03/2/

注意:multiplier不是速度,而是延迟。如果你增加它,它会变慢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42150572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档