Publishers of technology books, eBooks, and videos for creative people

Home > Articles

  • Print
  • + Share This
This chapter is from the book

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
<div class="event"><span class="time">6:00pm</span> <span class="title">City
Council Open Forum</span> <span class="loc">Council Chambers</span></div>

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>

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;}


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;}

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;}


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;} {float: right; text-align: center;

      border: 1px solid gray; border-width: 0 0 1px 1px;

      background: #F3F3F3;}

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;} {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;}

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): {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, td.sun {border-width: 0;

      color: gray; background: transparent;}

   td.jun, td.aug {border-width: 0;

      color: gray; background: transparent;}

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 {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;} {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.

  • + Share This
  • 🔖 Save To Your Account

Peachpit Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from Peachpit and its family of brands. I can unsubscribe at any time.


Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about Peachpit products and services that can be purchased through this site.

This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

Collection and Use of Information

To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

Questions and Inquiries

For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

Online Store

For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.


Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites; develop new products and services; conduct educational research; and for other purposes specified in the survey.

Contests and Drawings

Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.


If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email

Service Announcements

On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

Customer Service

We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

Other Collection and Use of Information

Application and System Logs

Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

Web Analytics

Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

Cookies and Related Technologies

This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

Do Not Track

This site currently does not respond to Do Not Track signals.


Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.


This site is not directed to children under the age of 13.


Pearson may send or direct marketing communications to users, provided that

  • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
  • Such marketing is consistent with applicable law and Pearson's legal obligations.
  • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
  • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

Correcting/Updating Personal Information

If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at and we will process the deletion of a user's account.


Users can always make an informed choice as to whether they should proceed with certain services offered by Adobe Press. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive:

Sale of Personal Information

Pearson does not rent or sell personal information in exchange for any payment of money.

While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to

Supplemental Privacy Statement for California Residents

California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

Sharing and Disclosure

Pearson may disclose personal information, as follows:

  • As required by law.
  • With the consent of the individual (or their parent, if the individual is a minor)
  • In response to a subpoena, court order or legal process, to the extent permitted or required by law
  • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
  • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
  • To investigate or address actual or suspected fraud or other illegal activities
  • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
  • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
  • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.


This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

Requests and Contact

Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

Changes to this Privacy Notice

We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

Last Update: November 17, 2020