Наведіть інший стильовий компонент при наведенні


87

Який найкращий спосіб обробляти зависання у стилізованих компонентах. У мене є обгортковий елемент, який при наведенні покаже кнопку.

Я міг реалізувати деякий стан на компоненті і перемикати властивість при наведенні, але цікавився, чи є кращий спосіб зробити це за допомогою styled-cmponents.

Щось на зразок наступного не працює, але було б ідеально:

const Wrapper = styled.div`
  border-radius: 0.25rem;
  overflow: hidden;
  box-shadow: 0 3px 10px -3px rgba(0, 0, 0, 0.25);
  &:not(:last-child) {
    margin-bottom: 2rem;
  }
  &:hover {
    .button {
      display: none;
    }
  }
`

Відповіді:


165

Що стосується styled-components v2, ви можете інтерполювати інші стилізовані компоненти, посилаючись на їх автоматично генеровані імена класів. У вашому випадку ви, мабуть, захочете зробити щось подібне:

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

Докладнішу інформацію дивіться у документації !

Важливий порядок компонентів. Це буде працювати, лише якщо Buttonце визначено вище / раніше Wrapper.


Якщо ви використовуєте v1, і вам потрібно це зробити, ви можете обійти це за допомогою спеціального імені класу:

const Wrapper = styled.div`
  &:hover .my__unique__button__class-asdf123 {
    display: none;
  }
`

<Wrapper>
  <Button className="my__unique__button__class-asdf123" />
</Wrapper>

Оскільки v2 - це оновлення, яке випадає з версії 1, я б рекомендував оновити, але якщо цього немає в картках, це чудове рішення.


17
Для кожного, хто читає це, важливий порядок компонентів. Це спрацює, лише якщо Buttonце визначено вище / ранішеWrapper
Titan

Власне, ще однією важливою документацією є посилання на інші компоненти
L_K

Що, якби я хотів розраховувати на деякі реквізити, передані кнопці від Wrapper, тому наведення виглядає по-різному залежно від реквізиту?
rmartrenado

29

Подібно до відповіді mxstbr, ви також можете використовувати інтерполяцію для посилання на батьківський компонент. Мені подобається цей маршрут, оскільки він інкапсулює стилістику компонента трохи краще, ніж посилання на дочірній компонент у батьківському.

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

Я не міг сказати вам, коли ця функція була введена, але це працює з v3.

Відповідне посилання: https://www.styled-components.com/docs/advanced#referring-to-other-components



0

Це рішення спрацювало для мене:

const ContentB = styled.span`
  opacity: 0;

  &:hover {
    opacity: 1;
  }
`

const ContentA = styled.span`
  &:hover ~ ${ContentB} {
    opacity: 1;
  }
`

0

Це те, що мені вдалося

const NoHoverLine = styled.div`
  a {
    &:hover {
      text-decoration: none;
    }
  }
`

Будь ласка, поясніть, як працює ваш код і як він працює.
M-Chen-3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.