当前位置: 首页 > 面试题库 >

如何使div在页面上随机移动(使用jQuery或CSS)

井宪
2023-03-14
问题内容

我一直在做一些谷歌搜索来找到答案,但是我没有运气。可能是因为我有点业余,我不知道要搜索的合适术语,但是也许有人可以在正确的方向指引我或帮助我。

无论如何,我正在寻找一种使div随机,平滑地在页面上移动的方法。会有背景色,然后我想随机地在页面上无限移动此图像。就像DVD播放器主屏幕的背景一样,“
DVD”只是在上面浮动。

div的起点并不重要,终点也不重要。它只需要在用户停留在页面上的持续时间内在页面上随机移动。

我具有不错的HTML和CSS技能,非常基本的JS技能以及一些实现jQuery的经验。理想情况下,我希望我可以实现自己的目标。

提前致谢!!!


问题答案:

基本前提是生成位置值,并使用jquery的animate()函数移动div。下一个位置的计算很简单,您只需要一点数学即可。这是我刚刚提出的一个非常基本的jsfiddle。它可以使用一个延迟计时器,根据它的移动幅度来动态计算速度,但是我希望它为您提供了一个起点。

由于某种原因,这仍然引起了人们的注意,因此这是一个更新的答案,该答案使用CSS过渡应该会更加流畅。

function RandomObjectMover(obj, container) {

    this.$object = obj;

  this.$container = container;

  this.container_is_window = container === window;

  this.pixels_per_second = 250;

  this.current_position = { x: 0, y: 0 };

  this.is_running = false;

}



// Set the speed of movement in Pixels per Second.

RandomObjectMover.prototype.setSpeed = function(pxPerSec) {

    this.pixels_per_second = pxPerSec;

}



RandomObjectMover.prototype._getContainerDimensions = function() {

   if (this.$container === window) {

       return { 'height' : this.$container.innerHeight, 'width' : this.$container.innerWidth };

   } else {

       return { 'height' : this.$container.clientHeight, 'width' : this.$container.clientWidth };

   }

}



RandomObjectMover.prototype._generateNewPosition = function() {



    // Get container dimensions minus div size

  var containerSize = this._getContainerDimensions();

    var availableHeight = containerSize.height - this.$object.clientHeight;

  var availableWidth = containerSize.width - this.$object.clientHeight;



  // Pick a random place in the space

  var y = Math.floor(Math.random() * availableHeight);

  var x = Math.floor(Math.random() * availableWidth);



  return { x: x, y: y };

}



RandomObjectMover.prototype._calcDelta = function(a, b) {

    var dx   = a.x - b.x;

  var dy   = a.y - b.y;

  var dist = Math.sqrt( dx*dx + dy*dy );

  return dist;

}



RandomObjectMover.prototype._moveOnce = function() {

        // Pick a new spot on the page

    var next = this._generateNewPosition();



    // How far do we have to move?

    var delta = this._calcDelta(this.current_position, next);



        // Speed of this transition, rounded to 2DP

        var speed = Math.round((delta / this.pixels_per_second) * 100) / 100;



    //console.log(this.current_position, next, delta, speed);



    this.$object.style.transition='transform '+speed+'s linear';

    this.$object.style.transform='translate3d('+next.x+'px, '+next.y+'px, 0)';



    // Save this new position ready for the next call.

    this.current_position = next;



};



RandomObjectMover.prototype.start = function() {



    if (this.is_running) {

    return;

  }



    // Make sure our object has the right html" target="_blank">css set

  this.$object.willChange = 'transform';

  this.$object.pointerEvents = 'auto';



  this.boundEvent = this._moveOnce.bind(this)



  // Bind callback to keep things moving

  this.$object.addEventListener('transitionend', this.boundEvent);



  // Start it moving

  this._moveOnce();



  this.is_running = true;

}



RandomObjectMover.prototype.stop = function() {



    if (!this.is_running) {

    return;

  }



  this.$object.removeEventListener('transitionend', this.boundEvent);



    this.is_running = false;

}





// Init it

var x = new RandomObjectMover(document.getElementById('a'), window);





// Toolbar stuff

document.getElementById('start').addEventListener('click', function(){

    x.start();

});

document.getElementById('stop').addEventListener('click', function(){

    x.stop();

});

document.getElementById('speed').addEventListener('keyup', function(){

  if (parseInt(this.value) > 3000 ) {

        alert('Don\'t be stupid, stupid');

    this.value = 250;

  }

    x.setSpeed(parseInt(this.value));

});





// Start it off



x.start();


div#toolbar {

  position:fixed;

  background:#20262F;

  width:100%;

  text-align:center;

  padding: 10px

}

div#a {

width: 50px;

height:50px;

background-color:red;

position:absolute;

}


<div id="toolbar">

<button id="start">Start</button>

<button id="stop">Stop</button>

<input type="number" value="250" id="speed" />

</div>

<div id='a'></div>


 类似资料:
  • 问题内容: 我正在尝试使用jQuery进行第一步,但是我很难理解如何从div父元素中找到子元素列表。我曾经使用过ActionScript 2和ActionScript 3,所以我可能会误解一些概念,例如用jQuery将div元素序列随机化的更好方法是什么! 我有HTML代码的以下简单部分: 我尝试了某种方法来执行此操作,例如将map .member divs放在一个数组中,然后更改排序顺序,但没有

  • 我在IE8中尝试使用jQuery mousemove、mouseup和mousemove事件pan div时遇到了问题。一旦我按下鼠标键,直到我释放鼠标键才检测到mousemove,而要检测到mouseup,我必须再次按下鼠标键。 下面是JavaScript: 以下是HTML: #Layout div中的图像设置为与div大小相同。我认为在IE8中可能会有问题,因为它认为我试图拖动图像。不确定是否

  • 问题内容: 我试图做到这一点,所以当我单击HTML页面中的链接时,它会动态地将请求的页面加载到jQuery的div中。 我怎样才能做到这一点? 问题答案: 那里有一个叫做pjax的jQuery插件,它指出:“它是带有真正的永久链接,页面标题和完全退化的后退按钮的ajax。” 该插件使用HTML5 pushState和AJAX来动态更改页面,而无需完全加载。如果不支持pushState,则PJAX将

  • 问题内容: 我已经尝试过使用dynamic.js和下面的代码,但是,当我在IE11中尝试此操作时,每次滚动时它都会一直跳到顶部: 我想使页面在平板电脑,IE10和11上可滚动,以便用户可以像在移动设备上一样向上推动页面以向下滚动。 如何在不跳到顶部的情况下在纯JS或jQuery中做到这一点? 问题答案: 您可以通过记录单击时鼠标的位置以及被拖动时的当前位置来非常简单地完成此操作。尝试这个: 为了防

  • 问题内容: 如何使用jQuery刷新页面? 问题答案: 用途: 该函数采用一个可选参数,可以将其设置为强制从服务器而不是从缓存重新加载。该参数默认为,因此默认情况下该页面可能会从浏览器的缓存中重新加载。

  • 这是我的代码: null null 因此,一般来说,我想生成一个随机数量的divs和随机的位置。 不幸的是,这篇或这篇文章对我没有帮助。太具体了。 我会非常感谢你的帮助!