最近项目有个下单的过程,需要输入很多信息,每次提交都要往下滑,还要去验证,测试后发现体验也不好,element框架也没提供这种滚动方法,

   不过提供了一个验证的方法 validate (两个参数:是否校验成功和未通过校验的字段),于是做了一个验证错误时的位置滚动。

   

   列举几个输入框,我是通过 ref 获取节点信息来算位置的,所以每一块都需要去设置ref属性(有好的建议可以留言哈)   

      <el-form-item label="联系人:" prop="trailer.address.name" ref="trailer.address.name">
            <el-input v-model="form.trailer.address.name" placeholder="请输入工厂联系人"></el-input>
          </el-form-item>
          <el-form-item label="手机号码:" prop="trailer.address.phone" ref="trailer.address.phone">
            <el-input v-model="form.trailer.address.phone" placeholder="请输入手机号码"></el-input>
          </el-form-item>
          <el-form-item label="so号:" prop="trailer.so_no" ref="trailer.so_no">
            <el-input v-model="form.trailer.so_no"></el-input>
      </el-form-item>

  

    this.$refs[formName].validate((valid, object) => {
          console.log(object)  //object就是未通过校验的字段
          if (valid) {
            //验证通过
          } else {
        
for (let i in object) { let dom = this.$refs[i]; if (Object.prototype.toString.call(dom) !== '[object Object]') {  //这里是针对遍历的情况(多个输入框),取值为数组 dom = dom[0]; }      
            

        //第一种方法(包含动画效果) dom.$el.scrollIntoView({  //滚动到指定节点 block:
'center',     //值有start,center,end,nearest,当前显示在视图区域中间 behavior: 'smooth'    //值有auto、instant,smooth,缓动动画(当前是慢速的) })
        //第二种方法 let top
= dom.$el.getBoundingClientRect().top;  //获取当前节点的偏移值 let scrollTop = document.documentElement.scrollTop;  //获取视图滚动值 let diff = top + scrollTop;    document.documentElement.scrollTop = diff - 276;  //276是第一个输入框节点距离顶部的偏移值,也可以在初始化提前保存 //window.scrollTo(0,diff- 276) //同上 break; //因为我们只需要检测一项,所以就可以跳出循环了 } } });

 

展示图