1

在 Styled System 中,他们有Responsive Props。例如:

<Box width={['100%', '50%', '25%']} />

这将产生以下 CSS:

.Box-hash {
  width: 100%;
}

@media screen and (min-width: 40em) {
  .Box-hash {
    width: 50%;
  }
}

@media screen and (min-width: 52em) {
  .Box-hash {
    width: 25%;
  }
}

作为替代方案,可以使用以下语法:

<Box width={{ _: '100%', md: '50%', lg: '25%' }} />

它将产生相同的结果。

我想知道是否可以使用 Styled Components 做类似的事情。我的想法是这样的:

const StyledBox = styled.div`

  width: ${['100%', '50%', '25%']};
`

const OtherStyledBox = styled.div`

  width: ${{ _: '100%', md: '50%', lg: '25%' }};
`

样式化组件可以做到这一点吗?如果没有,知道如何创建一个可以做到这一点的函数或“混合”吗?

谢谢。

4

3 回答 3

1

如果您的应用的样式“API”有 3 个媒体查询断点,那么您可以在样式组件中使用道具并返回正确的 CSS。指定您想要的 API,即<StyledBox width={{ _: '100%', md: '50%', lg: '25%' }} />.

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

const StyledBox = styled.div`
  ${props => props.width && css`
    width: ${width._};

    @media screen and (min-width: 40em) {
      width: ${width.md};
    }

    @media screen and (min-width: 52em) {
      width: ${width.lg};
    }
  `}
`;

StyledBox.propTypes = {
  width: PropTypes.shape({
    _: PropTypes.string.isRequired,
    md: PropTypes.string.isRequired,
    lg: PropTypes.string.isRequired,
  }),
};

StyledBox.defaultProps = {
  width: {
    _: '100%',
    md: '50%',
    lg: '25%'
  }
};

样式化组件css 辅助函数

用法:

<StyledBox>
  This gets default media breakpoints, 100%, 50%, 25%
</StyledBox>

<StyledBox
  width={{ _: '90%', md: '80%', lg: '70%'}}
>
  This gets overridden media breakpoints, 90%, 80%, 70%
</StyledBox>

更新

如果您不想每次都写出媒体查询,请将其分解为样式实用程序函数,以便在您想要响应的任何其他样式组件中使用。

const mediaQueries = ({ sm = '100%', md = '50%', lg = '25%'}) => css`
  width: ${sm};

  @media screen and (min-width: 40em) {
    width: ${md};
  }

  @media screen and (min-width: 52em) {
    width: ${lg};
  }
`;

然后在任何样式的组件中导入和使用

const ResponsiveDiv = styled.div`
  ...

  ${mediaQueries()}

  ...
`;

const CustomResponsiveDiv = styled.div`
  ...

  ${mediaQueries({ _: '90%', md: '80%', lg: '70%'})}

  ...
`;
于 2020-01-19T22:28:24.587 回答
1

我构建了一个媒体查询助手,允许您将数组放入反引号中,如下所示:

mq`
    width: ${[300, 600, 900]};
    color: ${["red", "blue"]};
    background-color: white;
`

了解更多: https ://github.com/hadiab/styled-easy-mq

于 2021-07-08T08:27:15.013 回答
0

我最终使用了 EmotionJS 库Facepaint。使用该库,我可以执行以下操作:

const mq = facepaint([
  '@media(min-width: 480px)',
  '@media(min-width: 768px)',
  '@media(min-width: 992px)',
  '@media(min-width: 1200px)',
  '@media(min-width: 1600px)',
])

const Test = styled.div`
  background-color: orange;

  ${mq({
    width: ['10px', '25px', '50px', '100px', '200px', '400px'],
    height: ['10px', '25px', '50px', '100px', '200px', '400px'],
  })};
`

这基本上是我想做的。目前我不知道如何创建一个对象系统税——即: width: { _: '15px', md: '30px', xl: '100px' }。但就目前而言,它已经足够好了。

于 2020-01-20T13:50:52.860 回答