简体   繁体   English

情感风格组件中的媒体查询

[英]Media Queries in Emotion Styled Components

The Emotion docs tell us how to make reusable media queries that works in the css prop. Emotion 文档告诉我们如何在 css 道具中进行可重用的媒体查询 This allows us to make the following queries in a css prop:这允许我们在 css prop 中进行以下查询:

<div
  css={{
    color: 'green',
    [mq[0]]: {
      color: 'gray'
    },
    [mq[1]]: {
      color: 'hotpink'
    }
  }}
>

With mq[0] and mq[1] referring to the first two items in a breakpoints array. mq[0]mq[1]指的是断点数组中的前两项。 For example: const breakpoints = [576, 768, 992, 1200] .例如: const breakpoints = [576, 768, 992, 1200]

What's more, this article takes it one step further, by showing up how to get named reusable media queries by using a breakpoint object.此外, 本文更进一步,展示了如何使用断点对象获取命名的可重用媒体查询。 It starts by making a similar function as per the emotion docs, but for objects:它首先根据情感文档创建一个类似的功能,但对于对象:

const mq = n => {
  const bpArray = Object.keys(bp).map(key => [key, bp[key]]);

  const [result] = bpArray.reduce((acc, [name, size]) => {
    if (n === name) return [...acc, `@media (min-width: ${size}px)`];
    return acc;
  }, []);

  return result;
};

This then allows us to create a breakpoints object with named media queries:这允许我们创建一个带有命名媒体查询的断点对象:

// object
const breakpoints = {
  sm: 500,
  md: 768,
  lg: 992,
  xl: 1200
};


// query
${mq('sm')} { 
  color: gray;
}

So far, so good.到现在为止还挺好。

I would now like to do something similar in an emotion styled component.我现在想在情感风格的组件中做类似的事情。 As such, I created an breakpoints object and the same function as mentioned in the above article.因此,我创建了一个断点对象和与上述文章中提到的相同的函数。

I then tried to use the short hand media query in my emotion styled component -- like this:然后我尝试在我的情感样式组件中使用速记媒体查询——就像这样:

import styled from '@emotion/styled'

const Container = styled.div`
  ${mq('sm')`max-width: 750px;`}
  ${mq('md')`max-width: 970px;`}
  ${mq('lg')`max-width: 1170px`}
`

But when I try this, it does not work.但是当我尝试这个时,它不起作用。 I get the following error message:我收到以下错误消息:

TypeError: Object(...) is not a function

Any idea why this is happening and what I can do to get it to work?知道为什么会发生这种情况以及我能做些什么来让它发挥作用吗?

Thanks.谢谢。

To clarify, there was mainly a minor syntax error in what the OP had posted (there should be no additional backticks in the interpolated string).澄清一下,OP 发布的内容主要存在一个小语法错误(插值字符串中不应该有额外的反引号)。

A full example of his code including type annotations would look like:包含类型注释的完整代码示例如下所示:

const breakpoints: { [index: string]: number } = {
  sm: 500,
  md: 768,
  lg: 992,
  xl: 1200,
};

const mq = Object.keys(breakpoints)
  .map((key) => [key, breakpoints[key]] as [string, number])
  .reduce((prev, [key, breakpoint]) => {
    prev[key] = `@media (min-width: ${breakpoint}px)`;
    return prev;
  }, {} as { [index: string]: string });

const Container = styled.div`
  ${mq["sm"]} {
    max-width: 750px;
  }
  ${mq["md"]} {
    max-width: 970px;
  }
  ${mq["lg"]} {
    max-width: 1170px;
  }
`;

The @bluenote10 answer is correct. @bluenote10 的答案是正确的。 Here's a boosted method if you want to add auto-completion with your IDE in your css definition.如果您想在 css 定义中使用 IDE 添加自动完成功能,这是一种增强的方法。

export const BREAKPOINTS = {
  xs: 420,
  sm: 576,
  md: 768,
  lg: 900,
  xl: 1200,
  xxl: 1536
};

type Mq = keyof typeof BREAKPOINTS;
export const mql = Object.keys(BREAKPOINTS)
  .map((key) => [key, BREAKPOINTS[key as Mq]] as [Mq, number])
  .reduce((prev, [key, breakpoint]) => {
    prev[key] = `@media (min-width: ${breakpoint}px)`;
    return prev;
  }, {} as Record<Mq, string>);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM