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.



Comments

  • Very good!

    Posted by Legacy on 01/03/2000 12:00am

    Originally posted by: John Zhang

    Very good work. It is small, clean, and includes everything I (everyone?) need to know.

    thanks

    Reply
  • MFC?

    Posted by Legacy on 12/18/1999 12:00am

    Originally posted by: Christian Skovdal Andersen

    Nice article, but exactly how is it related to MFC?


    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

  • Recently, Forrester Consulting conducted a Total Economic Impact™ (TEI) study to better understand the impact of incorporating Polycom voice solutions with Microsoft Lync. Forrester interviewed a company that had already deployed the Lync/Polycom combination to determine its potential return on investment (ROI). Microsoft Lync provides presence information and promotes voice and video collaboration. Polycom extends the benefits of Lync with voice endpoints and further enables collaboration in multiple …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds