- From: DavMila via GitHub <sysbot+gh@w3.org>
- Date: Thu, 04 Apr 2024 18:24:26 +0000
- To: public-css-archive@w3.org
DavMila has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-scroll-snap-2] Should pseudo-elements show up as null SnapEvent.snapTargetBlock/Inline ==
The snap events [spec](https://drafts.csswg.org/css-scroll-snap-2/#snap-events) indicates that a user-agent should identify the “element” to which a snap container snaps. Since pseudo-elements can also be snap targets and are not elements, this means that a `SnapEvent` for which the selected snap target is a pseudo-element will have its `SnapEvent.snapTargetBlock` (or `snapTargetInline`) as null.
From a developer’s point of view, this means there is some ambiguity about what a null `SnapEvent.snapTargetBlock` means, i.e. it could be mean that a pseudo-element was snapped to or that nothing was snapped to. For example, if a developer wishes to do some visual effect on the item that was snapped to, they might write something like:
```
scroller.addEventListener(“snapchanged”, (evt) => {
if (evt.snapTargetBlock) {
DoVisualEffect(evt.snapTargetBlock);
}
);
```
If the thing that was snapped to is a pseudo element, the code would not know to achieve `DoVisualEffect` on that pseudo-element.
Perhaps this is okay and developers simply need to be a bit careful about using pseudo elements as snap targets where they expect to interact with snap targets via JavaScript which currently can't interact with pseudo-elements as it can with elements.
Alternatively, we could have the type of `SnapEvent.snapTargetBlock` be slightly more abstract than an Element, e.g. a `SnapEventTarget` interface such as:
```
interface SnapEventTarget {
bool isPseudo;
Element target;
}
interface SnapEvent {
SnapEventTarget snapTargetBlock;
SnapEventTarget snapTargetInline;
}
```
would give the developer a little more information about the thing that was snapped to such that they could modify the earlier example with:
```
scroller.addEventListener(“snapchanged”, (evt) => {
if (evt.snapTargetBlock.target) {
DoVisualEffect(evt.snapTargetBlock);
} else if (evt.snapTargetBlock.isPseudo) {
DoVisualEffectOnPseudoSnapTarget()
}
);
```
The obvious problem with this approach is that a scroller may have multiple pseudo-elements which are snap targets and there would not be a straightforward way of knowing which of those the snap event was referring to.
Another point of consideration is that the (yet-to-be-spec'd) [`:snapped`](https://drafts.csswg.org/css-scroll-snap-2/#snapped) feature would be able to bridge this gap for pseudo-elements as far as style-related changes that can be accomplished by CSS. However, it would only be the equivalent of `snapchanged` and not `snapchanging`. Perhaps an equivalent `:snapping` CSS selector would be worth considering.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/10175 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 4 April 2024 18:24:26 UTC