Javascript 向样式化组件添加转换

Javascript 向样式化组件添加转换,javascript,css,reactjs,styles,styled-components,Javascript,Css,Reactjs,Styles,Styled Components,我在React中有以下组件: const Button = styled.div` width: 30px; height: 30px; position: absolute; right: 2em; top: 50%; transform: translateY(-50%); padding: 0; margin: 0; &::before,

我在React中有以下组件:

const Button = styled.div`
        width: 30px;
        height: 30px;
        position: absolute;
        right: 2em;
        top: 50%;
        transform: translateY(-50%);
        padding: 0;
        margin: 0;

        &::before,
        &::after {
          content: "";
          position: absolute;
          background-color: #3d3935;
          transition: transform 0.25s ease-out;
        }

        &::before {
          top: 0;
          left: 50%;
          width: 4px;
          height: 100%;
          margin-left: -2px;
        }

        &::after {
          top: 50%;
          left: 0;
          width: 100%;
          height: 4px;
          margin-top: -2px;
        }
`;
它只渲染具有库样式化组件的组件。它基本上显示一个
+
符号

但是,我想分别旋转每条线,使用:

    &::before {
      transform: rotate(${this.state.expanded ? '0' : '45'}deg);
    }
    &::after {
      transform: rotate(${this.state.expanded ? '0' : '135'}deg);
    }
它工作得很好,但不幸的是没有转换(它会立即发生)。尝试在这些行中的每一行中包含转换,但仍然不会影响更改

我尝试过的另一个解决方案是添加一个类,例如旋转的

    &.rotated::before {
      transform: rotate(45deg);
    }
但是样式化组件并不能提供仅仅使用其逻辑动态更改类的实际可能性


期待任何帮助,谢谢。

您可以尝试向组件传递条件道具

import styled, { css } from 'styled-components';

<Button expanded={ this.state.expanded } />

也可以使用三元运算符:

const按钮=styled.div`
变换:${props=>props.EXPENDED?'rotate(180度)'rotate(0度)};
转变:转变。2放松;
`;

还要确保在使用按钮的函数外部定义该按钮。我现在犯了那个错误,不明白为什么过渡不起作用(给未来我的提示)。

我为此挣扎了一段时间,我通过这样做来实现:

import styled from 'styled-components';
import { IconButton } from '@material-ui/core';
import { Pin } from 'styled-icons/boxicons-solid/Pin';

const IconWrapper = styled(IconButton).attrs(props => ({
  style: {
   padding: '0',
   transition: 'transform 0.2s ease-out',
   transform: props.rotated ? 'rotate(0)' : 'rotate(90deg)',
  },
}))`
  /* additional css goes here */
`;
然后作为回报:

<IconWrapper
  rotated={isRotated}
  onClick={handleClick} /* toggle isRotated true/false */
>
  <Pin size="20" />
</IconWrapper>


将转换应用于元素本身,而不是伪元素。您对元素进行了转换,但将转换应用于pseudo。@Morpheus尝试过,但没有成功:(我想知道引入初始转换值是否会有所帮助,类似这样的+1${props=>props.expanded&&css`transform:rotate(45度);`};花了我很长时间才找到它。谢谢!
<IconWrapper
  rotated={isRotated}
  onClick={handleClick} /* toggle isRotated true/false */
>
  <Pin size="20" />
</IconWrapper>