рдореИрдВ рдЬреЗрдПрд╕рдПрд╕ рдкрд░ рдмрддрд╛рдП рдЧрдП
const MyComponentWithStyles = withStyles(() => ({
"<strong i="7">@keyframes</strong> fadeAnimation": {
from: {opacity: 0},
to: {opacity: 1},
},
container: {
width: "100px",
height: "100px",
background: "red",
animation: "1s fadeAnimation",
}
}))(MyComponent)
рдХреБрдЫ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдкреНрд░рд╢реНрди рдорд┐рд▓реЗ, рдЬрд╣рд╛рдВ рдпрд╣ рдХреАрдлрд╝реНрд░реЗрдо рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП 'рд╕реАрдПрд╕рдПрд╕ рд╡рд┐рдХрд▓реНрдк' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ 'рд╕реАрдПрд╕рдПрд╕ рд╡рд┐рдХрд▓реНрдк' рдХрд╛ рдХреНрдпрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реАрдПрд╕рдПрд╕ рд╕реНрдЯрд╛рдЗрд▓?
рд╕рд╛рде рд╣реА, рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ рдЬреЛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдХреАрдлрд╝реНрд░реЗрдо рдПрдирд┐рдореЗрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдореЗрд░реЗ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
рд╣рд╛рдВ, рдХреАрдлреНрд░реЗрдо рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: https://github.com/mui-org/material-ui/blob/353c0aedc50de8bb2c09626e520d7cc16ac461dc/packages/material-ui/src/ButtonBase/TouchRipple.js#L84
рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рднрд╛рдЧ рдЧрдпрд╛ред рдЬреЗрдПрд╕рдПрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдХрд┐рд╕реА рдХреЛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗ рд╕рд╛рдордиреЗ $
рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдЗрд╕реЗ рдЫреЛрдбрд╝рдХрд░, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@bjrn рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЬреЗрдПрд╕рдПрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП: makeStyles
рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо makeStyles-keyframes-glowIcon-187
рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓ glowIcon
(JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛ред
рдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд $
рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ:
animation: '$glowIcon 2000ms infinite',
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП:
https://cssinjs.org/jss-syntax/?v=v10.0.0-alpha.10#keyframes -animation
рдореБрдЭреЗ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА: рдореЗрдХ рд╕реНрдЯрд╛рдЗрд▓ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд) + рд╢реИрд▓реА рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдп
animation
рдЬрдирд░реЗрд╢рди рдХреНрд░реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯрд╛рдЗрд▓ рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ:animation: ({ duration }) => `$glitch ${duration}s infinite`
рдЖрдЙрдЯрдкреБрдЯ:
.makeStyles-root-470::before {}
$
) рдХреЗ рдмрд┐рдирд╛ animation-name
рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдпрдо animation
рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди animation-name
@keyframe
рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ animation: ({ duration }) => `glitch ${duration}s infinite`
рдЖрдЙрдЯрдкреБрдЯ:
.makeStyles-root-477::before {
animation: 1s ease 0s infinite normal none running glitch;
}
animation: `$glitch 5s infinite`,
рдЖрдЙрдЯрдкреБрдЯ:
.makeStyles-root-482:before {
animation: makeStyles-keyframes-glitch-483 5s infinite;
}
animationDuration: ({ duration }) => `${duration}s`,
animationIterationCount: 'infinite',
animationName: `$glitch`,
"@material-ui/core": "^4.1.3",
"@material-ui/icons": "^4.4.1",
"@material-ui/styles": "^4.1.1",
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯреАрдПрд╕ рд╕реНрдЯрд╛рдЗрд▓ рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ :(
makeStyles()
рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:sslider: ({urls}) => ({
background: `url(${urls[0]})`,
backgroundRepeat: "no-repeat",
animation: `$slidingBackgroundAnimation 10s`,
...
}),
"<strong i="7">@keyframes</strong> slidingBackgroundAnimation": {
from: {
backgroundPositionX: "0px",
},
to: {
backgroundPositionX: "-100px",
},
},
рдпрд╣рд╛рдВ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдирд╛рдо keyframes
рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдирд┐рдореЗрд╢рди рдХреАрдлрд╝реНрд░реЗрдо slidingBackgroundAnimation
рдХреЛ <head> > <style>
рдореЗрдВ @-webkit-keyframes makeStyles-keyframes-slidingBackgroundAnimation-108
рд▓реЗрдХрд┐рди sslider
css рдЗрд╕реЗ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ @-webkit-keyframes makeStyles-keyframes-slidingBackgroundAnimation-109
(рдХреЗ рд╕рд╛рде) рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛)ред
sslider: {
background: ({ urls }) => `url(${urls[0]})`,
backgroundRepeat: "no-repeat",
animation: `$slidingBackgroundAnimation 10s`,
....
},
"<strong i="18">@keyframes</strong> slidingBackgroundAnimation" : { ... }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рджрд░реНрдж рдерд╛ <strong i="22">@keyframes</strong> animationName
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣рд╛рд░рд╛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ makeStyles({})
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдВрдЧрдордВрдЪ рдХреА рд╕рд╛рдордЧреНрд░реА рдЧреБрдЬрд░ useStyles({})
ред
рдпрд╣ рд╡рд╣ рдХреЛрдб рдерд╛ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред
const imageSliderAlgo = (urls) => {
// a function that accepts urls and dynamically create object to be consumed by the keyframes
// return example for two images
return {
"0%": { backgroundImage: `url(${urls[0]})` },
"50%": { backgroundImage: `url(${urls[1]})` }
}
};
const useStyles = makeStyles(theme => ({
"<strong i="28">@keyframes</strong> slidingBackgroundImageAnimation": ({ urls }) =>
imageSliderAlgo(urls),
sslider: { ... }
});
рдпрд╣ рдкреНрд░реЙрдкреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рдХреЛ classNames
рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдареАрдХ рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╕рдордп рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЙрдкрд░реЛрдХреНрдд рдЦрдВрдб рдореЗрдВ)ред
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдФрд░ рдмрд╣реБрдд рд╕рдордп рдЬрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реАрдПрд╕рдПрд╕-рдЗрди-рдЬреЗрдПрд╕ рд╢реИрд▓реА рдореЗрдВ рдХреАрдлреНрд░реЗрдо рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдХрд╕реНрдЯрдо рд╣реБрдХ рдореЗрдВ useStyles()
рд▓рдкреЗрдЯ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд░рд╣рд╛ рдерд╛ рд╡рд╣рд╛рдВ рд╕реЗ makeStyles()
ред
const useMyStyles = props => {
const useStyles = makeStyles(theme => ({
sslider: {
background: ({ urls }) => `url(${urls[0]})`,
animation: `$slidingBackgroundAnimation 30s ease 2s infinite forwards, $slidingBackgroundImageAnimation 20s ease 2s infinite forwards`,
...
},
// animation 1
// dynamically rendering keyframes in css-in-js
// using the props property passed in custom useMyStyles hook while invoking it in main component
"<strong i="36">@keyframes</strong> slidingBackgroundImageAnimation": imageSliderAlgo(props.urls),
// animation 2
// static keyframes in css-in-jss
"<strong i="37">@keyframes</strong> slidingBackgroundAnimation": {
"0%": {
backgroundPositionX: "0px",
},
"50%": {
backgroundPositionX: "-120px",
}
},
})); // useStyles closed
// returning useStyle function with the props passed in the higher order/parent function
return useStyles(props);
} // useMyStyles custom hook closed
// Component
export default function SlidingBackground({ children, urls }) {
// non-working way
// const classes = useStyles({ urls });
// working way
const classes = useMyStyles({ urls });
return (
<>
<div className={classes.sslider}>{children}</div>
</>
);
}
рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП:
makeStyles
рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛редрдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо
makeStyles-keyframes-glowIcon-187
рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓glowIcon
(JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛редрдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд
$
рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ:animation: '$glowIcon 2000ms infinite',
рддреБрдо рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдУ
рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рд╛
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП:
makeStyles
рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛редрдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо
makeStyles-keyframes-glowIcon-187
рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓glowIcon
(JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛редрдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд
$
рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ: