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

浏览器列表滚动的表现

作者: 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