vue自定义单向列表(横向或纵向)

template部分

<div class="dataNavPrev"
                 @click="navPrev">
              <svg t="1650615093887"
                   class="icon"
                   viewBox="0 0 1024 1024"
                   version="1.1"
                   xmlns="http://www.w3.org/2000/svg"
                   p-id="2210"
                   width="32"
                   height="32">
                <path d="M511.29 230.03L867.8 544.02l56.4-64.04-413.02-363.76L99.74 480.04l56.52 63.92z"
                      p-id="2211"
                      fill="#ffffff"></path>
                <path d="M99.74 817.1l56.52 63.93L511.29 567.1 867.8 881.09l56.4-64.04-413.02-363.76z"
                      p-id="2212"
                      fill="#ffffff"></path>
              </svg>
            </div>
			<!-- ref绑定列表盒子ul列表 -->
            <ul ref="dataNavList"
                style="height: 630px;overflow: hidden;">
             <li  :style="{transform:'translateY(-'+move+'px)'}"> v-for="item in list">{{item.name}}</li>
            </ul>
            <div class="dataNavNext"
                 @click="navNext">
              <svg t="1650615138027"
                   class="icon"
                   viewBox="0 0 1024 1024"
                   version="1.1"
                   xmlns="http://www.w3.org/2000/svg"
                   p-id="2570"
                   width="32"
                   height="32">
                <path d="M511.29 793.97L156.26 480.04l-56.52 63.92 411.44 363.81L924.2 544.02l-56.4-64.04z"
                      p-id="2571"
                      fill="#ffffff"></path>
                <path d="M924.2 206.95l-56.4-64.04L511.29 456.9 156.26 142.97 99.74 206.9l411.44 363.81z"
                      p-id="2572"
                      fill="#ffffff"></path>
              </svg>
            </div>

css部分

css部分根据自己想法来
.dataNavPrev {
  margin-bottom: 10px;
  
}
.dataNavNext,.dataNavPrev {
  width: 100%;
  display: flex;
  cursor: pointer;
  justify-content: center;
}

js部分

data(){
	return {
	  // 列表移动的距离
      move: 0,
      // 如果要改成横向 把这个JS里的内容的Height改为Weight
      dataNavListRealHeight: 0,
      dataNavListViewHeight: 0,
	}
}


    handleNavScroll() {
      // scrollWidth获取整个菜单实际高度
      // 如果要改成横向 把这个JS里的内容的Height改为Weight
      this.dataNavListRealHeight = this.$refs.dataNavList.scrollHeight;
      // offsetWidth获取菜单在当前页面可视高度
      // 如果要改成横向 把这个JS里的内容的Height改为Weight
      this.dataNavListViewHeight = this.$refs.dataNavList.offsetHeight;
      //实际宽度减去可视宽度就是可移动的范围即move的范围
      
      // 窗口大小变化时触发。实时更新可视宽度
      // 如果要改成横向 把这个JS里的内容的Height改为Weight
      window.onresize = () => {
        return (() => {
          this.dataNavListViewHeight = this.$refs.dataNavList.offsetHeight;
          //注1,详见下方
          if (
            this.move >
            this.dataNavListRealHeight - this.dataNavListViewHeight - 60
          ) {
            this.move = this.dataNavListRealHeight - this.dataNavListViewHeight;
          }
        })();
      };
    },
    // 当菜单项向右的可移动距离大于单个菜单项的宽度时,move减去一个菜单项的宽度(即右移移动一个菜单项的宽度),
    // 当菜单项向右的可移动距离小于单个菜单项的宽度时,move等于0(即回到最开始没有移动的状态)
    navPrev() {
      if (this.move > 60) {
        this.move = this.move - 60;
      } else {
        this.move = 0;
      }
    },
    // 当菜单项向左的可移动距离大于单个菜单项的宽度时,move减去一个菜单项的宽度(即左移移动一个菜单项的宽度),
    // 当菜单项向左的可移动距离小于单个菜单项的宽度时,move等于可以向左移动的最大值(即到最末尾)
    // 如果要改成横向 把这个JS里的内容的Height改为Weight
    navNext() {
      if (
        this.move <
        this.dataNavListRealHeight - this.dataNavListViewHeight - 60
      ) {
        this.move = this.move + 60;
      } else {
        this.move = this.dataNavListRealHeight - this.dataNavListViewHeight;
      }
    },

使用方法:注意!!!(如果列表为请求得到的数据,需要在请求里写,并且在nextTick里调用该方法;如果数据固定在页面data里,则在生命周期mounted调用该方法即可)

    getData(){
      api.getData().then(res => {
        this.$nextTick(() => {
            this.handleNavScroll();
        });
      })
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值