- Project Goals
- Preparation
- Laying the Groundwork
- Styling the Document
- Working with a More Detailed Calendar
- Branching Out
Working with a More Detailed Calendar
Having shown the resulting calendar to the clients, they've approved it enthusiastically. Now they want us to give the same treatment to their detailed monthly calendar, which lists the events that are happening throughout the month. This will be generated from the same database that produced the smaller calendar. Therefore, the markup will be consistent with what we already know. Let's apply the styles we already wrote to this new calendar and see what we get (see Figure 3.14).
Figure 3.14 The larger calendar with the styles from Listing 3.1.
Already it would seem that we have our work cut out for us. Although the larger calendar makes full use of the work we've already done, there is much more information here, and it will have to be styled in a way that makes sense.
Dissecting a Day
Before we start styling the events in this calendar, we have to understand how the information in a given day is structured. We'll look at July 15 because it contains two events, one of which (the Children's Hour) appears to be recurrent:
<td class="jul mon"> <div class="date">15</div> <div class="event recur"><span class="time">2:00pm</span> <span class="title">Children's Hour</span> <span class="loc">Main Street Public Library</span></div> <div class="event"><span class="time">6:00pm</span> <span class="title">City Council Open Forum</span> <span class="loc">Council Chambers</span></div> </td>
There are three important things to notice here:
- The date (15) is now enclosed in a div with a class of date.
- Every event is contained in a div.
- The pieces of an event—the time, the title, and the location—are all wrapped in appropriately classed span elements.
We can use all of these things to our advantage.
Looking over the calendar again, we can see that every day has exactly the same kind of information, so we can assume it's marked up in a similar way. Well, there is one exception: July 4th, which has the text "Independence Day (U.S.)" in the cell. That might be an event, but then again it might not. Let's look:
<td class="jul thu holiday"> <div class="date">4</div> <div class="event"><span class="time">10:00am</span> <span class="title">4th of July Parade</span> <span class="loc">Main Street</span></div> <div class="event"><span class="time">9:30pm</span> <span class="title">Fireworks!</span> <span class="loc">Meadowlands Park</span></div> <div class="holiday">Independence Day (U.S.)</div> </td>
Ah-ha! The text is contained in a div that has a class of holiday. We'll need to keep that in mind as we go about styling the calendar.
Global Changes
Our first order of business should be to bring consistency to the placement of information in each day. This will mean taking out a few declarations even as we add others.
For example, the declarations that make all table-cell text gray and right–aligned are no longer appropriate. We should also top align all of the content so that the date is always on the top line of the cell. In the old days, this was done with the HTML attribute valign, but CSS enables us to do the same thing without having to add an attribute to every row (or cell):
table#calendar tr#title th {background: #AAC; color: black; border: 1px solid #242; font-size: 120%;} table#calendar td {vertical-align: top; /* we removed "color: #777; text-align: right" */ border: 1px solid gray; border-color: #BBB #EEE #EEE #BBB;} table#calendar td.sat {border-right: 1px solid #BBB;}
Let's also add some margins to the divs so that they don't run together any more. We don't want to add too much space, so half an em is just the right amount (see Figure 3.15):
table#calendar td#jul16 {background-color: yellow; border: 1px solid black;} div.event {margin: 0.5em;} </style>
Figure 3.15 Just a little bit of margin helps keep the events distinct from each other.
Blocking the Spans
Now that we have the events separate from each other, we ought to make the contents look a little better. Right now the information sort of runs together, and it's hard to tell where one type of information ends and the next begins.
As you might recall, the time, title, and location of each event are enclosed in span elements. The first thing to do is convert these spans into block-level elements so that each one creates a line break at the end of the element.
div.event {margin: 0.5em;} div.event span {display: block;} </style>
Now we can more easily style the time, title, and location. Let's try boldfacing the time and making the location text italicized and dark gray (see Figure 3.16):
div.event span {display: block;} span.time {font-weight: bold;} span.loc {color: #555; font-style: italic;} </style>
Figure 3.16 Events are much easier to understand now that the bits of information are styled in distinct ways.
Cornering Our Dates
Much as it might sound like a social event gone horribly wrong, date cornering is almost required for calendars of this kind. It's expected that the date will be in one of the top corners of the box, with the actual events of the day flowing past the date. Sounds a lot like the date is a floated element, actually. So let's float the dates into the right corner of each date box and give them borders and a background (see Figure 3.17):
span.loc {color: #555; font-style: italic;} div.date {float: right; text-align: center; border: 1px solid gray; border-width: 0 0 1px 1px; background: #F3F3F3;} </style>
Figure 3.17 By floating the dates, we both compact the calendar and make it look more like a print calendar.
It's a good start, but we can already see things that need to be corrected. The borders are a little too snug against the numbers, for starters. We can beef up the floated date box with padding and set the margin to zero in the bargain:
span.loc {color: #555; font-style: italic;} div.date {float: right; text-align: center; border: 1px solid gray; border-width: 0 0 1px 1px; padding: 0.125em 0.25em 0 0.25em; margin: 0; background: #F3F3F3;} </style>
A bigger problem is that the date boxes on weekends (and those in June and August) don't match their backgrounds. Plus they don't really need the borders. The most sensible choice is to write rules that override the properties that need to be different (see Figure 3.18):
div.date {float: right; text-align: center; border: 1px solid gray; border-width: 0 0 1px 1px; padding: 0.125em 0.25em 0 0.25em; margin: 0; background: #F3F3F3;} td.sat div.date, td.sun div.date {border-width: 0; color: gray; background: transparent;} td.jun div.date, td.aug div.date {border-width: 0; color: gray; background: transparent;} </style>
Figure 3.18 The date boxes look a lot better with a little padding, and the dates in June and August aren't an eyesore any more.
By setting all of the date-box borders in June and August to have zero width, we effectively turn them off. Making the backgrounds transparent enables the table-cell background color to shine through. This will be useful if, for example, a later revision of the site changes the background colors for weekend days.
Restructuring the Grid
Because the calendar has expanded, the "inset" look to the cell borders seems a little too washed out. Let's change the way they're drawn by going from an all-four-sides border to a two-sides border. Let's also make sure there's no padding on the table cells.
table#calendar tr#title th {background: #AAC; color: black; border: 1px solid #242; font-size: 120%;} table#calendar td {vertical-align: top; padding: 0; border: 0px solid gray; border-width: 0 0 1px 1px;} /* we deleted "border: 1px solid gray; border-color: #BBB #EEE #EEE #BBB" */ table#calendar td.sat {border-right: 1px solid #BBB;}
Now only the left and bottom borders are being drawn for most cells. However, some cells (like holidays and non-July days) still have rules to style all four borders. As a result, we need to change or get rid of the holdovers (see Figure 3.19).
table#calendar td {vertical-align: top; padding: 0; border: 0px solid gray; border-width: 0 0 1px 1px;} /* deleted "border: 1px solid gray; border-color: #BBB #EEE #EEE #BBB" */ table#calendar td.sat {border-right: 1px solid gray; } /* changed the color from "#BBB" to "gray" */ table#calendar td.jun, table#calendar td.aug { background: #AAB; color: #889;} /* deleted "border: 1px solid #AAB; border-right-color: #99A" */
Figure 3.19 Tightening up the grid makes the calendar look a lot more cleanly drawn.
A Few Last Touches
Before we close out this phase of the project, let's do a few small things to make the calendar look even better.
Throughout the project, we've ignored the fact that the columns are of varying width. We could leave it that way—after all, one of the strengths of the Web is its fluidity—but let's set regular widths. Because the weekends are always empty, though, we might as well leave them skinny. If we set the Saturday and Sunday columns to each be 5% of the width of the table, that would leave us with 90% to be divided among five columns, which results in 18% each. To keep things simple, we can set the column width by setting the width of the cells in the "days" row:
table#calendar a {text-decoration: none;} tr#days th {width: 18%;} tr#days th.sat, tr#days th.sun {width: 5%;} table#calendar tr#days th {color: #CCE; background-color: #224; font-weight: bold; text-align: center; padding: 1px 0.33em;}
Although the current date is fairly well highlighted with its yellow background, let's take it one step further by boldfacing the text and coloring it dark red while also making the background of the date a light yellow:
table#calendar td#jul16 {background-color: yellow;} td#jul16 div.date {color: #C33; font-weight: bold; background: #FFC;} div.event {margin: 0.5em;}
To conform to widespread calendar conventions, let's italicize the text that names holidays. Thus, the text "Independence Day (U.S.)" will be in italics:
div.event span {display: block;} div.holiday {font-style: italic;} span.time {font-weight: bold;}
Finally, as a dollop of icing on our already well-styled cake, let's add an image of a firecracker to the background of the whole calendar:
<style type="text/css"> table#calendar {background: white url(fwork.gif) center no-repeat;} table#calendar a {text-decoration: none;}
We're applying the background image to the table so that it can be centered, more or less, within the grid. We could shift it around by changing the position values, but centering it in the table seems like the best move.
All of these changes, taken together, create the effect of a print calendar on the Web (see Figure 3.20).
Figure 3.20 The columns are more regular, the current date is more obvious, the holiday is labeled in italics, and there's clip art in the background. All is right with the world.