Skip to main content

JavaScript Banner Rotator

  • Author:
  • Updated date:

What This Script Does

This free JavaScript banner rotator displays a random, clickable image on your website. It is written in plain JS and does not require any additional libraries like jQuery. The random selection is done client-side, so it's easier on your server, too.

As the rotator script is very basic and does not provide any additional features like click tracking, it will probably be of interest to webmasters just starting out on monetizing their site. Bigger projects might warrant the use of an ad manager - although they're not without downsides either, as they can be pricy and come with additional overhead.

The JavaScript

Place this code within a text file and save it as, let's say, rotator.js:

var banner = [
["", ""],
["", ""],
["", ""],
["", ""]

function shuffle(a) {
    var j, x, i;
    for (i = a.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = a[i];
        a[i] = a[j];
        a[j] = x;
    return a;


document.getElementById('ad-container').innerHTML = '<a href="'+banner[0][0]+'" target="_blank" rel="nofollow"><img src="'+banner[0][1]+'" height="250" width="300" alt="300x250 Banner Ad" /></a>';

The example code contains four banners in an array, which is shuffled as to be random, and outputted into the container, which we'll get to in a moment. You can add as many or as few banners as you like—just replace the with the real link and with the URL of an actual image.

Unlike some similar banner rotator scripts found on the web, this one does not store the entire HTML of the banner in the array, but only the link and the image, which saves memory. The HTML output is at the very bottom of the script and should be edited with your actual banner dimensions (300x250 in the example).


You should have an empty container div with the ID of ad-container somewhere in your HTML, into which the script will dynamically insert the banner:

<div id="ad-container"></div>

The container's dimensions should be specified in CSS so as to avoid browser repaints when the banner is loaded. If you're using 300x250 size banners, for example, you'll want to put the following into your stylesheet:

#ad-container {height:250px;width:300px;}
#ad-container img {border:0;}

Or, just be a heathen and style the container inline:

<div id="ad-container" style="width:300px;height:250px;"></div>

Loading the Script

Now load the script by putting the following anywhere between your <body> tags:

<script src="/rotator.js" async></script>

As the script will be loaded asynchronously thanks to the async attribute, it won't block page rendering, nor is there any need to go out of your way and place it right before the closing </body> tag (although you still can, of course, if you're concerned about those outdated browsers which do not support async).

Responsive Design

If your website is responsive, perhaps the banner's container will be hidden on narrow-enough screens. If that's the case, you should prevent the banner from loading to make your website faster for mobile users. Edit the original rotator script by adding the following check:

if (window.matchMedia("(min-width: 1024px)").matches) {
	//the original script goes here

This will prevent the script from loading a banner unless the screen is at least 1024 pixels wide. Adjust the number to match the media queries in your stylesheet.

Questions & Answers

Question: Would there be an easy way to tie two separate banners together? For instance, a sidebar + a footer banner - if the sidebar gets the first banner chosen, match the footer banner to that array number as well?

Answer: Yes, that would be quite easy. Instead of a link + image in the array, you'd have a link + image + another image. Then at the bottom of the script, you'd call two divs (sidebar and footer) instead of one.

I've made a JSFiddle that should be self-explanatory:

In this example, the destination URL remains the same for both linked banners (300x250 and 160x600), but you can just as easily have a different URL - you would just need to add a fourth entry for each array element (so each would have two different links and two different images).