如何在调整包含 react-lottie 组件的浏览器大小时保持纵横比?
How to preserve aspect ratio upon resizing browser containing a react-lottie component?
我有一个使用 react-lottie
(https://www.npmjs.com/package/react-lottie)
渲染的 Lottie 动画
import Lottie from 'react-lottie'
import animationData from './path/to/animation.json'
const MyComponent = () => {
const myOptions = {
loop: true,
autoplay: true,
renderer: 'canvas',
animationData: animationData
}
return (
<div>
...other stuff
<Lottie options={myOptions} width={1000} height={500} />
</div>
)
}
动画显示和播放正常。
问题是在调整浏览器大小时,动画会缩小和挤压,并且不会保留其原始纵横比。如果我在缩小浏览器后刷新页面,动画就会正确呈现。只有在调整大小时,宽高比才会关闭。
我试过添加:
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice' // also tried 'xMidYMid meet'
}
我的选择,但这也不起作用。
我唯一能想到的另一件事是将 resize
事件侦听器附加到 window,后者将依次调用 lottie.resize()
useEffect(() => {
window.addEventListener('resize', ??)
}, [])
??
中的内容是我卡住的地方。我知道使用 lottie-web
,我可以直接访问 lottie.resize()
函数。但是,当使用 react-lottie
时,如何 call/access 调整大小功能?
如有任何帮助,我们将不胜感激。
编辑:我被要求添加示例动画 JSON 所以它在这里:https://pastebin.com/gXCEhKaR
是的,谢谢,我是在家里开始的,但是您已经为 Lottie 组件设置了宽度和高度值。如果你想让Lottie根据屏幕的大小改变它的大小,那么你需要添加一个钩子来改变屏幕。
挂钩调整大小
export function useSizeComponents (ref) {
const [size, setSize] = useState([0, 0])
useLayoutEffect(() => {
function updateSize () {
let newSize = [window.innerWidth, window.innerHeight]
if (ref?.current) {
newSize = [ref.current.offsetWidth, ref.current.offsetHeight]
}
setSize(newSize)
}
window.addEventListener('resize', updateSize)
updateSize()
return () => window.removeEventListener('resize', updateSize)
}, [])
return size
}
你的组件
const MyComponent = () => {
const [width, height] = useSizeComponents()
const scaleLottie = 0.5
const myOptions = {
loop: true,
autoplay: true,
renderer: 'canvas',
animationData: animationData,
}
const control = useMemo(() => {
if (!width) return null
const xMidYMid = 0.5
const sizeComponent = {
width: width * scaleLottie,
height: width * scaleLottie * xMidYMid
}
return <Lottie key={width} options={myOptions} {...sizeComponent} />
}, [width])
return (
<div>
...other stuff
{control}
</div>
)
}
我有一个使用 react-lottie
(https://www.npmjs.com/package/react-lottie)
import Lottie from 'react-lottie'
import animationData from './path/to/animation.json'
const MyComponent = () => {
const myOptions = {
loop: true,
autoplay: true,
renderer: 'canvas',
animationData: animationData
}
return (
<div>
...other stuff
<Lottie options={myOptions} width={1000} height={500} />
</div>
)
}
动画显示和播放正常。
问题是在调整浏览器大小时,动画会缩小和挤压,并且不会保留其原始纵横比。如果我在缩小浏览器后刷新页面,动画就会正确呈现。只有在调整大小时,宽高比才会关闭。
我试过添加:
rendererSettings: {
preserveAspectRatio: 'xMidYMid slice' // also tried 'xMidYMid meet'
}
我的选择,但这也不起作用。
我唯一能想到的另一件事是将 resize
事件侦听器附加到 window,后者将依次调用 lottie.resize()
useEffect(() => {
window.addEventListener('resize', ??)
}, [])
??
中的内容是我卡住的地方。我知道使用 lottie-web
,我可以直接访问 lottie.resize()
函数。但是,当使用 react-lottie
时,如何 call/access 调整大小功能?
如有任何帮助,我们将不胜感激。
编辑:我被要求添加示例动画 JSON 所以它在这里:https://pastebin.com/gXCEhKaR
是的,谢谢,我是在家里开始的,但是您已经为 Lottie 组件设置了宽度和高度值。如果你想让Lottie根据屏幕的大小改变它的大小,那么你需要添加一个钩子来改变屏幕。
挂钩调整大小
export function useSizeComponents (ref) {
const [size, setSize] = useState([0, 0])
useLayoutEffect(() => {
function updateSize () {
let newSize = [window.innerWidth, window.innerHeight]
if (ref?.current) {
newSize = [ref.current.offsetWidth, ref.current.offsetHeight]
}
setSize(newSize)
}
window.addEventListener('resize', updateSize)
updateSize()
return () => window.removeEventListener('resize', updateSize)
}, [])
return size
}
你的组件
const MyComponent = () => {
const [width, height] = useSizeComponents()
const scaleLottie = 0.5
const myOptions = {
loop: true,
autoplay: true,
renderer: 'canvas',
animationData: animationData,
}
const control = useMemo(() => {
if (!width) return null
const xMidYMid = 0.5
const sizeComponent = {
width: width * scaleLottie,
height: width * scaleLottie * xMidYMid
}
return <Lottie key={width} options={myOptions} {...sizeComponent} />
}, [width])
return (
<div>
...other stuff
{control}
</div>
)
}