Book HomeCascading Style Sheets: The Definitive GuideSearch this book Sunday 23rd of November 2014 10:51:05 PM

Chapter 8. Visual Formatting


Basic Boxes
Block-Level Elements
Floated Elements
Inline Elements

In the previous chapter, we covered a great deal of information on how CSS handles the visual formatting of a document. However, we did this in a mostly practical fashion: lots of explanation about how things work, with only a little lip service paid to the questions of why. In this chapter, we turn to the theoretical side of visual rendering, with only occasional references to the practical.

You may wonder why it's necessary to spend an entire chapter on the theoretical underpinnings of visual rendering in CSS. The main reason is to cover all the bases. I attempted to provide as many and varied examples as possible in the previous chapters, but with a model as open and powerful as that contained within CSS, no book could hope to cover every possible way of combining properties and effects. Every reader of this book will obviously go on to discover new ways of using CSS for their own document effects.

In the course of so doing, you may encounter what seems like strange behavior on the part of user agents. With a thorough grasp of how the visual rendering model works in CSS, you'll be able to determine whether the behavior is a correct (if unexpected) consequence of the rendering engine CSS defines or whether you've stumbled across a bug that needs to be reported. (See Appendix A, "CSS Resources", for details on how to report problems with rendering engines.)

8.1. Basic Boxes

In the rendering of elements, CSS assumes that every element

Figure 6-37

Figure 6-37. Placing the background image in the top right corner of the browser window

If only one keyword appears, then the other is assumed to becenter. Table 6-1 showsequivalent keyword statements.

Table 6-1. Position Keyword Equivalents Percentage values

Closely related to the keywords are generates one or more rectangular boxes, called element boxes . (Future versions of the specification may allow for nonrectangular boxes, but for now everything is rectangular.) Each element box consists of a content area at its core. This content area is surrounded by optional amounts of padding, borders, and margins. These are considered optional because all could be set to a width of zero, effectively removing them from the element box. An example content area is shown in Figure 8-1, along with the surrounding regions of padding, border, and margins.

Figure 8-1

Figure 8-1. The content area and its surroundings

Each of the margins, borders, and padding can be set using various properties, such as margin-left or border-bottom. The content's background (for example, a color or tiled image) is also applied to the padding, while the margins are always transparent, allowing the background of any parent elements to be visible. In effect, the margins simulate the HSPACE and VSPACE attributes of images, although in a much more sophisticated fashion. Padding cannot be set to a negative value, but margins can. The effects of negative margins are explored later in this chapter.

The borders, on the other hand, have their own rules. Borders are generated using defined styles, such as solid or inset, and their color can be set using the border-color property. If no color is set, then the color of the border is based on the foreground color of the element's content. For example, if the text of a paragraph is white, then any borders around that paragraph will be white, unless a different border color is explicitly declared by the author. If a border style has "gaps" of some type, then the element's background is visible through those gaps; in other words, the border has the same background as the content and padding. Finally, the width of a border can never be negative.

There are differences in how different types of elements are formatted, however. Block-level elements are not treated in the same way that inline elements are, for example, and floated elements introduce a whole new level of complexity. Let's examine each type of element in turn.

7.8. SummaryBook Index8.2. Block-Level Elements

Library Navigation Links

Copyright © 2002 O'Reilly & Associates. All rights reserved.

Another thing to note is that since each of these"border-side" properties applies only to a specific side,there isn't any possibility of value replication -- itwouldn't make any sense. There can only be one of each type ofvalue: that is, only one width value, only one color value, and onlyone border style. So don't try to declare more than one valuetype:

H3 {border: thin thick solid purple;}  /* two width values--WRONG */

In such a case, the entire statement will be invalid and should bethis section use background colors for all elements. That's because if they did, content might get overwritten by the background color of a following element. The CSS specification does not say what should happen when elements overlap in this manner; instead, it's left up to implementors to decide.

It has been argued that all foreground content is always shown "in front of " all background content, and the behavior of floated elements seems to support this interpretation. On the other hand, the CSS2 property z-index makes this

Further compounding the problem is that rect(...)only accepts length units and auto. The additionof percentage units as valid rect(...) valueswould go a long way toward improving things, and hopefully a futureversion of CSS will add this capability.

This property can be used to clip the element with a simpleintersection operation. The area of the element contained within theclip rectangle is displayed, and any parteffect on the image's inline box, which is in this case30px tall.

Nonetheless, an inline replaced element still has a value forline-height. Why? In order to be able to correctlyposition the element if it's been vertically aligned. Recallthat, percentage values for vertical-align arecalculated with respect to an element's line height. Thus:

P {line-height: 18px;}


Although most CSS-awarebrowsers (Explorer 4.x and 5.xand Opera 3.5 and later) honor negative background positions, theeffects are wildly unpredictable at best. This applies even tonegative lengths, which can cause unwanted tiling, inappropriatepositioning of the background images, and more. If you really need toset a single background image so that it's hanging off thepage, you're probably better off producing an image that isalready cut off and just putting it in the top left corner.