UI-Animation
Style recalculation
Layout
Paint
Composite
Caused by some event
width,
margin,
left...
background,
box-shadow,
color...
transform,
opacity
Style recalculation
Layout
Paint
Composite
width,
margin,
left...
background,
box-shadow,
color...
transform,
opacity
Chrome DevTools: Performance Tab
Expensive
Style recalculation
Layout
Paint
Composite
Caused by some event
width,
margin,
left...
background,
box-shadow,
color...
transform,
opacity
Chrome DevTools: Performance panel
div {
transform: translate(n, n)
scale(n)
skew(ndeg)
rotate(ndeg);
translate: n n;
scale: n;
rotate: ndeg;
opacity: 0..1;
}... bør være et standardvalg til hover, press states, drawers, toasts, cards, modals, view/state-skift og microinteractions.
Animation
Animation
.line {
/*width: 20%;*/
transform: scaleX(.2);
}.box {
transform: rotate(45deg) translate(-50%, -50%) scale(1.3);
}
.box:hover {
transform: rotate(0deg);
}.box {
rotate: 45deg;
translate: -50% -50%;
scale: 1.1;
}
.box:hover {
rotate: 0deg;
}.box {
rotate: 45deg;
translate: -50% -50%;
scale: 1.1;
}
.box:hover {
rotate: 0deg;
}Rækkefølgen er prædefineret.
Hvis du skal styre rækkefølgen, så brug transform-funktionen
1
2
3
Boolean Prop
.rotate {
--intent: 0;
rotate: calc( var(--intent) * 45deg );
transition: rotate .3s;
&:hover {
--intent: 1;
}
}Brug calc() til at gange variablen med 45deg
Boolean Prop
.slide-out {
--open: 0;
translate: calc( var(--open) * 100% );
transition: translate .4s;
&.open {
--open: 1;
}
}Brug calc() til at gange variablen med 100%
@property --colorPrimary {
syntax: '<color>';
}@property --colorPrimary {
syntax: '<color>';
initial-value: magenta;
}@property --colorPrimary {
syntax: '<color>';
initial-value: magenta;
inherits: false;
}@property --colorPrimary {
syntax: '<color>';
initial-value: magenta;
inherits: false;
}@property --colorPrimary {
syntax: '<color>';
initial-value: magenta;
inherits: false;
}(lad den blive åben)
.parent {
.child {
offset-path: border-box;
}
}Indhold ovenpå indhold
overlay, popup, popover, dialog osv.
popover
backdrop (baggrundslag)
popover
non-modal
modal
vs.
non-modal
modal
vs.
popover
<dialog>
I sin enkleste form laver du en popover ved at tilføje attributten
popovertil det element, som skal vise selve popover-indholdet.
Du skal også give elementet etid, så det kan kobles sammen med det element, der åbner popoveren.
popovertarget
peger på id’et af den popover, der skal styres
id
bruges til at identificere popoveren og forbinde den med en kontrol
popover
markerer elementet som en popover
popoverpopovertargetid<button popovertarget="popup">Open popup</button>
<div popover id="popup">
<h2>I'm a popup</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing.</p>
</div>popover::backdrop
pseudoelement, der repræsenterer det visuelle lag bag en popover
:popover-open
popover-elementet i åben tilstand
[popover]
popover-elementet
[ ]:popover-open::backdroppopoverattribut-selector
Ændr ikke display direkte — brug :popover-open til at style, når popover'en er synlig.
[popover] { /* eller #min-popover */
display: grid;
}[popover]:popover-open {
display: grid;
}<button popovertarget="popup">Open popup</button>
<div popover id="popup">
<h2>I'm a popup</h2>
<p>Lorem ipsum dolor sit amet consectetur adipisicing.</p>
</div>Loading...
Når et element vises for første gang – eller går fra display: none; til synligt – starter CSS-transitions ikke automatisk.
Browseren har nemlig ingen tidligere stil at animere fra.
@starting-style løser det ved at give elementet nogle startværdier, som browseren kan animere fra, når det dukker op.
0s
1s
.wrapper:hover .circle {
scale: 4;
display: block;
}
@starting-style {
.wrapper:hover .circle {
scale: 1;
}
}display: block;
@starting-style {
...
}transition-behavior: allow-discrete;:popover-open {
...
}Animation
@starting-style {
...
}transition-behavior: allow-discrete;[popover] {
opacity: 0;
translate: 0 -100%;
}
:popover-open {
opacity: 1;
translate: 0 0;
}Animation
@starting-style {
...
}transition-behavior: allow-discrete;[popover] {
opacity: 0;
translate: 0 -100%;
}
:popover-open {
opacity: 1;
translate: 0 0;
}Animation
@starting-style {
opacity: 0;
translate: 0 100%;
}transition-behavior: allow-discrete;[popover] {
opacity: 0;
translate: 0 -100%;
}
:popover-open {
opacity: 1;
translate: 0 0;
}Exit state
Entry state
Open state
Exit state
Entry state
Open state
0s
1s
{
transition: 1s;
}0s
1s
display: none;
{
transition: 1s;
}0s
1s
{
transition: 1s allow-discrete;
}display: none;
venter 1 sekund
Loading...