- From: Brad Kemper <brkemper@comcast.net>
- Date: Sun, 24 Feb 2008 18:57:53 -0800
- To: Andrew Fedoniouk <news@terrainformatica.com>
- Cc: Daniel Glazman <daniel.glazman@disruptive-innovations.com>, www-style <www-style@w3.org>
- Message-Id: <0BCF9735-3696-4752-A59D-61F89C400A99@comcast.net>
On Feb 20, 2008, at 3:12 PM, Andrew Fedoniouk wrote: > If you speak about first <select> on the picture: > http://www.terrainformatica.com/htmlayout/images/tree-view-lines.png > then yes, I do have CSS flags that define folded state. > > :expanded and :collapsed flags (and pseudo-classes). > Behavior (code behind particular widget (DOM element)) just sets/ > resets them. > And CSS does the rest. > > That <select> is defined as: > > <select> > <options expanded>Metals > <options expanded>Alkaline Metals > <option>Lithium <code>Li</code></option> > <option>Sodium <code>Na</code></option> > <option>Potassium <code>K</code></option> > </options> > <options expanded>Transition Metals > <option>Scandium <code>Sc</code></option> > <option>Titanium <code>Ti</code></option> > <option>Vanadium <code>V</code></option> > </options> > </options> > <options expanded>Halogens > <option>Fluorine <code>F</code></option> > <option>Chlorine <code>Cl</code></option> > <option>Bromine <code>Br</code></option> > </options> > </select> > And style looks like: > > select options:collapsed > :not(:first-child) > // normally all items inside options are hidden > // except the very first one - it is a caption of the > option group > { > visibility:collapsed; > } > select options:expanded > option, > select options:expanded > options // but in expanded state > allsubitems are shown > { > visibility:visible; > display: list-item; > list-style-type: tree-line; > outline-color:red; > } Andrew, you began by talking about list-style-type for a tree view, but you seem to imply that it could be used with a SELECT menu, not just a traditional list. It is pretty interesting to think of a SELECT menu as just a special kind of list, one in which each option is like an "LI" that behaves like a radio button. If that were the case, then "list-style-type" could make it into a tree list, some pseudo-classes and state information could make the tree folded or expanded, and "appearance: pop-up-menu" could make it more like a traditional SELECT. I would rather see "optgroup" with labels used instead of the non- standard "options". One OPTGROUP within another (not currently allowed in HTML 4.1, AFAIK) would create multiple nestings of tree branches if the SELECT is acting as a tree view control, and in a traditional SELECT pop-up menu would further indent or could even conceivable act as hierarchical sub-menus. This would be a good way of bringing fuller stylability to SELECT menu options, if SELECTs, OPTGROUPs, and OPTIONs could be styled using all of the CSS that can be applied to UL/OLs, nested UL/OLs, and LIs. Conversely, if a SELECT is a kind of list, then any list full of option buttons could be turned into a SELECT via CSS. For instance, if I wanted a list to behave as a SELECT (not including its radio-button-like features), I should conceivably be able to do this: UL { appearance: pop-up-menu; } The following (typical OS-common styling) would be included in the UA's style sheet for this appearance (includes "active" pseudo-class to work with UL, and some suggested new appearances), but could be overridden by the author (or user) by using the same selectors: UL::outside, SELECT:not([size]), SELECT[size=1] { /* closed pop-up */ content: attr(title); position: relative; /* color, etc. for the default, closed "SELECT" element */ } UL { /* the menu itself, before being revealed */ height: 0; overflow:hidden; /* can't use "display:none" because */ /* it would also hide the "::outside" elements */ } UL:active, SELECT:not([size])::choices , SELECT[size=1]::choices { /* (open pop-up menu) */ /* (for "::choices", see [1]) */ appearance:menu-list; position:absolute; height: auto; /* Actual position and height and overflow */ /* would be UI-specific when this appearance is used, */ /* or the author could override. */ /* Scrolling mechanism for this appearance is OS-specific: /* (top/bottom triangles on Mac, tiny scrollbars on Windows, etc. ). */ /* Some non-Mac OS's would use max-height to get a scroll-bar */ /* Open menu for this appearance can extend beyond the window */ /* as normal open menus do, but should then */ /* ignore author changes to width, position, */ /* negative margin, etc., to avoid chrome spoofing */ } UL LI, SELECT OPTION { appearance: menu-item; } UL:active UL, OPTGROUP { appearance: option-group; height: auto; /* "margin-left" or "padding-left" or "left" to handle left offset according to OS UI */ } UL:active UL:before { appearance: menu-divider; /* some element with a single border as per the OS UI */ } UL UL[title]:before, OPTGROUP[label]:before { content: attr(label), attr(title); appearance: option-group-label; } Colors, padding, borders, etc. could be specified on the LI's, but would default to those provided by the OS appearance (or you could use "appearance:normal" if you wanted to roll your own). To make each embedded UL (option-group equivalent) into a hierarchical menu, the author could add the following: UL UL, SELECT:not([size]) OPTGROUP, SELECT[size=1] OPTGROUP { appearance: sub-menu; } UL:active UL:before, SELECT:not([size]) OPTGROUP:before, SELECT[size=1] OPTGROUP:before { content: attr(label), attr(title); appearance: sub-menu-opener-item; } UL:active UL, SELECT:not([size]) OPTGROUP, SELECT[size=1] OPTGROUP { height: 0; overflow:hidden; } UL:active UL, SELECT:not([size]) OPTGROUP::choices, SELECT[size=1] OPTGROUP::choices { height: auto; position:absolute; /* "top" and "left" for sub-menu appearance is OS-specific */ } If you had all of the above, then for radio-button-like features in a list that is styled as a SELECT, you could do this; <UL> <LI><LABEL><INPUT type="radio" name="menuchoices" />Choice 1</ LABEL></LI> <LI><LABEL>INPUT type="radio" name="menuchoices" />Choice 1</LABEL></ LABEL></LI> <LI><LABEL>INPUT type="radio" name="menuchoices" />Choice 1</LABEL></ LABEL></LI> </UL> Then, instead of styling the LI as the menu item, you would style the label as the menu item: UL LABEL { appearance: menu-item; } The UA would then automatically use use a menu-style check-mark (instead of a traditional radio button look) for any checked radio button within any element with a menu-item appearance (and a blank area for the unchecked state). If authors didn't want to use the OS appearance for the menu item, or wanted to override the appearance of the check-mark, then they would need to know how create their own check marks by re-styling the radio button. It would be fairly easy, if the UA had a built in style sheet for radio buttons like the following: input[type=radio] { background: transparent url(radiobutton.png) no- repeat; width:12px; height;12px; } input[type=radio]:active { background-image: url (radiobutton_pushed.png); } input[type=radio]:checked { background-image: url (radiobutton_checked.png); } Then you could imagine the following for SELECT OPTIONs: SELECT OPTION { background-image: none; width:12px; height;12px; } SELECT OPTION:checked { background-image: url(checkmark.png); } So if you wanted the above HTML to be styled like a menu item, you could do this: UL LI input[type=radio] { background-image: none; } UL LI input[type=radio]:active { background-image: none; } UL LI input[type=radio]:checked { background-image: url (checkmark.png); } UL LI input[type=radio]:checked:active { background-image: url (checkmark.png); } [1] http://www.w3.org/TR/2004/CR-css3-ui-20040511/#pseudo-choices
Received on Monday, 25 February 2008 02:58:06 UTC