how to get a div to randomly move around a page (using jQuery or CSS)
Solution 1:
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>
Solution 2:
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
Solution 3:
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);
});
Solution 4:
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;
}
Solution 5:
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.