Spotlight E-mail
User Rating: / 6
PoorBest 
Written by Administrator   
Wednesday, 29 August 2007 18:46

This spotlight script was one of the effects in the bratta dhtml demo.

Instructions
Instructions in source-code.

Note: clipping is used a lot in this script, and early versions of Netscape 6 do not implement that very well yet, so some rendering glitches may occur.

Spotlight demo example 

Source
You have two options on getting the source to this script.

1. Copy the source from the textboxes below and place the code inside the body textbox in the body of your document and the code in the head textbox in the head of your document. If there are images to the script right click on the images below the textboxes and choose "save as" to get them.

2. Download the sourcecode and images in a zip file

Head

<style type="text/css">
#divExCont {position:absolute; left:0px; top:0px; clip:rect(0px 0px 0px 0px); layer-background-color:#ffffff; background-color:#ffffff;}
#divCircle {position:absolute; z-index:500; visibility:hidden; width:170px;}
body       {background-color:#000000; overflow:hidden;}
</style>


<script language="JavaScript" type="text/javascript">
/**********************************************************************************  
Spotlight
*   Copyright (C) 2001 Thomas Brattli
*   This script was released at DHTMLCentral.com
*   Visit for more great scripts!
*   This may be used and changed freely as long as this msg is intact!
*   We will also appreciate any links you could give us.
*
*   Made by Thomas Brattli
*
*   Script date: 09/04/2001 (keep this date to check versions)
*********************************************************************************/
function lib_bwcheck(){ //Browsercheck (needed)
    this.ver=navigator.appVersion
    this.agent=navigator.userAgent
    this.dom=document.getElementById?1:0
    this.opera5=(navigator.userAgent.indexOf("Opera")>-1 && document.getElementById)?1:0
    this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0;
    this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
    this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
    this.ie=this.ie4||this.ie5||this.ie6
    this.mac=this.agent.indexOf("Mac")>-1
    this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
    this.ns4=(document.layers && !this.dom)?1:0;
    this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5)
    return this
}
var bw=lib_bwcheck()

/*** Variables to set ***/
sCircleWidth = 168    //The width the script will clip to
sCircleHeight = 168    //The height the script will clip to
sStarty = 200        //Where do you want it to initially start
sStartx = 200        //Where do you want it to initially start
clipSpeed = 20        //Number of pixels for each step in the animation.

/******************************************************************************
Making the clipobject part
******************************************************************************/   
function makeObj(obj, nest, x, y){
    nest = (!nest) ? "":'document.'+nest+'.';                                       
       this.css = bw.dom? document.getElementById(obj).style:bw.ie4?document.all[obj].style:bw.ns4?eval(nest+"document.layers." +obj):0;       
    this.evnt = bw.dom? document.getElementById(obj):bw.ie4?document.all[obj]:bw.ns4?eval(nest+"document.layers." +obj):0;                                                   
    this.clip = b_clip;
    this.clipIt = b_clipIt;
    this.clipTo = b_clipTo;
    this.obj = obj + "Object";
    eval(this.obj + "=this");
    return this;
}

// A unit of measure that will be added when setting the position or size of a layer.
var px = bw.ns4||window.opera?"":"px";

//clip part
function b_clipTo(t,r,b,l){
    if (bw.ns4){
        this.css.clip.top=t;this.css.clip.right=r;this.css.clip.bottom=b;this.css.clip.left=l;
    }
    else {
        this.css.clip="rect("+t+"px "+r+"px "+b+"px "+l+"px)";
    }
}
function b_clipIt(tstop,rstop,bstop,lstop,step,fn){
    if (!fn) fn = null
    var clipval = new Array()
    if (bw.dom || bw.ie4) {
        clipval = this.css.clip
        clipval = clipval.slice(5,clipval.length-1);
        clipval = clipval.split(' ')
        for (var i=0; i<4; i++) clipval[i] = parseInt(clipval[i])
    }
    else {
        clipval[0] = this.css.clip.top
        clipval[1] = this.css.clip.right
        clipval[2] = this.css.clip.bottom
        clipval[3] = this.css.clip.left
    }
    totantstep = Math.max(Math.max(Math.abs((tstop-clipval[0])/step),Math.abs((rstop-clipval[1])/step)),
        Math.max(Math.abs((bstop-clipval[2])/step),Math.abs((lstop-clipval[3])/step)))
    if (!this.clipactive)
        this.clip(clipval[0],clipval[1],clipval[2],clipval[3],(tstop-clipval[0])/totantstep,
            (rstop-clipval[1])/totantstep,(bstop-clipval[2])/totantstep,
                (lstop-clipval[3])/totantstep,totantstep,0, fn)
}
function b_clip(tcurr,rcurr,bcurr,lcurr,tperstep,rperstep,bperstep,lperstep,totantstep,antstep, fn){
    tcurr=tcurr+tperstep; rcurr=rcurr+rperstep
    bcurr=bcurr+bperstep; lcurr=lcurr+lperstep
    this.clipTo(tcurr,rcurr,bcurr,lcurr)
    if(antstep<totantstep){
        this.clipactive=true
        antstep++
        setTimeout(this.obj+".clip("+tcurr+","+rcurr+","+bcurr+","+lcurr+","+tperstep+","
            +rperstep+","+bperstep+","+lperstep+","+totantstep+","+antstep+",'"+fn+"')", 40)   
    }else{
        this.clipactive = false
        eval(fn)
    }
}
/******************************************************************************
Initiating the page and the clip objects.
******************************************************************************/   
function spotInit(){
    pageWidth = (bw.ns4 || bw.ns6)?innerWidth:document.body.clientWidth;
    pageHeight = (bw.ns4 || bw.ns6)?innerHeight:document.body.clientHeight;
    oExCont = new makeObj('divExCont')
    if (bw.dom || bw.ie4){
        oExCont.css.width = pageWidth+px
        oExCont.css.height = pageHeight+px
    }
    oCircle = new makeObj('divCircle','divExCont')
    oExCont.clipTo(sStarty,sStartx+sCircleWidth,sStarty+sCircleHeight,sStartx)
    oCircle.css.left = sStartx+px
    oCircle.css.top = sStarty+px
    oCircle.css.visibility = "visible"
    if (bw.ns4)document.captureEvents(Event.MOUSEMOVE)
    document.onmousemove = moveCircle;
}
function moveCircle(e){
    x = (bw.ns4 || bw.ns6)?e.pageX:event.x
    y = (bw.ns4 || bw.ns6)?e.pageY:event.y
    oExCont.clipTo(y-sCircleHeight/2, x+sCircleWidth/2, y+sCircleHeight/2, x-sCircleWidth/2)
    oCircle.css.left = x - sCircleWidth/2 + px
    oCircle.css.top = y - sCircleHeight/2 + px
}
//This is being called when someone clicks the circle.
function showCont(){
    document.onmousemove = null
    oCircle.css.visibility = "hidden"
    oCircle.css.left = 0+px
    oCircle.css.top = 0+px
    oExCont.clipIt(-clipSpeed, pageWidth+clipSpeed, pageHeight+clipSpeed, -clipSpeed, clipSpeed, 'oExCont.css.overflow="auto"')
}

if (bw.bw) onload = spotInit
</script>

        

Body

<div id="divExCont">
<div id="divCircle"><a href="#" onclick="showCont(); return false" onfocus="if(this.blur)this.blur()"><img src="spotlight_circle.gif" width="170" height="170" alt="" border="0"></a></div>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<font face="arial,helvetica,sans-serif" size="2" color="#000000">Your regular body content goes here.</font>
</div>