SASS在Next.JS CSS模块中无法正常工作

6ie5vjzr  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(244)

这是我第一次使用Next.JS的CSS模块,它们非常有用。
但是,当我尝试将样式应用于children元素时,我遇到了一个奇怪的行为。
例如,如果我有以下HTML

<Offcanvas show={menu} onHide={closeMenu} className={styles.mobile_menu}>
    <Offcanvas.Header closeButton className={styles.mobile_menu_header}>
        <Offcanvas.Title className={styles.mobile_menu_title}>
            <h1>Menu</h1>
        </Offcanvas.Title>
    </Offcanvas.Header>
    <Offcanvas.Body>
        <ul className="list-unstyled">
            { links.map((link, key) => (
                <li key={"nav-link-" + key} className="mb-3">
                    <Link href={link.href} className={[styles.link, router.pathname == link.href ? "active" : ""].join(" ")}>{ link.label }</Link>
                </li>
            )) }
        </ul>
    </Offcanvas.Body>
</Offcanvas>

这个SCSS

.mobile_menu {
    background-color: rgb(57, 70, 78) !important;
    color: #fff !important;
}

.mobile_menu_header {
    border-bottom: solid 1px rgb(148, 162, 170);

    button.btn-close {
        filter: brightness(0) invert(1) !important;
        opacity: 1 !important;
        width: 1.6rem !important;
        height: 1.6rem !important;
        background-size: 100% !important;
    }
}

.mobile_menu_title {
    h1 {
        font-size: 3.2rem;
    }
}

.link {
    color: #fff;
    text-transform: uppercase;
    font-size: 1.7rem;
    transition: color 0.3s ease-in-out;

    &.active {
        border-bottom: solid 1rem rgb(148, 162, 170) !important;
    }

    &:hover {
        color: rgb(148, 162, 170);
    }
}

应用于button.btn-close(通过将closeButton标志添加到Offcanvas.Header自动生成)的属性未应用,并且与active类的链接没有预期的底部边框。
所以这让我觉得Next.JS的CSS模块中的SASS没有使用嵌套的/child/选择器,但是,由于某种原因,.mobile_menu_title中的h1是样式化的,并且,当我试图从选择器中删除.btn-close(只留下button)时,它被应用了!
那么,这是一个bug还是我不知道的东西?使用SASS的嵌套样式只适用于"纯"元素,而不适用于具有类/ID的选择器。
有人能帮我一下吗?
谢谢!

    • 注意:**我使用的是react Bootstrap 包。
gk7wooem

gk7wooem1#

那么,您可以做以下几点
在JavaScript文件中

...

<Offcanvas.Header closeButton className={styles.mobile_menu_header}>

  ...

</Offcanvas.Header>

...

在样式文件中

.mobile_menu_header {
  border-bottom: solid 1px rgb(148, 162, 170);
  :global {
    button.btn-close {
      filter: brightness(0) invert(1) !important;
      opacity: 1 !important;
      width: 1.6rem !important;
      height: 1.6rem !important;
      background-size: 100% !important;
    }
  }
}

"为什么会这样"
通过添加:global规则,基本上就是告诉React应用程序:在具有computed类名mobile_menu_header(实际类名类似于index_mobile_menu_header_xxxxxxxx)的元素中,找到类名为btn-close的元素并应用指定的样式。
像您所做的那样,将所有内容 Package 在mobile_menu_header中,有助于避免在整个应用程序中覆盖btn-close,而只是在此组件中覆盖它们。
当覆盖CSS库的唯一方法是覆盖样式本身时(因此,如果您无法通过样式化组件或主题设置等其他方式自定义库),这可能是一种适应策略,但您还需要面对CSS模块(导致名称类似而不仅仅是类名的模块)。

相关问题