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

前端 未结 7 874
旧时难觅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;
    }
    <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>

    0 讨论(0)
  • 2020-11-29 00:33

    EDIT Added random movement, like DVD idle screen but can bounce anywhere.

    http://jsfiddle.net/ryXBM/2/

    dirR = "+=2";
    dirL = "+=2";
    
    function moveDir() {
     if (Math.random() > 0.95) {
      swapDirL();
     }
     if (Math.random() < 0.05) {
      swapDirR();
     }
    }
    
    function swapDirL() {
        dirL == "+=2" ? dirL = "-=2" : dirL = "+=2"; 
    }
    
    function swapDirR() {
        dirR == "+=2" ? dirR = "-=2" : dirR = "+=2";   
    }
    
    setInterval (function() { $("#d").css("left", dirL); $("#d").css("top", dirR); moveDir(); } , 50)​
    

    CSS

    #d { position: absolute;
     left: 100px;
     top: 100px;
     width: 100px;
     height: 100px;
     background-color: #fce;   
    }​
    
    0 讨论(0)
  • 2020-11-29 00:37

    well you'll need to capture the dimensions of the window

    then you'll need to generate random numbers <= the height and width of the screen (minus the width/height of the box)

    give the box an absolute position, and give the box have the generated x,y coordinates

    then set a timer to call this function again.

    :)

    $(document).ready(function() {
        randoBox = {
          width:$("body").width(),
          height:$("body").height(),
          x:0,
          y:0,
          el:null,
          time:1000,
          state:"active",
          init: function(){
            el = $(document.createElement('div'));
            el.attr("style","position:absolute;left:"+this.x+";top:"+this.y+";");
            el.html("DVD")            
            el.height(100);
            el.width(100);
            $("body").append(el);
          },
          move:function(){
            this.y = Math.random()*this.height+1;
            this.x = Math.random()*this.width+1;
            el.attr("style","position:absolute;left:"+this.x+";top:"+this.y+";");            
          },
          run:function(state){
            if (this.state == "active" || state){
              this.move();
              setTimeout(function(){this.run()},this.time);
            }
          }
        }
        randoBox.init();
        randoBox.run(true);
    });
    
    0 讨论(0)
  • 2020-11-29 00:37

    You could use jQuery Slide and Math.random(), generating one random number to use as the distance to move and another random number to base your decision on which direction to move in.

    0 讨论(0)
  • 2020-11-29 00:39
    <html>
        <head>
            <link rel="stylesheet" href="sample1.css">
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
            <script type="text/javascript">
                $(document).ready(function(){
                        $('.btn').mouseover(function(){
                            $(this).css({
                                left:(Math.random()*$(window).width()-20),
                                top:(Math.random()*$(window).height()-20),      
                            });
                        });              
                });
            </script>
        </head> 
        <body>
            <div class="btn" style="position: absolute">button</div>
        </body>
    </html> 
    
    0 讨论(0)
  • 2020-11-29 00:40

    Try this:

    function moveDiv() {
        var $span = $("#random");
    
        $span.fadeOut(1000, function() {
            var maxLeft = $(window).width() - $span.width();
            var maxTop = $(window).height() - $span.height();
            var leftPos = Math.floor(Math.random() * (maxLeft + 1))
            var topPos = Math.floor(Math.random() * (maxTop + 1))
    
            $span.css({ left: leftPos, top: topPos }).fadeIn(1000);
        });
    };
    
    moveDiv();
    setInterval(moveDiv, 5000);
    

    Example fiddle

    0 讨论(0)
提交回复
热议问题