VUE2版本的仿微信通讯录侧滑列表

<template><!-- Vue模板部分 --><div><div v-for="(group, index) in groupedArray" :key="index" ref="indexcatch"><h2>{{ letter[index] }}</h2><ul><li v-for="item in group" :key="item.id">{{ item.name }}</li></ul></div><div ref="scrollDiv"style="position: fixed;right: 0;top: calc(50vh - 325px);width: 50px; height: 650px;background-color: #CCCCCC;"@click="handleClick" @mousedown="startLongPress" @mouseup="stopLongPress"><div v-for="(item,index) in letter" :key="index":style="{textAlign: 'center',height: '25px',color:IndexItem==index?'red':'black',fontWeight:IndexItem==index?'700':''}">{{letter[index]}}</div></div></div>
</template><script>// yarn add js-pinyin --save 或者 npm install js-pinyin --save 安装// 作用是把汉字转化为拼音,以便于排序使用import Pinyin from 'js-pinyin'; export default {data() {return {letter: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S','T', 'U', 'V', 'W', 'X', 'Y', 'Z'], // 右侧字母列表arr: [], // 被处理过的左侧数据列表数据(已经分类好)EleHeight: 25, // 右侧每个字母的高(使用这个高度用于计算点击的或者滚动到的是哪个索引的字母,以便于让左侧列表跟着进行滚动到指定位置)FatherDivHeight: -1, // 右侧字母列表的容器距离浏览器顶部的距离IndexItem: -1, // 用于将字母高亮显示};},computed: {groupedArray() {let result = {};// 生成随机名字的函数(这个是找GPT要的方法,你也用不上,毕竟你的项目是有数据的,这里是模拟的数据,就不写注释了)function getRandomName() {const surnames = ['张', '王', '李', '赵', '刘', '陈', '杨', '黄', '吴', '郑', '孙', '周', '徐', '朱', '高', '林', '何','马', '罗', '梁', '宋', '郭', '胡', '郭', '潘', '李', '谢', '邓', '曹', '程', '曾', '彭', '蔡', '梁', '田', '许','韩', '冯', '曹', '庄', '魏', '张', '石', '章', '叶', '董', '汪', '方', '于', '邹', '苏', '潘', '葛', '奚', '范','彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '贾', '严', '武', '庄', '邱', '卫', '蒋', '童', '颜', '郭','梅', '盛', '林', '翟', '石', '王'];const names = ['三', '四', '五', '六', '七', '八', '九', '十', '一', '二', '华', '明', '强', '超', '辉', '军', '涛','勇', '毅', '伟', '刚', '强', '军', '平', '杰', '峰', '雷', '磊', '新', '洋', '宇', '昊', '翔', '晓', '亮', '云','飞', '鹏', '浩', '波', '文', '轩', '东', '俊', '涵', '阳', '晨', '帆', '宇', '航', '建', '琪', '轩', '海', '立','智', '志', '弘', '博', '晨', '瑞', '凯', '子', '卓', '坤', '雄', '霖', '政', '晗', '煜', '�'];let getRandomItem = (arr) => arr[Math.floor(Math.random() * arr.length)];let randomNames = [];for (let i = 0; i < 299; i++) {let surname = getRandomItem(surnames);let name = getRandomItem(names);randomNames.push({"name": surname + name});}return randomNames;}this.arr = getRandomName();this.arr.forEach(item => {let firstLetter = this.getFirstLetter(item.name);if (!result[firstLetter]) {result[firstLetter] = [];}result[firstLetter].push(item);});let allLetters = 'abcdefghijklmnopqrstuvwxyz'.split('');let groupedArray = allLetters.map(letter => result[letter] || []);return groupedArray;}},methods: {getFirstLetter(str) {// 将中文姓名转换为拼音并取首字母return Pinyin.getCamelChars(str).charAt(0).toLowerCase();},startLongPress(e) {// 鼠标按下(开始监听全局的鼠标滚动)this.FatherDivHeight = e.currentTarget.offsetTop // 获取当前字母容器距离顶部的距离// 添加全局事件监听器document.addEventListener('mousemove', this.handleScroll);},stopLongPress() {// 移除全局事件监听器(鼠标抬起移除全局的鼠标移动事件)document.removeEventListener('mousemove', this.handleScroll);},handleClick(event) {// 点击滚动实现// 获取当前滚动的y坐标// console.log(event.y);// 获取当前字母列表每个字母的高度// console.log(this.EleHeight);// 计算当前字母索引let index = Math.ceil((event.detail.y - this.FatherDivHeight) / this.EleHeight) - 1;console.log(index);// 将当前索引赋值this.IndexItem = index// 将右侧列表滚动到相应位置scrollTo({left: 0, // 距离左侧距离top: this.$refs.indexcatch[index].offsetTop, //点击侧边栏的哪个索引就让右侧哪个索引对应的块滚动behavior: "smooth", // 点击滚动这里我用了平滑滚动,带动画的})},handleScroll(event) {// 获取当前滚动的y坐标// console.log(event.y);// 获取当前字母列表每个字母的高度// console.log(this.EleHeight);// 计算当前字母索引let index = Math.ceil((event.y - this.FatherDivHeight) / this.EleHeight) - 1;console.log(index);// 将当前字母索引赋值this.IndexItem = index// 将右侧列表滚动到相应位置scrollTo({left: 0,top: this.$refs.indexcatch[index].offsetTop, //点击侧边栏的哪个索引就让右侧哪个索引对应的块滚动behavior: "auto", // auto 瞬间滚动 无动画 smooth 平滑滚动带有动画效果})}}};
</script>

效果图
在这里插入图片描述
支持滑动和点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/645269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis拦截器和mybatis plus的拦截器

MyBatis拦截器和MyBatis Plus的拦截器在概念上是一致的&#xff0c;都是通过拦截器机制对MyBatis的SQL执行过程进行扩展和控制&#xff0c;但是在实现细节和功能上有所差异。MyBatis Plus的拦截器是建立在MyBatis拦截器基础之上&#xff0c;通过封装简化了开发流程&#xff0c;…

武汉星起航:亚马逊全球资源赋能中国卖家,跨境电商助力品牌国际化

亚马逊全球开店业务于2015年正式进驻中国&#xff0c;为中国卖家打开了通往全球市场的便捷之门。这一举措不仅为中国卖家提供了与全球消费者直接交流的机会&#xff0c;更借助亚马逊的丰富资源和先进技术&#xff0c;帮助卖家将优质的中国商品推向世界舞台。亚马逊平台以其高效…

8.4.1 实验1:创建 VLAN 和划分端口

1、实验目的 通过本实验可以掌握&#xff1a; VLAN的概念。创建VLAN的方法。把交换机端口划分到VLAN中的方法。 2、实验拓扑 创建 VLAN 和划分端口的实验拓扑如下图所示。 图8-5 创建 VLAN 和划分端口的实验拓扑 3、实验步骤 &#xff08;1&#xff09;实验准备 S1#eras…

javaScript中的作用域和作用域链

作用域&#xff08;Scope&#xff09; 什么是作用域 作用域是在运行时代码中的某些特定部分中变量、对象和函数的可访问性。 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性。 示例&#xff1a; function outFun2() {var inVariable "内层变量2…

请介绍如何在PostgreSQL中使用物化视图提升查询性能,并描述其更新机制?

文章目录 解决方案1. 创建物化视图2. 刷新物化视图3. 在查询中使用物化视图 物化视图的更新机制总结 物化视图&#xff08;Materialized View&#xff09;是数据库中的一种对象&#xff0c;它存储了查询的结果集&#xff0c;即预先计算和存储了查询的结果。通过物化视图&#x…

Java 设计模式(上)

目录 一、单一职责原则 二、开闭原则 三、里氏替换原则 四、迪米特法则 五、接口隔离原则 六、依赖倒置原则 七、工厂方法 八、抽象工厂 九、建造者模式 十、原型模式 十一、单例模式 十二、适配器模式 一、单一职责原则 单一职责原则又称单一功能原则&#xff0c;…

HTTP协议的总结

参考 https://www.runoob.com/http/http-tutorial.html 1.简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模…

为底图发愁? 这里有一份清爽又百搭的底图绘制方法!

图纸不够清爽美观&#xff1f; 图纸表达混乱&#xff0c;重点不够醒目&#xff1f; 图纸的颜色太难调了&#xff0c;怎么调都不满意&#xff1f; ...... 俗话说&#xff0c;好的底图是图纸成功的关键&#xff01; 绝大部分的图纸问题&#xff0c;都和底图有关&#xff01; …

权威解析Spring框架九大核心功能(续篇):专业深度,不容错过

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

【无标题】w

import requests , sys , edge _ tts , os , asyncio from pydub import AudioSegment , playback url http://localhost:8080/v1/chat/ completions ’ def send _ message ( message ): headers {" Content - Type “:” application / json "} data { " mode…

数据聚类:Mean-Shift和EM算法

目录 1. 高斯混合分布2. Mean-Shift算法3. EM算法4. 数据聚类5. 源码地址 1. 高斯混合分布 在高斯混合分布中&#xff0c;我们假设数据是由多个高斯分布组合而成的。每个高斯分布被称为一个“成分”&#xff08;component&#xff09;&#xff0c;这些成分通过加权和的方式来构…

Cesium分屏对比功能实现,完整版代码案例

使用cesium开发的小伙伴们,分屏对比功能是视图功能中比较常见的一个需求。 这篇文章我们来教会大家如何实现这个功能。 首先我们要准备一左一右2个div容器,用来挂在两个cesium实例。 其实分屏对比的关键就在于左右两个视图如何联动起来。 那么我们需要借助相机之间的参数…