根据部分的背景更改汉堡菜单的颜色

时间:2021-07-20 15:20:27

标签: javascript html css reactjs next.js

我正在制作一个 hamburger menu 作为组件并修复了 fixed 属性,它具有菜单特征的三行,这些是白色的,我需要的是当它处于白色部分变为黑色,即使我占用了 Methods for Contrasting Text Against Backgrounds 但它也不起作用,因为 bg 必须在组件的父 div 中,而不是在何处我发送它来调用它,所以如果有人可以帮助我如何让它改变颜色,或者如果已经有一些 npm 的汉堡包相对于 bg 改变颜色。

此外,有必要考虑到在每个不同的页面中它都有不同的 bg,并且在我命令的所有页面中都将 nav 作为组件调用。

这将是我在菜单上的代码,其中包含 nextjstypescript

import { StyledHamburger } from "./Hamburger.styled";

export type Props = {
  open: boolean;
  setOpen: (v: boolean) => void;
};

const Hamburger = (props: Props) => (
  <StyledHamburger open={props.open} onClick={() => props.setOpen(!props.open)}>
    <div />
    <div />
    <div />
  </StyledHamburger>
);

export default Hamburger;

样式:

import styled from "styled-components";

import { colors } from "../global";

export const StyledHamburger = styled.button<{ open: boolean }>`
  position: fixed;

  width: 2rem;
  height: 2rem;
  padding: 0;
  background: transparent;

  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;

  border: none;
  cursor: pointer;
  outline: none;
  z-index: 2;

  div {
    position: relative;
    width: 2rem;
    height: 0.25rem;
    border-radius: 0px;
    transition: all 0.3s linear;
    transform-origin: 1px;
    background-color: ${({ open }) =>
      open ? colors.pearl : colors.pearl};

    :first-child {
      transform: ${({ open }) => (open ? "rotate(45deg)" : "rotate(0)")};
    }

    :nth-child(2) {
      opacity: ${({ open }) => (open ? "0" : "1")};
      transform: ${({ open }) => (open ? "translateX(20px)" : "translateX(0)")};
    }

    :nth-child(3) {
     
      transform: ${({ open }) => (open ? "rotate(-45deg)" : "rotate(0)")};
    }
  }
  p {
    position: relative;
    border-radius: 0px;
    transition: all 0.3s linear;
    transform-origin: 1px;
    background-color: ${({ open }) =>
      open ? colors.pearl : colors.pearl};
      transform: ${({ open }) => (open ? "translateX(20px)" : "translateX(0)")};
  }
`;

2 个答案:

答案 0 :(得分:0)

我不确定是否有一个简单的解决方案来检查元素的背景并进行更改。

我会使用 intersection observer 来检查每个部分及其背景颜色。然后将正确的样式应用到汉堡包元素。它不像您所说的自动对比工具那样自动化,但应该相当容易控制和使用。

答案 1 :(得分:0)

如果每个汉堡包菜单都在不同背景的自己的页面上,您可以使用 CSS 为每页菜单设置样式。您可以做的是为每个页面分配一个附加到正文的 id,然后在 CSS 中调用该 ID 和汉堡菜单来设置样式。

示例:

<body id="homepage">
<nav class="hamburger">
</body>

对于第 2 页:

<body id="about-us">
<nav class="hamburger">
</body>

然后在 CSS 中:

#homepage .hamburger {
your styles
}
#about-us .hamburger {
your styles
}