Creating a cross browser scroller using DHTML

There’s something about text moving across the screen that
fascinates people. Since it was first possible to create moving text in a webpage, by
using JavaScript, countless so-called scroller scripts have been created. Have you
noticed, however, that most of them are limited to scrolling the text either inside a
textbox, or status bar? For example, the below scroller scrolls text inside a textbox:

Not that there’s anything wrong with textboxes or the status
bar, but personally, I like my text scrolled all by itself, not wrapped inside any other
element. In other words, a "true" text scroller. Is it possible? Apparently,
yes. After a couple of weeks of searching, I finally found some working scrolling text examples
on the web, and in the process, learned for myself how to create them. In this article, I
wish to share that knowledge with you.

I’m going to teach you how to create a basic, side-scrolling
scroller using the DHTML features of IE4+ and NS4+. Here’s a demo:

Whether you’re using IE4 or NS4, the scroller works equally.
Two completely different concepts is involved in the realization of it. Let’s see for
ourselves how to create a text scroller!

-Scrolling the text in IE4

In IE4, it’s actually very simple to scroll any text, thanks
to a default tag supported since IE3- the <marquee> tag. Just wrap any text you want
to scroll inside it, and off it goes:

<marquee>This
is scrolling text</marquee>

In IE4, however, it seems you can now also put in HTML tags,
and they will interpreted as such:

<marquee><big>This
is a BIG scrolling text</big></marquee>

So that’s that for IE4. If you’re only creating a text
scroller for IE4, you already know all there is to know. However, I, like many other
people, use NS4 to browse the web, so whatever you have planned for IE4 users, I would
appreciate seeing it as well. Let’s move on to see how to make the scroller work in NS4
equally, which is a little more complex.

-Scrolling the text in NS4

To scroll text in NS4, everything- including the interface-
has to be created from scratch. That’s because no default tag or feature exists in NS4 to
simulate this action.

What does exist in NS4, though, is the <layer> tag (the
DHTML tag of the browser). This tag allows you to move whatever is inside of it freely
around the page, and by applying some control, we can mold that into a scroller!

Here’s the basic idea. We define a <layer> tag and put
the text to scroll inside of it. We then wrap all of that with the <ilayer> tag,
which simply grounds it to appear inline with the rest of the page (as opposed to the
coordinates defined by the layer’s left and top position).

<ilayer
name="scroll1" width=300 height=20>

<layer name="scroll2">This is scrolling text. This is scrolling
text. This is scrolling text…</layer>

</ilayer>

Then, by using a simple script to increment the left position
of this layer, it moves, just like in a scroller. Before I show you the script itself,
allow me to illustrate what I’ve just talked about graphically:

scroller.gif (3993 bytes)

The <ilayer> tag defines the "scroller
window", the physical viewable area of the scroller (green rectangle). The
<layer> tag, on the other hand, defines/contains the scrolling text itself, and is
represented above as the white rectangle. We want to create a script that will move this
white rectangle continuously to the left until it reaches the end of the text, then start
over again.

Here’s the function that does that:

function
scrollit(){

//get the total length of the scroller (white rectangle)
scrollerlength=document.scroll1.document.scroll2.document.width

//if the scroller’s left position is greater than -scrollerlength (hasn’t reached
the end)
if (document.scroll1.document.scroll2.left>=scrollerlength*(-1)){

//decrease it’s left position by 6 pixels
document.scroll1.document.scroll2.left-=6
setTimeout("scrollit()",100)
}
else{

//else if the scroller has reached the end, reset the scroller position
document.scroll1.document.scroll2.left=300

//and start things all over
scrollit()
}
}

Read my comments inside to see how it works. Basically, the
idea is to decrease the "left" value of the layer continuously, until it reaches
the end of the layer. Then, repeat and start all over again from it’s original position.

-The entire scrolling text code

Putting the bits and pieces together, along with some added
code, here is the entire script that renders the scroller you saw in the beginning of this
article. I’ll list it first, then explain any parts of it that might need clarification:

<script
language="JavaScript1.2">

<!–Script by Billy Pete (http://members.xoom.com/billypete/) –>
<!–Idea based on scroller found at http://dynamicdrive.com –>

//Specify the marquee’s scroll speed (larger is faster)
var speed=6
//Specify the marquee contents
var marqueecontents='<font face="Arial"><strong>This is is scrolling
text script. This is a scrolling text script. This is a scrolling text
script.</strong></font>’

if (document.all)
document.write(‘<marquee scrollAmount=’+speed+’
style="width:300">’+marqueecontents+'</marquee>’)

function intializemarquee(){
if (document.layers){
document.cmarquee01.document.cmarquee02.document.write(‘<nobr>’+marqueecontents+'</nobr>’)
document.cmarquee01.document.cmarquee02.document.close()
thelength=document.cmarquee01.document.cmarquee02.document.width
scrollit()
}
}

function scrollit(){
if (document.cmarquee01.document.cmarquee02.left>=thelength*(-1)){
document.cmarquee01.document.cmarquee02.left-=speed
setTimeout("scrollit()",100)
}
else{
document.cmarquee01.document.cmarquee02.left=300
scrollit()
}
}

window.onload=intializemarquee
</script>

<ilayer width=300 height=20 name="cmarquee01">
<layer name="cmarquee02"></layer>
</ilayer>

I use document.write() to dynamically write out the
<marquee> tag for IE (instead of simply directly embedding it on the page). This is
to avoid future potential problems with NS when and if NS eventually does support the
<marquee>; the code was written exclusively for IE in this respect! Function
initializemarquee() is what’s used to fill the scroller with the desired text for NS. It
first accesses the <ilayer>, then <layer> tag, and finally, it’s
document.write() method to accomplish this.

So there you have it! A cool, cross browser scroller you can
use on your webpage. Finally, I leave you with a few additional examples on the web
regarding DHTML scrollers:

Dynamic
Drive DHTML scrollers

DevEdge
Ticker object
(Requires NS 4+)

Take a peek into their source codes…that’s how you learn!


-Have a question on anything in this article? Email me! This is an open-source article, so you
may include it on your site for the benefit of others, assuming you email me first.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read