- From: Bert Bos <bert@w3.org>
- Date: Mon, 7 Apr 2008 19:22:11 +0200
- To: W3C style mailing list <www-style@w3.org>
After the recent discussion here about collapsing lists and other dual-mode (or even multi-mode) elements, I got an action from the CSS WG to write a concrete proposal for a section in CSS. I had started doing that already and here it is. I don't know yet in which module it belongs. css3-links (the Hyperlink Presentation module) probably makes most sense, because dual-mode text is in fact a traditional hypertext style. (This text refers to a 'target' property that is able to make a link inactive, i.e., it's still a link, but no longer a *hyper*link. That property is, of course, just as hypothetical as the dual-mode feature itself.) ----------------------------------------------------------------------- Dual-mode elements (':normal' and ':alternative') ================================================= One of the traditional hypertext behaviors is to expand and collapse elements in place, e.g., to collapse a list or a section, leaving just a small icon or a heading. In the CSS implementation, that behavior is not tied to links, but can be applied to any element. Indeed, the behavior has certain restrictions on the resulting rendering when applied to hyperlinks (see the examples below) that it doesn't have when applied to normal elements. In CSS, the two states are called normal and alternative (':normal' and ':alternative'), rather than collapsed and expanded, because one is not necessarily shorter than the other: they are just different styles. Also, there is no property to specify whether an element starts out collapsed or expanded: it always starts out as ':normal' and the style rules specify how the element looks in that state. The two pseudo-classes are mutually exclusive. An interactive UA should allow the user to designate any visible element and toggle its state to ':alternative' and back again. A typical way would be a mouse click. But if the element is a hyperlink with 'target-name' unequal to ''none'', the UA need not provide such a way. A UA should not allow a user to toggle the state to ':alternative' if that would not change any property of any element in the document. * Example 1. This example shows a collapsing list that starts out in the collapsed state. Note that UAs that do not support the pseudo-classes (such as UAs that support only CSS level 2) will show the list expanded at all times and will never show the + and - minus signs used as list markers. li:normal ul {display: none} li:normal::marker {content: "+"} li:alternative::marker {content: "-"} With a list like this: <ul> <li>First set <ul> <li>Set 1, choice 1 <li>Set 1, choice 2 <li>Set 1, choice 3 </ul> <li>Second set <ul> <li>Set 2, choice 1 <li>Set 2, choice 2 <li>Set 2, choice 3 </ul> </ul> the initial rendering might be like this: + First set + Second set and after activating the second line: + First set - Second set + Set 2, choice 1 + Set 2, choice 2 + Set 2, choice 3 * Example 2. This example shows how the source anchor of a link is replaced by the resource it points to when the link is activated. The resulting replaced element is futher styled with a border around it: a.thumbnail { target: none} a.thumbnail:alternative { content: attr(href, url); border: solid} This might be used, e.g., with a document fragment like this: <a class=thumbnail href="img01"><img src="th01" alt=""></a> The 'target: none' disables the normal behavior of the element as a link. Trying to activate the link will thus have no effect. Instead, the element has an alternative state and in that alternative state it is a replaced element, which, in this case, happens to display the target of the link. Even if the target is a document of the same format as the source (e.g., both are HTML), the result is still a replaced element, i.e., a single box. In particular, it is not possible to replace a word by a sentence this way and have it take part in the inline formatting, including line breaks. * Example 3. Here is an example that collapses a section to just its header. sect:normal * {display: none} /* Hide all children... */ sect:normal h {display: block} /* Except for the H */ sect:normal h:after {content: " ▼"} sect:alternative h:after {content: " ▲"} A document like this <sect> <h>The secret life of blue bees</h> <p>Not many people know that...</p> <p>The blue honey has...</p> </sect> Might look like this initially: The secret life of blue bees ▼ After the user activates the SECT element, it may look like this: The secret life of blue bees ▲ Not many people know that blue bees are a screen of many years with barely a scratch on the inside of the biggest sound effect in London. The blue honey has not lost any of the splendor that the late king acquired when the moon and the earth were of approximately equal size, despite what her mother told the other one. This specification recommends that UAs use the same user actions for activating a link as for toggling the state (e.g., a mouse click). If the user uses that action on an element that is a hyperlink (with 'target-name' unequal to ''none''), then only the hyperlink behavior must be executed. UAs may provide other user actions as well, including some that only do one or the other, e.g., a context-sensitive menu on right clicks. ----------------------------------------------------------------------- Open question: What does the Back button do? Does it undo a switch from normal to alternative? If so, does it also undo a switch from alternative to normal? Does CSS need to say anything about the Back button at all? Bert -- Bert Bos ( W 3 C ) http://www.w3.org/ http://www.w3.org/people/bos W3C/ERCIM bert@w3.org 2004 Rt des Lucioles / BP 93 +33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Monday, 7 April 2008 17:22:53 UTC