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判断单个复选框是否被选中的代码
Sep 03 Javascript
isArray()函数(JavaScript中对象类型判断的几种方法)
Nov 26 Javascript
读jQuery之五(取DOM元素)
Jun 20 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
Jan 06 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
个人小程序接入支付解决方案
May 23 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 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
PHP常用代码
2006/11/23 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
php二维码生成
2015/10/19 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
js form action动态修改方法
2008/11/04 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
JavaScript正则表达式和级联效果
2017/09/14 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
python读写json文件的简单实现
2017/04/11 Python
Python自定义线程类简单示例
2018/03/23 Python
基于Python log 的正确打开方式
2018/04/28 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
班级德育工作实施方案
2014/02/21 职场文书
年度考核自我鉴定
2014/03/19 职场文书
环保建议书500字
2014/05/14 职场文书
校车安全责任书
2014/08/25 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2014年人事科工作总结
2014/11/19 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
复试通知单模板
2015/04/24 职场文书
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript