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生成asp.net服务器控件的代码
Feb 04 Javascript
JQuery入门—编写一个简单的JQuery应用案例
Jan 03 Javascript
一个简单的Node.js异步操作管理器分享
Apr 29 Javascript
JavaScript学习笔记之Function对象
Jan 22 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
js 判断附件后缀的简单实现方法
Oct 11 Javascript
微信小程序  checkbox组件详解及简单实例
Jan 10 Javascript
移动端利用H5实现压缩图片上传功能
Mar 29 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
微信小程序实现随机验证码功能
Dec 20 Javascript
vue3+typeScript穿梭框的实现示例
Dec 29 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
Terran历史背景
2020/03/14 星际争霸
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python中查看变量内存地址的方法
2015/05/05 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python实现多层感知器
2019/01/18 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python多进程间通信代码实例
2019/09/30 Python
python实现滑雪者小游戏
2020/02/22 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
《猴子种树》教学反思
2014/02/14 职场文书
研究生简历自我评
2015/03/11 职场文书