美文网首页
浏览器列表滚动的表现

浏览器列表滚动的表现

作者: skoll | 来源:发表于2022-03-30 17:04 被阅读0次

    css属性

    1 .content-visibility:auto.content-visibility是一个css属性,它控制一个元素是否呈现其内容,能让用户潜在地控制元素的呈现。用户可以使用它跳过元素的呈现(包括布局和绘制),直到用户需要为止,让页面的初始渲染得到极大的提升.css属性实现虚拟列表,但是框架渲染的话,好像这个没啥用.
    2 .will-change:当我们通过某些行为(点击、移动或滚动)触发页面进行大面积绘制的时候,浏览器往往是没有准备的,只能被动使用CPU去计算与重绘,由于没有事先准备,应付渲染够呛,于是掉帧,于是卡顿。而will-change则是真正的行为触发之前告诉浏览器:“浏览器同学,我待会儿就要变形了,你心理和生理上都准备准备”。于是乎,浏览器同学把GPU给拉上了,从容应对即将到来的变形。

    1 will-change:scroll-position
    

    js方面

    1 .变化的属性使用animeJs来实现,有阻尼感,类似于betterScroll的操作

    const calculateRange = () => {
        const container = getTargetElement(containerTarget);
        const wrapper = getTargetElement(wrapperTarget);
    
        if (container && wrapper) {
          const { scrollTop, clientHeight } = container;
    
          const offset = getOffset(scrollTop);
          const visibleCount = getVisibleCount(clientHeight, offset);
    
          const start = Math.max(0, offset - overscan);
          const end = Math.min(list.length, offset + visibleCount + overscan);
    
          const offsetTop = getDistanceTop(start);
    
          wrapper.style.height = totalHeight - offsetTop + 'px';
          wrapper.style.marginTop = offsetTop + 'px';
    //这里要使用渐变
    
          setTargetList(
            list.slice(start, end).map((ele, index) => ({
              data: ele,
              index: index + start,
            })),
          );
        }
      };
    

    3 .useScroll获得值,需要渐变,也就是正常我们每次滚动,都有最小值.所以才会出现滚动不连贯的问题,要让这个值不是间隔的加,而是顺序的加
    4 .scroll-behavior:smooth.当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,属性 scroll-behavior 为一个滚动框指定滚动行为

    手动导航:很容易想到的是锚点跳转
    <nav>
      <a href="#page-1">1</a>
      <a href="#page-2">2</a>
      <a href="#page-3">3</a>
    </nav>
    <scroll-container>
      <scroll-page id="page-1">1</scroll-page>
      <scroll-page id="page-2">2</scroll-page>
      <scroll-page id="page-3">3</scroll-page>
    </scroll-container>
    CSSOM:例如scrollX、scrollTop、scrollLeft等 Dom 属性发生改变的时候也会受到影响
    
    scroll-behaviour表现

    可以看到加了behaviour的css属性,确实是出现了渐进增加的表现


    scrollTop效果

    //可以看到加了scroll-bahaviour的div,scroll的时候确实滚动有缓慢的趋势.
    5 .问题:这里只是会缓动开始和结束的时候,中间的时候是不会的

    window.addEventListener('wheel',(e)=>{
            console.log('wheel',e)
            ref.current.scrollTop+=100
     })
    //这算是一种最简单的优化
    

    6 .想要实现列表滚动的平滑滚动,还是要自己操作.检测鼠标wheel操作

    1 .如果我们给document绑定touchmove或者touchstart事件的监听器,这个passive是会被默认设置为true以提高性能
    2 .想要阻止默认的滑动操作,自己改他的值
    

    实现

    1 .就算是把这个持续时间变得很短,无论怎么搞,都会有延迟.其实想做的就是对两次的做插值.会抖动

      const anim=anime({
                targets:innerRef.current,
                translateY:target,
                duration:5,
                easing:'linear',
                delay:0,
              })
    //也就是说他无法支持一些高精度的操作
        function createAnim(current,target){
              console.log(current,target,'前往的位置')
              let value
              if(target>current){
                value=target-current
                console.log('1',value,target)
                setAnimState(1)
                const anim=anime({
                  targets:innerRef.current,
                  translateY:{
                    value:`+=${value}`
                  },
                  duration:100,
                  easing:'linear',
                  delay:0,
                  complete:function(){
                    console.log('完成',target)
                    currentHeight.current=target
                    setAnimState(0)
                    if(target>currentHeight.current){
                      console.log('下一次动画')
                      createAnim(target,currentHeight.current)
                    }
                  }
                })
              }else{
                value=current-target
                console.log('2',value)
                const anim=anime({
                  targets:innerRef.current,
                  translateY:{
                    value:`-=${value}`
                  },
                  duration:100,
                  easing:'linear',
                  delay:0,
                  complete:function(){
                    currentHeight.current=target
                    setAnimState(0)
                    if(target<currentHeight.height){
    
                    }
                  }
                })
              }
              
    
        }
    

    2 .用requestAnimationFrame实现下试试吧.
    3 .tween.js实现一下


    image.png
    1 .最小的粒度操作,他是有时间概念的,一秒内,这么多距离,每次的距离还都不是固定的.滚轮滚动最小都会触发30次操作,滚动90px的高度
    2 .拖拽是连续的,所以可以实现丝滑操作.如果每一个小项的高度>=90,看起来就不会那么怪,可以滚一下,切换一个项,小的就不行
    3 .要想丝滑应该是这样,第一次滑动的时候,就让他立马开始运动40px,之后再检测下一步的距离
    4 .默认不是从0开始的.
    
    image.png

    //tween的


    image.png

    //linear创建出来的补间动画也不是1px,1px的变化.5px.看起来,肉眼时别的

    相关文章

      网友评论

          本文标题:浏览器列表滚动的表现

          本文链接:https://www.haomeiwen.com/subject/regcdrtx.html