Target another styled component on hover

后端 未结 5 910
长情又很酷
长情又很酷 2020-12-12 11:42

What is the best way to handle hovers in styled-components. I have a wrapping element that when hovered will reveal a button.

I could implement some state on the com

相关标签:
5条回答
  • 2020-12-12 11:59

    Similarly to mxstbr's answer, you can also use interpolation to reference a parent component. I like this route because it encapsulates a component's styling a little better than referencing the child component in the parent.

    const Button = styled.button`
      ${Wrapper}:hover & {
        display: none;
      }
    `;
    

    I couldn't tell you when this feature was introduced but this works as of v3.

    Relevant link: https://www.styled-components.com/docs/advanced#referring-to-other-components

    0 讨论(0)
  • 2020-12-12 12:02

    This solution worked for me:

    const ContentB = styled.span`
      opacity: 0;
    
      &:hover {
        opacity: 1;
      }
    `
    
    const ContentA = styled.span`
      &:hover ~ ${ContentB} {
        opacity: 1;
      }
    `
    
    0 讨论(0)
  • 2020-12-12 12:03

    This is what worked for me

    const NoHoverLine = styled.div`
      a {
        &:hover {
          text-decoration: none;
        }
      }
    `
    
    0 讨论(0)
  • 2020-12-12 12:07

    As of styled-components v2 you can interpolate other styled components to refer to their automatically generated class names. In your case you'll probably want to do something like this:

    const Wrapper = styled.div`
      &:hover ${Button} {
        display: none;
      }
    `
    

    See the documentation for more information!

    The order of components is important. It will only work if Button is defined above/before Wrapper.


    If you're using v1 and you need to do this you can work around it by using a custom class name:

    const Wrapper = styled.div`
      &:hover .my__unique__button__class-asdf123 {
        display: none;
      }
    `
    
    <Wrapper>
      <Button className="my__unique__button__class-asdf123" />
    </Wrapper>
    

    Since v2 is a drop-in upgrade from v1 I'd recommend updating, but if that's not in the cards this is a fine workaround.

    0 讨论(0)
  • 2020-12-12 12:10

    My solution is

    const Content = styled.div`
      &:hover + ${ImgPortal} {
        &:after {
          opacity: 1;
        }
      }
    `;
    
    0 讨论(0)
提交回复
热议问题