The code which produces the above is:
<!-- This script came from the public archives of JavaScript Planet at http://www.js-planet.com -->
<!-- For more scripts, tutorials, links, discussion forums, help, or anything else JavaScript, -->
<!-- Please visit JavaScript Planet at http://www.js-planet.com. Please keep this header intact. -->
<body bgcolor=white text=black>
<SCRIPT>
// Ver .91 Jan 17 1998
//////////////////////////////////////////////////////////////
//
// Copyright 1997 Jeremie
// Free for public non-commercial use and modification
// as long as this header is kept intact and unmodified.
// Please see http://www.jeremie.com for more information
// or email webdev@jeremie.com with questions/suggestions.
//
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/////////////// Public Morphing Function //////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
/////// to do items/additions/notes
//
// I didnt have time to "fully" comment this throughout, so
// please feel free to ask me to explain anything.
//
////////////////////////////
//// this is the main public function
//// takes the element to morph, time between steps,
//// # of steps, style replacement, and JS code to execute when done
function morph(e,wait,steps,style,done){
if(e.morphing){
return;
}
e.morphing = true;
e.step = 0;
e.done = steps;
e.wait = wait;
e.morphDone = done;
// initialize the given element for the process
// save some temporary variables within it
var attribs = _eat_attrib(style);
if(attribs["top"] != null){
e.deltaTop = Math.round(Number((attribs["top"] - e.style.posTop) / steps));
e.finalTop = attribs["top"];
}else{
e.deltaTop = null;
e.finalTop = e.style.posTop;
}
if(attribs["left"] != null){
e.deltaLeft = Math.round(Number((attribs["left"] - e.style.posLeft) / steps));
e.finalLeft = attribs["left"];
}else{
e.deltaLeft = null;
e.finalLeft = e.style.posLeft;
}
if(attribs["height"] != null){
e.deltaHeight = Math.round(Number((attribs["height"] - e.style.posHeight) / steps));
e.finalHeight = attribs["height"];
}else{
e.deltaHeight = null;
e.finalHeight = e.style.posHeight;
}
if(attribs["width"] != null){
e.deltaWidth = Math.round(Number((attribs["width"] - e.style.posWidth) / steps));
e.finalWidth = attribs["width"];
}else{
e.deltaWidth = null;
e.finalWidth = e.style.posWidth;
}
// group all of the coloring elements together
e.colors = new Array();
for(attrib in attribs){
// check each one individually to kludge
// if we need to use a "safe" name for the css attribute
if(attrib == "background"){
e.colors[e.colors.length] = new Array();
e.colors[e.colors.length - 1].name = attrib;
e.colors[e.colors.length - 1].safename = attrib;
}
if(attrib == "color"){
e.colors[e.colors.length] = new Array();
e.colors[e.colors.length - 1].name = attrib;
e.colors[e.colors.length - 1].safename = attrib;
}
if(attrib == "border-color"){
e.colors[e.colors.length] = new Array();
e.colors[e.colors.length - 1].name = attrib;
e.colors[e.colors.length - 1].safename = "borderColor";
}
}
for(var i=0;i<e.colors.length;i++){
var rgb = _eat_rgb(attribs[e.colors[i].name]);
var prergb = _eat_rgb(e.style[e.colors[i].safename]);
e.colors[i].delta = _eat_rgb(attribs[e.colors[i].name]);
e.colors[i].finish = _eat_rgb(attribs[e.colors[i].name]);
e.colors[i].delta["red"] = Math.round(Number((rgb["red"] - prergb["red"]) / steps));
e.colors[i].delta["green"] = Math.round(Number((rgb["green"] - prergb["green"]) / steps));
e.colors[i].delta["blue"] = Math.round(Number((rgb["blue"] - prergb["blue"]) / steps));
}
// fire the first morphing step
setTimeout("_morphing(document.all." + e.id + ")", wait);
}
/////////////////////////////
/////////////////////////////
//// private function that does the work of morphing the element
function _morphing(e){
e.step++;
if(e.deltaTop!=null){
e.style.posTop += e.deltaTop;
}
if(e.deltaLeft!=null){
e.style.posLeft += e.deltaLeft;
}
if(e.deltaHeight!=null){
e.style.posHeight += e.deltaHeight;
}
if(e.deltaWidth!=null){
e.style.posWidth += e.deltaWidth;
}
for(var i=0;i<e.colors.length;i++){
var rgb = _eat_rgb(e.style[e.colors[i].safename]);
e.style[e.colors[i].safename] = "rgb("
+ (e.colors[i].delta["red"] + rgb["red"])
+ ","
+ (e.colors[i].delta["green"] + rgb["green"])
+ ","
+ (e.colors[i].delta["blue"] + rgb["blue"])
+ ")";
}
// do special things when we are done
if(e.step == e.done){
if(e.deltaTop != null)
e.style.posTop = e.finalTop;
if(e.deltaLeft != null)
e.style.posLeft = e.finalLeft;
if(e.deltaWidth != null)
e.style.posWidth = e.finalWidth;
if(e.deltaHeight != null)
e.style.posHeight = e.finalHeight;
for(var i=0;i<e.colors.length;i++){
e.style[e.colors[i].safename] = "rgb("
+ (e.colors[i].finish["red"] + rgb["red"])
+ ","
+ (e.colors[i].finish["green"] + rgb["green"])
+ ","
+ (e.colors[i].finish["blue"] + rgb["blue"])
+ ")";
}
e.morphing = false;
eval(e.morphDone);
}else{
setTimeout("_morphing(document.all." + e.id + ")", e.wait);
}
return;
}
//////////////////
//// util for element attribute parsing
//// returns an array of all of the keys = values
function _eat_attrib(str){
var chunks = new Array();
var all = new Array();
chunks=str.split(";");
for(var i=0;i<chunks.length;i++){
var tmpA = new Array();
tmpA=chunks[i].split(":");
all[tmpA[0]]=tmpA[1];
}
return all;
}
////////////////////
//////////////////
//// util for style rgb(#,#,#) parsing
//// returns an array of red/green/blue = number
function _eat_rgb(str){
var all = new Array();
var a = str.indexOf("(");
var b = str.indexOf(")");
str = str.substring(a + 1, b);
var tmpA = str.split(",");
all["red"]=Number(tmpA[0]);
all["green"]=Number(tmpA[1]);
all["blue"]=Number(tmpA[2]);
return all;
}
////////////////////
</SCRIPT>
<SPAN ID="test" STYLE="border:solid;border-width:5;border-color:rgb(0,0,0);color:rgb(255,255,255);position:absolute;top:0;left:0;width:400;height:400;overflow:hidden;background:rgb(0,0,255);">
this is some <B>text</B> that I am putting inside of here, watch me CHANGE :)
</SPAN>
<SCRIPT>
function rander(){
var top = Math.round(Math.random() * 400);
var left = Math.round(Math.random() * 600);
var width = Math.round(Math.random() * 200);
var height = Math.round(Math.random() * 200);
var r = Math.round(Math.random() * 255);
var g = Math.round(Math.random() * 255);
var b = Math.round(Math.random() * 255);
var background = "rgb(" + r + "," + g + "," + b + ")";
var r = Math.round(Math.random() * 255);
var g = Math.round(Math.random() * 255);
var b = Math.round(Math.random() * 255);
var borderColor = "rgb(" + r + "," + g + "," + b + ")";
var r = Math.round(Math.random() * 255);
var g = Math.round(Math.random() * 255);
var b = Math.round(Math.random() * 255);
var color = "rgb(" + r + "," + g + "," + b + ")";
morph(document.all.test,30,20,"top:" + top + ";left:" + left + ";width:" + width + ";height:" + height + ";background:" + background + ";border-color:" + borderColor + ";color:" + color + ";","rander();");
}
rander();
</SCRIPT>