@stepan132

Почему не работает transition?

Здравствуйте. Решил анимировать переход по табам и столкнулся с проблемой: переход не плавный.
Использую: React + styled-components
При клике на название таба, я заношу в state ширину и отступ от левого края. По эти данным рисуется подчеркивание активного таба. Все работает корректно за исключением плавного перехода, элемент просто перескакивает. Вот части кода:

state = {
    tabUnderlineWidth: 131,
    tabUnderlineLeft: 0,
}

// функция, выполняющаяся при клике на название таба
changeActiveTab = (e: React.MouseEvent<HTMLElement>, tabName: string) => {
    const node = e.target as HTMLElement
    const nodeLeftIndent = node.offsetLeft
    const nodeWidth = node.offsetWidth

    this.setState({
      tabUnderlineWidth: nodeWidth,
      tabUnderlineLeft: nodeLeftIndent
    })
}

<TabIconsWrapper> // обертка названий табов
            {tabNames.map(({ tabName, title }, i) => { // Сами названия табов
              return <TabIcon
                onClick={(e) => this.changeActiveTab(e, tabName)}
                key={i}
              >{title}</TabIcon>
            })}
            <TabIconUnderline tabUnderlineWidth={tabUnderlineWidth} tabUnderlineLeft={tabUnderlineLeft} // элемент, который должен анимироваться
</TabIconsWrapper>


вот styled-components:

const TabIconsWrapper = styled.div`
  position: relative;
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 50px;
`
const TabIconUnderline = styled.span`
  position: absolute;
  bottom: 0;
  height: 2px;
  background: #000;
  transition: 2s;
  
  ${(props: { tabUnderlineWidth: number, tabUnderlineLeft: number }) => `
    width: ${props.tabUnderlineWidth}px;
    left: ${props.tabUnderlineLeft}px;
  `};
`


Смотрел в инспекторе, ширина и отступ выставляются корректно. также пробовал выставлять inline стили, эффекта это не дало
  • Вопрос задан
  • 428 просмотров
Пригласить эксперта
Ответы на вопрос 1
Seasle
@Seasle Куратор тега CSS
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы