React JS:如何在 react-spring 中使用响应式样式

Posted

技术标签:

【中文标题】React JS:如何在 react-spring 中使用响应式样式【英文标题】:React JS: How to use responsive styles with react-spring 【发布时间】:2020-09-17 15:21:08 【问题描述】:

我不熟悉使用 Gatsby 和 React JS 构建网站。

问题

我想使用react-spring 制作基于css transform 属性的简单动画。 当我使用styled-components(带有theme.js 文件)时,我希望动画能够根据断点做出响应。

问题是react-spring 不会接受 array,而只接受 strings 作为例如“10 像素”。


响应式风格与react-components

假设我有以下定义

const MyDiv = styled(animated.div)`
  height: 100px;
  $width
`;

然后像这样简单地调用元素

<MyDiv width=[50, 70] />

由于我在我的 theme.js 文件中实现了 断点,因此效果很好(使用 styled-components 中的 ThemeProvider)。

按钮动画

让我们定义 spring 动画如下:

const [showButton, setShowButton] = useState(false);
const clickState = useSpring(
  oi: showButton ? 0 : 1,
);
const divAnimation = 
  transform: clickState.oi.interpolate(oi => `translateX($oi * 50px)`),
;

并将其称为

<Button onClick=setShowButton(!showButton)>
  <MyDiv style= ...divAnimation  />
</Button>

响应式和动画

正如上面间接提到的,我希望根据窗口宽度制作稍微不同的动画。所以,我想出了一些如何实现它的想法,但没有一个可行。

动画divAnimation 一定有可能以不同方式移动 div。还是不..?


提前感谢您的帮助。

亲切的问候

.

.

.

post scriptum:该代码的依赖关系

import React,  useState  from 'react';
import styled from 'styled-components';
import  width  from 'styled-system';
import  animated  from 'react-spring';¨
import  Button  from 'rebass';

【问题讨论】:

你有没有想过这个问题? 【参考方案1】:

使用window.matchMediajavascript 中调用媒体查询,然后相应地更改 spring 的输入。

作为自定义钩子的示例实现:

const useMediaQuery = (minWidth: number) => 
  const [matches, setMatches] = useState(true);

  useEffect(() => 
    const mediaQuery = window.matchMedia(
      `screen and (min-width: $minWidthpx)`
    );
    const listener = (ev) => 
      setMatches(ev.matches);
    ;
    mediaQuery.addEventListener("change", listener);

    return () => 
      mediaQuery.removeEventListener("change", listener);
    ;
  , []);

  return matches;
;

【讨论】:

以上是关于React JS:如何在 react-spring 中使用响应式样式的主要内容,如果未能解决你的问题,请参考以下文章

如何反向运行 react-spring 动画?

如何将 react-spring 动画组件添加到 React 延迟加载?

将 react-spring 用于 react-native

React-Spring - 改变过渡动画速度

react-spring 中的“动画”做啥?

react-spring 插值函数不适用于打字稿