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 相关文章推荐
json格式的时间显示为正常年月日的方法
Sep 08 Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 Javascript
jQuery获取URL请求参数的方法
Jul 18 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
Jan 10 Javascript
使用node.js搭建服务器
May 20 Javascript
vue使用codemirror的两种用法
Aug 27 Javascript
Vue.js下拉菜单组件使用方法详解
Oct 19 Javascript
JS实现动态星空背景效果
Nov 01 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
Dec 17 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
Oct 28 Javascript
JQuery绑定事件四种实现方法解析
Dec 02 jQuery
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
基于mysql的论坛(7)
2006/10/09 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
幼儿园开学家长寄语
2014/01/19 职场文书
亚运会口号
2014/06/20 职场文书
酒店开业主持词
2015/07/02 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
MySQL限制查询和数据排序介绍
2022/03/25 MySQL
Redis唯一ID生成器的实现
2022/07/07 Redis