gpt4 book ai didi

javascript - 一旦元素在 Material-UI 中可见,就触发 CSS 动画

转载 作者:行者123 更新时间:2023-12-02 22:05:46 24 4
gpt4 key购买 nike

我对元素进入 View 后如何触发 CSS 动画做了一些研究,我发现 the answer使用 IntersectionObserverelement.classList.add('.some-class-name')

上面的方法是用纯CSS演示的,但我想用Material-UI来实现它。这是我的代码。

import React, { useEffect } from 'react';
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles((theme) => ({
root: {
height: '100vh'
},
box: {
opacity: 0,
width: 100,
height: 100,
backgroundColor: 'red'
},
animated: {
animationName: '$fadein',
animationDuration: '1s'
},
'@keyframes fadein': {
'0%': {
opacity: 0
},
'100%': {
opacity: 1
}
},
}));

function App() {
const classes = useStyles();

useEffect(() => {
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
if (entry.intersectionRatio > 0) {

// trigger animation
entry.target.classList.add('animated');

// remove observer
observer.unobserve(entry.target);
}
});
});

const element = document.getElementById('item');
observer.observe(element);
}, []);

return (
<div>
<div className={classes.root} />
<div id="item" className={classes.box} />
</div>
);
};

export default App;

不幸的是,上面的代码不起作用,我认为这是因为 className 'animated' 不存在。我知道 Material-UI 具有生成唯一类名的内部逻辑,所以我的问题是如何找出“动画”的真正类名?或者,有更好的方法来解决这个问题吗?任何帮助将不胜感激。

最佳答案

这就是我想出来的。

import React, { useEffect, useState, useRef } from 'react';
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles((theme) => ({
root: {
height: '100vh'
},
box: {
opacity: 0,
width: 100,
height: 100,
backgroundColor: 'red'
},
animated: {
animationName: '$fadein',
animationDuration: '1s',
animationFillMode: 'forwards'
},
'@keyframes fadein': {
'0%': {
opacity: 0
},
'100%': {
opacity: 1
}
}
}));

function App() {
const classes = useStyles();

const BoxSection = (props) => {
const [isVisible, setVisible] = useState(false);
const domRef = useRef();
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => setVisible(entry.isIntersecting));
});
observer.observe(domRef.current);
return () => observer.unobserve(domRef.current); // clean up
}, []);
return (
<div className={`${classes.box} ${isVisible ? classes.animated : ''}`} ref={domRef}>
{props.children}
</div>
);
};

return (
<div>
<div className={classes.root} />
<BoxSection />
</div>
);
}

export default App;

基本上,我决定通过添加上面的类来使用状态来触发动画。我从 this article 得到了一些指示,如果有人感兴趣的话。

关于javascript - 一旦元素在 Material-UI 中可见,就触发 CSS 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59717303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com