W3C home > Mailing lists > Public > www-style@w3.org > July 2011

Re: [css3-lists] Published as WD!

From: Anton Prowse <prowse@moonhenge.net>
Date: Sun, 03 Jul 2011 11:40:04 +0200
Message-ID: <4E1038F4.8020904@moonhenge.net>
To: www-style list <www-style@w3.org>
CC: "Tab Atkins Jr." <jackalmage@gmail.com>, Brad Kemper <brad.kemper@gmail.com>
Sorry for my late entry into this conversation!  Nice work on the Lists 
module, Tab.

The things that caught my attention on my initial complete read-throughs 
were already queried by Brad, as it happens:

On 28/05/2011 01:36, Tab Atkins Jr. wrote:
> On 27/05/2011 08:26, Brad Kemper wrote:
>> On May 26, 2011, at 5:52 PM, Tab Atkins Jr. wrote:
>>> On Thu, May 26, 2011 at 10:45 AM, Brad
>>> Kemper<brad.kemper@gmail.com>  wrote:

>>> All properties apply to ::marker - it's basically equivalent to
>>> ::before.

Really? What happens to the properties that ordinarily influence
position and flow, such as display, position, float, clear etc? Are they
merely ignored? Because it sounds like 'list-style-position' wants to
have complete control over positioning, and it's not possible eg to
float or abspos a marker.

>> Hmm. If it is always positioned, what happens if I declare ::marker
>> { position: static; }? Does it become 'list-style-position:inside'?
>> If nothing changes, because it is always positioned, then you
>> should probably say so in the spec. For added clarity, if nothing
>> else.
> Yes, it essentially becomes 'inside', as that's the element-tree
> position of the ::marker. The actual value of list-style-position
> doesn't change, of course.

I don't think I follow, but that's probably because I don't understand
why 'position' would be honoured at all; see above.

Also, from Section 6:

   # The value of ‘list-style-position’ on the marker's superior parent 
can vary the marker's directionality and the initial value of its 
‘position’ property.

Again, I don't understand the reference to the 'position' property (nor 
what is meant by "an element's initial value of its 'position' property").

(I won't comment on the "static position" discussion until I've 
understood this!)

>>>>> 3. The 'inline' value for 'list-style-type' was added,
>>>>> alongside the new (well, repurposed) 'marker' value for
>>>>> 'display'.  Using these in concert makes the first element
>>>>> with display:marker use its text contents as the marker
>>>>> value.  This is useful for documents where the list marker is
>>>>> a vital part of the content, and so must be included inline
>>>>> to ensure that it is displayed properly even when CSS is
>>>>> missing.
>>>>
>>>> I like the idea, but I think it is backwards. The way you have
>>>> it, the 'display' property has this one value that pushes the
>>>> content into a marker, but only under very limited
>>>> circumstances, and with a fallback that might not always be
>>>> appropriate. I think instead, the ::marker should pull the
>>>> content into its 'content' property (something like
>>>> 'content:select-first-within(.myMarkers)'), where it can be
>>>> combined with other images and text if desired, and where it
>>>> can have its own 'display' properties set to whatever (maybe to
>>>> 'table-cell' with some height and border and padding and
>>>> background, for example), and where there is not the idea of
>>>> candidates. Pulling it into ::marker would mean that it would
>>>> only be styled there and by inheritance, and not by anything
>>>> that selected it before it was pulled. Thus avoiding confusion
>>>> like this:
>>>>
>>>> li .myMarker { display: marker; color:red; } li::marker {
>>>> display: block; color:green; }
>>>>
>>>> I want ::marker to be what sets the properties, without having
>>>> to override the other selectors or use !important.
>>>
>>> Hmm.  I may need to make it clearer, but that's the intention
>>> already. Using an inline marker just (1) suppresses the display
>>> of the element, and (2) makes the default contents of ::marker be
>>> the textual contents of the element.  The ::marker then has
>>> completely control over the styling, because its contents are
>>> freshly generated and separate from the display:marker element.
>>
>> I still think that is kinda weird to do it that way. You use normal
>> selectors to select the marker you want as a candidate, in order to
>> give it a very special 'display' value; but if that value is
>> successful in advancing the candidate then all other properties
>> (other than 'display') set on the element are ignored. As is the
>> 'display' value, actually, since that is whatever ::marker says it
>> is (initial value 'inline-block').
>>
>> And you still can't add parentheses or arrow glyphs or bullets or
>> anything to it.
>>
>> I would rather see it pulled in via the 'content' property instead
>> of pushed via 'display'. No candidates, just whatever single
>> descendant of the list item that the 'content' value pulls in via a
>> selector. Having a mechanism to do that (grab content from a
>> descendant to use in a pseudo element's content) might even be
>> useful for other things too. The fallback for other 'candidates'
>> would be better too, as they could have whatever 'display' value is
>> desired.
> Okay, slight rethink. The entire purpose of display:marker, as I
> said above, is to take an inline element and give it the same
> positioning behavior as a real marker. In all other respects, there's
> no difference between using ::marker and using a real element.
>
> What if, then, we just address the positioning issue directly?
> Define the value "position:marker", which is identical to 'absolute',
> but sets the static position to the position that the nearest
> list-item ancestor would put its marker? That way there's no
> confusion about which should be styled - you just position an element
> and style it as you wish.
>
> This also means that any structure in the inline marker (like a<b>,
> for example) is preserved, where it's stripped in the current model
> (since I only copy over the textual contents).

I share Brad's concern that using display:marker to mean "display:none
and then magically copy the contents to a pseudo-element that then
displayed somewhere else" is unusual. (I'm not saying it's wrong or even
a bad idea (yet!); I'm just saying that it's a new model AFAIK.)

I think Brad's proposal to be able to pull content explicitly from the
document using 'content' seems more natural, and could have applications
in various places in CSS not just here. (We can do this for element
attribute content already.) However, it's also a new model and would
require a fair bit of thought. It is pretty similar to populating flows
(à la regions) as you suggest (and may therefore be more complex that we 
would like for the purposes of this module).

I also agree with your analysis that you're merely interested in moving
the would-be marker contents to a new, well-defined place in the layout.
So something like position:marker is worth considering. However, what
happens if you also specify
::marker { position: <something>; }
? See my question above.

The thing I'm concerned about with using position:marker is that until
now, 'position' hasn't been used to reshuffle contents. In CSS21, abspos
removes content from the normal flow, and relpos visually repositions
content but doesn't affect "layout". In CSS3 template positioning, the
mechanism is more akin to regions but specifically the "slots" are
defined in such a way that positioning something into them doesn't
require us to worry about rewrapping neighbouring content around the
something's new location. Under your proposal, however, you're taking
content inside of a list item and moving somewhere else, and in the case
of list-style-position:inside you're moving it elsewhere inside the same
block box and expecting neighbouring content to flow around it; that is,
you're reshuffling (a bit like using 'float').

I think we should think carefully about whether we want to extend
position in this way. Again, I'm not saying we don't; I'm just saying it
deserves some thought.

Another aspect about position:marker is that you're not so much setting
a position as setting a rôle. So I can't help but feel that this is a
bit of an abuse of the 'position' property, and that use of
display:marker might indeed be better. I would be happier with
display:marker if we could avoid getting into the "populating flows"
model by insisting that display:marker could only be used on the "first"
content of a list item, in some sense. That would seem to cover your use
cases without getting bogged down in moving content to somewhere else in
the flow.

Cheers,
Anton Prowse
prowse@moonhenge.net
Received on Sunday, 3 July 2011 09:41:20 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:42 GMT