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 相关文章推荐
jQuery 插件 将this下的div轮番显示
Apr 09 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
利用JS制作万年历的方法
Aug 16 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
Dec 24 Javascript
LayUI表格批量删除方法
Aug 15 Javascript
JS实现数组深拷贝的方法分析
Mar 06 Javascript
js实现轮播图特效
May 28 Javascript
vue+spring boot实现校验码功能
May 27 Vue.js
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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
python中__call__方法示例分析
2014/10/11 Python
python创建和删除目录的方法
2015/04/29 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python类装饰器实现方法详解
2018/12/21 Python
Python实现DDos攻击实例详解
2019/02/02 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
廉洁使者实施方案
2014/03/29 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
学校食品安全实施方案
2014/06/14 职场文书
项目合作协议书
2014/09/23 职场文书
个人投资合作协议书
2014/10/12 职场文书
5.12护士节活动总结
2015/02/10 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
小学美术教学反思
2016/02/17 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏