Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[css-transitions-2] Add spec for @starting-style #8174 #8876

Merged
merged 6 commits into from
Jun 22, 2023
Merged
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions css-transitions-2/Overview.bs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,124 @@ Each time a new transition is generated, the current value of the (already
incremented) <a>current transition generation</a> is stored as the
transition's <dfn>transition generation</dfn>.

## Defining [=before-change style=]: the ''@starting-style'' rule

In Level 1 of this specification, transitions can only start during a
[=style change event=] for elements which have a defined [=before-change style=]
established by the previous [=style change event=]. That means a transition
could not be started on an element that was not being rendered for the previous
[=style change event=] (see: [[css-transitions-1#starting]]).

In some cases it makes sense to start transitions on newly inserted elements or
elements that change from not [=being rendered=] to being rendered. To allow
for that, this specification introduces ''@starting-style''.

The <dfn at-rule id="at-ruledef-starting-style">@starting-style</dfn> rule is a
grouping rule where the rules inside it is used to establish styles to
transition from if the previous [=style change event=] did not establish a
[=before-change style=] for the element whose styles are being computed.
lilles marked this conversation as resolved.
Show resolved Hide resolved

Note: This means that ''@starting-style'' rules only apply to some elements
during a computed style update, namely elements that were not rendered or part
of the DOM during the previous [=style change event=].

Define <dfn>starting style</dfn> for an element as the [=after-change style=]
with ''@starting-style'' rules applied in addition. If an element does not have
a [=before-change style=] for a given [=style change event=], the
[=starting style=] is used instead of the [=before-change style=] to compare
with the [=after-change style=] to start transitions
([[css-transitions-1#starting]]).

The rules inside ''@starting-style'' cascade as any other grouping rules without
lilles marked this conversation as resolved.
Show resolved Hide resolved
introducing any new ordering to the cascade, which means rules inside
''@starting-style'' do not necessarily win over those outside.

Style rules in ''@starting-style'' do not apply to [=after-change style=].
Thus, the presence of matching rules in ''@starting-style'' can cause
transitions to occur on elements that otherwise could not have transitions
because they lack a [=before-change style=].

''starting style'' inherits from the parent's [=after-change style=] just like
lilles marked this conversation as resolved.
Show resolved Hide resolved
[=after-change style=] does.

<div class=example>

Transitioning background-color of an h1 element from transparent to green
lilles marked this conversation as resolved.
Show resolved Hide resolved
from initial rendering:

<pre class=lang-css>
h1 {
transition: background-color 1.5s;
background-color: green;
}
@starting-style {
h1 {
background-color: transparent;
}
}
</pre>

Conditional rules can be used with CSS Nesting:

<pre class=lang-css>
h1 {
transition: background-color 1.5s;
background-color: green;
@starting-style {
background-color: transparent;
}
}
</pre>
</div>
dbaron marked this conversation as resolved.
Show resolved Hide resolved

<div class=example>

Transitioning an element with opacity in and out of display:none:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps it would be useful to have a few sentences of explanation on why there are two display: none; opacity: 0; pieces and what each one does.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Realized display:none in the starting style was actually wrong. Corrected and commented.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, but I think it's probably still worth explaining what the two opacity: 0 declarations do -- and how one of them applies to the transition when class=hidden is removed and the other applies to the transition when class=hidden is added.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I sort of tried to do that already, and I've modified the description a bit, but I'm not quite sure how you'd want it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, mostly looks good, but I left a few comments.

lilles marked this conversation as resolved.
Show resolved Hide resolved

<pre class=lang-css>
#target {
transition-property: opacity, display;
transition-duration: 0.5s;
display: block;
opacity: 1;
@starting-style {
opacity: 0;
}
}
#target.hidden {
display: none;
opacity: 0;
}
</pre>

The display is transitioning to allow for an opacity transition before
flipping from <code>display:block</code> to <code>display:none</code>.
lilles marked this conversation as resolved.
Show resolved Hide resolved

Setting ''@starting-style'' opacity to 0 means the element will
lilles marked this conversation as resolved.
Show resolved Hide resolved
transition opacity from 0 to 1 when inserted into the tree or when
the <code>hidden</code> class flips ''display'' from
''display/none''</code> to ''display/block'' as the target element does
lilles marked this conversation as resolved.
Show resolved Hide resolved
not already have a [=before-change style=] in those cases.

The opacity set to 0 in <code>#target.hidden</code> is for transitioning
opacity from 1 to 0 when the <code>hidden</code> class is added.
lilles marked this conversation as resolved.
Show resolved Hide resolved
</div>

Global, name-defining at-rules such as ''@keyframes'', ''@font-face'', and
''@layer'' are allowed inside ''@starting-style'', and when present behave as
if they were outside of ''@starting-style''.

### The <code>CSSStartingStyleRule</code> interface

The {{CSSStartingStyleRule}} interface represents a ''@starting-style'' rule.

<pre class='idl'>
[Exposed=Window]
interface CSSStartingStyleRule : CSSGroupingRule {
};
</pre>


# Application of transitions # {#application}

## Animation composite order ## {#animation-composite-order}
Expand Down