近期在接入deepseekR1的深度思考,研究了下deepseek官网的滚动效果,大概如下:用户发出消息后,自动滚动到页面最底部,让最新消息展示在视野中,这时候,我们先处理一次滚动:


const scrollDom = ref(null); // 获取DOM
if (scrollDom.value) {
      const maxScrollTop = robotScroll.value.scrollHeight - robotScroll.value.clientHeight;
      scrollDom.value.scrollTop = maxScrollTop;
    }

这时候,消息发出,AI开始回答,这时候,如果用户没有滚动页面,那么就依然是在底部,并且随着AI回答的文字渐渐冒出,我们去把页面慢慢滚动,保持一直可以看到最新冒出的消息。但是注意需要判断:用户如果滚动了页面(例如在查看顶部其他回答),我们是不能打断用户操作的,这个时候我们不进行页面滚动处理。如下:

// 判断在最底部才继续黏贴在底部滚动
const stickToBottom = () => {
  const scrollEl = scrollDom.value;
  if (!scrollEl) return;

  // 记录当前滚动状态
  const currentScrollTop = scrollEl.scrollTop;
  const currentMaxScroll = scrollEl.scrollHeight - scrollEl.clientHeight;
  
  // 判断是否已经到底部(允许1px误差)
  const isAtBottom = currentScrollTop >= currentMaxScroll - 1;

  nextTick(() => {
    if (!scrollEl) return;
    
    // 只有当前在底部时才滚动
    if (isAtBottom) {
       console.log('当前到达底部了,滚动√')
      const newMaxScroll = scrollEl.scrollHeight - scrollEl.clientHeight;
      scrollEl.scrollTop = newMaxScroll;
    } else {
       console.log('未到达底部,不滚动')
    }
  });
}

这个时候用户的体验感就比较好了~~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐