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代码(站点及虚拟目录)
Oct 20 Javascript
innerText和textContent对比及使用介绍
Feb 27 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
Nov 21 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
May 19 Javascript
jQuery实现右下角可缩放大小的层完整实例
Jun 20 Javascript
Node.js的基本知识简单汇总
Sep 19 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
vue事件修饰符和按键修饰符用法总结
Jul 25 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
解决angularjs中同步执行http请求的方法
Aug 13 Javascript
Vue实现图书管理案例
Jan 20 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
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
PHP PDO操作总结
2014/11/17 Javascript
js中日期的加减法
2015/05/06 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
python中lambda()的用法
2017/11/16 Python
django中related_name的用法说明
2020/05/20 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
先进教师个人总结
2015/02/11 职场文书
盲山观后感
2015/06/11 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS
Rust中的Struct使用示例详解
2022/08/14 Javascript