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 相关文章推荐
javascript 显示当前系统时间代码
Dec 28 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
May 20 Javascript
javascript+ajax实现产品页面加载信息
Jul 09 Javascript
基于javascript实现简单的抽奖系统
Apr 15 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
vue一步步实现alert功能
Jul 05 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 Javascript
Vue 实现展开折叠效果的示例代码
Aug 27 Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 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-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
javascript数组排序汇总
2015/07/07 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
带你认识Django
2019/01/15 Python
Python中extend和append的区别讲解
2019/01/24 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
python中操作文件的模块的方法总结
2021/02/04 Python
python 如何在测试中使用 Mock
2021/03/01 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
学术会议邀请函范文
2014/01/22 职场文书
演讲主持词
2014/03/18 职场文书
党风廉设责任书
2014/04/16 职场文书
临床医学专业求职信
2014/08/08 职场文书
介绍信怎么写
2015/01/30 职场文书
导游词之潮音寺
2019/09/26 职场文书