I am trying to do a simple animation using React, keyframes, CSS modules (and SASS). The problem is that CSS Modules hash keyframe names the same way it hashes the local classes.
JS code
//...
export default () => {
const [active, setActive] = useState(false);
return(
<div className={active ? 'active' : 'inactive'}
onClick={() => setActive(!active)}
>content</div>
)
}
An attempt to make everything global, used this source as a tutorial (does not compile):
//default scope is local
@keyframes :global(animateIn) {
0% { background: black; }
100% { background: orange; }
}
@keyframes :global(animatOut) {
0% { background: orange; }
100% { background: black; }
}
:global {
.active {
background: orange;
animation-name: animateIn;
animation-duration: 1s;
}
.inactive {
background: black;
animation-name: animateOut;
animation-duration: 1s;
}
}
Changing this does not work too:
:global {
@keyframes animateIn {
0% { background: black; }
100% { background: orange; }
}
@keyframes animateOut {
0% { background: orange; }
100% { background: black; }
}
}
Another attempt (does not work):
@keyframes animateIn {
0% { background: black; }
100% { background: orange; }
}
@keyframes animateOut {
0% { background: orange; }
100% { background: black; }
}
:global {
.active {
background: orange;
:local {
animation-name: animateIn;
}
animation-duration: 1s;
}
.inactive {
background: black;
:local {
animation-name: animateOut;
}
animation-duration: 1s;
}
}
How to use keyframes in CSS modules global scope? Is it possible to use local scope keyframes in a global scope class?
Definition and Usage. The @keyframes rule specifies the animation code. The animation is created by gradually changing from one set of CSS styles to another. During the animation, you can change the set of CSS styles many times.
A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. CSS Modules let you write styles in CSS files but consume them as JavaScript objects for additional processing and safety.
You can change as many CSS properties you want, as many times as you want. To use CSS animation, you must first specify some keyframes for the animation.
You first describe the animation effect using the @-webkit-keyframes rule. A @-webkit-keyframes block contains rule sets called keyframes. A keyframe defines the style that will be applied for that moment within the animation.
Your third attempt was almost fine, you just have to add &
before :local
and make sure there's a space in between them. By doing so, you switch to the local scope within the selector.
:global {
.selector {
& :local {
animation: yourAnimation 1s ease;
}
}
}
@keyframes yourAnimation {
0% {
opacity: 0;
}
to {
opacity: 1;
}
}
Which compiles to
.selector {
animation: [hashOfYourAnimation] 1s ease;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With