scroll-behavior: smooth;



scroll-behavior - CSS(层叠样式表) | MDN

需求:表单填写页面,当点击提交时,校验表单必填项,并希望页面滚动到一个有错误信息提示的地方:

         // 若有校验失败则页面回到第一个错误提示位置
            
         this.$nextTick(() => {
              document
                .getElementsByClassName('el-form-item__error')[0]
                .setAttribute('id', 'first_error');
              let objEle = document.getElementById('first_error');
              let scrollHeight = this.findPosY(objEle);
              scrollHeight[0] = scrollHeight[0] - 300;

            // 计算出滚动条需要滚动的距离
              window.scrollTo({
                top: scrollHeight,
                behavior: 'smooth',
              });
          });



        // 获取元素到达顶部的距离

        findPosY(obj) {
            //obj为所要计算的元素,可用id或class获取
            var top = 0;
            if (obj.offsetParent) {
              do {
                top += obj.offsetTop;
              } while ((obj = obj.offsetParent));
              return [top];
            }
         },

点击表单之后,展示结果页,在测试环境中由于页面的头和尾都是异步加载上去的,所以当页面渲染完成后,浏览器的滚动条会在最下面,这时需要进入页面滚动条平滑的滚动到最顶部。

// 由于好几种写法都没有生效,所以采用监听页面的一个属性noTimes,
// 这个noTimes属性是判断用户是否有提交次数了,3次是为上限,当没有次数提示用户:您当前的次数已用完。
// 这一句话的时候,滚动条是正常的。只有提交成功需要把滚动条滚到页面的顶部
watch: {
      async noTimes() {
        await this.$nextTick();
        setTimeout(() => {
          window.scrollTo({
            top: 0,
            behavior: 'smooth',
          });
        }, 0);
      },
    },

现在说一下代码为什么要这么写:

当时尝试以下写法都不行:

1.写法一

mounted: {
      this.$nextTick(()=> {
        window.scrollTo({
            top: 0,
            behavior: 'smooth',
          });
      );
       
},

2.写法二

mounted: {
      setTimeout(()=> {
        window.scrollTo({
            top: 0,
            behavior: 'smooth',
          });
      },100);
       
},

3.写法三 

async mounted: {
        await this.$nextTick();
        window.scrollTo({
            top: 0,
            behavior: 'smooth',
          });
       
},

 官方文档也有类似的例子:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值