Markup languages such as SGML (of which HTML 4.0 is an application)
	and XML (of which HTML 5.0 will be an application) describe a tree
	structure containing the content of the document.  (See Arjun
	Ray's article [alternate
	link] for a good explanation of trees.) The following HTML
	document is indented to show the tree structure.  Each element in the
	document tree contains other elements, content, or a combination
	thereof.  HTML is designed so that markup describes the content, that
	is, an h1 element represents a top-level header, a
	blockquote element represents a quotation, etc.  If HTML
	is used in other ways (using h1 to specify large text,
	using blockquote to indent, etc.), then stylesheets may
	cause unwanted consequences.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
   "http://www.w3.org/TR/REC-html40/strict.dtd">
<html lang="en-US">
  <head>
    <title>
      A Document
    </title>
  </head>
  <body>
    
    <h1>
      About Document Trees
    </h1>
    <p>
      Document trees are wonderful, because they allow:
    </p>
    <ul>
      <li>
        styling of elements
      </li>
      <li>
        scripting of behaviors on elements
      </li>
      <li>
        machines to understand the structure of documents
      </li>
    </ul>
  </body>
</html> 
The vocabulary of markup languages is relevant to CSS, and necessary for understanding how CSS works. Thus I will define the following terms:
<h1>) and an end tag (such as
		</h1>.  It can contain elements or data
		content.
	body element is the parent
		of the h1 element, and the ul element is
		the parent of all of the li elements.
	body element has
		three children, an h1 element, a p
		element, and a ul element.
	html element is the root element.
	This section (as is the section on non-CSS presentational hints) is based partially on an article I wrote on comp.infosystems.www.authoring.html.
Every CSS rule (or ruleset) has selectors and declarations, for example, in:
h1 { 
  font-family: Tahoma, Verdana, Arial, sans-serif;
  }
	The (one) selector is h1 and the (one) declaration is
	font-family: Tahoma, Verdana, Arial, sans-serif;.  Each
	declaration
	has a property and a value (and possibly a weight).  In
	this case, the property is font-family
	and the value is Tahoma, Verdana, Arial,
	sans-serif.  CSS selectors match elements in the document
	tree.  This means that the CSS selector h1 doesn't
	match anything inside an h1 element.  It only matches
	the h1 element.  Many properties, by default, inherit
	from the parent element.  Thus if is no declaration for a property
	that inherits (such as font-family), an element will
	have the same value as its parent did.  However, if another
	declaration for that property has a selector matches an element
	inside the h1 element, the properties declared in the
	rule with that selector will not be inherited from the
	h1 element.  This has nothing to do with specificity or cascading.  Specificity and
	cascading only resolve which value is used when multiple declarations
	of a property have selectors that match a given element.  If there is
	only one declaration that matches, it is used.  This means that if a
	UA style sheet has:
h1 { font-size: 24px; } /* UA stylesheet, specificity 1 */
and an author style sheet has:
div#id1 { font-size: 16px ! important; }  /* author -important, specificity 101 */
you will still get
<div id="d1"><h1>This header is 24px</h1></div>
	even though the div selector is more important than the
	h1 selector in three ways (weight, origin, and
	specificity).  This happens because the h1 selector
	still matches the h1.  The only way to override that is
	to use another selector that actually matches the h1,
	for example "div#d1 h1", "h1", or
	"div#d1 *" (using the universal selector, which causes
	problems in some browsers).
(Up to User Stylesheets Guide, CSS, David Baron)
LDB, dbaron@dbaron.org, 1999-06-15