- From: Florian Rivoal via GitHub <sysbot+gh@w3.org>
- Date: Tue, 13 Sep 2016 03:58:40 +0000
- To: public-css-archive@w3.org
I've looked into splitting the current 'user-select' property into longhands, to see if it helps with the issue of a non inherited property that has one value whose effect depends on the value on the parent element (this has been described as quasi-inheritance or selective inheritance). So here's the attempt: 'user-select' becomes a shorthand for 'user-select-inside' and 'user-select-outside' (to be bikesheded). Name: user-select-inside Inherited: yes Values: text | none | all Initial: text The values mean the same as what they currently mean on 'user-select'. Name: user-select-outside Inherited: no Values: auto | contain Initial: auto ''contain'' on an element prevents a selection started within that element to be extended outside of it. ''user-select-outside:auto'' computes to (or alternatively, behaves as) ''user-select-outside: contain'' on editable elements. ''contain'' + ''none'' is the same as ''auto'' + ''none''.r ''contain'' + ''all'' could either be the same as ''auto'' + ''all'', or have subttely different behavior when trying to select from outside. These two combination are not particularly problematic to handle, but it is doubtfull whether they are of any use. | user-select | user-select-inside | user-select-outside | |----|----|----| | auto | inherit (Gecko / Edge / IE / Spec behavior) <br> text (Chrome / Safari behavior) | auto| | text | text | auto | | none | none | auto | | all | all | auto | |contain | text | contain | This design can work, but it has two oddities. The first one, which is rare but not unique, being that one of the longhands is inherited and the other not. The second one, for which I believe there is no precendent, is that one value of the shorthand (''auto'') expands to the reserved keyword ''inherit'' in one of the longhands. These longhands could be exposed to authors or possibly kept as internal implemenation details. ---- ''user-select: auto'' in the Spec / Mozilla / Edge / IE behavior is used what is effectively partial inheritance in a non inherited property. In the Chrome / Safari behavior, 'user-select' is inherited, and ''user-select:auto'' behaves identically to ''user-select: text'', and serves no purpose. If we keep ''contain'' in the same (non inherited) property, ''auto'' is necessary to make things work. If we split ''contain'' into a separate property, ''auto'' serves no purpose other than backwards compatibility, with a different behavior in Chrome + Safari vs Gecko + Edge + IE. We could consider not including ''auto'' in the standard shorthand, an only keeping it in the prefixed versions. If we keep the visible part as a single property, and implement it internally as the two longhands described above, we can keep the same behavior as if we only had a single property. I do not know whether this would be simpler to implement for Blink, due to the peculiar use of ''inherit'' as an expantion of ''auto'' on the shorthand. I suspect it is, since this would only come into play when ''auto'' is manually specified and the rest of the time you can do normal inheritance on one property and normal non-inheritance on the other, but that's for Google to see. When taking that route, a bit of fudging would be needed on getComputedStyle() since it normally returns nothing for shorhands, but that shouldn't be hard (`if ($user-select-outside == "contain") return "contain" else return $user-select-inside`) --- I believe that the approach taken in the spec offers a simpler/better better author experience than trying to use the longhands (no useless combinations such as contain+none, no need to remeber to reset 'user-select-inside' to ''text'' if you want to set 'user-select-outside' to ''contain'' and have it do something useful), and has more separate implemenations (Gecko + IE/Edge vs Webkit/Blink pre-fork). Moreover, looking at the value on a parent element to determine the computed value on a child element is explicitely mentioned in the cascading spec as something that can be expected of computed values: > Note: In general, the computed value resolves the specified value as far as possible without laying out the document or performing other expensive or hard-to-parallelize operations, such as resolving network requests or retrieving values other than from the element and its parent. All in all, I could live with the two-properties-with-shorthand solution if all implementers prefered it, but I don't think it is a better solution than the one currently specified, which aligns with what IE/Edge and Gecko do. The hidden longhand approach does seem to work around the difficulties you may run into if you were to do a straightforward implementation, and I am sure other implementation strategies exist. I hope we can keep the spec as it is. -- GitHub Notification of comment by frivoal Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/336#issuecomment-246567000 using your GitHub account
Received on Tuesday, 13 September 2016 03:58:47 UTC