相邻兄弟没有获得CSS变量值

我有一个React标头组件,该组件由styled-components设置样式。我有一个选择器,我可以使用该选择器来选择标题的下一个同级项,并为其加上顶部填充以在标题下保持空白,因为它具有position: fixed。当我使用这种样式的常规值时,它就可以正常工作,但是一旦使用CSS变量,便可以通过媒体查询自定义高度,该变量将不再在同级元素中进行解析。这是我的代码:

export const S_Header = styled.header<HeaderProps>`
  --height: 20vw;

  position: fixed;
  top: 0;

  width: 100vw;
  height: var(--height);

  /* Give the next sibling a top padding so text doesn't flow underneath the header */
  + * {
    padding-top: var(--height);
    margin-top: 0;
    border-top: 0;
  }
`;

样式已应用于标头本身(高度正常工作),但是兄弟姐妹的padding-top在Chrome中的值为var(--height),这是正常的,但不会显示任何计算所得的值当我将其悬停时。

qf0923 回答:相邻兄弟没有获得CSS变量值

如@DennisMartinez所说,

  

“ CSS定制属性在级联时起作用。这意味着它将在声明它的元素和该元素的后代上起作用。同级不是后代,因此您会遇到此问题。”

这意味着很难解决这个问题。我认为以下解决方案可能是最好的,因为上述限制使我们很难想到更好的解决方案。

我最终两次声明了变量,一次是在Header样式内部,一次是在同级选择器内部。如果需要,我可以插值,这样我仍然可以有一个单一的真理来源。我希望通过媒体查询来更改变量,因此我也两次在与变量相同的位置声明了此变量。如果需要,可以将此复制粘贴提取到字符串中并进行插值。

代码如下:

export const S_Header = styled.header<HeaderProps>`
  --height: 20vw;

  position: fixed;
  top: 0;

  width: 100vw;
  height: var(--height);

  @media (${devices.medium}) {
    --height: 10vw;
  }

  @media (${devices.large}) {
    --height: 5vw;
  }

  /* Give the next sibling a top padding so it doesn't start underneath the header */
  + * {
    --height: 20vw;

    padding-top: var(--height);
    margin-top: 0;
    border-top: 0;

    @media (${devices.medium}) {
      --height: 10vw;
    }

    @media (${devices.large}) {
      --height: 5vw;
    }
  }
`;

我也使用上面提到的内插法编写了此代码:

const heightVar = "--height: 20vw;";

const mediaQuery = ` 
  @media (${devices.medium}) {
    --height: 10vw;
  }

  @media (${devices.large}) {
    --height: 5vw;
  }
`;

export const S_Header = styled.header<HeaderProps>`
  ${heightVar}

  position: fixed;
  top: 0;

  width: 100vw;
  height: var(--height);

  z-index: 98;

  transform: ${(props): string =>
    props.visible === false ? "translateY(-100%)" : "none"};

  background-color: ${(props): string =>
    props.atTop ? "transparent" : props.bgColor};

  transition: transform 0.35s,background-color 0.35s ease-in-out;

  ${mediaQuery}

  /* Give the next sibling a top padding so it doesn't start underneath the header */
  + * {
    ${heightVar}

    padding-top: var(--height);
    margin-top: 0;
    border-top: 0;

    ${mediaQuery}
  }
`;
本文链接:https://www.f2er.com/3040934.html

大家都在问