Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

希望可以允许用户添加滚动效果 #71

Open
Soya-xy opened this issue Dec 28, 2024 · 9 comments
Open

希望可以允许用户添加滚动效果 #71

Soya-xy opened this issue Dec 28, 2024 · 9 comments

Comments

@Soya-xy
Copy link

Soya-xy commented Dec 28, 2024

scrollToBottom scrollToTop scrollToIndex scrollInToView scrollToOffset 可以允许用户 添加scroll-behavior 来允许平滑滚动

@kolarorz
Copy link
Owner

好的,安排

@kolarorz
Copy link
Owner

kolarorz commented Dec 28, 2024

你好,项目commit有调整。需要重新rebase后提交一下pr。
如果不方便我直接改也可以。

@Soya-xy
Copy link
Author

Soya-xy commented Dec 28, 2024

不确定是否 scrollToOffset 覆盖了 全部场景

@kolarorz
Copy link
Owner

我会回归一下所有场景。感谢反馈,我尽快完成

@kolarorz
Copy link
Owner

kolarorz commented Jan 9, 2025

当目标位置超出虚拟渲染起始,该滚动效果是无效的。不过已经在尝试做一个假的动画效果,来实现视觉上的平滑滚动,不过时间可能较久

@netdolphin
Copy link

这个功能很需要哇, 我尝试使用translateY + transition的CSS动画, 偏移后再是设置偏移量为0, 效果不是很好。

@Soya-xy
Copy link
Author

Soya-xy commented Jan 13, 2025

这个功能很需要哇, 我尝试使用translateY + transition的CSS动画, 偏移后再是设置偏移量为0, 效果不是很好。

目前可以通过patch 暂时修改 ,也可以 使用 vueuse useTransition 暂时实现

const isScrolling = ref(false)
const source = ref(0)
const smoothIndex = useTransition(source, {
  duration: 1000,
  transition: TransitionPresets.linear,
})

watch(smoothIndex, (newValue) => {
  if (el.value) {
    const itemSize = el.value.getItemSize(Math.floor(newValue))
    el.value.clientRefEl.scrollTop = newValue * itemSize
  }
})

function startAutoScroll() {
  const scroll = () => {
    if (!isScrolling.value) {
      isScrolling.value = true
      source.value++

      setTimeout(() => {
        isScrolling.value = false
      }, 1400)
    }
  }

  setTimeout(() => {
    scroll()
    setInterval(scroll, 3000)
  }, 500)
}

onMounted(async () => {
  await nextTick()
  if (el.value) {
    startAutoScroll()
  }
})

@netdolphin
Copy link

sorry,

这个功能很需要哇, 我尝试使用translateY + transition的CSS动画, 偏移后再是设置偏移量为0, 效果不是很好。

目前可以通过patch 暂时修改 ,也可以 使用 vueuse useTransition 暂时实现

const isScrolling = ref(false)
const source = ref(0)
const smoothIndex = useTransition(source, {
  duration: 1000,
  transition: TransitionPresets.linear,
})

watch(smoothIndex, (newValue) => {
  if (el.value) {
    const itemSize = el.value.getItemSize(Math.floor(newValue))
    el.value.clientRefEl.scrollTop = newValue * itemSize
  }
})

function startAutoScroll() {
  const scroll = () => {
    if (!isScrolling.value) {
      isScrolling.value = true
      source.value++

      setTimeout(() => {
        isScrolling.value = false
      }, 1400)
    }
  }

  setTimeout(() => {
    scroll()
    setInterval(scroll, 3000)
  }, 500)
}

onMounted(async () => {
  await nextTick()
  if (el.value) {
    startAutoScroll()
  }
})

sorry, 这个方式应该是可行的。但我个人认为值得商榷。

@netdolphin
Copy link

scrollToBottom scrollToTop scrollToIndex scrollInToView最后都可以转化为scrollToOffset

譬如scrollToOffset最后为300, 那设定一个定时器, 每次scrollToOffset 10,其实就可以实现平滑过渡。这个本质和你的解决方案是一样的。

[vue-virt-list]的目的是为了解决大量数据带来的性能问题,使用定时器少量scrollToOffset也好, useTransition也罢, 使用js来实现动画, 本质上性能又浪费了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants