首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旋转木马只能工作一次

旋转木马只能工作一次
EN

Stack Overflow用户
提问于 2022-07-29 19:55:53
回答 1查看 53关注 0票数 0

我使用"element.scrollIntoView({inline:center,behavior: smooth})“为一个旋转木马组件编写了代码。但是,它不是通过旋转木马水平导航,它只在第一次工作,中心垂直代替。

奇怪的是,如果我走到页面的顶部,按下左右键,它会向下滚动,水平滚动,然后它又开始工作了.我不明白发生了什么事。

TSX文件:

代码语言:javascript
复制
import React, { useEffect, useState } from 'react'
import './styles.css'

export function Carousel() {

  const [currentItem, setCurrentItem] = useState(0)

  function clickArrowLeft() {
    const items = document.querySelectorAll('.items')
    const maxItems = items.length
    
    if(currentItem == 0) {
      setCurrentItem(maxItems - 1)
    }else {
    setCurrentItem(currentItem - 1)
  }
  console.log(currentItem)
}
function clickArrowRight() {
  const items = document.querySelectorAll('.items')
  const maxItems = items.length
  
  if(currentItem == maxItems - 1) {
    setCurrentItem(0)
  }else{
    setCurrentItem(currentItem + 1)
    }
    console.log(currentItem)
  }

  useEffect(()=>{
    
      const items = document.querySelectorAll('.items')
      items.forEach(item => {
        item.classList.remove('current-item')
      })
      items[currentItem].scrollIntoView({
        inline: 'center',
        behavior: 'smooth'
      })
      items[currentItem].classList.add('current-item')
    
  }, [currentItem])
  
  return (
    <div className='Carousel-container'>
      <button onClick={clickArrowLeft} className='control'>{'<'}</button>
        <div id='contain-carousel' className='wrapper'>
            <ul>
                <img className='items current-item' src='https://picsum.photos/seed/1/800/400' />
                <img className='items' src='https://picsum.photos/seed/2/800/400' />
                <img className='items' src='https://picsum.photos/seed/3/800/400' />
                <img className='items' src='https://picsum.photos/seed/4/800/400' />
                <img className='items' src='https://picsum.photos/seed/5/800/400' />
                <img className='items' src='https://picsum.photos/seed/6/800/400' />
                <img className='items' src='https://picsum.photos/seed/7/800/400' />
                <img className='items' src='https://picsum.photos/seed/8/800/400' />
                <img className='items' src='https://picsum.photos/seed/9/800/400' />
                <img className='items' src='https://picsum.photos/seed/10/800/400' />
            </ul>
        </div>
      <button onClick={clickArrowRight} className='control'>{'>'}</button>
    </div>
  )
}

CSS文件:

代码语言:javascript
复制
.Carousel-container{
    @apply
    flex
    p-4
    m-auto
    gap-2
}

.wrapper{
    @apply
    overflow-x-auto
}

ul {
    @apply
    flex
    flex-nowrap
    gap-2
}

.items{
    @apply
    opacity-10
}

.current-item {
    @apply
    opacity-100
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-29 20:38:05

scrollIntoView垂直滚动,而inline: 'center'应该处理水平滚动,所以这里并不奇怪。

在看到CSS文件之前,我不能告诉您更多。

您可以通过将display: none设置为所有没有current-item类的项来实现您想要的结果吗?这样您就根本不需要使用scrollIntoView了。

另外,您不应该创建useEffect来检测currentItem更改的时间,而应该将其作为一个单独的函数,并从clickArrowRightclickArrowLeft调用它。这样,您将避免在组件第一次加载时调用它(除非您希望这样做)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73170425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档