首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >style -system|解析组件内的主题样式函数

style -system|解析组件内的主题样式函数
EN

Stack Overflow用户
提问于 2020-09-22 21:40:02
回答 1查看 260关注 0票数 0

我正在尝试弄清楚如何在默认情况下解析组件中的样式化系统函数。这个想法是有一个容器元素,它使用开箱即用的主题来提供主要的响应性中断。

现在,我在下面做的就是为样式化系统的width函数提供一个这样的对象:

代码语言:javascript
复制
//theme.js
const CONTAINERS = {
  xs: "100%",
  sm: "55rem",
  md: "74rem",
  lg: "100rem",
  xl: "131rem",
};
export default {
 containers: CONTAINERS,
//other items
}
代码语言:javascript
复制
//Container.js
export default (props) => {
  const { containers, grid } = useContext(ThemeContext);
  return (
    <Container px={grid.margin} width={containers} {...props}>
      {props.children}
    </Container>
  );
};

const Container = styled("div")(
  css`
    margin-right: auto;
    margin-left: auto;
    padding-right: 1rem;
    padding-left: 1rem;
  `,
  compose
);

这是可以工作的,但是,它并不像我希望的那样干净。我很希望能够简单地

代码语言:javascript
复制
const Container = styled("div")(
  css`
    margin-right: auto;
    margin-left: auto;
    padding-right: 1rem;
    padding-left: 1rem;
    ${//maybe resolve the responsive widths here}
  `,
  compose //<- a group of styled-system functions supplied in one object
  //or resolve responsive widths here
);

export default Container

这将是非常干净的,因为我可以将布局组件合并并导出到一个文件中,而不必执行const Container... + const StyledContainer...手续。

我正在考虑编写一个函数来循环containers对象并返回媒体查询中包装的宽度,但我想知道styled-system是否可以开箱即用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 00:00:10

我在文档中找不到任何东西可以让它开箱即用,所以我手动实现了它。

代码语言:javascript
复制
//theme.js
const BREAKPOINTS = {
  xs: "0em",
  sm: "37em",
  md: "48em",
  lg: "64.625em",
  xl: "84em",
};

const CONTAINERS = {
  xs: "100%",
  sm: "55rem",
  md: "74rem",
  lg: "100rem",
  xl: "131rem",
};

下面的脚本获取上面的对象,并将断点值放入包装的@media中,然后将容器的值作为width:插入到其中。然后将整个批次作为css返回。

代码语言:javascript
复制
const Container = styled("div")(
  css`
    margin-right: auto;
    margin-left: auto;
    padding-right: 1rem;
    padding-left: 1rem;

    &::after,
    &::before {
      content: "";
      display: block;
      min-height: 2rem;
      height: 4vw;
      max-height: 6rem;
    }
  `,
  compose,
  (props) => {
    const breakpoints = props.theme.breakpoints;
    const containers = props.theme.containers;

    const makeMedia = (media) => {
      return (...args) => css`
        @media ${media} {
          ${css(...args)}
        }
      `;
    };

    const getMedia = Object.keys(breakpoints).reduce((media, breakpoint) => {
      const breakpointWidth = breakpoints[breakpoint];
      media[breakpoint] = makeMedia(
        [breakpoint !== 0 && `(min-width: ${breakpointWidth})`]
          .filter(Boolean)
          .join(" and ")
      );
      return media;
    }, {});

    return css`
      ${Object.keys(breakpoints).map(
        (key) => containers[key] && getMedia[key]`width: ${containers[key]}`
      )};
    `;
  }
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64011008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档