【问题标题】:How can I use media query with emotion/styled/macro?如何使用带有情感/样式/宏的媒体查询?
【发布时间】:2021-09-30 06:36:12
【问题描述】:

我找不到任何使用带有媒体查询的样式宏的代码,也不明白为什么使用emotion/styled/macro 找到代码是如此罕见。

我知道它允许对象文字中的 css 样式

const StyledUl = styled("ul")(
    {
        backgroundColor: "#fff",
        height: "200px",
        width: "100%",
        overflowY: "scroll",
        position: "absolute",
        margin: 0,
        padding: "5px",
        boxShadow: "-1px 15px 34px -21px rgba(0,32,86,0.21)",
        boxSizing: "border-box",
        borderRadius: "8px",
        zIndex: 9999,
    }
)

但是如何使用media 查询呢? 我在哪里可以找到有关 emotion/styled/macro 的文档?

【问题讨论】:

    标签: reactjs emotion


    【解决方案1】:

    没有什么特别的要求。只需添加一个@media ... 查询作为属性:

    import styled from "@emotion/styled/macro";
    
    const StyledUl = styled("ul")({
      "@media (max-width: 600px)": {
        backgroundColor: "#000",
        color: "#fff"
      },
      backgroundColor: "#fff",
      height: "200px",
      width: "calc(100% - 40px)",
      overflowY: "scroll",
      position: "absolute",
      margin: 0,
      padding: "5px",
      boxShadow: "-1px 15px 34px -21px rgba(0,32,86,0.21)",
      boxSizing: "border-box",
      borderRadius: "8px",
      zIndex: 9999
    });
    
    export default StyledUl;
    

    您可以选择使用模板文字来设置styled.HTMLElement 的样式:

    import styled from "@emotion/styled/macro";
    
    const StyledUlTemplate = styled.ul`
      @media (max-width: 600px) {
        background-color: #000;
        color: #fff;
      }
    
      background-color: #fff;
      height: 200px;
      width: calc(100% - 40px);
      overflow-y: scroll;
      position: absolute;
      top: 60%;
      margin: 0;
      padding: 5px;
      box-shadow: -1px 15px 34px -21px rgba(0, 32, 86, 0.21);
      box-sizing: border-box;
      border-radius: 8px;
      z-index: 9999;
    `;
    
    export default StyledUlTemplate;
    

    演示(左右拖动中间条以调整Browser标签的大小以触发样式更改):

    【讨论】:

    • 我个人不想使用模板文字,因为我正在使用 emacs 并且不想为此设置语法荧光笔...... :(但这就是我想要的。非常感谢!
    • 顺便说一句,使用模板有什么好处吗?
    • 两个优点是在模板字面量内,CSS 属性可以自动插值:color: ${props => props.color || "#fff" };;而在对象中,它们要么需要css 辅助函数(它使用模板文字),要么你需要传递一个返回对象的函数:styled("ul")(props => ({ color: props.color || "#fff" }))。另一个优点是在模板文字中插入多个属性更容易并且直接。
    • 我认为在内部使用道具时使用对象也很容易,但确实在模板中看起来很方便。非常感谢您的回复。
    • 更新了演示以包含使用伪选择器的示例(请参阅Toggle.js)。
    猜你喜欢
    • 2013-10-19
    • 2021-05-31
    • 2021-11-13
    • 1970-01-01
    • 2020-04-20
    • 2018-03-06
    • 1970-01-01
    • 2014-07-08
    • 2013-03-16
    相关资源
    最近更新 更多