Мерцание анимации в Material-UI JSS
Я создаю сайт GatsbyJS с помощью Material-UI. Используя withStyles HoC, возможно ли сделать мигающую анимацию? Я пытался обеспечить анимацию в styles
:
const styles = theme => ({
'@keyframes blinker': {
from: {opacity: 1},
to: {opacity: 0}
},
headerGT: {
color: 'white',
animation: ['blinker', '1s', 'linear', 'infinite'],
'-webkit-animation': ['blinker', '1s', 'linear', 'infinite'],
'-moz-animation': ['blinker', '1s', 'linear', 'infinite'],
}
})
Я вижу, как класс и ключевые кадры распознаются, а headerGT имеет метод анимации при сборке DOM, но анимация не запускается. Есть идеи?
4 ответа
У меня была такая же проблема, но, как указано в документации JSS, ссылка на мою анимацию с префиксом $ решила ее.
Попробуй это:
const style = theme => (
{
'@keyframes blinker': {
from: {opacity: 1},
to: {opacity: 0}
},
headerGT: {
[...]
animationName: '$blinker',
animationDuration: '1s',
animationTimingFunction: 'linear',
animationIterationCount:'infinite',
},
});
Да, вполне возможно. Например:
const style = theme => (
{
'@keyframes blinker': {
from: {opacity: 1},
to: {opacity: 0}
},
headerGT: {
position: 'absolute',
width: '60px',
height: '60px',
right: 17,
backgroundImage: 'url(https://cdn3.iconfinder.com/data/icons/common-4/24/ui-21-512.png)',
backgroundRepeat: 'no-repeat',
backgroundSize: 'contain',
border: 'none',
bottom: '108px',
opacity: '0.4',
backgroundColor: 'red',
animationName: 'blinker',
animationDuration: '1s',
animationTimingFunction: 'linear',
animationIterationCount:'infinite',
},
});
В MUI v5 вы можете определить анимацию, используяkeyframes
от эмоций.
import { styled } from '@mui/material/styles';
import { keyframes } from '@mui/system';
const blink = keyframes`
from { opacity: 0; }
to { opacity: 1; }
`;
const BlinkedBox = styled('div')({
backgroundColor: 'pink',
width: 30,
height: 30,
animation: `${blink} 1s linear infinite`,
});
Живая демонстрация
Ниже приведен пример мигающей анимации, которую можно включить или выключить в зависимости от отключенного свойства компонента:
import { makeStyles } from '@material-ui/core'
const useStyles = makeStyles({
'@keyframes flicker': {
from: {
opacity: 1,
},
to: {
opacity: 0.7,
},
},
flicker: {
animationName: '$flicker',
animationDuration: '1000ms',
animationIterationCount: 'infinite',
animationDirection: 'alternate',
animationTimingFunction: 'ease-in-out',
},
withAnimation: ({ disabled }: { disabled: boolean }) => ({
animationPlayState: disabled ? 'paused' : 'running',
}),
});
const Component: React.FC<{ disabled }> = () => {
const { flicker, withAnimation } = useStyles({ disabled })
return (
<div className={`${flicker} ${withAnimation}`}>Hello</div>
)
}
Обратите внимание, что существует 2 отдельных класса из-за того, что только animationPlayState зависит от значения свойства. Однако,animationName
должен быть объявлен внутри объекта, потому что @material-ui
отобразит объект и заменит $flicker
с именем анимации, к которой добавлен случайный хэш (т.е. makeStyles-keyframes-flicker-4043
). Сопоставление не выполняется для объекта, возвращаемого функцией, которая была вызвана с помощью свойств.