Если с переходами всё просто – transition это лишь ещё одно правило – то с keyframes всё интереснее. Ведь keyframes – это at-rule, иначе говоря – оператор, указывающий CSS какие конкретно правила и когда применять. Ещё и переиспользовать можно – создали в одном месте, используем других.
Напрямую написать @keyframes внутри описания styled-компонента нельзя, но можно воспользоваться ещё одним помощником – функцией @keyframes.
import styled, { css, keyframes } from 'styled-components';
/* © Nick Pettit, https://github.com/nickpettit/glide */
const wobbleKey = keyframes`
from {
transform: translate3d(0, 0, 0);
}
15% {
transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
}
30% {
transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
}
45% {
transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
}
60% {
transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
}
75% {
transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
}
to {
transform: translate3d(0, 0, 0);
}
`;
const wobbleAnimation = (props) => css`
${wobbleKey} ${props.animationLength} ease-in-out infinite;
`;
const WobbledDiv = styled.div`
animation: ${wobbleAnimation};
`;
function HelloAnimatedComponent() {
return <WobbleDiv animationLength="0.8s">Hello Wobble!WobbleDiv>;
}
Удобно? По-моему, очень даже. Но вы точно знаете как минимум ещё одно at-rule, если хоть раз занимались адаптивной разработкой.