how to get a div to randomly move around a page (using jQuery or CSS)

前端 未结 7 894
旧时难觅i
旧时难觅i 2020-11-29 00:01

I\'ve been doing some Googling to find an answer to this, but I\'ve had no luck. It could be because I\'m a bit of an amateur and I don\'t know the proper terms to search f

7条回答
  •  醉话见心
    2020-11-29 00:26

    The basic premise is to generate positional values, and use jquery's animate() function to move the div. The calculation of the next position is simple, you just need a bit of math. Here's a very basic jsfiddle i just knocked up. It could do with possibly a delay timer, a dynamically calculating speed based on how far its got too move e.c.t. But it gives you a start point i hope.

    http://jsfiddle.net/Xw29r/

    Updated example code with speed modifier:

    http://jsfiddle.net/Xw29r/15/


    For some reason this is still getting some attention, so here's an updated answer that uses CSS transitions which should be much smoother.

    http://jsfiddle.net/bf9nv1q6/

    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 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;
    }

提交回复
热议问题