vue滚动轴插件better-scroll使用详解


Posted in Javascript onOctober 17, 2017

跟做慕课网的vue高仿外卖项目中用到了一个很好用的插件BScroll,用来计算左侧menu栏对应右侧foods栏相应显示的食物区,如果不用插件就比较费事了,因此这里分享一下这个插件的简单使用:

一、项目中下载,并引入

在配置文件package.json中引入版本

"dependencies": {
 "better-scroll": "^0.1.7"
 }

然后进入项目目录,打开cmd更新配置

npm i (i是install缩写)

最后引入,比如我在项目goods组件中使用则:

import BScroll from 'better-scroll';

二、举个栗子

需求是处于当前比如热销榜栏目,则菜单栏高亮。滚动到下一栏高亮栏目则下一栏菜单高亮。点击菜单中某一栏菜单该栏目高亮并且跳转到对应食物区。

下面是foods组件中的代码

template:

<template>
 <div class="goods">
 <div class="menu-wrap" ref="menuWrap">//菜单栏
  <ul>
  <li v-for="(item,index) in goods" class="menu-item" :class="{'current':currentIndex===index}" @click="selectMenu(index,$event)">
   <span class="text border-1px">
   <span v-show="item.type>0" class="icon" :class="classMap[item.type]"></span>{{item.name}}
   </span>
  </li>
  </ul>
 </div>
 <div class="foods-wrap" ref="foodsWrap">//食物栏
 </div>
 </div>
</template>

script

<script type="text/ecmascript-6">
 import Vue from 'vue';
 import BScroll from 'better-scroll';
 import shopcart from '@/components/shopcart/shopcart';
 export default {
 props: {//接收父组件传的数据
  seller: {
  type: Object
  }
 },
 data () {
  return {
  goods: [],
  listHeight: [],//菜单中一个菜单栏目的高度
  scrollY: 0//定义的Y滚动轴及初始值
  };
 },
 computed: {//计算属性
  currentIndex () {//当前菜单栏在整个菜单中的下标index
  for (let i = 0; i < this.listHeight.length; i++) {//遍历菜单中每个栏目的高度
   let height1 = this.listHeight[i];//第i个栏目的高度
   let height2 = this.listHeight[i + 1];//第i+1个栏目的高度
   if (!height2 || (this.scrollY >= height1 && this.scrollY < height2)) {//根据当前滚动轴的位置得出index(如果第二个栏目不存在即第一个栏目是最后一个)或者(当前栏目高度大于等于第一个并且当前滚动轴小于第二个栏目高度)
   return i;//如果满足则返回index
   }
  }
  return 0;//初始值0
  }
 },
 created () {
  Vue.prototype.$http.get('/api/goods')
  .then(res => {
   this.goods = res.data.data;
   this.$nextTick(() => {//
   this._initScroll();
   this._calculateHeight();
   });
  });
  this.classMap = ['decrease', 'discount', 'special', 'invoice', 'guarantee'];
 },
 methods: {
  selectMenu (index, event) {
  if (!event._constructed) {
   return;
  }
  let foodList = this.$refs.foodsWrap.getElementsByClassName('food-list-hook');
  let el = foodList[index];
  this.foodsScroll.scrollToElement(el, 300);
  },
  _initScroll () {
  this.menuScroll = new BScroll(this.$refs.menuWrap, {
   click: true
  });
  this.foodsScroll = new BScroll(this.$refs.foodsWrap, {probeType: 3
  });
  this.foodsScroll.on('scroll', (pos) => {
   this.scrollY = Math.abs(Math.round(pos.y));
   console.log(this.scrollY);
  });
  },
  _calculateHeight () {
  let foodList = this.$refs.foodsWrap.getElementsByClassName('food-list-hook');
  let height = 0;
  this.listHeight.push(height);
  for (let i = 0; i < foodList.length; i++) {
   let item = foodList[i];
   height += item.clientHeight;
   this.listHeight.push(height);
  }
  }
 }
 };
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
判断iframe里的页面是否加载完成
Jun 06 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
javascript实现捕捉键盘上按下的键
May 05 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
Nov 24 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 Javascript
layui的table中显示图片方法
Aug 17 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
react中的ajax封装实例详解
Oct 17 #Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
Oct 17 #Javascript
打造通用的匀速运动框架(实例讲解)
Oct 17 #Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 #Javascript
Vue中封装input组件的实例详解
Oct 17 #Javascript
js获取文件里面的所有文件名(实例)
Oct 17 #Javascript
Vue中之nextTick函数源码分析详解
Oct 17 #Javascript
You might like
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
python中xrange和range的区别
2014/05/13 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python request中文乱码问题解决方案
2020/09/17 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
cf收人广告词大全
2014/03/14 职场文书
家长通知书家长评语
2014/04/17 职场文书
协议书与合同的区别
2014/04/18 职场文书
社区矫正工作方案
2014/06/04 职场文书
树转促学习心得体会
2014/09/10 职场文书
简历中自我评价范文
2015/03/11 职场文书
爱国主义电影观后感
2015/06/18 职场文书
小学毕业教师寄语
2019/06/21 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python