商场里的一个小需求
小程序scroll-view开发一个能够滚动的tab组件,当点击大于屏幕二分之一标签时,将其移动到中间,点击向下的箭头展开全部,进行选择
项目github地址
vue版本戳这里vue时better-scroll 实现的相似的效果vue
git clone https://github.com/sunnie1992/soul-weapp.git
开发者工具直接打开运行
将components下s-tab-scoller放到你的目录下git
// 在你的页面json中引用 { "navigationBarTitleText": "横向滚动", "usingComponents": { "s-tab-scoller": "/components/s-tab-scoller/index" } } wxml使用 <s-tab-scoller list="{{list}}" bindchange="navChange"></s-tab-scoller>
组件接受一个list参数,咱们有两个参数要展现,标题和数量,开发者能够根据不一样的需求进行修改
选择标签项触发chooseNav方法github
// components/s-float-icons/index.js Component({ externalClasses: ['ex-class'], properties: { list: Array }, options: { multipleSlots: true }, data: { showNavDrap: false, navIndex: 0, navScrollLeft: 0 }, /** * 组件的方法列表 */ methods: { showAllNav() { this.setData({ showNavDrap: !this.data.showNavDrap }) }, //选择 chooseNav(e) { var item = e.currentTarget.dataset.item var index = e.currentTarget.dataset.index var pop = e.currentTarget.dataset.pop // 点击弹出的选项(pop区分的是选择的是滚动的tab仍是下拉的tab) if (pop) { this.setData({ showNavDrap: !this.data.showNavDrap }) } var _this = this // 设置当前位置 const query = wx.createSelectorQuery().in(this) query .selectAll('.label-item') .boundingClientRect(function(rect) { let width = 0 // 循环获取计算当前点击的标签项距离左侧的距离 for (let i = 0; i < index; i++) { width += rect[i].width } // 当大于屏幕一半的宽度则滚动,不然就设置位置为0 let clientWidth = wx.getSystemInfoSync().windowWidth / 2 if (width > clientWidth) { _this.setData({ navScrollLeft: width + rect[index].width / 2 - clientWidth }) } else { _this.setData({ navScrollLeft: 0 }) } }) .exec() //设置当前样式选中 this.setData({ navIndex: index }) this.triggerEvent('change', item) } } })
您能够扫描添加下方的微信并备注 Sol 加交流群,给我提意见,交流学习。json