摘要: 小程序索引选择器,点击跳转相应条目,索引可滑动,滑动也可跳转

场景:城市选择列表, 汽车品牌选择列表

所用组件: scroll-view(小程序原生) https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html

使用技术: 组件 + API + 一个简单的计算
效果示意:

 
本例数据结构:(你可以把你的数据改成这种结构,当然,掌握方法后可自行调整)

 list: [
{
"letter": "A",
"list": [{
"name": "奥迪1",
"id": 1
},
{
"name": "奥迪2",
"id": 2
}]
},
{
"letter": "B",
"list": [{
"name": "宝马1",
"id": 3
},
{
"name": "宝马2",
"id": 4
}]
},
{
"letter": "C",
"list": [{
"name": "麻喇沙底",
"id": 5
},
{
"name": "adidas",
"id": 6
}]
},
{
"letter": "D",
"list": [{
"name": "煲事件",
"id": 7
},
{
"name": "保时捷",
"id": 8
}]
},
{
"letter": "E",
"list": [{
"name": "宝马1",
"id": 9
},
{
"name": "宝马2",
"id": 10
}]
},
{
"letter": "F",
"list": [{
"name": "宝马1",
"id": 11
},
{
"name": "宝马2",
"id": 12
}]
},
{
"letter": "G",
"list": [{
"name": "宝马1",
"id": 15
},
{
"name": "宝马2",
"id": 16
}]
},
{
"letter": "H",
"list": [{
"name": "宝马1",
"id": 17
},
{
"name": "宝马2",
"id": 18
}]
},
{
"letter": "I",
"list": [{
"name": "宝马1",
"id": 19
},
{
"name": "宝马2",
"id": 20
}]
},
{
"letter": "J",
"list": [{
"name": "宝马1",
"id": 21
},
{
"name": "宝马2",
"id": 22
}]
},
{
"letter": "K",
"list": [{
"name": "宝马1",
"id": 23
},
{
"name": "宝马2",
"id": 24
}]
},
]

html 结构:

主体部分

 <scroll-view class="content" scroll-y="true" :style="scrollHeight" :scroll-top="scrollData.scrollTop" :scroll-into-view="toView">
<ul class="brandList">
<li v-for="(item, index) in list" :key="index" :id="item.letter">
<h2>{{item.letter}}</h2>
<div v-for="(el, i) in item.list" :key="i" class="pro" @click="getToast(el.name)">
<img src="/static/images/user.png" alt="" mode="aspectFit">
<span>{{el.name}}</span>
</div>
</li>
</ul>
</scroll-view>
 // 侧边导航栏
<div class="letterList" @touchstart="handlerTouchMove"
@touchmove="handlerTouchMove"
@touchend="handlerTouchEnd" :style="fixedTop">
<p v-for="(item, index) in list" :key="index" @click="getLetter(item.letter)">{{item.letter}}</p>
</div>
 js初始数据:
scrollData: {
scrollTop: 0,
},
toView:'A',

step1:

首先,侧边导航栏肯定是用fixed定位固定(一般在右侧),其次在竖直方向居中,调用wx.getSystemInfo

 let fixedTop = 0;
let length = this.list.length // 取到list数组的length,因为list的length决定了侧边导航的高度
wx.getSystemInfo({
success(res) {
fixedTop = (res.windowHeight - (20 * length))/2 //20为侧边导航每个p的高度
}
})

step2

手指在侧边导航滑动时的js

 handlerTouchMove (e) {
let touches = e.touches[0] || {}
let pageY = touches.pageY
let rest = pageY - this.fixedTop
let index = Math.ceil(rest / 20)
console.log(this.list.length, index, 206);
console.log(index,195);
if(index > this.list.length) {
index = this.list.length - 1//
}
if( 0 <index <= this.list.length) { // 1213 10 9
12 index = index - 1
13 }
14 if(index <= 0) {
15 index = 0
16 }
17 let letter = this.list[index].letter
18 wx.showToast({
19 title: letter,
20 icon: 'none',
21 duration: 2000
22 })
23 this.toView = letter
24 },
25 handlerTouchEnd () {
26 wx.hideLoading()
27 },

step3

点击侧边索引时的js

     getLetter (letter) {
this.toView = letter
},

结束惹,88, 下次见

 

【微信小程序】手写索引选择器(城市列表,汽车品牌选择列表)的更多相关文章

  1. 微信小程序开发之picker选择器组件用法

    picker组件时一个从底部弹起的可滚动的选择器(嵌入页面滚动器组件picker-view查看https://mp.weixin.qq.com/debug/wxadoc/dev/component/p ...

  2. 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...

  3. 微信小程序-获取当前位置和城市名

    微信小程序-获取当前城市位置 1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数) ...

  4. mpvue开发微信小程序之时间+日期选择器

    最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...

  5. 微信小程序初探--写个扫雷分享给你玩

    闲暇里,想学一下微信小程序, 于是,用微信小程序原生做了个扫雷玩. 以下略作总结,分享给大家. 微信里下拉,输入[mini计算器], 看到这个图标的就是了: 说好的扫雷,怎么变成计算器了?原因后面解释 ...

  6. [微信小程序] 微信小程序下拉滚动选择器picker绑定数据的两种方式

    小程序 picker 多列选择器 数据动态获取 需求是将各校区对应各班级的数据 以两列选择器的方式展示出来,并且可以在选择完成之后记录选结果参数. 校区数据 和 班级数据 分别是两个接口,以 校区 t ...

  7. mpvue微信小程序怎么写轮播图,和官方微信代码的差别

    目前用mpvue很多第三方的ui库是引入不了的,因为它不支持含有dom操作. 那我们要做轮播图的话一个是手写另外一个就是用小程序的swiper组件了: 官方代码: <swiper indicat ...

  8. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  9. 微信小程序手绘地图实现之《Canvas》

    环境:微信SDK2.9+   + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...

随机推荐

  1. Module Code: CMT107

    Cardiff School of Computer Science and InformaticsCoursework Assessment Pro-formaModule Code: CMT107 ...

  2. cap理论与分布式事务的解决方案

    现在很火的微服务架构所设计的系统是分布式系统.分布式系统有一个著名的CAP理论,即一个分布式系统要同时满足一致性(Consistency).可用性(Availablility)和分区容错(Partit ...

  3. IO多路复用(转)

    原文:Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文 ...

  4. ORACLE 求和(多列)

    SELECT SUM(列名),SUM(列名),SUM(列名),SUM(列名) FROM 表名

  5. maven 学习---使用Maven构建项目

    要构建一个基于Maven的项目,打开控制台,进入到 pom.xml 文件所放的项目文件夹,并发出以下命令: mvn package 这将执行Maven的“package”阶段. Maven构建生命周期 ...

  6. idea加载springboot 项目热加载失效

    需要打开 help -> find action ->registry ->其中的compiler.automake.allow.when.app.running勾上

  7. [TCP/IP] ping traceroute和TTL

    1.Time To Live是生存时间的意思,就是说这个ping的数据包能在网络上存在多少时间.当我们对网络上的主机进行ping操作的时候,我们本地机器会发出一个数据包,数据包经过一定数量的路由器传送 ...

  8. Docker容器服务(三)

    一.创建容器 容器是Docker的另一个核心概念. 简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 1.1创建一个容器 使用docker create命令创建的容器处于停止状 ...

  9. 201871010104-陈园园 《面向对象程序设计(java)》第十三周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  10. 201871010135 张玉晶《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/11963 ...