Cascading Style Sheets (CSS): Absolute Positioning
Cascading Style Sheets (CSS): Absolute Positioning
In our previous articles, we covered the basic anatomy of a CSS style sheet, and the techniques for formatting text using them. In fact, CSS can do some other tricks as well.
Although graphic designers have long complained that it's not possible to absolutely position a graphic on a page by using HTML, CSS has a solution to that problem.
First, let's look at one more type of selectorthe ID selectorand a few new properties:
1. #smduck1 { 2. position: absolute; 3. top: 0px; 4. left: 0px; 5. z-index: 1; } 1. #smduck1 {
The ID selector always begins with a hash mark (#) and must be unique within the document. That means that you can only define it once, and can only use it once (see the following sidebar, "ID versus CLASS"). It works almost exactly like the class selector (.), but is usually used for absolute positioning of objects on a page, where only one object will have any single position.
2. position: absolute;
The position property can be either absolute or relative. Use absolute for objects that you want to have at a specific position on the page, and relative for objects that you want to position relative to wherever they would have otherwise fallen. We used absolute positioning in this example to position the graphic at a specific point on the page. We'll see an example of relative a little later.
3. top: 0px; 4. left: 0px;
The top and left properties are used to position the object. These measurements are absolute measurementsfrom the top-left corner of the screenwith no padding. This style will place the graphic in the absolute upper left-hand corner of the screen.
5. z-index: 1;
Objects that are put on the screen with absolute positioning can be laid on top of each other. The z-index property tells the browser which objects should be on top of (or under) other objects. Higher-numbered objects will overlay lower-numbered objects.
Figure 1 shows a page that uses the style we just defined, along with this HTML:
<HTML> <HEAD> <TITLE>Absolute Positioning: Simple</TITLE> <STYLE> #smduck1 { position: absolute; top: 0px; left: 0px; } </STYLE> <BODY> 1. <DIV ID="smduck1"> <IMG SRC=revgreentile.gif WIDTH=50 HEIGHT=50></DIV> </BODY> </HTML>
Figure 1 css-abs1.html: That GIF is right up against the corner!
1. <DIV ID="smduck1"> <IMG SRC=revgreentile.gif WIDTH=50 HEIGHT=50></DIV>
Notice the use of the DIV element that encloses the IMG. The DIV tag has an attribute, called ID, which is used to specify the selector in the style. The DIV element is necessary to make the absolute positioning work.
The little image in this example is 50 [ts] 50 pixels in size, so we should be able to lay another one right on its lower right-hand corner (see Figure 2) by positioning it 50 pixels in and down:
<HEAD> <TITLE>Absolute Positioning: Simple</TITLE> <STYLE> #smduck1 { position: absolute; top: 0px; left: 0px; z-index: 0; } #smduck2 { position: absolute; top: 50px; left: 50px; z-index: 0; } </STYLE> <BODY BGCOLOR="#999966" BACKGROUND="greentile.gif"> <DIV ID="smduck1"> <IMG SRC=revgreentile.gif WIDTH=50 HEIGHT=50></DIV> <DIV ID="smduck2"> <IMG SRC=revgreentile.gif WIDTH=50 HEIGHT=50></DIV> </BODY>
Figure 2 css-abs1a.html: Another perfectly positioned image.
In this example, we also added a 50[ts]50 tiled background so that you can better see the perfect alignment of the images against a repeating background.
ID versus CLASS
On the surface, the ID and CLASS selectors seem so similar that it makes us wonder why there are two different methods for the same thing!
As best we can determine, the only difference is that it is considered an error to use the same ID selector more than once. Validation enginesand some future browsersmay flag errors on duplicate ID selectors.
DIV and Absolute Positioning
According to the specification, you should be able to forgo the DIV tag and use the ID attribute directly in the IMG tag, but the current crop of browsers will not perform absolute positioning without the DIV tag. This is one of those areas that will likely change in the next generation of browsers.
Layering Text and Images
By extending these same techniques to a mixture of text and graphics, we can create a nice effect that requires very little bandwidth. This example is a little complex, but keep in mind that we've already seen all the techniques involved.
Let's first take a look at the result (shown in Figure 3) and then see what it takes to do this.
Figure 3 css-abs2.html: Overlapping text and a simple graphic make a nice splash page.
This example is basically just 20 copies of the text "ducks in a row" using the Verdana font and a number of different overlapping browser-safe colors, covered with a black oval cut-out duck and one more "ducks in a row" in black.
<HTML> <HEAD> <TITLE>Absolute Positioning: Complex</TITLE> <STYLE TYPE="text/css"> 1. H1 { font-family: verdana; font-weight: bold; font-size: 52px; color: black; } 2. H2 { font-family: verdana; font-weight: bold; font-size: 32px; } 3. #words1 { position: absolute; top: 50px; left: 50px; z-index: 1; } 4. #words2 { position: absolute; top: 60px; left: 90px; z-index: 2; } 5. .ovalduck { position: absolute; top: 35px; left: 30px; z-index: 3; } 6. .ducktitle { position: absolute; top: 130px; left: 0px; } 7. .duck1 { color: #999900; } .duck2 { color: #FFCC00; } .duck3 { color: #FF9933; } .duck4 { color: #FF6633; } .duck5 { color: #FF9933; } 8. #w00 { position: absolute; top: 112px; left: 52px; } #w01 { position: absolute; top: 24px; left: 45px; } #w02 { position: absolute; top: 95px; left: 62px; } #w03 { position: absolute; top: 142px; left: 138px; } #w04 { position: absolute; top: 128px; left: 74px; } #w05 { position: absolute; top: 63px; left: 122px; } #w06 { position: absolute; top: 79px; left: 36px; } #w07 { position: absolute; top: 158px; left: 29px; } #w08 { position: absolute; top: 83px; left: 146px; } #w09 { position: absolute; top: 42px; left: 12px; } #w10 { position: absolute; top: 112px; left: 52px; } #w11 { position: absolute; top: 24px; left: 45px; } #w12 { position: absolute; top: 95px; left: 62px; } #w13 { position: absolute; top: 142px; left: 138px; } #w14 { position: absolute; top: 128px; left: 74px; } #w15 { position: absolute; top: 63px; left: 122px; } #w16 { position: absolute; top: 79px; left: 36px; } #w17 { position: absolute; top: 158px; left: 29px; } #w18 { position: absolute; top: 83px; left: 146px; } #w19 { position: absolute; top: 42px; left: 12px; } </STYLE> </HEAD> <BODY BGCOLOR="#FFFFCC" TEXT="#663333" LINK="#006699" VLINK="#006699"> 9. <DIV ID="words1"> <H2 CLASS="duck1"><SPAN ID="w00">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w01">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w02">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w03">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w04">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w05">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w06">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w07">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w08">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w09">ducks in a row</SPAN></H2> </DIV> 10. <DIV ID="words2"> <H2 CLASS="duck5"><SPAN ID="w10">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w11">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w12">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w13">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w14">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w15">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w16">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w17">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w18">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w19">ducks in a row</SPAN></H2> </DIV> 11. <DIV CLASS="ovalduck"> <IMG SRC="blackoval.gif" width=269 height=136> <H1><SPAN CLASS="ducktitle">ducks in a row</SPAN></H1> </DIV> </BODY> </HTML>
The HTML file is only 3K and the GIF is only 900 bytes! There are no techniques used here that you haven't already seen in this or previous articles.
1. H1 { font-family: verdana; font-weight: bold; font-size: 52px; color: black; }
This defines the style for the H1 element, used for the black "ducks in a row" on the top.
2. H2 { font-family: verdana; font-weight: bold; font-size: 32px; }
This defines the base style that is used for all the overlapping "ducks in a row" strings.
3. #words1 { position: absolute; top: 50px; left: 50px; z-index: 1; }
This defines the ID used for the first layer of words in [9].
4. #words2 { position: absolute; top: 60px; left: 90px; z-index: 2; }
This defines the ID used for the second layer of words in [10].
5. .ovalduck { position: absolute; top: 35px; left: 30px; z-index: 3; }
This defines the position used for the black oval duck image and black type in [11].
6. .ducktitle { position: absolute; top: 130px; left: 0px; }
This positions the title relative to the image in [11].
7. .duck1 { color: #999900; } .duck2 { color: #FFCC00; } .duck3 { color: #FF9933; } .duck4 { color: #FF6633; } .duck5 { color: #FF9933; }
These classes define colors for the overlapping "ducks in a row" strings.
8. #w00 { position: absolute; top: 112px; left: 52px; } #w01 { position: absolute; top: 24px; left: 45px; } #w02 { position: absolute; top: 95px; left: 62px; } #w03 { position: absolute; top: 142px; left: 138px; } #w04 { position: absolute; top: 128px; left: 74px; } #w05 { position: absolute; top: 63px; left: 122px; } #w06 { position: absolute; top: 79px; left: 36px; } #w07 { position: absolute; top: 158px; left: 29px; } #w08 { position: absolute; top: 83px; left: 146px; } #w09 { position: absolute; top: 42px; left: 12px; } #w10 { position: absolute; top: 112px; left: 52px; } #w11 { position: absolute; top: 24px; left: 45px; } #w12 { position: absolute; top: 95px; left: 62px; } #w13 { position: absolute; top: 142px; left: 138px; } #w14 { position: absolute; top: 128px; left: 74px; } #w15 { position: absolute; top: 63px; left: 122px; } #w16 { position: absolute; top: 79px; left: 36px; } #w17 { position: absolute; top: 158px; left: 29px; } #w18 { position: absolute; top: 83px; left: 146px; } #w19 { position: absolute; top: 42px; left: 12px; }
These are all the positions for the "ducks in a row" strings.
9. <DIV ID="words1"> <H2 CLASS="duck1"><SPAN ID="w00">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w01">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w02">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w03">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w04">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w05">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w06">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w07">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w08">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w09">ducks in a row</SPAN></H2> </DIV>
There are two layers of overlapping strings, and this is the first one. The DIV element is used to position the block absolutely on the page. Each of the SPAN elements positions an individual string within the block. The H2 elements have the font and size for the strings, and the duck15 classes have the varying colors.
Because we didn't use the z-index property, the layering occurs in the same order that the text appears in the HTML file. You only need to use z-index when you want to specify a particular order. In this example, we don't really care about the order of the layers, as long as they're layered.
10. <DIV ID="words2"> <H2 CLASS="duck5"><SPAN ID="w10">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w11">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w12">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w13">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w14">ducks in a row</SPAN></H2> <H2 CLASS="duck5"><SPAN ID="w15">ducks in a row</SPAN></H2> <H2 CLASS="duck1"><SPAN ID="w16">ducks in a row</SPAN></H2> <H2 CLASS="duck4"><SPAN ID="w17">ducks in a row</SPAN></H2> <H2 CLASS="duck2"><SPAN ID="w18">ducks in a row</SPAN></H2> <H2 CLASS="duck3"><SPAN ID="w19">ducks in a row</SPAN></H2> </DIV>
This works exactly like [9], and gets overlapped on top of it to provide a more random appearance than just one layer of 10 strings.
11. <DIV CLASS="ovalduck"> <IMG SRC="blackoval.gif" width=269 height=136> <H1><SPAN CLASS="ducktitle">ducks in a row</SPAN></H1> </DIV>
Finally, the oval duck and the black letters are layered on top of the rest, using the classes from [5] and [6] that you saw previously.
As we said, this is a complex example that applies all the elements we learned in this series of articles. It's intended to demonstrate the power of style sheets, but it is not really intended for a production Web site. There are still too few browsers that understand CSS, and we believe that the specification will change significantly before it is really ready for widespread use.